diff --git a/.gitignore b/.gitignore index 003c719..ff996f4 100644 --- a/.gitignore +++ b/.gitignore @@ -59,7 +59,6 @@ typings/ # Output out -*.vsix .vscode-test # Mac diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1ca8c37..d834174 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -9,12 +9,7 @@ "kind": "build", "isDefault": true }, - "args": [ - "run", - "compile", - "--loglevel", - "silent" - ], + "args": ["run", "compile", "--loglevel", "silent"], "isBackground": true, "presentation": { "reveal": "silent" @@ -25,9 +20,19 @@ "type": "npm", "script": "lint", "problemMatcher": { - "base": "$tslint5", + "owner": "tslint", + "pattern": [ + { + "regexp": "^([^\\s].*)\\((\\d+),(\\d+)\\):\\s+(error|warning|info)\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + ], "fileLocation": "absolute" } } ] -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 2ac17cf..1829d15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-leetcode", - "version": "0.18.1", + "version": "0.18.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-leetcode", - "version": "0.18.1", + "version": "0.18.4", "license": "MIT", "dependencies": { "axios": "^1.6.8", @@ -1717,7 +1717,7 @@ }, "node_modules/tslint": { "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "resolved": "https://registry.npmmirror.com/tslint/-/tslint-5.20.1.tgz", "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "dependencies": { @@ -3522,7 +3522,7 @@ }, "tslint": { "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "resolved": "https://registry.npmmirror.com/tslint/-/tslint-5.20.1.tgz", "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "requires": { diff --git a/package.json b/package.json index 53552b7..03a04c1 100644 --- a/package.json +++ b/package.json @@ -293,11 +293,26 @@ { "title": "LeetCode", "properties": { - "leetcode.hideSolved": { - "type": "boolean", - "default": false, + "leetcode.hide": { + "type": "array", + "default": [], "scope": "application", - "description": "Hide solved problems." + "items": { + "type": "string", + "enum": [ + "AC", + "NotAC", + "Unknown", + "Locked" + ], + "enumDescriptions": [ + "已解答", + "尝试过", + "待完成", + "Locked" + ] + }, + "description": "Hide problems." }, "leetcode.defaultLanguage": { "type": "string", diff --git a/src/explorer/explorerNodeManager.ts b/src/explorer/explorerNodeManager.ts index a04ad55..4d854d1 100644 --- a/src/explorer/explorerNodeManager.ts +++ b/src/explorer/explorerNodeManager.ts @@ -5,20 +5,19 @@ import * as _ from "lodash"; import { Disposable } from "vscode"; import * as list from "../commands/list"; import { getSortingStrategy } from "../commands/plugin"; -import { Category, defaultProblem, ProblemState, SortingStrategy } from "../shared"; -import { shouldHideSolvedProblem } from "../utils/settingUtils"; +import { Category, defaultProblem, SortingStrategy } from "../shared"; +import { shouldHideProblem } from "../utils/settingUtils"; import { LeetCodeNode } from "./LeetCodeNode"; class ExplorerNodeManager implements Disposable { private explorerNodeMap: Map = new Map(); private companySet: Set = new Set(); private tagSet: Set = new Set(); - public async refreshCache(): Promise { this.dispose(); - const shouldHideSolved: boolean = shouldHideSolvedProblem(); + const shouldHide: Set = shouldHideProblem(); for (const problem of await list.listProblems()) { - if (shouldHideSolved && problem.state === ProblemState.AC) { + if (shouldHide.has(problem.state)) { continue; } this.explorerNodeMap.set(problem.id, new LeetCodeNode(problem)); @@ -33,50 +32,72 @@ class ExplorerNodeManager implements Disposable { public getRootNodes(): LeetCodeNode[] { return [ - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: Category.All, - name: Category.All, - }), false), - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: Category.Difficulty, - name: Category.Difficulty, - }), false), - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: Category.Tag, - name: Category.Tag, - }), false), - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: Category.Company, - name: Category.Company, - }), false), - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: Category.Favorite, - name: Category.Favorite, - }), false), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: Category.All, + name: Category.All, + }), + false + ), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: Category.Difficulty, + name: Category.Difficulty, + }), + false + ), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: Category.Tag, + name: Category.Tag, + }), + false + ), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: Category.Company, + name: Category.Company, + }), + false + ), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: Category.Favorite, + name: Category.Favorite, + }), + false + ), ]; } public getAllNodes(): LeetCodeNode[] { - return this.applySortingStrategy( - Array.from(this.explorerNodeMap.values()), - ); + return this.applySortingStrategy(Array.from(this.explorerNodeMap.values())); } public getAllDifficultyNodes(): LeetCodeNode[] { const res: LeetCodeNode[] = []; res.push( - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: `${Category.Difficulty}.Easy`, - name: "Easy", - }), false), - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: `${Category.Difficulty}.Medium`, - name: "Medium", - }), false), - new LeetCodeNode(Object.assign({}, defaultProblem, { - id: `${Category.Difficulty}.Hard`, - name: "Hard", - }), false), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: `${Category.Difficulty}.Easy`, + name: "Easy", + }), + false + ), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: `${Category.Difficulty}.Medium`, + name: "Medium", + }), + false + ), + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: `${Category.Difficulty}.Hard`, + name: "Hard", + }), + false + ) ); this.sortSubCategoryNodes(res, Category.Difficulty); return res; @@ -85,10 +106,15 @@ class ExplorerNodeManager implements Disposable { public getAllCompanyNodes(): LeetCodeNode[] { const res: LeetCodeNode[] = []; for (const company of this.companySet.values()) { - res.push(new LeetCodeNode(Object.assign({}, defaultProblem, { - id: `${Category.Company}.${company}`, - name: _.startCase(company), - }), false)); + res.push( + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: `${Category.Company}.${company}`, + name: _.startCase(company), + }), + false + ) + ); } this.sortSubCategoryNodes(res, Category.Company); return res; @@ -97,10 +123,15 @@ class ExplorerNodeManager implements Disposable { public getAllTagNodes(): LeetCodeNode[] { const res: LeetCodeNode[] = []; for (const tag of this.tagSet.values()) { - res.push(new LeetCodeNode(Object.assign({}, defaultProblem, { - id: `${Category.Tag}.${tag}`, - name: _.startCase(tag), - }), false)); + res.push( + new LeetCodeNode( + Object.assign({}, defaultProblem, { + id: `${Category.Tag}.${tag}`, + name: _.startCase(tag), + }), + false + ) + ); } this.sortSubCategoryNodes(res, Category.Tag); return res; @@ -193,9 +224,12 @@ class ExplorerNodeManager implements Disposable { private applySortingStrategy(nodes: LeetCodeNode[]): LeetCodeNode[] { const strategy: SortingStrategy = getSortingStrategy(); switch (strategy) { - case SortingStrategy.AcceptanceRateAsc: return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(x.acceptanceRate) - Number(y.acceptanceRate)); - case SortingStrategy.AcceptanceRateDesc: return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(y.acceptanceRate) - Number(x.acceptanceRate)); - default: return nodes; + case SortingStrategy.AcceptanceRateAsc: + return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(x.acceptanceRate) - Number(y.acceptanceRate)); + case SortingStrategy.AcceptanceRateDesc: + return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(y.acceptanceRate) - Number(x.acceptanceRate)); + default: + return nodes; } } } diff --git a/src/utils/settingUtils.ts b/src/utils/settingUtils.ts index 7b6eb6c..782368e 100644 --- a/src/utils/settingUtils.ts +++ b/src/utils/settingUtils.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { workspace, WorkspaceConfiguration } from "vscode"; -import { DescriptionConfiguration } from "../shared"; +import { DescriptionConfiguration, ProblemState } from "../shared"; export function getWorkspaceConfiguration(): WorkspaceConfiguration { return workspace.getConfiguration("leetcode"); @@ -12,6 +12,28 @@ export function shouldHideSolvedProblem(): boolean { return getWorkspaceConfiguration().get("hideSolved", false); } +export function shouldHideProblem(): Set { + const statusArr: string[] = getWorkspaceConfiguration().get("hide", []); + const res: Set = new Set(); + for (const s of statusArr) { + switch (s) { + case "AC": + res.add(ProblemState.AC); + break; + case "NotAC": + res.add(ProblemState.NotAC); + break; + case "Unknown": + res.add(ProblemState.Unknown); + break; + case "Locked": + res.add(ProblemState.Locked); + break; + } + } + return res; +} + export function getWorkspaceFolder(): string { return getWorkspaceConfiguration().get("workspaceFolder", ""); } diff --git a/vscode-leetcode-0.18.4.vsix b/vscode-leetcode-0.18.4.vsix new file mode 100644 index 0000000..8e8d947 Binary files /dev/null and b/vscode-leetcode-0.18.4.vsix differ