@@ -9,10 +9,10 @@ import { markdownEngine } from "./markdownEngine";
99class  LeetCodeSubmissionProvider  extends  LeetCodeWebview  { 
1010
1111    protected  readonly  viewType : string  =  "leetcode.submission" ; 
12-     private  result : string ; 
12+     private  result : IResult ; 
1313
14-     public  show ( result : string ) : void   { 
15-         this . result  =  result ; 
14+     public  show ( resultString : string ) : void   { 
15+         this . result  =  this . parseResult ( resultString ) ; 
1616        this . showWebviewInternal ( ) ; 
1717        this . showKeybindingsHint ( ) ; 
1818    } 
@@ -25,18 +25,36 @@ class LeetCodeSubmissionProvider extends LeetCodeWebview {
2525    } 
2626
2727    protected  getWebviewContent ( ) : string  { 
28-         return  `<!DOCTYPE html> 
29-             <html lang="en"> 
28+         const  styles : string  =  markdownEngine . getStyles ( ) ; 
29+         const  title : string  =  `## ${ this . result . messages [ 0 ] }  ` ; 
30+         const  messages : string [ ]  =  this . result . messages . slice ( 1 ) . map ( ( m : string )  =>  `* ${ m }  ` ) ; 
31+         const  sections : string [ ]  =  Object . keys ( this . result ) 
32+             . filter ( ( key : string )  =>  key  !==  "messages" ) 
33+             . map ( ( key : string )  =>  [ 
34+                 `### ${ key }  ` , 
35+                 "```" , 
36+                 this . result [ key ] . join ( "\n" ) , 
37+                 "```" , 
38+             ] . join ( "\n" ) ) ; 
39+         const  body : string  =  markdownEngine . render ( [ 
40+             title , 
41+             ...messages , 
42+             ...sections , 
43+         ] . join ( "\n" ) ) ; 
44+         return  ` 
45+             <!DOCTYPE html> 
46+             <html> 
3047            <head> 
3148                <meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src https:; script-src vscode-resource:; style-src vscode-resource:;"/> 
3249                <meta charset="UTF-8"> 
3350                <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
34-                 ${ markdownEngine . getStyles ( ) }  
51+                 ${ styles }  
3552            </head> 
36-             <body> 
37-                 <pre><code> ${ this . result . trim ( ) } </code></pre>  
53+             <body class="vscode-body 'scrollBeyondLastLine' 'wordWrap' 'showEditorSelection'" style="tab-size:4" > 
54+                 ${ body }  
3855            </body> 
39-             </html>` ; 
56+             </html> 
57+         ` ; 
4058    } 
4159
4260    protected  onDidDisposeWebview ( ) : void   { 
@@ -52,6 +70,38 @@ class LeetCodeSubmissionProvider extends LeetCodeWebview {
5270            ( ) : Promise < any >  =>  openKeybindingsEditor ( "leetcode solution" ) , 
5371        ) ; 
5472    } 
73+ 
74+     private  parseResult ( raw : string ) : IResult  { 
75+         raw  =  raw . concat ( "  √ " ) ;  // Append a dummy sentinel to the end of raw string 
76+         const  regSplit : RegExp  =  /     [ √ × ✔ ✘ v x ]   ( [ ^ ] + ?) \n (? =     [ √ × ✔ ✘ v x ]   ) / g; 
77+         const  regKeyVal : RegExp  =  / ( .+ ?) :   ( [ ^ ] * ) / ; 
78+         const  result : IResult  =  {  messages : [ ]  } ; 
79+         let  entry : RegExpExecArray  |  null ; 
80+         do  { 
81+             entry  =  regSplit . exec ( raw ) ; 
82+             if  ( ! entry )  { 
83+                 continue ; 
84+             } 
85+             const  kvMatch : RegExpExecArray  |  null  =  regKeyVal . exec ( entry [ 1 ] ) ; 
86+             if  ( kvMatch )  { 
87+                 const  [ key ,  value ]  =  kvMatch . slice ( 1 ) ; 
88+                 if  ( value )  {  // Do not show empty string 
89+                     if  ( ! result [ key ] )  { 
90+                         result [ key ]  =  [ ] ; 
91+                     } 
92+                     result [ key ] . push ( value ) ; 
93+                 } 
94+             }  else  { 
95+                 result . messages . push ( entry [ 1 ] ) ; 
96+             } 
97+         }  while  ( entry ) ; 
98+         return  result ; 
99+     } 
100+ } 
101+ 
102+ interface  IResult  { 
103+     [ key : string ] : string [ ] ; 
104+     messages : string [ ] ; 
55105} 
56106
57107export  const  leetCodeSubmissionProvider : LeetCodeSubmissionProvider  =  new  LeetCodeSubmissionProvider ( ) ; 
0 commit comments