From be8b47dedb7dbeb4563dfc37942eb24e6e11b607 Mon Sep 17 00:00:00 2001 From: zinc0x1E Date: Fri, 21 Jul 2023 01:11:36 +0800 Subject: [PATCH] feat: replace cloze (cherry picked from commit 8ce47c375b3f3839092d579bc6c7e0e61cf199af) --- esbuild.config.mjs | 2 +- src/blueprints/basic-codeblock.ts | 1 + src/blueprints/sandwich.ts | 1 + src/notes/base.ts | 2 ++ src/processors/postprocessors/cloze.ts | 46 ++++++++++++++++++++++++++ tsconfig.json | 1 + 6 files changed, 52 insertions(+), 1 deletion(-) diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 9c6f934..62bad4d 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -57,7 +57,7 @@ esbuild platform: 'node', format: 'cjs', watch: !prod, - target: 'es2016', + target: 'es2021', logLevel: 'info', loader: { '.pegjs': 'text', diff --git a/src/blueprints/basic-codeblock.ts b/src/blueprints/basic-codeblock.ts index 4218e86..dab9540 100644 --- a/src/blueprints/basic-codeblock.ts +++ b/src/blueprints/basic-codeblock.ts @@ -39,6 +39,7 @@ export class BasicCodeBlockBlueprint extends CodeBlockBlueprint { delete: note.config.delete, enabled: note.config.enabled, cloze: note.config.cloze, + clozeReplacements: note.config.clozeReplacements, }) let str = '' diff --git a/src/blueprints/sandwich.ts b/src/blueprints/sandwich.ts index 68ac2ad..a4b8d68 100644 --- a/src/blueprints/sandwich.ts +++ b/src/blueprints/sandwich.ts @@ -30,6 +30,7 @@ export class SandwichBlueprint extends Blueprint { delete: note.config.delete, enabled: note.config.enabled, cloze: note.config.cloze, + clozeReplacements: note.config.clozeReplacements, }) let str = '' diff --git a/src/notes/base.ts b/src/notes/base.ts index 19935aa..4692539 100644 --- a/src/notes/base.ts +++ b/src/notes/base.ts @@ -20,6 +20,7 @@ export interface Config { delete?: boolean enabled?: boolean cloze?: boolean + clozeReplacements?: Array } export interface ParseConfig extends Config { @@ -42,6 +43,7 @@ export const ParseConfigSchema: yup.SchemaOf = yup.object({ delete: yup.boolean().nullAsUndefined(), enabled: yup.boolean().nullAsUndefined(), cloze: yup.boolean().nullAsUndefined(), + clozeReplacements: yup.array().of(yup.string()).notRequired(), }) // Location diff --git a/src/processors/postprocessors/cloze.ts b/src/processors/postprocessors/cloze.ts index 90d170c..6f2d194 100644 --- a/src/processors/postprocessors/cloze.ts +++ b/src/processors/postprocessors/cloze.ts @@ -3,6 +3,35 @@ import { NoteBase } from 'ankibridge/notes/base' import { ProcessorContext } from 'ankibridge/processors/base' import { Postprocessor } from 'ankibridge/processors/postprocessors/base' +const processClozeReplacement = (raw: string): [RegExp | string, string] => { + // regex, e.g.: /foobar/g + const regexModeMatching = raw.match(/^\/(.*?)\/(.?)$/) + if (regexModeMatching) { + const pattern = regexModeMatching[1] + const flags = regexModeMatching[2] + const replaceValue = "$1" + return [new RegExp(`(${pattern})`, flags), replaceValue] + } + + // regex with specified replace value, e.g.: /foo(bar)/g, $1 + const regexWithReplaceValueModeMatching = raw.match(/^\/(.*?)\/(.?),\s+(.*?)$/) + if (regexWithReplaceValueModeMatching) { + const pattern = regexWithReplaceValueModeMatching[1] + const flags = regexWithReplaceValueModeMatching[2] + const replaceValue = regexWithReplaceValueModeMatching[3] + return [new RegExp(pattern, flags), replaceValue] + } + + // raw text, e.g.: r"/123/" + const textModeMatching = raw.match(/^r"(.*?)"$/) + if (textModeMatching) { + return [textModeMatching[1], textModeMatching[1]] + } + + // text, e.g.: 123 + return [raw, raw] +} + export class ClozePostprocessor extends Postprocessor { static id = 'ClozePostprocessor' static displayName = 'ClozePostprocessor' @@ -29,16 +58,33 @@ export class ClozePostprocessor extends Postprocessor { targets = targets.concat(Array.from(domField.content.querySelectorAll('del'))) } + console.log("domField", domField) + targets.forEach((target) => { const content = target.textContent const cloze = `{{c${clozeIterator}::${content}}}` const clozeNode = document.createTextNode(cloze) + console.log("cloze", clozeNode) + console.log("target", target) + target.replaceWith(clozeNode) clozeIterator++ }) + if (note.config.clozeReplacements) { + const clozeReplacements = note.config.clozeReplacements + for (const replacement of clozeReplacements) { + const [searchValue, replaceValue] = processClozeReplacement(replacement) + + console.log("tuple", searchValue, replaceValue) + console.log("domField2", domField) + domField.innerHTML = domField.innerHTML.replaceAll(searchValue, `{{c${clozeIterator}::${replaceValue}}}`) + clozeIterator++ + } + } + if (clozeIterator !== 1) { note.isCloze = true } diff --git a/tsconfig.json b/tsconfig.json index 6d86b99..91cf963 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,6 +24,7 @@ "es2015", "es2019", "es2020", + "es2021" ], "types": [ "node",