@@ -1934,6 +1934,138 @@ ${fileContents}`);
19341934 '<span class="break-all">$1</span>'
19351935 ) ;
19361936
1937+ // 自动检测代码语言
1938+ const detectLanguage = ( code : string ) : string => {
1939+ // 检查代码中的特征来判断语言
1940+ if ( / \b i m p o r t \s + R e a c t | \b f r o m \s + [ ' " ] r e a c t [ ' " ] / i. test ( code ) ) {
1941+ return code . includes ( "tsx" ) || code . includes ( ":" ) ? "tsx" : "jsx" ;
1942+ }
1943+ if (
1944+ / \b i m p o r t \s + | \b e x p o r t \s + | \b c o n s t \s + \w + \s * = \s * | l e t \s + \w + \s * = \s * / i. test (
1945+ code
1946+ )
1947+ ) {
1948+ return code . includes ( ":" ) ||
1949+ code . includes ( "interface" ) ||
1950+ code . includes ( "type " )
1951+ ? "typescript"
1952+ : "javascript" ;
1953+ }
1954+ if ( / ^ ( < ! D O C T Y P E | < h t m l | < h e a d | < b o d y ) / i. test ( code ) ) {
1955+ return "html" ;
1956+ }
1957+ if ( / c l a s s = " .* ?" | c l a s s N a m e = " .* ?" | < d i v | < s p a n | < p > / i. test ( code ) ) {
1958+ return "jsx" ;
1959+ }
1960+ if ( / ^ \s * \. [ \w - ] + \s * { | @ m e d i a | @ k e y f r a m e s / i. test ( code ) ) {
1961+ return "css" ;
1962+ }
1963+ if ( / S E L E C T | I N S E R T | U P D A T E | D E L E T E | C R E A T E T A B L E / i. test ( code ) ) {
1964+ return "sql" ;
1965+ }
1966+ if ( / d e f \s + \w + \s * \( | i m p o r t \s + \w + | f r o m \s + \w + \s + i m p o r t / i. test ( code ) ) {
1967+ return "python" ;
1968+ }
1969+ if ( / p u b l i c \s + ( s t a t i c \s + ) ? ( v o i d | c l a s s | i n t | b o o l e a n ) / i. test ( code ) ) {
1970+ return "java" ;
1971+ }
1972+ if ( / ^ \s * p a c k a g e \s + \w + | f u n c \s + \w + \s * \( / i. test ( code ) ) {
1973+ return "go" ;
1974+ }
1975+ if ( / ^ # i n c l u d e \s + < | s t d : : | i n t \s + m a i n \s * \( \s * \) / i. test ( code ) ) {
1976+ return "cpp" ;
1977+ }
1978+ if (
1979+ / \$ \w + \s * = | \$ \w + \s * - > | f u n c t i o n \s + \w + \s * \( / i. test ( code ) &&
1980+ code . includes ( "<?php" )
1981+ ) {
1982+ return "php" ;
1983+ }
1984+ if ( / ^ \s * { \s * [ " ' ] \w + [ " ' ] \s * : / i. test ( code ) ) {
1985+ return "json" ;
1986+ }
1987+ if ( / n p m | y a r n | a p t - g e t | s u d o | b a s h | s h \s + / i. test ( code ) ) {
1988+ return "bash" ;
1989+ }
1990+ if ( / ^ # ! \/ b i n \/ b a s h | ^ # ! \/ b i n \/ s h / i. test ( code ) ) {
1991+ return "bash" ;
1992+ }
1993+ if ( / ^ \s * # \s + | ^ # # \s + | ^ \* \* \s + / i. test ( code ) ) {
1994+ return "markdown" ;
1995+ }
1996+
1997+ // 检查文件扩展名引用
1998+ const extMatch = code . match ( / \. ( [ a - z A - Z 0 - 9 ] + ) ( \s | $ | [ ' " ) \] } ] | : | , ) / ) ;
1999+ if ( extMatch ) {
2000+ const ext = extMatch [ 1 ] . toLowerCase ( ) ;
2001+ switch ( ext ) {
2002+ case "js" :
2003+ return "javascript" ;
2004+ case "jsx" :
2005+ return "jsx" ;
2006+ case "ts" :
2007+ return "typescript" ;
2008+ case "tsx" :
2009+ return "tsx" ;
2010+ case "py" :
2011+ return "python" ;
2012+ case "rb" :
2013+ return "ruby" ;
2014+ case "java" :
2015+ return "java" ;
2016+ case "php" :
2017+ return "php" ;
2018+ case "go" :
2019+ return "go" ;
2020+ case "cs" :
2021+ return "csharp" ;
2022+ case "html" :
2023+ return "html" ;
2024+ case "css" :
2025+ return "css" ;
2026+ case "scss" :
2027+ return "scss" ;
2028+ case "less" :
2029+ return "less" ;
2030+ case "json" :
2031+ return "json" ;
2032+ case "md" :
2033+ return "markdown" ;
2034+ case "xml" :
2035+ return "xml" ;
2036+ case "yml" :
2037+ case "yaml" :
2038+ return "yaml" ;
2039+ case "sh" :
2040+ return "bash" ;
2041+ case "sql" :
2042+ return "sql" ;
2043+ }
2044+ }
2045+
2046+ return "" ;
2047+ } ;
2048+
2049+ // 处理代码块,自动检测语言
2050+ processed = processed . replace (
2051+ / ` ` ` (?: ( \w + ) \n ) ? ( [ \s \S ] * ?) ` ` ` / g,
2052+ ( match , lang , code ) => {
2053+ // 如果已有语言标识,使用它
2054+ if ( lang && lang !== "text" && lang !== "plaintext" ) {
2055+ return match ;
2056+ }
2057+
2058+ // 自动检测语言
2059+ const detectedLang = detectLanguage ( code ) ;
2060+ if ( detectedLang ) {
2061+ return `\`\`\`${ detectedLang } \n${ code } \`\`\`` ;
2062+ }
2063+
2064+ // 如果无法检测到语言,使用text
2065+ return `\`\`\`text\n${ code } \`\`\`` ;
2066+ }
2067+ ) ;
2068+
19372069 // 防止文件名和函数关键字被错误地渲染为代码块
19382070 // 1. 修复文件名格式: 将 ```filename.ext``` 替换为 `filename.ext`
19392071 processed = processed . replace (
0 commit comments