Skip to content

Commit 4d4b86f

Browse files
committed
feat:create file by lang
1 parent 0612bab commit 4d4b86f

15 files changed

+80
-36
lines changed

common/utils/question-getter/getQuestionById.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import {getQuestionDetail} from "../question-handler/getQuestionDetail.js";
33
import {graphql} from "#common/utils/http/graphql.js";
44
export async function getQuestionById(id) {
55
const base = await graphql(getQuestionSearchJson(id.toString()));
6-
const questionContent = base.data.problemsetQuestionList.questions.find((o) => o.frontendQuestionId === id.toString());
6+
const questionContent = base?.['data']?.['problemsetQuestionList']?.['questions']?.find((o) => o?.['frontendQuestionId'] === id.toString());
77
if(!questionContent) {
88
return {
99
id: null,
1010
}
1111
}
1212
const slug = questionContent.titleSlug;
13-
const question = await getQuestionDetail(slug);
13+
const question = await getQuestionDetail(slug,{id});
1414
return question;
1515
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import {graphql} from "#common/utils/http/graphql.js";
2+
import {getQuestionCodeListJson} from "#resources/headers/questionCodeListJson.js";
3+
4+
/**
5+
* 获取代码列表
6+
* @param slug
7+
* @returns {Promise<*>}
8+
*/
9+
export const getQuestionCodeList = async (slug)=>{
10+
const res = await graphql(getQuestionCodeListJson(slug));
11+
return res.data.question?.codeSnippets;
12+
}

common/utils/question-handler/createQuestion.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import fs from "fs";
22
import path from "path";
33
import {fulfillQuestion} from "#common/utils/question-handler/fulfillQuestion.js";
44
import {template} from "#resources/template/template.js";
5+
import {getQuestionFileExtension} from "#common/utils/question-handler/questionLanguage.js";
56

67
/**
78
* 创建问题
@@ -11,7 +12,7 @@ import {template} from "#resources/template/template.js";
1112
*/
1213
export const createQuestion = (question, questionDir) => {
1314
return new Promise(resolve => {
14-
let filePath = path.normalize(path.join(questionDir, 'index.js'));
15+
let filePath = path.normalize(path.join(questionDir, `question${getQuestionFileExtension(question.lang)}`));
1516
if (fs.existsSync(filePath)) {
1617
resolve(false);
1718
} else {

common/utils/question-handler/createQuestionCopy.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import {getCountBySameName} from "#common/utils/file/getCountBySameName.js";
33
import {createQuestionFile} from "#common/utils/question-handler/createQuestion.js";
44
import path from "path";
5+
import {getQuestionFileExtension} from "#common/utils/question-handler/questionLanguage.js";
56

67
/**
78
* 创建副本
@@ -15,6 +16,6 @@ export const createQuestionCopy = (question, questionDir)=>{
1516
const name = `${question.id}.${question.slug}`;
1617
const affix = ` [${getCountBySameName(dir,name)}]`;
1718
const copyFileDir = path.join(dir,`${name}${affix}`);
18-
const copyFilePath = path.join(copyFileDir,`index.js`);
19+
const copyFilePath = path.join(copyFileDir,`question${getQuestionFileExtension(question.lang)}`);
1920
return createQuestionFile(copyFileDir,copyFilePath,question);
2021
}

common/utils/question-handler/fulfillQuestion.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const generateTemplateContent = (data, question) =>
2828
.replace('@url', question.url)
2929
.replace(/\n+/g, '\n')
3030
.replaceAll('\n', '\n * '))
31-
.replace('// @Function', question.jsCode)
31+
.replace('// @Function', question.code)
3232
.replace('// @TestCase', getTestCase(question))
3333
.replace('@url', getQuestionUrl(question.slug));
3434
/**
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import {getQuestionCodeList} from "#common/utils/question-getter/getQuestionCodeList.js";
2+
3+
/**
4+
* 获取代码
5+
* @param slug
6+
* @param lang
7+
* @returns {Promise<*>}
8+
*/
9+
export const getCode = async (slug,lang)=>{
10+
const list = await getQuestionCodeList(slug);
11+
return list.find(o=>o.langSlug === lang)?.code;
12+
}

common/utils/question-handler/getQuestionDetail.js

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
1-
import {getJSCode} from "./getJSCode.js";
21
import {getQuestionDetailJson} from "#resources/headers/questionDetailJson.js";
2+
import {getCode} from "#common/utils/question-handler/getCode.js";
3+
import {getQuestionLanguage} from "#common/utils/question-handler/questionLanguage.js";
4+
import {graphql} from "#common/utils/http/graphql.js";
35

4-
export async function getQuestionDetail(slug, extra) {
6+
/**
7+
* 获取代码详情
8+
* @param slug
9+
* @param extra
10+
* @returns {Promise<*&{code: *, detail: *, title: *, slug}>}
11+
*/
12+
export async function getQuestionDetail(slug, extra = {}) {
513
// 标题的英文字符串
6-
const questionDetail = await fetch('https://leetcode.cn/graphql/', getQuestionDetailJson(slug)).then(((res) => res.json()));
14+
const questionDetail = await graphql(getQuestionDetailJson(slug));
715
const detail = questionDetail.data.question;
8-
const jsCode = await getJSCode(slug);
16+
const curLang = await getQuestionLanguage();
17+
const code = await getCode(slug,curLang);
918
return {
19+
id: detail?.['questionId'],
1020
slug: slug,
11-
title: detail.translatedTitle,
12-
detail: detail.translatedContent,
13-
...jsCode,
21+
title: detail?.['translatedTitle'],
22+
detail: detail?.['translatedContent'],
23+
lang:curLang,
24+
code,
1425
...extra,
1526
};
1627
}

common/utils/question-handler/getTestCase.js

+15-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {getDataStructure} from "./parseStructure.js";
22
import {removeDomTags} from "../functions/removeDomTags.js";
3+
import {DefaultLang} from "#common/constants/question.const.js";
34

45
/**
56
* test case 需要从两个地方拿到内容
@@ -23,16 +24,19 @@ export function getTestCase(question) {
2324
?.map((str) => `[${removeDomTags(str?.replace(inputStartReg, '')?.replace(endReg, '')?.replace('\n', '').replace(/[a-zA-Z]+ =/g,""))}]`);
2425
const expires = detail.match(outputReg)
2526
?.map((str) => removeDomTags(str?.replace(outputStartReg, '')?.replace(endReg, '')?.replace('\n', '').replace(/[a-zA-Z]+ =/g,"")));
26-
const functionName = question.jsCode?.match(/(var|let|const).+=/g)?.[0]?.replace(/((var|let|const)|=)\s?/gm, '').trim();
27-
return `showLogs(
28-
${functionName},
29-
{
30-
data: [${cases}],
31-
structure: ${JSON.stringify(getDataStructure(question.jsCode))},
32-
},
33-
{
34-
data: [${expires}],
35-
structure: ${JSON.stringify(getDataStructure(question.jsCode, 'return'))}
27+
if(question.lang === DefaultLang){
28+
const functionName = question.code?.match(/(var|let|const).+=/g)?.[0]?.replace(/((var|let|const)|=)\s?/gm, '').trim();
29+
return `showLogs(\n${functionName},\n{\ndata: [${cases}],\nstructure: ${JSON.stringify(getDataStructure(question.code))},\n},\n{\ndata: [${expires}],\nstructure: ${JSON.stringify(getDataStructure(question.code, 'return'))}\n}\n)`;
30+
}else{
31+
// 其他语言无法支持测试 只能提供测试数据
32+
console.log(cases,expires);
33+
let showText = `\/* 暂无法支持除JS外的语言测试,提取的一些入参和返回值供自行测试,每一个case中的第一行为入参,第二行为返回值\n`;
34+
for (let i = 0; i < Math.max(cases.length,expires.length); i++) {
35+
showText += `case ${i+1}:\n`;
36+
showText += `${cases?.[i]}\n`??'[参数获取错误]\n';
37+
showText += `${expires?.[i]}\n`??'[返回值获取错误]\n';
38+
}
39+
showText += `\n*\/`
40+
return showText;
3641
}
37-
)`;
3842
}

common/utils/question-handler/parseStructure.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,19 @@ export const setDataStructure = (params, structs, type = 'cases') => params.map(
3535

3636
/**
3737
* 获取test case 入参的数据类型
38-
* @param {string} jsCode leetcode的实例函数体
38+
* @param {string} code leetcode的实例函数体
3939
* @param {string} type 类型,param入参,returns返回值
4040
* @returns {string[]}
4141
*/
42-
export const getDataStructure = (jsCode, type = 'param') => {
42+
export const getDataStructure = (code, type = 'param') => {
4343
const regexMap = {
4444
param: /@param\s+{\s*([^}\s]+)\s*}/g,
4545
return: /@return\s+{\s*([^}\s]+)\s*}/g,
4646
};
4747
const regex = regexMap[type];
4848
const paramTypes = [];
4949
let match;
50-
while ((match = regex.exec(jsCode)) !== null) {
50+
while ((match = regex.exec(code)) !== null) {
5151
paramTypes.push(match[1]);
5252
}
5353
return paramTypes;

common/utils/store/schemas/question.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ export class Question extends Realm.Object {
99
slug: "string",
1010
title: "string",
1111
detail: "string",
12-
jsCode: "string",
12+
lang: "string",
13+
code: "string",
1314
url: "string?",
1415
date: "string?",
1516
timestamp: {type:"date",default:()=>new Date()}

common/view/check.view.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export const easyCheckView = async () => {
7575
questionDir = path.join(questionParentDir, selectQuestion);
7676
console.log(`用户选择题目[ ${questionFileName}]的副本[ ${selectQuestion}]进行检测`)
7777
}
78-
const filePath = path.join(questionDir, "index.js");
78+
const filePath = path.join(questionDir, `question${question.lang}`);
7979
await checkQuestion(filePath);
8080
console.log(`题目[${questionFileName}]检查完成!\n文件地址为: ${filePath}`)
8181
process.exit(0)

common/view/language.view.js

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import {LANGUAGES, setQuestionLanguage} from "#common/utils/question-handler/questionLanguage.js";
22
import inquirer from "inquirer";
3+
import {getCode} from "#common/utils/question-handler/getCode.js";
4+
import {DefaultLang} from "#common/constants/question.const.js";
35

4-
export const easyLanguageView = async (defaultLang = "javascript")=>{
6+
export const easyLanguageView = async (defaultLang = DefaultLang)=>{
57
const list = LANGUAGES.map(o=>o.name);
68
const setQuestion = [{
79
type:"list",
8-
name:"set",
10+
name:"newSet",
911
message: "请确认你要设置CLI的语言环境(如果选项匹配成功,那么按下回车确认即可)",
1012
choices:list,
1113
default:defaultLang
1214
}];
13-
const {set} = await inquirer.prompt(setQuestion,null);
14-
console.log("设置语言环境为:",set)
15-
await setQuestionLanguage(set);
15+
const {newSet} = await inquirer.prompt(setQuestion,null);
16+
console.log("设置语言环境为:",newSet)
17+
await setQuestionLanguage(newSet);
1618
process.exit(0);
1719
}

resources/headers/questionCodeListJson.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export function getCodeListJson(slug) {
1+
export function getQuestionCodeListJson(slug) {
22
return {
33
headers: { "content-type": "application/json" },
44
body: `{"query":"\\n query questionEditorData($titleSlug: String!) {\\n question(titleSlug: $titleSlug) {\\n questionId\\n questionFrontendId\\n codeSnippets {\\n lang\\n langSlug\\n code\\n }\\n envInfo\\n enableRunCode\\n hasFrontendPreview\\n frontendPreviews\\n }\\n}\\n ","variables":{"titleSlug":"${slug}"},"operationName":"questionEditorData"}`,
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export function getQuestionDetailJson(slug) {
22
return {
33
headers: { "content-type": "application/json" },
4-
body: `{"query":"\\n query questionTranslations($titleSlug: String!) {\\n question(titleSlug: $titleSlug) {\\n translatedTitle\\n translatedContent\\n }\\n}\\n ","variables":{"titleSlug":"${slug}"},"operationName":"questionTranslations"}`,
4+
body: `{"query":"\\n query questionTranslations($titleSlug: String!) {\\n question(titleSlug: $titleSlug) {questionId\\n translatedTitle\\n translatedContent\\n }\\n}\\n ","variables":{"titleSlug":"${slug}"},"operationName":"questionTranslations"}`,
55
method: 'POST',
66
};
77
}

test/create.spec.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const isContainJsCode = (input) => funRegex.test(input);
1515
const isContainTestCase = (input) => input.includes('showLogs(');
1616

1717
const handleText = (input) => input.replace(/\n+/g, '\n').replaceAll('\n', '\n * ');
18-
const mockKeys = [ 'slug', 'title', 'detail', 'id', 'jsCode', 'date' ];
18+
const mockKeys = [ 'slug', 'title', 'detail', 'id', 'lang','code', 'date' ];
1919
const oneDay = 24*60*60*1000;
2020

2121
function isValidQuestion(res) {

0 commit comments

Comments
 (0)