diff --git a/packages/shaku-code-annotate-shiki-transformer/src/__tests__/__snapshots__/codeToHtml.test.ts.snap b/packages/shaku-code-annotate-shiki-transformer/src/__tests__/__snapshots__/codeToHtml.test.ts.snap index d9cd06f..369a121 100644 --- a/packages/shaku-code-annotate-shiki-transformer/src/__tests__/__snapshots__/codeToHtml.test.ts.snap +++ b/packages/shaku-code-annotate-shiki-transformer/src/__tests__/__snapshots__/codeToHtml.test.ts.snap @@ -126,3 +126,15 @@ exports[`codeToHtml() 4`] = `"
function useSomeEffect({blog}) { useEffect(() => { return () => { location.href = 'https://jser.dev' } }, [blog])}
"`;
exports[`codeToHtml() 6`] = `" function useSomeEffect({blog}) { location.href = 'https://jser.dev' }
"`;
+
+exports[`unknown lang should fallback to text 1`] = `"function ChatRoom({ roomId }) { const [serverUrl, setServerUrl] = useState('https://localhost:1234'); // ^ // [<a href=\\"https:jser.dev\\">jser.dev</a>] useEffect(() => { // ( ) const connection = createConnection(serverUrl, roomId); // (1 ) connection.connect(); return () => { //(2 ) connection.disconnect(); }; //(3 ) }, [serverUrl, roomId]);}
"`;
+
+exports[`unknown lang should fallback to text 2`] = `"function hello() { // ^! // [Hello world!]! // ^ // [Shaku <b>Shaku</b>] const blog = \\"https://jser.dev\\"}
"`;
+
+exports[`unknown lang should fallback to text 3`] = `"function useSomeEffect({blog}) { useEffect(() => { // do some stuff // @fold start return () => { // @highlight location.href = 'https://jser.dev' } // @fold ^ }, [blog])}
"`;
+
+exports[`unknown lang should fallback to text 4`] = `"// @class abc h123// @highlightfunction useSomeEffect({blog}) { useEffect(() => { return () => { location.href = 'https://jser.dev' } }, [blog])}
"`;
+
+exports[`unknown lang should fallback to text 5`] = `"function useSomeEffect({blog}) { useEffect(() => { // @data a=1 return () => { // @data a-b-c=1-2-3 beg-1=hello-2 location.href = 'https://jser.dev' } }, [blog])}
"`;
+
+exports[`unknown lang should fallback to text 6`] = `" function useSomeEffect({blog}) { // @cut v useEffect(() => { return () => { // @cut ^ location.href = 'https://jser.dev' // @cut start } }, [blog]) // @cut end // @cut // a comment to cut }
"`;
diff --git a/packages/shaku-code-annotate-shiki-transformer/src/__tests__/codeToHtml.test.ts b/packages/shaku-code-annotate-shiki-transformer/src/__tests__/codeToHtml.test.ts
index f7a1126..ce00c17 100644
--- a/packages/shaku-code-annotate-shiki-transformer/src/__tests__/codeToHtml.test.ts
+++ b/packages/shaku-code-annotate-shiki-transformer/src/__tests__/codeToHtml.test.ts
@@ -129,3 +129,18 @@ test("codeToHtml() + raw HTML + explicit trigger", async () => {
expect(html).toMatchSnapshot();
}
});
+
+test("unknown lang should fallback to text", async () => {
+ const processor = await fetchProcessor(
+ "javascript",
+ true /* useDangerousRawHtml */
+ );
+
+ for (const snippet of snippets) {
+ const html = await processor
+ .process(`\`\`\`unknown \n${snippet}\n\`\`\``)
+ .then((result) => result.toString());
+
+ expect(html).toMatchSnapshot();
+ }
+});
diff --git a/packages/shaku-code-annotate-shiki-transformer/src/__tests__/util.ts b/packages/shaku-code-annotate-shiki-transformer/src/__tests__/util.ts
index e3c94c7..5900717 100644
--- a/packages/shaku-code-annotate-shiki-transformer/src/__tests__/util.ts
+++ b/packages/shaku-code-annotate-shiki-transformer/src/__tests__/util.ts
@@ -5,12 +5,27 @@ import remarkRehype from "remark-rehype";
import { unified } from "unified";
import shakuCodeAnnotateShikiTransformer from "..";
import * as shiki from "shiki";
+import { visit } from "unist-util-visit";
+import { commentPatterns } from "../commentPatterns";
export const unifiedProcessor = unified()
.use(remarkParse)
.use(remarkRehype) // this sanitize html by default
.use(rehypeStringify);
+function remarkFallbackLang() {
+ return (tree) => {
+ visit(tree, "code", (node) => {
+ if (node.lang) {
+ node.lang = node.lang.toLowerCase();
+ if (!(node.lang in commentPatterns)) {
+ node.lang = "text";
+ }
+ }
+ });
+ };
+}
+
export function fetchProcessor(
lang: string,
useDangerousRawHtml: boolean,
@@ -24,6 +39,7 @@ export function fetchProcessor(
.then((highlighter) =>
unified()
.use(remarkParse)
+ .use(remarkFallbackLang)
.use(remarkRehype)
.use(rehypeShiki, {
transformers: [