Spaces:
Paused
Paused
| import { VarType } from '../../types' | |
| import type { OutputVar } from './types' | |
| import { CodeLanguage } from './types' | |
| export const extractFunctionParams = (code: string, language: CodeLanguage) => { | |
| if (language === CodeLanguage.json) | |
| return [] | |
| const patterns: Record<Exclude<CodeLanguage, CodeLanguage.json>, RegExp> = { | |
| [CodeLanguage.python3]: /def\s+main\s*\((.*?)\)/, | |
| [CodeLanguage.javascript]: /function\s+main\s*\((.*?)\)/, | |
| } | |
| const match = code.match(patterns[language]) | |
| const params: string[] = [] | |
| if (match?.[1]) { | |
| params.push(...match[1].split(',') | |
| .map(p => p.trim()) | |
| .filter(Boolean) | |
| .map(p => p.split(':')[0].trim()), | |
| ) | |
| } | |
| return params | |
| } | |
| export const extractReturnType = (code: string, language: CodeLanguage): OutputVar => { | |
| const codeWithoutComments = code.replace(/\/\*\*[\s\S]*?\*\//, '') | |
| console.log(codeWithoutComments) | |
| const returnIndex = codeWithoutComments.indexOf('return') | |
| if (returnIndex === -1) | |
| return {} | |
| // returnから始まる部分文字列を取得 | |
| const codeAfterReturn = codeWithoutComments.slice(returnIndex) | |
| let bracketCount = 0 | |
| let startIndex = codeAfterReturn.indexOf('{') | |
| if (language === CodeLanguage.javascript && startIndex === -1) { | |
| const parenStart = codeAfterReturn.indexOf('(') | |
| if (parenStart !== -1) | |
| startIndex = codeAfterReturn.indexOf('{', parenStart) | |
| } | |
| if (startIndex === -1) | |
| return {} | |
| let endIndex = -1 | |
| for (let i = startIndex; i < codeAfterReturn.length; i++) { | |
| if (codeAfterReturn[i] === '{') | |
| bracketCount++ | |
| if (codeAfterReturn[i] === '}') { | |
| bracketCount-- | |
| if (bracketCount === 0) { | |
| endIndex = i + 1 | |
| break | |
| } | |
| } | |
| } | |
| if (endIndex === -1) | |
| return {} | |
| const returnContent = codeAfterReturn.slice(startIndex + 1, endIndex - 1) | |
| console.log(returnContent) | |
| const result: OutputVar = {} | |
| const keyRegex = /['"]?(\w+)['"]?\s*:(?![^{]*})/g | |
| const matches = returnContent.matchAll(keyRegex) | |
| for (const match of matches) { | |
| console.log(`Found key: "${match[1]}" from match: "${match[0]}"`) | |
| const key = match[1] | |
| result[key] = { | |
| type: VarType.string, | |
| children: null, | |
| } | |
| } | |
| console.log(result) | |
| return result | |
| } | |