From c3431b928a1f155bdc70ab9678c7acf4bfff2b62 Mon Sep 17 00:00:00 2001 From: naskya Date: Mon, 10 Apr 2023 05:42:17 +0000 Subject: [PATCH] Partially disable search MFM (#9830) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Honestly, this workaround is pure garbage when this can be achieved by deleting a small piece of code from mfm-js, but this closes #9816 anyway 😅 Co-authored-by: naskya Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9830 Co-authored-by: naskya Co-committed-by: naskya --- packages/client/src/components/mfm.ts | 38 +++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index e7f27854f8..ff8c7a8633 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -50,7 +50,9 @@ export default defineComponent({ render() { if (this.text == null || this.text === "") return; - const ast = (this.plain ? mfm.parseSimple : mfm.parse)(this.text, { + const isPlain = this.plain; + + const ast = (isPlain ? mfm.parseSimple : mfm.parse)(this.text, { fnNameList: MFM_TAGS, }); @@ -61,7 +63,7 @@ export default defineComponent({ const genEl = (ast: mfm.MfmNode[]) => concat( - ast.map((token): VNode[] => { + ast.map((token, index): VNode[] => { switch (token.type) { case "text": { const text = token.props.text.replace(/(\r\n|\n|\r)/g, "\n"); @@ -459,6 +461,38 @@ export default defineComponent({ } case "search": { + // Disable "search" keyword + // (see the issue #9816 on Codeberg) + if (token.props.content.endsWith("search")) { + const sentinel = "#"; + let ast2 = (isPlain ? mfm.parseSimple : mfm.parse)( + token.props.content.slice(0, -6) + sentinel, + { + fnNameList: MFM_TAGS, + }, + ); + if ( + ast2[ast2.length - 1].type === "text" && + ast2[ast2.length - 1].props.text.endsWith(sentinel) + ) { + ast2[ast2.length - 1].props.text = ast2[ + ast2.length - 1 + ].props.text.slice(0, -1); + } + + let prefix = "\n"; + if ( + index === 0 || + ["blockCode", "mathBlock", "search", "quote"].includes( + ast[index - 1].type, + ) + ) { + prefix = ""; + } + + return [prefix, ...genEl(ast2), "search\n"]; + } + return [ h(MkGoogle, { key: Math.random(),