@hcengineering/text-markdown 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/markdown.test.js +1044 -0
- package/lib/__tests__/markdown.test.js.map +7 -0
- package/lib/compare.js +100 -0
- package/lib/compare.js.map +7 -0
- package/lib/index.js +47 -0
- package/lib/index.js.map +7 -0
- package/lib/marks.js +59 -0
- package/lib/marks.js.map +7 -0
- package/lib/node.js +34 -0
- package/lib/node.js.map +7 -0
- package/lib/parser.js +724 -0
- package/lib/parser.js.map +7 -0
- package/lib/serializer.js +614 -0
- package/lib/serializer.js.map +7 -0
- package/package.json +59 -0
- package/src/__tests__/markdown.test.ts +1076 -0
- package/src/compare.ts +119 -0
- package/src/index.ts +47 -0
- package/src/marks.ts +46 -0
- package/src/node.ts +24 -0
- package/src/parser.ts +853 -0
- package/src/serializer.ts +833 -0
- package/tsconfig.json +12 -0
- package/types/__tests__/markdown.test.d.ts +9 -0
- package/types/__tests__/markdown.test.d.ts.map +1 -0
- package/types/compare.d.ts +10 -0
- package/types/compare.d.ts.map +1 -0
- package/types/index.d.ts +14 -0
- package/types/index.d.ts.map +1 -0
- package/types/marks.d.ts +8 -0
- package/types/marks.d.ts.map +1 -0
- package/types/node.d.ts +4 -0
- package/types/node.d.ts.map +1 -0
- package/types/parser.d.ts +50 -0
- package/types/parser.d.ts.map +1 -0
- package/types/serializer.d.ts +102 -0
- package/types/serializer.d.ts.map +1 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/parser.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright \u00A9 2025 Hardcore Engineering Inc.\n//\n// Licensed under the Eclipse Public License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License. You may\n// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n\nimport { Attrs, MarkupMark, MarkupMarkType, MarkupNode, MarkupNodeType } from '@hcengineering/text-core'\nimport { htmlToMarkup } from '@hcengineering/text-html'\nimport MarkdownIt, { type Token } from 'markdown-it'\nimport type { RuleCore } from 'markdown-it/lib/parser_core'\nimport type StateCore from 'markdown-it/lib/rules_core/state_core'\n\nimport { addToSet, removeFromSet, sameSet } from './marks'\nimport { nodeContent } from './node'\n\ntype SpecRule<T> = T | ((tok: Token, state: MarkdownParseState) => T)\n\nfunction readSpec<T> (rule: SpecRule<T>, tok: Token, state: MarkdownParseState): T {\n if (typeof rule === 'function') {\n return (rule as (tok: Token, state: MarkdownParseState) => T)(tok, state)\n }\n return rule\n}\n\ninterface ParsingBlockRule {\n block: SpecRule<MarkupNodeType>\n getAttrs?: (tok: Token, state: MarkdownParseState) => Attrs\n wrapContent?: boolean\n noCloseToken?: boolean\n}\n\ninterface ParsingNodeRule {\n node: MarkupNodeType\n getAttrs?: (tok: Token, state: MarkdownParseState) => Attrs\n}\n\ninterface ParsingMarkRule {\n mark: MarkupMarkType\n getAttrs?: (tok: Token, state: MarkdownParseState) => Attrs\n noCloseToken?: boolean\n}\n\ninterface ParsingSpecialRule {\n type: (state: MarkdownParseState, tok: Token) => { type: MarkupMarkType | MarkupNodeType, node: boolean }\n getAttrs?: (tok: Token, state: MarkdownParseState) => Attrs\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface ParsingIgnoreRule {\n // empty\n}\n\ntype HandlerRecord = (state: MarkdownParseState, tok: Token) => void\ntype HandlersRecord = Record<string, HandlerRecord>\n\n// ****************************************************************\n// Markdown parser\n// ****************************************************************\nfunction isText (a: MarkupNode, b: MarkupNode): boolean {\n return (a.type === MarkupNodeType.text || a.type === MarkupNodeType.reference) && b.type === MarkupNodeType.text\n}\nfunction maybeMerge (a: MarkupNode, b: MarkupNode): MarkupNode | undefined {\n if (isText(a, b) && (sameSet(a.marks, b.marks) || (a.text === '' && (a.marks?.length ?? 0) === 0))) {\n if (a.text === '' && (a.marks?.length ?? 0) === 0) {\n return { ...b }\n }\n return { ...a, text: (a.text ?? '') + (b.text ?? '') }\n }\n return undefined\n}\n\ninterface StateElement {\n type: MarkupNodeType\n content: MarkupNode[]\n attrs: Attrs\n}\n\n// Object used to track the context of a running parse.\nclass MarkdownParseState {\n stack: StateElement[]\n marks: MarkupMark[]\n tokenHandlers: Record<string, (state: MarkdownParseState, tok: Token) => void>\n\n constructor (\n tokenHandlers: Record<string, (state: MarkdownParseState, tok: Token) => void>,\n readonly refUrl: string,\n readonly imageUrl: string\n ) {\n this.stack = [{ type: MarkupNodeType.doc, attrs: {}, content: [] }]\n this.marks = []\n this.tokenHandlers = tokenHandlers\n }\n\n top (): StateElement | undefined {\n return this.stack[this.stack.length - 1]\n }\n\n push (elt: MarkupNode): void {\n if (this.stack.length > 0) {\n const tt = this.top()\n tt?.content.push(elt)\n }\n }\n\n mergeWithLast (nodes: MarkupNode[], node: MarkupNode): boolean {\n const last = nodes[nodes.length - 1]\n let merged: MarkupNode | undefined\n if (last !== undefined && (merged = maybeMerge(last, node)) !== undefined) {\n nodes[nodes.length - 1] = merged\n return true\n }\n return false\n }\n\n // Adds the given text to the current position in the document,\n // using the current marks as styling.\n addText (text?: string): void {\n const top = this.top()\n if (text === undefined || top === undefined || text.length === 0) {\n return\n }\n\n const node: MarkupNode = {\n type: MarkupNodeType.text,\n text\n }\n if (this.marks !== undefined) {\n node.marks = this.marks\n }\n\n const nodes = top.content\n\n if (!this.mergeWithLast(nodes, node)) {\n nodes.push(node)\n }\n }\n\n // Adds the given mark to the set of active marks.\n openMark (mark: MarkupMark): void {\n this.marks = addToSet(mark, this.marks)\n }\n\n // Removes the given mark from the set of active marks.\n closeMark (mark: MarkupMarkType): void {\n this.marks = removeFromSet(mark, this.marks)\n }\n\n parseTokens (toks: Token[] | null): void {\n const _toks = [...(toks ?? [])]\n while (_toks.length > 0) {\n const tok = _toks.shift()\n if (tok === undefined) {\n break\n }\n // Check if we need to merge some content into\n // Merge <sub> </sub> into one html token\n if (tok.type === 'html_inline' && tok.content.trim() === '<sub>') {\n while (_toks.length > 0) {\n const _tok = _toks.shift()\n if (_tok !== undefined) {\n tok.content += _tok.content\n if (_tok.type === 'html_inline' && _tok.content.trim() === '</sub>') {\n break\n }\n }\n }\n }\n\n const handler = this.tokenHandlers[tok.type]\n if (handler === undefined) {\n throw new Error(`Token type '${String(tok.type)} not supported by Markdown parser`)\n }\n handler(this, tok)\n }\n }\n\n // Add a node at the current position.\n addNode (type: MarkupNodeType, attrs: Attrs, content: MarkupNode[] = []): MarkupNode {\n const node: MarkupNode = { type, content }\n\n if (Object.keys(attrs ?? {}).length > 0) {\n node.attrs = attrs\n }\n if (this.marks.length > 0) {\n node.marks = this.marks\n }\n this.push(node)\n return node\n }\n\n // Wrap subsequent content in a node of the given type.\n openNode (type: MarkupNodeType, attrs: Attrs): void {\n this.stack.push({ type, attrs, content: [] })\n }\n\n // Close and return the node that is currently on top of the stack.\n closeNode (): MarkupNode {\n if (this.marks.length > 0) this.marks = []\n const info = this.stack.pop()\n if (info !== undefined) {\n return this.addNode(info.type, info.attrs, info.content)\n }\n return { type: MarkupNodeType.doc }\n }\n}\n\nfunction attrs (\n spec: ParsingBlockRule | ParsingMarkRule | ParsingNodeRule,\n token: Token,\n state: MarkdownParseState\n): Attrs {\n return spec.getAttrs?.(token, state) ?? {}\n}\n\n// Code content is represented as a single token with a `content`\n// property in Markdown-it.\nfunction noCloseToken (spec: ParsingBlockRule | ParsingMarkRule, type: string): boolean {\n return (spec.noCloseToken ?? false) || ['code_inline', 'code_block', 'fence'].indexOf(type) > 0\n}\n\nfunction withoutTrailingNewline (str: string): string {\n return str[str.length - 1] === '\\n' ? str.slice(0, str.length - 1) : str\n}\n\nfunction addSpecBlock (\n handlers: HandlersRecord,\n spec: ParsingBlockRule,\n type: string,\n specBlock: SpecRule<MarkupNodeType>\n): void {\n if (noCloseToken(spec, type)) {\n handlers[type] = newSimpleBlockHandler(specBlock, spec)\n } else {\n handlers[type + '_open'] = (state, tok) => {\n state.openNode(readSpec(specBlock, tok, state), attrs(spec, tok, state))\n if (spec.wrapContent === true) {\n state.openNode(MarkupNodeType.paragraph, {})\n }\n }\n handlers[type + '_close'] = (state) => {\n if (spec.wrapContent === true) {\n state.closeNode()\n }\n state.closeNode()\n }\n }\n}\nfunction newSimpleBlockHandler (specBlock: SpecRule<MarkupNodeType>, spec: ParsingBlockRule): HandlerRecord {\n return (state, tok) => {\n state.openNode(readSpec(specBlock, tok, state), attrs(spec, tok, state))\n state.addText(withoutTrailingNewline(tok.content))\n state.closeNode()\n }\n}\n\nfunction addSpecMark (handlers: HandlersRecord, spec: ParsingMarkRule, type: string, specMark: MarkupMarkType): void {\n if (noCloseToken(spec, type)) {\n handlers[type] = newSimpleMarkHandler(spec, specMark)\n } else {\n handlers[type + '_open'] = (state, tok) => {\n state.openMark({ type: specMark, attrs: attrs(spec, tok, state) })\n }\n handlers[type + '_close'] = (state) => {\n state.closeMark(specMark)\n }\n }\n}\nfunction addSpecialRule (handlers: HandlersRecord, spec: ParsingSpecialRule, type: string): void {\n handlers[type + '_open'] = (state, tok) => {\n const type = spec.type(state, tok)\n if (type.node) {\n state.openNode(type.type as MarkupNodeType, spec.getAttrs?.(tok, state) ?? {})\n } else {\n state.openMark({ type: type.type as MarkupMarkType, attrs: spec.getAttrs?.(tok, state) ?? {} })\n }\n }\n handlers[type + '_close'] = (state, tok) => {\n const type = spec.type(state, tok)\n if (type.node) {\n state.closeNode()\n } else {\n state.closeMark(type.type as MarkupMarkType)\n }\n }\n}\nfunction addIgnoreRule (handlers: HandlersRecord, spec: ParsingIgnoreRule, type: string): void {\n handlers[type + '_open'] = (state, tok) => {}\n handlers[type + '_close'] = (state, tok) => {}\n}\nfunction newSimpleMarkHandler (spec: ParsingMarkRule, specMark: MarkupMarkType): HandlerRecord {\n return (state: MarkdownParseState, tok: Token): void => {\n state.openMark({ attrs: attrs(spec, tok, state), type: specMark })\n state.addText(withoutTrailingNewline(tok.content))\n state.closeMark(specMark)\n }\n}\n\nfunction tokenHandlers (\n tokensBlock: Record<string, ParsingBlockRule>,\n tokensNode: Record<string, ParsingNodeRule>,\n tokensMark: Record<string, ParsingMarkRule>,\n specialRules: Record<string, ParsingSpecialRule>,\n ignoreRules: Record<string, ParsingIgnoreRule>,\n htmlParser: HtmlParser\n): HandlersRecord {\n const handlers: HandlersRecord = {}\n\n Object.entries(tokensBlock).forEach(([type, spec]) => {\n addSpecBlock(handlers, spec, type, spec.block)\n })\n Object.entries(tokensNode).forEach(([type, spec]) => {\n addSpecNode(handlers, type, spec)\n })\n Object.entries(tokensMark).forEach(([type, spec]) => {\n addSpecMark(handlers, spec, type, spec.mark)\n })\n Object.entries(specialRules).forEach(([type, spec]) => {\n addSpecialRule(handlers, spec, type)\n })\n Object.entries(ignoreRules).forEach(([type, spec]) => {\n addIgnoreRule(handlers, spec, type)\n })\n\n handlers.html_inline = (state: MarkdownParseState, tok: Token) => {\n try {\n const top = state.top()\n if (tok.content.trim() === '</a>' && top?.type === MarkupNodeType.embed) {\n top.content = []\n state.closeNode()\n return\n }\n const markup = htmlParser(tok.content)\n if (markup.content !== undefined) {\n // unwrap content from wrapping paragraph\n const shouldUnwrap =\n markup.content.length === 1 &&\n markup.content[0].type === MarkupNodeType.paragraph &&\n top?.type === MarkupNodeType.paragraph\n\n const content = nodeContent(shouldUnwrap ? markup.content[0] : markup)\n for (const c of content) {\n if (c.type === MarkupNodeType.embed) {\n state.openNode(MarkupNodeType.embed, c.attrs ?? {})\n continue\n }\n state.push(c)\n }\n }\n } catch (err: any) {\n console.error(err)\n state.addText(tok.content)\n }\n }\n handlers.html_block = (state: MarkdownParseState, tok: Token) => {\n try {\n const model = htmlParser(tok.content)\n const content = nodeContent(model)\n for (const c of content) {\n state.push(c)\n }\n } catch (err: any) {\n console.error(err)\n state.addText(tok.content)\n }\n }\n\n addTextHandlers(handlers)\n\n return handlers\n}\n\nfunction addTextHandlers (handlers: HandlersRecord): void {\n handlers.text = (state, tok) => {\n state.addText(tok.content)\n }\n handlers.inline = (state, tok) => {\n state.parseTokens(tok.children)\n }\n handlers.softbreak = (state) => {\n state.addText('\\n')\n }\n}\n\nfunction addSpecNode (handlers: HandlersRecord, type: string, spec: ParsingNodeRule): void {\n handlers[type] = (state: MarkdownParseState, tok: Token) => state.addNode(spec.node, attrs(spec, tok, state))\n}\n\nfunction tokAttrGet (token: Token, name: string): string | undefined {\n const attr = token.attrGet(name)\n if (attr != null) {\n return attr\n }\n // try iterate attrs\n for (const [k, v] of token.attrs ?? []) {\n if (k === name) {\n return v\n }\n }\n}\n\nfunction tokToAttrs (token: Token, ...names: string[]): Record<string, string> {\n const result: Record<string, string> = {}\n for (const name of names) {\n const attr = token.attrGet(name)\n if (attr !== null) {\n result[name] = attr\n }\n }\n return result\n}\n\nfunction todoItemMetaAttrsGet (tok: Token): Record<string, string> {\n const userid = tokAttrGet(tok, 'userid')\n const todoid = tokAttrGet(tok, 'todoid')\n\n const result: Record<string, string> = {}\n\n if (userid !== undefined) {\n result.userid = userid\n }\n if (todoid !== undefined) {\n result.todoid = todoid\n }\n\n return result\n}\n\n// ::- A configuration of a Markdown parser. Such a parser uses\nconst tokensBlock: Record<string, ParsingBlockRule> = {\n blockquote: { block: MarkupNodeType.blockquote },\n paragraph: { block: MarkupNodeType.paragraph },\n list_item: { block: MarkupNodeType.list_item },\n task_item: { block: MarkupNodeType.taskItem, getAttrs: (tok) => ({ 'data-type': 'taskItem' }) },\n bullet_list: {\n block: MarkupNodeType.bullet_list,\n getAttrs: (tok) => ({\n bullet: tok.markup\n })\n },\n todo_list: {\n block: MarkupNodeType.todoList,\n getAttrs: (tok) => ({\n bullet: tok.markup\n })\n },\n todo_item: {\n block: MarkupNodeType.todoItem,\n getAttrs: (tok) => ({\n checked: tokAttrGet(tok, 'checked') === 'true',\n ...todoItemMetaAttrsGet(tok)\n })\n },\n ordered_list: {\n block: MarkupNodeType.ordered_list,\n getAttrs: (tok: Token) => ({ order: tokAttrGet(tok, 'start') ?? '1' })\n },\n task_list: {\n block: MarkupNodeType.taskList,\n getAttrs: (tok: Token) => ({ order: tokAttrGet(tok, 'start') ?? '1', 'data-type': 'taskList' })\n },\n heading: {\n block: MarkupNodeType.heading,\n getAttrs: (tok: Token) => ({ level: Number(tok.tag.slice(1)), marker: tok.markup })\n },\n code_block: {\n block: (tok) => {\n if (tok.info === 'mermaid') {\n return MarkupNodeType.mermaid\n }\n return MarkupNodeType.code_block\n },\n getAttrs: (tok: Token) => {\n return { language: tok.info ?? '' }\n },\n noCloseToken: true\n },\n fence: {\n block: (tok) => {\n if (tok.info === 'mermaid') {\n return MarkupNodeType.mermaid\n }\n return MarkupNodeType.code_block\n },\n getAttrs: (tok: Token) => {\n return { language: tok.info ?? '' }\n },\n noCloseToken: true\n },\n sub: {\n block: MarkupNodeType.subLink,\n getAttrs: (tok: Token) => {\n return { language: tok.info ?? '' }\n },\n noCloseToken: false\n },\n table: {\n block: MarkupNodeType.table,\n noCloseToken: false\n },\n th: {\n block: MarkupNodeType.table_header,\n getAttrs: (tok: Token) => {\n return {\n colspan: Number(tok.attrGet('colspan') ?? '1'),\n rowspan: Number(tok.attrGet('rowspan') ?? '1')\n }\n },\n wrapContent: true,\n noCloseToken: false\n },\n tr: {\n block: MarkupNodeType.table_row,\n noCloseToken: false\n },\n td: {\n block: MarkupNodeType.table_cell,\n getAttrs: (tok: Token) => {\n return {\n colspan: Number(tok.attrGet('colspan') ?? '1'),\n rowspan: Number(tok.attrGet('rowspan') ?? '1')\n }\n },\n wrapContent: true,\n noCloseToken: false\n }\n}\nconst tokensNode: Record<string, ParsingNodeRule> = {\n hr: { node: MarkupNodeType.horizontal_rule },\n image: {\n node: MarkupNodeType.image,\n getAttrs: (tok: Token, state) => {\n const result = tokToAttrs(tok, 'src', 'title', 'alt', 'data')\n result.alt = convertStringLikeToken(tok, result.alt)\n if (result.src.startsWith(state.imageUrl)) {\n const url = new URL(result.src)\n result['data-type'] = 'image'\n const file = url.searchParams.get('file')\n if (file != null) {\n result['file-id'] = file\n }\n\n const width = url.searchParams.get('width')\n if (width != null) {\n result.width = width\n }\n\n const height = url.searchParams.get('height')\n if (height != null) {\n result.height = height\n }\n }\n return result\n }\n },\n hardbreak: { node: MarkupNodeType.hard_break }\n}\nconst tokensMark: Record<string, ParsingMarkRule> = {\n em: {\n mark: MarkupMarkType.em,\n getAttrs: (tok: Token, state: MarkdownParseState) => {\n return { marker: tok.markup }\n }\n },\n bold: {\n mark: MarkupMarkType.bold,\n getAttrs: (tok: Token, state: MarkdownParseState) => {\n return { marker: tok.markup }\n }\n },\n strong: {\n mark: MarkupMarkType.bold,\n getAttrs: (tok: Token, state: MarkdownParseState) => {\n return { marker: tok.markup }\n }\n },\n s: { mark: MarkupMarkType.strike },\n u: { mark: MarkupMarkType.underline },\n code_inline: {\n mark: MarkupMarkType.code,\n noCloseToken: true\n }\n}\n\nconst specialRule: Record<string, ParsingSpecialRule> = {\n link: {\n type: (state, tok) => {\n const href = tok.attrGet('href')\n if ((href?.startsWith(state.refUrl) ?? false) || state.stack[state.stack.length - 1]?.type === 'reference') {\n return { type: MarkupNodeType.reference, node: true }\n }\n return { type: MarkupMarkType.link, node: false, close: true }\n },\n getAttrs: (tok: Token, state) => {\n const attrs = tokToAttrs(tok, 'href', 'title')\n if (attrs.href !== undefined) {\n try {\n const url = new URL(attrs.href)\n if (attrs.href.startsWith(state.refUrl) ?? false) {\n return {\n label: url.searchParams?.get('label') ?? '',\n id: url.searchParams?.get('_id') ?? '',\n objectclass: url.searchParams?.get('_class') ?? ''\n }\n }\n } catch (err: any) {\n // ignore\n }\n }\n return attrs\n }\n }\n}\n\nconst ignoreRule: Record<string, ParsingIgnoreRule> = {\n thead: {},\n tbody: {}\n}\n\nexport const isInlineToken = (token?: Token): boolean => token?.type === 'inline'\n\nexport const isParagraphToken = (token?: Token): boolean => token?.type === 'paragraph_open'\n\nexport const isListItemToken = (token?: Token): boolean => token?.type === 'list_item_open'\n\nexport interface TaskListEnv {\n tasklists: number\n}\n\ninterface TaskListStateCore extends StateCore {\n env: TaskListEnv\n}\n\n// The leading whitespace in a list item (token.content) is already trimmed off by markdown-it.\n// The regex below checks for '[ ] ' or '[x] ' or '[X] ' at the start of the string token.content,\n// where the space is either a normal space or a non-breaking space (character 160 = \\u00A0).\nconst startsWithTodoMarkdown = (token: Token): boolean => /^\\[[xX \\u00A0]\\][ \\u00A0]/.test(token.content)\nconst isCheckedTodoItem = (token: Token): boolean => /^\\[[xX]\\][ \\u00A0]/.test(token.content)\n\nexport type HtmlParser = (html: string) => MarkupNode\n\nexport interface MarkdownParserOptions {\n refUrl: string\n imageUrl: string\n htmlParser?: HtmlParser\n}\n\nexport class MarkdownParser {\n tokenizer: MarkdownIt\n tokenHandlers: Record<string, (state: MarkdownParseState, tok: Token) => void>\n htmlParser: HtmlParser\n\n constructor (private readonly options: MarkdownParserOptions) {\n this.tokenizer = MarkdownIt('default', {\n html: true\n })\n this.tokenizer.core.ruler.after('inline', 'task_list', this.listRule)\n this.tokenizer.core.ruler.after('inline', 'html_comment', this.htmlCommentRule)\n\n this.htmlParser = options.htmlParser ?? htmlToMarkup\n this.tokenHandlers = tokenHandlers(tokensBlock, tokensNode, tokensMark, specialRule, ignoreRule, this.htmlParser)\n }\n\n parse (text: string): MarkupNode {\n const state = new MarkdownParseState(this.tokenHandlers, this.options.refUrl, this.options.imageUrl)\n let doc: MarkupNode\n\n const tokens = this.tokenizer.parse(text, {})\n\n state.parseTokens(tokens)\n do {\n doc = state.closeNode()\n } while (state.stack.length > 0)\n return doc\n }\n\n htmlCommentRule: RuleCore = (state: StateCore): boolean => {\n const tokens = state.tokens\n for (let i = 0; i < tokens.length; i++) {\n // Prosemirror entirely ignores comments when parsing, so\n // here we replaces html comment tag with a custom tag so the comments got parsed as a node\n if (tokens[i].type === 'html_block' || tokens[i].type === 'html_inline') {\n const content = tokens[i].content.replaceAll('<!--', '<comment>').replaceAll('-->', '</comment>')\n tokens[i].content = content\n }\n }\n return true\n }\n\n listRule: RuleCore = (state: TaskListStateCore): boolean => {\n const tokens = state.tokens\n const states: Array<{ closeIdx: number, lastItemIdx: number }> = []\n\n // step #1 - convert list items to todo items\n for (let open = 0; open < tokens.length; open++) {\n if (isTodoListItem(tokens, open)) {\n convertTodoItem(tokens, open)\n }\n }\n\n // step #2 - convert lists to proper type\n // listCloseIdx and itemCloseIdx tracks position of the list and item close tokens\n // because we insert items into the list, the variables keep the position from the\n // end of the list so we don't have to count inserts\n let listCloseIdx = -1\n let itemCloseIdx = -1\n\n for (let i = tokens.length - 1; i >= 0; i--) {\n if (tokens[i].type === 'bullet_list_close') {\n states.push({ closeIdx: listCloseIdx, lastItemIdx: itemCloseIdx })\n listCloseIdx = tokens.length - i\n itemCloseIdx = -1\n } else if (tokens[i].type === 'list_item_close' || tokens[i].type === 'todo_item_close') {\n // when found item close token of different type, split the list\n if (itemCloseIdx === -1) {\n itemCloseIdx = tokens.length - i\n } else if (tokens[i].type !== tokens[tokens.length - itemCloseIdx].type) {\n const bulletListOpen = new state.Token('bullet_list_open', 'ul', 1)\n bulletListOpen.markup = tokens[i + 1].markup\n tokens.splice(i + 1, 0, bulletListOpen)\n tokens.splice(i + 1, 0, new state.Token('bullet_list_close', 'ul', -1))\n convertTodoList(tokens, i + 2, tokens.length - listCloseIdx, tokens.length - itemCloseIdx)\n listCloseIdx = tokens.length - i - 1\n itemCloseIdx = tokens.length - i\n }\n } else if (tokens[i].type === 'bullet_list_open') {\n if (itemCloseIdx !== -1) {\n convertTodoList(tokens, i, tokens.length - listCloseIdx, tokens.length - itemCloseIdx)\n }\n\n const prevState = states.pop() ?? { closeIdx: -1, lastItemIdx: -1 }\n listCloseIdx = prevState.closeIdx\n itemCloseIdx = prevState.lastItemIdx\n }\n }\n\n return true\n }\n}\n\nfunction convertTodoList (tokens: Token[], open: number, close: number, item: number): void {\n if (tokens[open].type !== 'bullet_list_open') {\n throw new Error('bullet_list_open token expected')\n }\n if (tokens[close].type !== 'bullet_list_close') {\n throw new Error('bullet_list_close token expected')\n }\n\n if (tokens[item].type === 'todo_item_close') {\n tokens[open].type = 'todo_list_open'\n tokens[close].type = 'todo_list_close'\n }\n}\n\nfunction convertTodoItem (tokens: Token[], open: number): boolean {\n const close = findListItemCloseToken(tokens, open)\n if (close !== -1) {\n tokens[open].type = 'todo_item_open'\n tokens[close].type = 'todo_item_close'\n\n const inline = tokens[open + 2]\n\n if (tokens[open].attrs == null) {\n tokens[open].attrs = []\n }\n\n ;(tokens[open].attrs as any).push(['checked', isCheckedTodoItem(inline) ? 'true' : 'false'])\n\n if (inline.children !== null) {\n const newContent = inline.children[0].content.slice(4)\n if (newContent.length > 0) {\n inline.children[0].content = newContent\n } else {\n inline.children = inline.children.slice(1)\n }\n\n const metaTok = inline.children.find(\n (tok) => tok.type === 'html_inline' && tok.content.startsWith('<!--') && tok.content.endsWith('-->')\n )\n if (metaTok !== undefined) {\n const metaValues = metaTok.content.slice(5, -4).split(',')\n for (const mv of metaValues) {\n if (mv.startsWith('todoid')) {\n ;(tokens[open].attrs as any).push(['todoid', mv.slice(7)])\n }\n if (mv.startsWith('userid')) {\n ;(tokens[open].attrs as any).push(['userid', mv.slice(7)])\n }\n }\n }\n }\n\n return true\n }\n\n return false\n}\n\nfunction findListItemCloseToken (tokens: Token[], open: number): number {\n if (tokens[open].type !== 'list_item_open') {\n throw new Error('list_item_open token expected')\n }\n\n const level = tokens[open].level\n for (let close = open + 1; close < tokens.length; close++) {\n if (tokens[close].type === 'list_item_close' && tokens[close].level === level) {\n return close\n }\n }\n\n return -1\n}\n\n// todo token structure\n// tokens[i].type === list_item_open\n// tokens[i + 1].type === paragraph\n// tokens[i + 2].type === inline\nfunction isTodoListItem (tokens: Token[], pos: number): boolean {\n return (\n isListItemToken(tokens[pos]) &&\n isParagraphToken(tokens[pos + 1]) &&\n isInlineToken(tokens[pos + 2]) &&\n startsWithTodoMarkdown(tokens[pos + 2])\n )\n}\n\nfunction convertStringLikeToken (tok: Token, attrValue?: string): string {\n if (typeof attrValue === 'string' && attrValue !== '') {\n return attrValue\n }\n const children = tok.children ?? []\n let out = ''\n for (const child of children) {\n switch (child.type) {\n case 'text':\n out += child.content\n break\n case 'hardbreak':\n out += '\\n'\n break\n }\n }\n\n return out\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["tokenHandlers", "attrs", "type", "tokensBlock", "tokensNode", "tokensMark", "MarkdownIt"]
|
|
7
|
+
}
|