mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-24 18:50:56 +08:00
refactor: hard-coded language map (#7360)
This commit is contained in:
parent
5a50748c65
commit
1434062bdd
@ -168,7 +168,6 @@
|
||||
"husky": "^9.1.7",
|
||||
"i18next": "^23.11.5",
|
||||
"jest-styled-components": "^7.2.0",
|
||||
"linguist-languages": "^8.0.0",
|
||||
"lint-staged": "^15.5.0",
|
||||
"lodash": "^4.17.21",
|
||||
"lru-cache": "^11.1.0",
|
||||
|
||||
2904
packages/shared/config/languages.ts
Normal file
2904
packages/shared/config/languages.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -146,15 +146,15 @@ describe('markdown', () => {
|
||||
|
||||
describe('getExtensionByLanguage', () => {
|
||||
// 批量测试语言名称到扩展名的映射
|
||||
const testLanguageExtensions = async (testCases: Record<string, string>) => {
|
||||
const testLanguageExtensions = (testCases: Record<string, string>) => {
|
||||
for (const [language, expectedExtension] of Object.entries(testCases)) {
|
||||
const result = await getExtensionByLanguage(language)
|
||||
const result = getExtensionByLanguage(language)
|
||||
expect(result).toBe(expectedExtension)
|
||||
}
|
||||
}
|
||||
|
||||
it('should return extension for exact language name match', async () => {
|
||||
await testLanguageExtensions({
|
||||
it('should return extension for exact language name match', () => {
|
||||
testLanguageExtensions({
|
||||
'4D': '.4dm',
|
||||
'C#': '.cs',
|
||||
JavaScript: '.js',
|
||||
@ -166,8 +166,8 @@ describe('markdown', () => {
|
||||
})
|
||||
})
|
||||
|
||||
it('should return extension for case-insensitive language name match', async () => {
|
||||
await testLanguageExtensions({
|
||||
it('should return extension for case-insensitive language name match', () => {
|
||||
testLanguageExtensions({
|
||||
'4d': '.4dm',
|
||||
'c#': '.cs',
|
||||
javascript: '.js',
|
||||
@ -179,8 +179,8 @@ describe('markdown', () => {
|
||||
})
|
||||
})
|
||||
|
||||
it('should return extension for language aliases', async () => {
|
||||
await testLanguageExtensions({
|
||||
it('should return extension for language aliases', () => {
|
||||
testLanguageExtensions({
|
||||
js: '.js',
|
||||
node: '.js',
|
||||
'obj-c++': '.mm',
|
||||
@ -191,15 +191,15 @@ describe('markdown', () => {
|
||||
})
|
||||
})
|
||||
|
||||
it('should return fallback extension for unknown languages', async () => {
|
||||
await testLanguageExtensions({
|
||||
it('should return fallback extension for unknown languages', () => {
|
||||
testLanguageExtensions({
|
||||
'unknown-language': '.unknown-language',
|
||||
custom: '.custom'
|
||||
})
|
||||
})
|
||||
|
||||
it('should handle empty string input', async () => {
|
||||
await testLanguageExtensions({
|
||||
it('should handle empty string input', () => {
|
||||
testLanguageExtensions({
|
||||
'': '.'
|
||||
})
|
||||
})
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
import { languages } from '@shared/config/languages'
|
||||
import remarkParse from 'remark-parse'
|
||||
import remarkStringify from 'remark-stringify'
|
||||
import removeMarkdown from 'remove-markdown'
|
||||
@ -54,16 +55,6 @@ export function removeTrailingDoubleSpaces(markdown: string): string {
|
||||
return markdown.replace(/ {2}$/gm, '')
|
||||
}
|
||||
|
||||
const predefinedExtensionMap: Record<string, string> = {
|
||||
html: '.html',
|
||||
javascript: '.js',
|
||||
typescript: '.ts',
|
||||
python: '.py',
|
||||
json: '.json',
|
||||
markdown: '.md',
|
||||
text: '.txt'
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据语言名称获取文件扩展名
|
||||
* - 先精确匹配,再忽略大小写,最后匹配别名
|
||||
@ -71,36 +62,26 @@ const predefinedExtensionMap: Record<string, string> = {
|
||||
* @param language 语言名称
|
||||
* @returns 文件扩展名
|
||||
*/
|
||||
export async function getExtensionByLanguage(language: string): Promise<string> {
|
||||
export function getExtensionByLanguage(language: string): string {
|
||||
const lowerLanguage = language.toLowerCase()
|
||||
|
||||
// 常用的扩展名
|
||||
const predefined = predefinedExtensionMap[lowerLanguage]
|
||||
if (predefined) {
|
||||
return predefined
|
||||
}
|
||||
|
||||
const languages = await import('linguist-languages')
|
||||
|
||||
// 精确匹配语言名称
|
||||
const directMatch = languages[language as keyof typeof languages] as any
|
||||
const directMatch = languages[language]
|
||||
if (directMatch?.extensions?.[0]) {
|
||||
return directMatch.extensions[0]
|
||||
}
|
||||
|
||||
// 大小写不敏感的语言名称匹配
|
||||
for (const [langName, data] of Object.entries(languages)) {
|
||||
const languageData = data as any
|
||||
if (langName.toLowerCase() === lowerLanguage && languageData.extensions?.[0]) {
|
||||
return languageData.extensions[0]
|
||||
if (langName.toLowerCase() === lowerLanguage && data.extensions?.[0]) {
|
||||
return data.extensions[0]
|
||||
}
|
||||
}
|
||||
|
||||
// 通过别名匹配
|
||||
for (const [, data] of Object.entries(languages)) {
|
||||
const languageData = data as any
|
||||
if (languageData.aliases?.includes(lowerLanguage)) {
|
||||
return languageData.extensions?.[0] || `.${language}`
|
||||
if (data.aliases?.some((alias) => alias.toLowerCase() === lowerLanguage)) {
|
||||
return data.extensions?.[0] || `.${language}`
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -5688,7 +5688,6 @@ __metadata:
|
||||
i18next: "npm:^23.11.5"
|
||||
jest-styled-components: "npm:^7.2.0"
|
||||
jsdom: "npm:26.1.0"
|
||||
linguist-languages: "npm:^8.0.0"
|
||||
lint-staged: "npm:^15.5.0"
|
||||
lodash: "npm:^4.17.21"
|
||||
lru-cache: "npm:^11.1.0"
|
||||
@ -11875,13 +11874,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"linguist-languages@npm:^8.0.0":
|
||||
version: 8.0.0
|
||||
resolution: "linguist-languages@npm:8.0.0"
|
||||
checksum: 10c0/eaae46254247b9aa5b287ac98e062e7fe859314328ce305e34e152bc7bb172d69633999320cb47dc2a710388179712a76bb1ddd6e39e249af2684a4f0a66256c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"linkify-it@npm:^5.0.0":
|
||||
version: 5.0.0
|
||||
resolution: "linkify-it@npm:5.0.0"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user