diff --git a/package-lock.json b/package-lock.json index 0e490db..766d91b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,6 @@ "highlight.js": "^11.11.1", "imurmurhash": "^0.1.4", "markdown-it": "^12.3.2", - "markdown-it-checkbox": "^1.1.0", "markdown-it-docutils": "^0.1.3", "mermaid": "^11.2.0", "preact": "^10.11.3", @@ -4392,15 +4391,6 @@ "markdown-it": "bin/markdown-it.js" } }, - "node_modules/markdown-it-checkbox": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/markdown-it-checkbox/-/markdown-it-checkbox-1.1.0.tgz", - "integrity": "sha512-NkZVjnXo5G+cLNdi7DPZxICypBuxFE9F8sx3YGMZn+Cfizr8EZ/1TFUKl7ZnefF6cr1aFHbnQ5iA3rc4cp7EyA==", - "license": "MIT", - "dependencies": { - "underscore": "^1.8.2" - } - }, "node_modules/markdown-it-docutils": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/markdown-it-docutils/-/markdown-it-docutils-0.1.6.tgz", @@ -5731,12 +5721,6 @@ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", "license": "MIT" }, - "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", - "license": "MIT" - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", diff --git a/package.json b/package.json index d63bcf3..4caed2e 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "highlight.js": "^11.11.1", "imurmurhash": "^0.1.4", "markdown-it": "^12.3.2", - "markdown-it-checkbox": "^1.1.0", "markdown-it-docutils": "^0.1.3", "mermaid": "^11.2.0", "preact": "^10.11.3", diff --git a/src/markdown/markdownCheckboxes.js b/src/markdown/markdownCheckboxes.js index 686e8ad..b98ba7a 100644 --- a/src/markdown/markdownCheckboxes.js +++ b/src/markdown/markdownCheckboxes.js @@ -1,5 +1,6 @@ import { getLineById } from "./markdownSourceMap"; import { EditorView } from "codemirror"; +import markdownIt from "markdown-it"; /** * @param {{ target: HTMLElement }} ev @@ -22,3 +23,48 @@ export function syncCheckboxes(ev, lineMap, editor) { }, }); } + +export function markdownCheckboxes(/** @type {markdownIt} */ md) { + md.block.ruler.before("paragraph", "checkbox", (state, startLine, _, silent) => { + const start = state.bMarks[startLine] + state.tShift[startLine]; + let pos = start; + let max = state.eMarks[startLine]; + + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) return false; + + if (state.src.charCodeAt(pos) !== 0x5b /* [ */) return false; + pos++; + let checked; + if (state.src.charCodeAt(pos) === 0x20 /* space */) checked = false; + else if (state.src.charCodeAt(pos) === 0x78 || state.src.charCodeAt(pos) === 0x58 /* x || X */) checked = true; + else return false; + pos++; + if (state.src.charCodeAt(pos) !== 0x5d /* ] */) return false; + pos++; + + if (silent) return true; + + state.line = startLine + 1; + + const tokenLabelOpen = state.push("label_open", "label", 1); + tokenLabelOpen.map = [startLine, state.line]; + + const tokenCheckbox = state.push("checkbox", "input", 0); + tokenCheckbox.markup = state.src.slice(start, pos - 1); + tokenCheckbox.map = [startLine, state.line]; + tokenCheckbox.attrSet("type", "checkbox"); + if (checked) { + tokenCheckbox.attrSet("checked"); + } + + const tokenInline = state.push("inline", "", 0); + tokenInline.content = state.src.slice(pos, max).trim(); + tokenInline.map = [startLine, state.line]; + tokenInline.children = []; + + state.push("label_close", "label", -1); + + return true; + }); +} diff --git a/src/markdown/markdownSourceMap.js b/src/markdown/markdownSourceMap.js index ea49bc5..56b5b27 100644 --- a/src/markdown/markdownSourceMap.js +++ b/src/markdown/markdownSourceMap.js @@ -23,6 +23,7 @@ export default function markdownSourceMap(md) { "checkbox_input", "html_block", "html_inline", + "checkbox", ]; for (const rule of overrideRules) { diff --git a/src/text.js b/src/text.js index 6986ade..c6c037e 100644 --- a/src/text.js +++ b/src/text.js @@ -8,13 +8,13 @@ import markdownSourceMap from "./markdown/markdownSourceMap"; import { checkLinks } from "./markdown/markdownLinks"; import { colonFencedBlocks } from "./markdown/markdownFence"; import { markdownItMapUrls } from "./markdown/markdownUrlMapping"; -import markdownCheckboxes from "markdown-it-checkbox"; import { backslashLineBreakPlugin } from "./markdown/markdownLineBreak"; import IMurMurHash from "imurmurhash"; import purify from "dompurify"; import { StateEffect } from "@codemirror/state"; import hljs from "highlight.js/lib/core"; import yamlHighlight from "highlight.js/lib/languages/yaml"; +import { markdownCheckboxes } from "./markdown/markdownCheckboxes"; export const markdownUpdatedEffect = StateEffect.define();