11// Copyright (c) jdneo. All rights reserved.
22// Licensed under the MIT license.
33
4- import * as _ from "lodash" ;
54import { Disposable , ExtensionContext , ViewColumn , WebviewPanel , window } from "vscode" ;
6- import { markdownEngine } from "./markdownEngine" ;
75
86class LeetCodeResultProvider implements Disposable {
97
@@ -14,21 +12,19 @@ class LeetCodeResultProvider implements Disposable {
1412 this . context = context ;
1513 }
1614
17- public async show ( resultString : string ) : Promise < void > {
15+ public async show ( result : string ) : Promise < void > {
1816 if ( ! this . panel ) {
19- this . panel = window . createWebviewPanel ( "leetcode.result" , "Submission Result " , ViewColumn . Two , {
17+ this . panel = window . createWebviewPanel ( "leetcode.result" , "LeetCode Results " , ViewColumn . Two , {
2018 retainContextWhenHidden : true ,
2119 enableFindWidget : true ,
22- localResourceRoots : markdownEngine . localResourceRoots ,
2320 } ) ;
2421
2522 this . panel . onDidDispose ( ( ) => {
2623 this . panel = undefined ;
2724 } , null , this . context . subscriptions ) ;
2825 }
2926
30- const result : IResult = this . parseResult ( resultString ) ;
31- this . panel . webview . html = this . getWebViewContent ( result ) ;
27+ this . panel . webview . html = await this . provideHtmlContent ( result ) ;
3228 this . panel . reveal ( ViewColumn . Two ) ;
3329 }
3430
@@ -38,67 +34,19 @@ class LeetCodeResultProvider implements Disposable {
3834 }
3935 }
4036
41- private parseResult ( raw : string ) : IResult {
42- raw = raw . concat ( " √ " ) ; // Append a dummy sentinel to the end of raw string
43- const regSplit : RegExp = / [ √ × ✔ ✘ v x ] ( [ ^ ] + ?) \n (? = [ √ × ✔ ✘ v x ] ) / g;
44- const regKeyVal : RegExp = / ( .+ ?) : ( [ ^ ] * ) / ;
45- const result : IResult = { messages : [ ] } ;
46- let entry : RegExpExecArray | null ;
47- do {
48- entry = regSplit . exec ( raw ) ;
49- if ( ! entry ) {
50- continue ;
51- }
52- const kvMatch : RegExpExecArray | null = regKeyVal . exec ( entry [ 1 ] ) ;
53- if ( kvMatch ) {
54- const key : string = _ . startCase ( kvMatch [ 1 ] ) ;
55- let value : string = kvMatch [ 2 ] ;
56- if ( ! result [ key ] ) {
57- result [ key ] = [ ] ;
58- }
59- if ( key === "Testcase" ) {
60- value = value . slice ( 1 , - 1 ) . replace ( "\\n" , "\n" ) ;
61- }
62- result [ key ] . push ( value ) ;
63- } else {
64- result . messages . push ( entry [ 1 ] ) ;
65- }
66- } while ( entry ) ;
67- return result ;
68- }
69-
70- private getWebViewContent ( result : IResult ) : string {
71- const styles : string = markdownEngine . getStylesHTML ( ) ;
72- const title : string = `## ${ result . messages [ 0 ] } ` ;
73- const messages : string [ ] = result . messages . slice ( 1 ) . map ( ( m : string ) => `* ${ m } ` ) ;
74- const sections : string [ ] = Object . keys ( result ) . filter ( ( k : string ) => k !== "messages" ) . map ( ( key : string ) => [
75- `### ${ key } ` ,
76- "```" ,
77- result [ key ] . join ( "\n\n" ) ,
78- "```" ,
79- ] . join ( "\n" ) ) ;
80- const body : string = markdownEngine . render ( [
81- title ,
82- ...messages ,
83- ...sections ,
84- ] . join ( "\n" ) ) ;
85- return `
86- <!DOCTYPE html>
87- <html>
37+ private async provideHtmlContent ( result : string ) : Promise < string > {
38+ return `<!DOCTYPE html>
39+ <html lang="en">
8840 <head>
89- ${ styles }
41+ <meta charset="UTF-8">
42+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
43+ <title>LeetCode Results</title>
9044 </head>
91- <body class="vscode-body 'scrollBeyondLastLine' 'wordWrap' 'showEditorSelection'" style="tab-size:4" >
92- ${ body }
45+ <body>
46+ <pre> ${ result . trim ( ) } </pre>
9347 </body>
94- </html>
95- ` ;
48+ </html>` ;
9649 }
9750}
9851
99- interface IResult {
100- [ key : string ] : string [ ] ;
101- messages : string [ ] ;
102- }
103-
10452export const leetCodeResultProvider : LeetCodeResultProvider = new LeetCodeResultProvider ( ) ;
0 commit comments