Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9b33df0

Browse files
Vigilansjdneo
authored andcommitted
Top voted solution webview (LeetCode-OpenSource#193)
1 parent9164acb commit9b33df0

File tree

6 files changed

+283
-29
lines changed

6 files changed

+283
-29
lines changed

‎package-lock.json

Lines changed: 57 additions & 3 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎package.json

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@
109109
"dark":"resources/dark/search.svg"
110110
}
111111
},
112+
{
113+
"command":"leetcode.showSolution",
114+
"title":"Show Top Voted Solution",
115+
"category":"LeetCode"
116+
},
112117
{
113118
"command":"leetcode.testSolution",
114119
"title":"Test in LeetCode",
@@ -171,6 +176,12 @@
171176
"when":"view == leetCodeExplorer && viewItem == problem",
172177
"group":"leetcode@1"
173178
},
179+
{
180+
181+
"command":"leetcode.showSolution",
182+
"when":"view == leetCodeExplorer && viewItem == problem",
183+
"group":"leetcode@1"
184+
},
174185
{
175186
"command":"leetcode.previewProblem",
176187
"when":"view == leetCodeExplorer && viewItem == problem",
@@ -182,6 +193,11 @@
182193
"command":"leetcode.showProblem",
183194
"when":"never"
184195
},
196+
{
197+
198+
"command":"leetcode.showSolution",
199+
"when":"never"
200+
},
185201
{
186202
"command":"leetcode.previewProblem",
187203
"when":"never"
@@ -288,7 +304,9 @@
288304
},
289305
"devDependencies": {
290306
"@types/fs-extra":"5.0.0",
307+
"@types/highlight.js":"^9.12.3",
291308
"@types/lodash.kebabcase":"^4.1.5",
309+
"@types/markdown-it":"0.0.7",
292310
"@types/mocha":"^2.2.42",
293311
"@types/node":"^7.0.43",
294312
"@types/require-from-string":"^1.2.0",
@@ -298,8 +316,10 @@
298316
},
299317
"dependencies": {
300318
"fs-extra":"^6.0.1",
301-
"vsc-leetcode-cli":"2.6.2",
319+
"highlight.js":"^9.15.6",
302320
"lodash.kebabcase":"^4.1.1",
303-
"require-from-string":"^2.0.2"
321+
"markdown-it":"^8.4.2",
322+
"require-from-string":"^2.0.2",
323+
"vsc-leetcode-cli":"2.6.2"
304324
}
305325
}

‎src/commands/show.ts

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { LeetCodeNode } from "../explorer/LeetCodeNode";
88
import{leetCodeChannel}from"../leetCodeChannel";
99
import{leetCodeExecutor}from"../leetCodeExecutor";
1010
import{leetCodeManager}from"../leetCodeManager";
11+
import{leetCodeSolutionProvider}from"../leetCodeSolutionProvider";
1112
import{IProblem,IQuickItemEx,languages,ProblemState}from"../shared";
1213
import{DialogOptions,DialogType,promptForOpenOutputChannel,promptForSignIn}from"../utils/uiUtils";
1314
import{selectWorkspaceFolder}from"../utils/workspaceUtils";
@@ -39,18 +40,60 @@ export async function searchProblem(): Promise<void> {
3940
awaitshowProblemInternal(choice.value);
4041
}
4142

42-
asyncfunctionshowProblemInternal(node:IProblem):Promise<void>{
43+
exportasyncfunctionshowSolution(node?:LeetCodeNode):Promise<void>{
44+
if(!node){
45+
return;
46+
}
47+
constlanguage:string|undefined=awaitfetchProblemLanguage();
48+
if(!language){
49+
return;
50+
}
4351
try{
44-
constleetCodeConfig:vscode.WorkspaceConfiguration=vscode.workspace.getConfiguration("leetcode");
45-
letdefaultLanguage:string|undefined=leetCodeConfig.get<string>("defaultLanguage");
46-
if(defaultLanguage&&languages.indexOf(defaultLanguage)<0){
47-
defaultLanguage=undefined;
52+
letsolution:string=awaitleetCodeExecutor.showSolution(node,language);
53+
// remove backslash in espaced \'...\'(generated by leetcode's database)
54+
solution=solution.replace(/\\'/g,"'");
55+
awaitleetCodeSolutionProvider.show(solution,node);
56+
}catch(error){
57+
awaitpromptForOpenOutputChannel("Failed to fetch the top voted solution. Please open the output channel for details.",DialogType.error);
58+
}
59+
}
60+
61+
// SUGGESTION: group config retriving into one file
62+
asyncfunctionfetchProblemLanguage():Promise<string|undefined>{
63+
constleetCodeConfig:vscode.WorkspaceConfiguration=vscode.workspace.getConfiguration("leetcode");
64+
letdefaultLanguage:string|undefined=leetCodeConfig.get<string>("defaultLanguage");
65+
if(defaultLanguage&&languages.indexOf(defaultLanguage)<0){
66+
defaultLanguage=undefined;
67+
}
68+
constlanguage:string|undefined=defaultLanguage||awaitvscode.window.showQuickPick(languages,{placeHolder:"Select the language you want to use"});
69+
// fire-and-forget default language query
70+
(async():Promise<void>=>{
71+
if(!defaultLanguage&&leetCodeConfig.get<boolean>("showSetDefaultLanguageHint")){
72+
constchoice:vscode.MessageItem|undefined=awaitvscode.window.showInformationMessage(
73+
`Would you like to set '${language}' as your default language?`,
74+
DialogOptions.yes,
75+
DialogOptions.no,
76+
DialogOptions.never,
77+
);
78+
if(choice===DialogOptions.yes){
79+
leetCodeConfig.update("defaultLanguage",language,true/* UserSetting */);
80+
}elseif(choice===DialogOptions.never){
81+
leetCodeConfig.update("showSetDefaultLanguageHint",false,true/* UserSetting */);
82+
}
4883
}
49-
constlanguage:string|undefined=defaultLanguage||awaitvscode.window.showQuickPick(languages,{placeHolder:"Select the language you want to use"});
84+
})();
85+
returnlanguage;
86+
}
87+
88+
asyncfunctionshowProblemInternal(node:IProblem):Promise<void>{
89+
try{
90+
constlanguage:string|undefined=awaitfetchProblemLanguage();
5091
if(!language){
5192
return;
5293
}
5394

95+
// SUGGESTION: group config retriving into one file
96+
constleetCodeConfig:vscode.WorkspaceConfiguration=vscode.workspace.getConfiguration("leetcode");
5497
letoutDir:string=awaitselectWorkspaceFolder();
5598
letrelativePath:string=(leetCodeConfig.get<string>("outputFolder")||"").trim();
5699
constmatchResult:RegExpMatchArray|null=relativePath.match(/\$\{(.*?)\}/);
@@ -69,20 +112,6 @@ async function showProblemInternal(node: IProblem): Promise<void> {
69112
constoriginFilePath:string=awaitleetCodeExecutor.showProblem(node,language,outDir);
70113
constfilePath:string=wsl.useWsl() ?awaitwsl.toWinPath(originFilePath) :originFilePath;
71114
awaitvscode.window.showTextDocument(vscode.Uri.file(filePath),{preview:false});
72-
73-
if(!defaultLanguage&&leetCodeConfig.get<boolean>("showSetDefaultLanguageHint")){
74-
constchoice:vscode.MessageItem|undefined=awaitvscode.window.showInformationMessage(
75-
`Would you like to set '${language}' as your default language?`,
76-
DialogOptions.yes,
77-
DialogOptions.no,
78-
DialogOptions.never,
79-
);
80-
if(choice===DialogOptions.yes){
81-
leetCodeConfig.update("defaultLanguage",language,true/* UserSetting */);
82-
}elseif(choice===DialogOptions.never){
83-
leetCodeConfig.update("showSetDefaultLanguageHint",false,true/* UserSetting */);
84-
}
85-
}
86115
}catch(error){
87116
awaitpromptForOpenOutputChannel("Failed to show the problem. Please open the output channel for details.",DialogType.error);
88117
}

‎src/extension.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { leetCodeExecutor } from "./leetCodeExecutor";
1717
import{leetCodeManager}from"./leetCodeManager";
1818
import{leetCodePreviewProvider}from"./leetCodePreviewProvider";
1919
import{leetCodeResultProvider}from"./leetCodeResultProvider";
20+
import{leetCodeSolutionProvider}from"./leetCodeSolutionProvider";
2021
import{leetCodeStatusBarItem}from"./leetCodeStatusBarItem";
2122

2223
exportasyncfunctionactivate(context:vscode.ExtensionContext):Promise<void>{
@@ -32,12 +33,14 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
3233
constleetCodeTreeDataProvider:LeetCodeTreeDataProvider=newLeetCodeTreeDataProvider(context);
3334
leetCodePreviewProvider.initialize(context);
3435
leetCodeResultProvider.initialize(context);
36+
leetCodeSolutionProvider.initialize(context);
3537

3638
context.subscriptions.push(
3739
leetCodeStatusBarItem,
3840
leetCodeChannel,
3941
leetCodePreviewProvider,
4042
leetCodeResultProvider,
43+
leetCodeSolutionProvider,
4144
vscode.window.createTreeView("leetCodeExplorer",{treeDataProvider:leetCodeTreeDataProvider,showCollapseAll:true}),
4245
vscode.languages.registerCodeLensProvider({scheme:"file"},codeLensProvider),
4346
vscode.commands.registerCommand("leetcode.deleteCache",()=>cache.deleteCache()),
@@ -49,6 +52,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
4952
vscode.commands.registerCommand("leetcode.previewProblem",(node:LeetCodeNode)=>leetCodePreviewProvider.preview(node)),
5053
vscode.commands.registerCommand("leetcode.showProblem",(node:LeetCodeNode)=>show.showProblem(node)),
5154
vscode.commands.registerCommand("leetcode.searchProblem",()=>show.searchProblem()),
55+
vscode.commands.registerCommand("leetcode.showSolution",(node:LeetCodeNode)=>show.showSolution(node)),
5256
vscode.commands.registerCommand("leetcode.refreshExplorer",()=>leetCodeTreeDataProvider.refresh()),
5357
vscode.commands.registerCommand("leetcode.testSolution",(uri?:vscode.Uri)=>test.testSolution(uri)),
5458
vscode.commands.registerCommand("leetcode.submitSolution",(uri?:vscode.Uri)=>submit.submitSolution(uri)),

‎src/leetCodeExecutor.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ class LeetCodeExecutor {
4848
}
4949
returnfalse;
5050
}
51-
try{// Check company plugin
52-
awaitthis.executeCommandEx("node",[awaitthis.getLeetCodeBinaryPath(),"plugin","-e","company"]);
53-
}catch(error){// Download company plugin and activate
54-
awaitthis.executeCommandEx("node",[awaitthis.getLeetCodeBinaryPath(),"plugin","-i","company"]);
51+
for(constpluginof["company","solution.discuss"]){
52+
try{// Check plugin
53+
awaitthis.executeCommandEx("node",[awaitthis.getLeetCodeBinaryPath(),"plugin","-e",plugin]);
54+
}catch(error){// Download plugin and activate
55+
awaitthis.executeCommandEx("node",[awaitthis.getLeetCodeBinaryPath(),"plugin","-i",plugin]);
56+
}
5557
}
5658
returntrue;
5759
}
@@ -87,6 +89,11 @@ class LeetCodeExecutor {
8789
returnfilePath;
8890
}
8991

92+
publicasyncshowSolution(problemNode:IProblem,language:string):Promise<string>{
93+
constsolution:string=awaitthis.executeCommandWithProgressEx("Fetching top voted solution from discussions...","node",[awaitthis.getLeetCodeBinaryPath(),"show",problemNode.id,"--solution","-l",language]);
94+
returnsolution;
95+
}
96+
9097
publicasyncgetDescription(problemNode:IProblem):Promise<string>{
9198
returnawaitthis.executeCommandWithProgressEx("Fetching problem description...","node",[awaitthis.getLeetCodeBinaryPath(),"show",problemNode.id,"-x"]);
9299
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp