@hcengineering/text-markdown 0.7.17 → 0.7.19
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 +170 -3
- package/lib/__tests__/markdown.test.js.map +2 -2
- package/lib/compare.js +3 -1
- package/lib/compare.js.map +2 -2
- package/lib/parser.js +23 -8
- package/lib/parser.js.map +2 -2
- package/lib/serializer.js +40 -0
- package/lib/serializer.js.map +2 -2
- package/package.json +3 -3
- package/src/__tests__/markdown.test.ts +181 -5
- package/src/compare.ts +5 -1
- package/src/parser.ts +31 -14
- package/src/serializer.ts +43 -0
- package/types/compare.d.ts.map +1 -1
- package/types/parser.d.ts.map +1 -1
- package/types/serializer.d.ts.map +1 -1
package/lib/parser.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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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",
|
|
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 } | undefined\n getAttrs?: (tok: Token, state: MarkdownParseState) => Attrs | undefined\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\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 // Merge <span ...> ... </span> into one html token\n if (tok.type === 'html_inline' && tok.content.trim().startsWith('<span')) {\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() === '</span>') {\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 !== undefined) {\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 }\n handlers[type + '_close'] = (state, tok) => {\n const type = spec.type(state, tok)\n if (type !== undefined) {\n if (type.node) {\n state.closeNode()\n } else {\n state.closeMark(type.type as MarkupMarkType)\n }\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 as any).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: Token) => 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
6
|
"names": ["tokenHandlers", "attrs", "type", "tokensBlock", "tokensNode", "tokensMark", "MarkdownIt"]
|
|
7
7
|
}
|
package/lib/serializer.js
CHANGED
|
@@ -283,6 +283,46 @@ const storeMarks = {
|
|
|
283
283
|
mixable: false,
|
|
284
284
|
expelEnclosingWhitespace: false,
|
|
285
285
|
escape: false
|
|
286
|
+
},
|
|
287
|
+
textColor: {
|
|
288
|
+
open: /* @__PURE__ */ __name((state, mark, parent, index) => {
|
|
289
|
+
if (mark.attrs?.color === void 0) {
|
|
290
|
+
return "";
|
|
291
|
+
}
|
|
292
|
+
return `<span style="color: ${mark.attrs.color}" data-color="${mark.attrs.color}">`;
|
|
293
|
+
}, "open"),
|
|
294
|
+
close: /* @__PURE__ */ __name((state, mark, parent, index) => {
|
|
295
|
+
if (mark.attrs?.color === void 0) {
|
|
296
|
+
return "";
|
|
297
|
+
}
|
|
298
|
+
return "</span>";
|
|
299
|
+
}, "close"),
|
|
300
|
+
mixable: false,
|
|
301
|
+
expelEnclosingWhitespace: false,
|
|
302
|
+
escape: false
|
|
303
|
+
},
|
|
304
|
+
textStyle: {
|
|
305
|
+
open: /* @__PURE__ */ __name((state, mark, parent, index) => {
|
|
306
|
+
const attrs = mark.attrs ?? {};
|
|
307
|
+
if (Object.keys(attrs).length === 0) {
|
|
308
|
+
return "";
|
|
309
|
+
}
|
|
310
|
+
const styleAttrs = Object.entries(attrs).map(([key, value]) => {
|
|
311
|
+
const kebabKey = key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
|
|
312
|
+
return `${kebabKey}: ${value}`;
|
|
313
|
+
}).join("; ");
|
|
314
|
+
return `<span style="${styleAttrs}">`;
|
|
315
|
+
}, "open"),
|
|
316
|
+
close: /* @__PURE__ */ __name((state, mark, parent, index) => {
|
|
317
|
+
const attrs = mark.attrs ?? {};
|
|
318
|
+
if (Object.keys(attrs).length === 0) {
|
|
319
|
+
return "";
|
|
320
|
+
}
|
|
321
|
+
return "</span>";
|
|
322
|
+
}, "close"),
|
|
323
|
+
mixable: false,
|
|
324
|
+
expelEnclosingWhitespace: false,
|
|
325
|
+
escape: false
|
|
286
326
|
}
|
|
287
327
|
};
|
|
288
328
|
class MarkdownState {
|
package/lib/serializer.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/serializer.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 { MarkupMark, MarkupNode, MarkupNodeType } from '@hcengineering/text-core'\nimport { markupToHtml } from '@hcengineering/text-html'\n\nimport { isInSet, markEq } from './marks'\nimport { nodeContent, nodeAttrs } from './node'\n\ntype FirstDelim = (i: number, attrs?: Record<string, any>, parentAttrs?: Record<string, any>) => string\ninterface IState {\n wrapBlock: (delim: string, firstDelim: string | null, node: MarkupNode, f: () => void) => void\n flushClose: (size: number) => void\n atBlank: () => void\n ensureNewLine: () => void\n write: (content: string) => void\n closeBlock: (node: any) => void\n text: (text: string, escape?: boolean) => void\n render: (node: MarkupNode, parent: MarkupNode, index: number) => void\n renderContent: (parent: MarkupNode) => void\n renderInline: (parent: MarkupNode) => void\n renderList: (node: MarkupNode, delim: string, firstDelim: FirstDelim) => void\n esc: (str: string, startOfLine?: boolean) => string\n htmlEsc: (str: string) => string\n quote: (str: string) => string\n repeat: (str: string, n: number) => string\n markString: (mark: MarkupMark, open: boolean, parent: MarkupNode, index: number) => string\n renderHtml: (node: MarkupNode) => string\n refUrl: string\n imageUrl: string\n inAutolink?: boolean\n renderAHref?: boolean\n}\n\ntype NodeProcessor = (state: IState, node: MarkupNode, parent: MarkupNode, index: number) => void\n\ninterface InlineState {\n active: MarkupMark[]\n trailing: string\n parent: MarkupNode\n node?: MarkupNode\n marks: MarkupMark[]\n}\n\n// *************************************************************\n\nfunction backticksFor (side: boolean): string {\n return side ? '`' : '`'\n}\n\nfunction isPlainURL (link: MarkupMark, parent: MarkupNode, index: number): boolean {\n if (link.attrs?.title !== undefined || !/^\\w+:/.test(link.attrs?.href)) return false\n const content = parent.content?.[index]\n if (content === undefined) {\n return false\n }\n if (\n content.type !== MarkupNodeType.text ||\n content.text !== link.attrs?.href ||\n content.marks?.[content.marks.length - 1] !== link\n ) {\n return false\n }\n return index === (parent.content?.length ?? 0) - 1 || !isInSet(link, parent.content?.[index + 1]?.marks ?? [])\n}\n\nconst formatTodoItem: FirstDelim = (i, attrs, parentAttrs?: Record<string, any>) => {\n const meta =\n attrs?.todoid !== undefined && attrs?.userid !== undefined\n ? `<!-- todoid=${attrs?.todoid},userid=${attrs?.userid} -->`\n : ''\n\n const bullet = parentAttrs?.bullet ?? '*'\n return `${bullet} [${attrs?.checked === true ? 'x' : ' '}] ${meta}`\n}\n\n// *************************************************************\n\nexport const storeNodes: Record<string, NodeProcessor> = {\n blockquote: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.renderContent(node)\n })\n },\n codeBlock: (state, node) => {\n state.write('```' + `${nodeAttrs(node).language ?? ''}` + '\\n')\n // TODO: Check for node.textContent\n state.renderInline(node)\n // state.text(node.text ?? '', false)\n state.ensureNewLine()\n state.write('```')\n state.closeBlock(node)\n },\n mermaid: (state, node) => {\n state.write('```mermaid\\n')\n state.renderInline(node)\n state.ensureNewLine()\n state.write('```')\n state.closeBlock(node)\n },\n heading: (state, node) => {\n const attrs = nodeAttrs(node)\n if (attrs.marker === '=' && attrs.level === 1) {\n state.renderInline(node)\n state.ensureNewLine()\n state.write('===\\n')\n } else if (attrs.marker === '-' && attrs.level === 2) {\n state.renderInline(node)\n state.ensureNewLine()\n state.write('---\\n')\n } else {\n state.write(state.repeat('#', attrs.level !== undefined ? Number(attrs.level) : 1) + ' ')\n state.renderInline(node)\n }\n state.closeBlock(node)\n },\n horizontalRule: (state, node) => {\n state.write(`${nodeAttrs(node).markup ?? '---'}`)\n state.closeBlock(node)\n },\n bulletList: (state, node) => {\n state.renderList(node, ' ', () => `${nodeAttrs(node).bullet ?? '*'}` + ' ')\n },\n taskList: (state, node) => {\n state.renderList(node, ' ', () => '* [ ]' + ' ')\n },\n todoList: (state, node) => {\n state.renderList(node, ' ', formatTodoItem)\n },\n orderedList: (state, node) => {\n let start = 1\n if (nodeAttrs(node).order !== undefined) {\n start = Number(nodeAttrs(node).order)\n }\n const maxW = String(start + nodeContent(node).length - 1).length\n const space = state.repeat(' ', maxW + 2)\n state.renderList(node, space, (i: number) => {\n const nStr = String(start + i)\n return state.repeat(' ', maxW - nStr.length) + nStr + '. '\n })\n },\n listItem: (state, node) => {\n state.renderContent(node)\n },\n taskItem: (state, node) => {\n state.renderContent(node)\n },\n todoItem: (state, node) => {\n state.renderContent(node)\n },\n paragraph: (state, node) => {\n state.renderInline(node)\n state.closeBlock(node)\n },\n subLink: (state, node) => {\n state.write('<sub>')\n state.renderAHref = true\n state.renderInline(node)\n state.renderAHref = false\n state.write('</sub>')\n },\n\n image: (state, node) => {\n const attrs = nodeAttrs(node)\n if (attrs.token != null && attrs['file-id'] != null) {\n // Convert image to token format\n state.write(\n ' : '') +\n (attrs.height != null ? '&height=' + state.esc(`${attrs.height}`) : '') +\n (attrs.token != null ? '&token=' + state.esc(`${attrs.token}`) : '')) +\n (attrs.title != null ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n } else if (attrs['file-id'] != null) {\n // Convert image to fileid format\n state.write(\n ' : '') +\n (attrs.height != null ? '&height=' + state.esc(`${attrs.height}`) : '')) +\n (attrs.title != null ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n } else {\n if (attrs.width != null || attrs.height != null) {\n state.write(\n '<img' +\n (attrs.width != null ? ` width=\"${state.esc(`${attrs.width}`)}\"` : '') +\n (attrs.height != null ? ` height=\"${state.esc(`${attrs.height}`)}\"` : '') +\n ` src=\"${state.esc(`${attrs.src}`)}\"` +\n (attrs.alt != null ? ` alt=\"${state.esc(`${attrs.alt}`)}\"` : '') +\n (attrs.title != null ? '>' + state.quote(`${attrs.title}`) + '</img>' : '>')\n )\n } else {\n state.write(\n ' +\n (attrs.title != null ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n }\n }\n },\n reference: (state, node) => {\n const attrs = nodeAttrs(node)\n let url = state.refUrl\n if (!url.includes('?')) {\n url += '?'\n } else {\n url += '&'\n }\n state.write(\n '[' +\n state.esc(`${attrs.label ?? ''}`) +\n '](' +\n `${url}${makeQuery({\n _class: attrs.objectclass,\n _id: attrs.id,\n label: attrs.label\n })}` +\n (attrs.title !== undefined ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n },\n markdown: (state, node) => {\n state.renderInline(node)\n state.closeBlock(node)\n },\n comment: (state, node) => {\n state.write('<!--')\n state.renderInline(node)\n state.write('-->')\n },\n hardBreak: (state, node, parent, index) => {\n const content = nodeContent(parent)\n for (let i = index + 1; i < content.length; i++) {\n if (content[i].type !== node.type) {\n state.write('\\\\\\n')\n return\n }\n }\n },\n text: (state, node) => {\n // Check if test has reference mark, in this case we need to remove [[]]\n state.text(node.text ?? '')\n },\n emoji: (state, node) => {\n state.text(node.attrs?.emoji as string)\n },\n table: (state, node) => {\n state.write(state.renderHtml(node))\n state.closeBlock(node)\n },\n embed: (state, node) => {\n const attrs = nodeAttrs(node)\n const embedUrl = attrs.src as string\n state.write(`<a href=\"${encodeURI(embedUrl)}\" data-type=\"embed\">`)\n // Slashes are escaped to prevent autolink creation\n state.write(state.htmlEsc(embedUrl).replace(/\\//g, '/'))\n state.write('</a>')\n }\n}\n\ninterface MarkProcessor {\n open: ((_state: IState, mark: MarkupMark, parent: MarkupNode, index: number) => string) | string\n close: ((_state: IState, mark: MarkupMark, parent: MarkupNode, index: number) => string) | string\n mixable: boolean\n expelEnclosingWhitespace: boolean\n escape: boolean\n}\n\nexport const storeMarks: Record<string, MarkProcessor> = {\n em: {\n open: '*',\n close: '*',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n italic: {\n open: '*',\n close: '*',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n bold: {\n open: '**',\n close: '**',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n strong: {\n open: '**',\n close: '**',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n strike: {\n open: '~~',\n close: '~~',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n underline: {\n open: '<ins>',\n close: '</ins>',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n link: {\n open: (state, mark, parent, index) => {\n if (state.renderAHref === true) {\n return `<a href=\"${encodeURI(mark.attrs?.href)}\">`\n } else {\n state.inAutolink = isPlainURL(mark, parent, index)\n return state.inAutolink ? '<' : '['\n }\n },\n close: (state, mark, parent, index) => {\n if (state.renderAHref === true) {\n return '</a>'\n } else {\n const { inAutolink } = state\n state.inAutolink = undefined\n\n const href = (mark.attrs?.href as string) ?? ''\n // eslint-disable-next-line\n const url = href.replace(/[\\(\\)\"\\\\<>]/g, '\\\\$&')\n const hasSpaces = url.includes(' ')\n\n return inAutolink === true\n ? '>'\n : '](' +\n (hasSpaces ? `<${url}>` : url) +\n (mark.attrs?.title !== undefined ? ` \"${(mark.attrs?.title as string).replace(/\"/g, '\\\\\"')}\"` : '') +\n ')'\n }\n },\n mixable: false,\n expelEnclosingWhitespace: false,\n escape: true\n },\n code: {\n open: (state, mark, parent, index) => {\n return backticksFor(false)\n },\n close: (state, mark, parent, index) => {\n return backticksFor(true)\n },\n mixable: false,\n expelEnclosingWhitespace: false,\n escape: false\n }\n}\n\nexport type HtmlWriter = (markup: MarkupNode) => string\n\nexport interface StateOptions {\n tightLists: boolean\n refUrl: string\n imageUrl: string\n htmlWriter?: HtmlWriter\n}\nexport class MarkdownState implements IState {\n nodes: Record<string, NodeProcessor>\n marks: Record<string, MarkProcessor>\n delim: string\n out: string\n closed: boolean\n closedNode?: MarkupNode\n inTightList: boolean\n options: StateOptions\n refUrl: string\n imageUrl: string\n htmlWriter: HtmlWriter\n\n constructor (\n nodes = storeNodes,\n marks = storeMarks,\n options: StateOptions = { tightLists: true, refUrl: 'ref://', imageUrl: 'http://' }\n ) {\n this.nodes = nodes\n this.marks = marks\n this.delim = this.out = ''\n this.closed = false\n this.inTightList = false\n this.refUrl = options.refUrl\n this.imageUrl = options.imageUrl\n this.htmlWriter = options.htmlWriter ?? markupToHtml\n\n this.options = options\n }\n\n flushClose (size: number): void {\n if (this.closed) {\n if (!this.atBlank()) this.out += '\\n'\n if (size > 1) {\n this.addDelim(size)\n }\n this.closed = false\n }\n }\n\n private addDelim (size: number): void {\n let delimMin = this.delim\n const trim = /\\s+$/.exec(delimMin)\n if (trim !== null) {\n delimMin = delimMin.slice(0, delimMin.length - trim[0].length)\n }\n for (let i = 1; i < size; i++) {\n this.out += delimMin + '\\n'\n }\n }\n\n renderHtml (node: MarkupNode): string {\n return this.htmlWriter(node)\n }\n\n wrapBlock (delim: string, firstDelim: string | null, node: MarkupNode, f: () => void): void {\n const old = this.delim\n this.write(firstDelim ?? delim)\n this.delim += delim\n f()\n this.delim = old\n this.closeBlock(node)\n }\n\n atBlank (): boolean {\n return /(^|\\n)$/.test(this.out)\n }\n\n // :: ()\n // Ensure the current content ends with a newline.\n ensureNewLine (): void {\n if (!this.atBlank()) this.out += '\\n'\n }\n\n // :: (?string)\n // Prepare the state for writing output (closing closed paragraphs,\n // adding delimiters, and so on), and then optionally add content\n // (unescaped) to the output.\n write (content: string): void {\n this.flushClose(2)\n if (this.delim !== undefined && this.atBlank()) this.out += this.delim\n if (content.length > 0) this.out += content\n }\n\n // :: (Node)\n // Close the block for the given node.\n closeBlock (node: MarkupNode): void {\n this.closedNode = node\n this.closed = true\n }\n\n // :: (string, ?bool)\n // Add the given text to the document. When escape is not `false`,\n // it will be escaped.\n text (text: string, escape = false): void {\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const startOfLine = this.atBlank() || this.closed\n this.write('')\n this.out += escape ? this.esc(lines[i], startOfLine) : lines[i]\n if (i !== lines.length - 1) this.out += '\\n'\n }\n }\n\n // :: (Node)\n // Render the given node as a block.\n render (node: MarkupNode, parent: MarkupNode, index: number): void {\n if (this.nodes[node.type] === undefined) {\n throw new Error('Token type `' + node.type + '` not supported by Markdown renderer')\n }\n this.nodes[node.type](this, node, parent, index)\n }\n\n // :: (Node)\n // Render the contents of `parent` as block nodes.\n renderContent (parent: MarkupNode): void {\n nodeContent(parent).forEach((node: MarkupNode, i: number) => {\n this.render(node, parent, i)\n })\n }\n\n reorderMixableMark (state: InlineState, mark: MarkupMark, i: number, len: number): void {\n for (let j = 0; j < state.active.length; j++) {\n const other = state.active[j]\n if (!this.marks[other.type].mixable || this.checkSwitchMarks(i, j, state, mark, other, len)) {\n break\n }\n }\n }\n\n reorderMixableMarks (state: InlineState, len: number): void {\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n\n for (let i = 0; i < len; i++) {\n const mark = state.marks[i]\n const mm = this.marks[mark.type]\n if (mm == null) {\n break\n }\n if (!mm.mixable) break\n this.reorderMixableMark(state, mark, i, len)\n }\n }\n\n private checkSwitchMarks (\n i: number,\n j: number,\n state: InlineState,\n mark: MarkupMark,\n other: MarkupMark,\n len: number\n ): boolean {\n if (!markEq(mark, other) || i === j) {\n return false\n }\n this.switchMarks(i, j, state, mark, len)\n return true\n }\n\n private switchMarks (i: number, j: number, state: InlineState, mark: MarkupMark, len: number): void {\n if (i > j) {\n state.marks = state.marks\n .slice(0, j)\n .concat(mark)\n .concat(state.marks.slice(j, i))\n .concat(state.marks.slice(i + 1, len))\n }\n if (j > i) {\n state.marks = state.marks\n .slice(0, i)\n .concat(state.marks.slice(i + 1, j))\n .concat(mark)\n .concat(state.marks.slice(j, len))\n }\n }\n\n renderNodeInline (state: InlineState, index: number): void {\n state.marks = state.node?.marks ?? []\n this.updateHardBreakMarks(state, index)\n\n const leading = this.adjustLeading(state)\n\n const inner: MarkupMark | undefined = state.marks.length > 0 ? state.marks[state.marks.length - 1] : undefined\n const noEsc = inner !== undefined && !(this.marks[inner.type]?.escape ?? false)\n const len = state.marks.length - (noEsc ? 1 : 0)\n\n this.reorderMixableMarks(state, len)\n\n // Find the prefix of the mark set that didn't change\n this.checkCloseMarks(state, len, index)\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading !== '') this.text(leading)\n\n // Open the marks that need to be opened\n this.checkOpenMarks(state, len, index, inner, noEsc)\n }\n\n private checkOpenMarks (\n state: InlineState,\n len: number,\n index: number,\n inner: MarkupMark | undefined,\n noEsc: boolean\n ): void {\n if (state.node !== undefined) {\n this.updateActiveMarks(state, len, index)\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (this.isNoEscapeRequire(state.node, inner, noEsc, state)) {\n this.renderMarkText(inner as MarkupMark, state, index)\n } else {\n this.render(state.node, state.parent, index)\n }\n }\n }\n\n private isNoEscapeRequire (\n node: MarkupNode,\n inner: MarkupMark | undefined,\n noEsc: boolean,\n state: InlineState\n ): boolean {\n return inner !== undefined && noEsc && node.type === MarkupNodeType.text\n }\n\n private renderMarkText (inner: MarkupMark, state: InlineState, index: number): void {\n this.text(\n this.markString(inner, true, state.parent, index) +\n (state.node?.text as string) +\n this.markString(inner, false, state.parent, index + 1),\n false\n )\n }\n\n private updateActiveMarks (state: InlineState, len: number, index: number): void {\n while (state.active.length < len) {\n const add = state.marks[state.active.length]\n state.active.push(add)\n this.text(this.markString(add, true, state.parent, index), false)\n }\n }\n\n private checkCloseMarks (state: InlineState, len: number, index: number): void {\n let keep = 0\n while (keep < Math.min(state.active.length, len) && markEq(state.marks[keep], state.active[keep])) {\n ++keep\n }\n\n // Close the marks that need to be closed\n while (keep < state.active.length) {\n const mark = state.active.pop()\n if (mark !== undefined) {\n this.text(this.markString(mark, false, state.parent, index), false)\n }\n }\n }\n\n private adjustLeading (state: InlineState): string {\n let leading = state.trailing\n state.trailing = ''\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n const node = state?.node\n if (this.isText(node) && this.isMarksHasExpelEnclosingWhitespace(state)) {\n const match = /^(\\s*)(.*?)(\\s*)$/m.exec(node?.text ?? '')\n if (match !== null) {\n const [leadMatch, innerMatch, trailMatch] = [match[1], match[2], match[3]]\n leading += leadMatch\n state.trailing = trailMatch\n this.adjustLeadingTextNode(leadMatch, trailMatch, state, innerMatch, node as MarkupNode)\n }\n }\n return leading\n }\n\n private isMarksHasExpelEnclosingWhitespace (state: InlineState): boolean {\n return state.marks.some((mark) => this.marks[mark.type]?.expelEnclosingWhitespace)\n }\n\n private adjustLeadingTextNode (\n lead: string,\n trail: string,\n state: InlineState,\n inner: string,\n node: MarkupNode\n ): void {\n if (lead !== '' || trail !== '') {\n state.node = inner !== undefined ? { ...node, text: inner } : undefined\n if (state.node === undefined) {\n state.marks = state.active\n }\n }\n }\n\n private updateHardBreakMarks (state: InlineState, index: number): void {\n if (state.node !== undefined && state.node.type === MarkupNodeType.hard_break) {\n state.marks = this.filterHardBreakMarks(state.marks, index, state)\n }\n }\n\n private filterHardBreakMarks (marks: MarkupMark[], index: number, state: InlineState): MarkupMark[] {\n const content = state.parent.content ?? []\n const next = content[index + 1]\n if (!this.isHardbreakText(next)) {\n return []\n }\n return marks.filter((m) => isInSet(m, next.marks ?? []))\n }\n\n private isHardbreakText (next?: MarkupNode): boolean {\n return (\n next !== undefined && (next.type !== MarkupNodeType.text || (next.text !== undefined && /\\S/.test(next.text)))\n )\n }\n\n private isText (node?: MarkupNode): boolean {\n return node !== undefined && node.type === MarkupNodeType.text && node.text !== undefined\n }\n\n // :: (Node)\n // Render the contents of `parent` as inline content.\n renderInline (parent: MarkupNode): void {\n const state: InlineState = { active: [], trailing: '', parent, marks: [] }\n nodeContent(parent).forEach((nde, index) => {\n state.node = nde\n this.renderNodeInline(state, index)\n })\n state.node = undefined\n this.renderNodeInline(state, 0)\n }\n\n // :: (Node, string, (number) \u2192 string)\n // Render a node's content as a list. `delim` should be the extra\n // indentation added to all lines except the first in an item,\n // `firstDelim` is a function going from an item index to a\n // delimiter for the first line of the item.\n renderList (node: MarkupNode, delim: string, firstDelim: FirstDelim): void {\n this.flushListClose(node)\n\n const isTight: boolean =\n typeof node.attrs?.tight !== 'undefined' ? node.attrs.tight === 'true' : this.options.tightLists\n const prevTight = this.inTightList\n this.inTightList = isTight\n\n nodeContent(node).forEach((child, i) => {\n this.renderListItem(node, child, i, isTight, delim, firstDelim)\n })\n this.inTightList = prevTight\n }\n\n renderListItem (\n node: MarkupNode,\n child: MarkupNode,\n i: number,\n isTight: boolean,\n delim: string,\n firstDelim: FirstDelim\n ): void {\n if (i > 0 && isTight) this.flushClose(1)\n this.wrapBlock(delim, firstDelim(i, node.content?.[i].attrs, node.attrs), node, () => {\n this.render(child, node, i)\n })\n }\n\n private flushListClose (node: MarkupNode): void {\n if (this.closed && this.closedNode?.type === node.type) {\n this.flushClose(3)\n } else if (this.inTightList) {\n this.flushClose(1)\n }\n }\n\n // :: (string, ?bool) \u2192 string\n // Escape the given string so that it can safely appear in Markdown\n // content. If `startOfLine` is true, also escape characters that\n // has special meaning only at the start of the line.\n esc (str: string, startOfLine = false): string {\n if (str == null) {\n return ''\n }\n str = str.replace(/[`*\\\\~\\[\\]]/g, '\\\\$&') // eslint-disable-line\n if (startOfLine) {\n str = str.replace(/^[:#\\-*+]/, '\\\\$&').replace(/^(\\d+)\\./, '$1\\\\.')\n }\n str = str.replace(/\\r?\\n/g, '\\\\\\n')\n return str\n }\n\n htmlEsc (str: string): string {\n if (str == null) {\n return ''\n }\n\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n quote (str: string): string {\n const wrap = !(str?.includes('\"') ?? false) ? '\"\"' : !(str?.includes(\"'\") ?? false) ? \"''\" : '()'\n return wrap[0] + str + wrap[1]\n }\n\n // :: (string, number) \u2192 string\n // Repeat the given string `n` times.\n repeat (str: string, n: number): string {\n let out = ''\n for (let i = 0; i < n; i++) out += str\n return out\n }\n\n // : (Mark, bool, string?) \u2192 string\n // Get the markdown string for a given opening or closing mark.\n markString (mark: MarkupMark, open: boolean, parent: MarkupNode, index: number): string {\n let value = mark.attrs?.marker\n if (value === undefined) {\n const info = this.marks[mark.type]\n if (info == null) {\n throw new Error(`No info for mark ${mark.type}`)\n }\n value = open ? info.open : info.close\n }\n return typeof value === 'string' ? value : (value(this, mark, parent, index) ?? '')\n }\n}\n\nfunction makeQuery (obj: Record<string, string | number | boolean | null | undefined>): string {\n return Object.keys(obj)\n .filter((it) => it[1] != null)\n .map(function (k) {\n return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k] as string | number | boolean)\n })\n .join('&')\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,uBAAuD;AACvD,uBAA6B;AAE7B,mBAAgC;AAChC,kBAAuC;AAuCvC,SAAS,aAAc,MAAuB;AAC5C,SAAO,OAAO,MAAM;AACtB;AAFS;AAIT,SAAS,WAAY,MAAkB,QAAoB,OAAwB;AACjF,MAAI,KAAK,OAAO,UAAU,UAAa,CAAC,QAAQ,KAAK,KAAK,OAAO,IAAI,EAAG,QAAO;AAC/E,QAAM,UAAU,OAAO,UAAU,KAAK;AACtC,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AACA,MACE,QAAQ,SAAS,gCAAe,QAChC,QAAQ,SAAS,KAAK,OAAO,QAC7B,QAAQ,QAAQ,QAAQ,MAAM,SAAS,CAAC,MAAM,MAC9C;AACA,WAAO;AAAA,EACT;AACA,SAAO,WAAW,OAAO,SAAS,UAAU,KAAK,KAAK,KAAC,sBAAQ,MAAM,OAAO,UAAU,QAAQ,CAAC,GAAG,SAAS,CAAC,CAAC;AAC/G;AAdS;AAgBT,MAAM,iBAA6B,wBAAC,GAAG,OAAO,gBAAsC;AAClF,QAAM,OACJ,OAAO,WAAW,UAAa,OAAO,WAAW,SAC7C,eAAe,OAAO,MAAM,WAAW,OAAO,MAAM,SACpD;AAEN,QAAM,SAAS,aAAa,UAAU;AACtC,SAAO,GAAG,MAAM,KAAK,OAAO,YAAY,OAAO,MAAM,GAAG,KAAK,IAAI;AACnE,GARmC;AAY5B,MAAM,aAA4C;AAAA,EACvD,YAAY,wBAAC,OAAO,SAAS;AAC3B,UAAM,UAAU,MAAM,MAAM,MAAM,MAAM;AACtC,YAAM,cAAc,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH,GAJY;AAAA,EAKZ,WAAW,wBAAC,OAAO,SAAS;AAC1B,UAAM,MAAM,aAAW,uBAAU,IAAI,EAAE,YAAY,EAAE;AAAA,CAAS;AAE9D,UAAM,aAAa,IAAI;AAEvB,UAAM,cAAc;AACpB,UAAM,MAAM,KAAK;AACjB,UAAM,WAAW,IAAI;AAAA,EACvB,GARW;AAAA,EASX,SAAS,wBAAC,OAAO,SAAS;AACxB,UAAM,MAAM,cAAc;AAC1B,UAAM,aAAa,IAAI;AACvB,UAAM,cAAc;AACpB,UAAM,MAAM,KAAK;AACjB,UAAM,WAAW,IAAI;AAAA,EACvB,GANS;AAAA,EAOT,SAAS,wBAAC,OAAO,SAAS;AACxB,UAAM,YAAQ,uBAAU,IAAI;AAC5B,QAAI,MAAM,WAAW,OAAO,MAAM,UAAU,GAAG;AAC7C,YAAM,aAAa,IAAI;AACvB,YAAM,cAAc;AACpB,YAAM,MAAM,OAAO;AAAA,IACrB,WAAW,MAAM,WAAW,OAAO,MAAM,UAAU,GAAG;AACpD,YAAM,aAAa,IAAI;AACvB,YAAM,cAAc;AACpB,YAAM,MAAM,OAAO;AAAA,IACrB,OAAO;AACL,YAAM,MAAM,MAAM,OAAO,KAAK,MAAM,UAAU,SAAY,OAAO,MAAM,KAAK,IAAI,CAAC,IAAI,GAAG;AACxF,YAAM,aAAa,IAAI;AAAA,IACzB;AACA,UAAM,WAAW,IAAI;AAAA,EACvB,GAfS;AAAA,EAgBT,gBAAgB,wBAAC,OAAO,SAAS;AAC/B,UAAM,MAAM,OAAG,uBAAU,IAAI,EAAE,UAAU,KAAK,EAAE;AAChD,UAAM,WAAW,IAAI;AAAA,EACvB,GAHgB;AAAA,EAIhB,YAAY,wBAAC,OAAO,SAAS;AAC3B,UAAM,WAAW,MAAM,MAAM,MAAM,OAAG,uBAAU,IAAI,EAAE,UAAU,GAAG,GAAQ;AAAA,EAC7E,GAFY;AAAA,EAGZ,UAAU,wBAAC,OAAO,SAAS;AACzB,UAAM,WAAW,MAAM,MAAM,MAAM,QAAa;AAAA,EAClD,GAFU;AAAA,EAGV,UAAU,wBAAC,OAAO,SAAS;AACzB,UAAM,WAAW,MAAM,MAAM,cAAc;AAAA,EAC7C,GAFU;AAAA,EAGV,aAAa,wBAAC,OAAO,SAAS;AAC5B,QAAI,QAAQ;AACZ,YAAI,uBAAU,IAAI,EAAE,UAAU,QAAW;AACvC,cAAQ,WAAO,uBAAU,IAAI,EAAE,KAAK;AAAA,IACtC;AACA,UAAM,OAAO,OAAO,YAAQ,yBAAY,IAAI,EAAE,SAAS,CAAC,EAAE;AAC1D,UAAM,QAAQ,MAAM,OAAO,KAAK,OAAO,CAAC;AACxC,UAAM,WAAW,MAAM,OAAO,CAAC,MAAc;AAC3C,YAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,aAAO,MAAM,OAAO,KAAK,OAAO,KAAK,MAAM,IAAI,OAAO;AAAA,IACxD,CAAC;AAAA,EACH,GAXa;AAAA,EAYb,UAAU,wBAAC,OAAO,SAAS;AACzB,UAAM,cAAc,IAAI;AAAA,EAC1B,GAFU;AAAA,EAGV,UAAU,wBAAC,OAAO,SAAS;AACzB,UAAM,cAAc,IAAI;AAAA,EAC1B,GAFU;AAAA,EAGV,UAAU,wBAAC,OAAO,SAAS;AACzB,UAAM,cAAc,IAAI;AAAA,EAC1B,GAFU;AAAA,EAGV,WAAW,wBAAC,OAAO,SAAS;AAC1B,UAAM,aAAa,IAAI;AACvB,UAAM,WAAW,IAAI;AAAA,EACvB,GAHW;AAAA,EAIX,SAAS,wBAAC,OAAO,SAAS;AACxB,UAAM,MAAM,OAAO;AACnB,UAAM,cAAc;AACpB,UAAM,aAAa,IAAI;AACvB,UAAM,cAAc;AACpB,UAAM,MAAM,QAAQ;AAAA,EACtB,GANS;AAAA,EAQT,OAAO,wBAAC,OAAO,SAAS;AACtB,UAAM,YAAQ,uBAAU,IAAI;AAC5B,QAAI,MAAM,SAAS,QAAQ,MAAM,SAAS,KAAK,MAAM;AAEnD,YAAM;AAAA,QACJ,OACE,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,EAAE,IAC9B,QACC,MAAM,WACL,GAAG,MAAM,SAAS,CAAC,SACV,MAAM,SAAS,CAAC,MACxB,MAAM,SAAS,OAAO,YAAY,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,IAAI,OAChE,MAAM,UAAU,OAAO,aAAa,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,IAAI,OACnE,MAAM,SAAS,OAAO,YAAY,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,IAAI,QAClE,MAAM,SAAS,OAAO,MAAM,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,IAAI,MAC7D;AAAA,MACJ;AAAA,IACF,WAAW,MAAM,SAAS,KAAK,MAAM;AAEnC,YAAM;AAAA,QACJ,OACE,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,EAAE,IAC9B,QACC,MAAM,WACL,GAAG,MAAM,SAAS,CAAC,MAClB,MAAM,SAAS,OAAO,YAAY,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,IAAI,OAChE,MAAM,UAAU,OAAO,aAAa,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,IAAI,QACrE,MAAM,SAAS,OAAO,MAAM,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,IAAI,MAC7D;AAAA,MACJ;AAAA,IACF,OAAO;AACL,UAAI,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAM;AAC/C,cAAM;AAAA,UACJ,UACG,MAAM,SAAS,OAAO,WAAW,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC,MAAM,OAClE,MAAM,UAAU,OAAO,YAAY,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC,MAAM,MACtE,SAAS,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,OACjC,MAAM,OAAO,OAAO,SAAS,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,OAC5D,MAAM,SAAS,OAAO,MAAM,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,IAAI,WAAW;AAAA,QAC5E;AAAA,MACF,OAAO;AACL,cAAM;AAAA,UACJ,OACE,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,EAAE,IAC9B,OACA,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,KACvB,MAAM,SAAS,OAAO,MAAM,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,IAAI,MAC7D;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAnDO;AAAA,EAoDP,WAAW,wBAAC,OAAO,SAAS;AAC1B,UAAM,YAAQ,uBAAU,IAAI;AAC5B,QAAI,MAAM,MAAM;AAChB,QAAI,CAAC,IAAI,SAAS,GAAG,GAAG;AACtB,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AACA,UAAM;AAAA,MACJ,MACE,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,EAAE,IAChC,KACG,GAAG,GAAG,UAAU;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,KAAK,MAAM;AAAA,QACX,OAAO,MAAM;AAAA,MACf,CAAC,CAAC,MACD,MAAM,UAAU,SAAY,MAAM,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,IAAI,MACnE;AAAA,IACJ;AAAA,EACF,GApBW;AAAA,EAqBX,UAAU,wBAAC,OAAO,SAAS;AACzB,UAAM,aAAa,IAAI;AACvB,UAAM,WAAW,IAAI;AAAA,EACvB,GAHU;AAAA,EAIV,SAAS,wBAAC,OAAO,SAAS;AACxB,UAAM,MAAM,MAAM;AAClB,UAAM,aAAa,IAAI;AACvB,UAAM,MAAM,KAAK;AAAA,EACnB,GAJS;AAAA,EAKT,WAAW,wBAAC,OAAO,MAAM,QAAQ,UAAU;AACzC,UAAM,cAAU,yBAAY,MAAM;AAClC,aAAS,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAC/C,UAAI,QAAQ,CAAC,EAAE,SAAS,KAAK,MAAM;AACjC,cAAM,MAAM,MAAM;AAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GARW;AAAA,EASX,MAAM,wBAAC,OAAO,SAAS;AAErB,UAAM,KAAK,KAAK,QAAQ,EAAE;AAAA,EAC5B,GAHM;AAAA,EAIN,OAAO,wBAAC,OAAO,SAAS;AACtB,UAAM,KAAK,KAAK,OAAO,KAAe;AAAA,EACxC,GAFO;AAAA,EAGP,OAAO,wBAAC,OAAO,SAAS;AACtB,UAAM,MAAM,MAAM,WAAW,IAAI,CAAC;AAClC,UAAM,WAAW,IAAI;AAAA,EACvB,GAHO;AAAA,EAIP,OAAO,wBAAC,OAAO,SAAS;AACtB,UAAM,YAAQ,uBAAU,IAAI;AAC5B,UAAM,WAAW,MAAM;AACvB,UAAM,MAAM,YAAY,UAAU,QAAQ,CAAC,sBAAsB;AAEjE,UAAM,MAAM,MAAM,QAAQ,QAAQ,EAAE,QAAQ,OAAO,QAAQ,CAAC;AAC5D,UAAM,MAAM,MAAM;AAAA,EACpB,GAPO;AAQT;AAUO,MAAM,aAA4C;AAAA,EACvD,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,wBAAC,OAAO,MAAM,QAAQ,UAAU;AACpC,UAAI,MAAM,gBAAgB,MAAM;AAC9B,eAAO,YAAY,UAAU,KAAK,OAAO,IAAI,CAAC;AAAA,MAChD,OAAO;AACL,cAAM,aAAa,WAAW,MAAM,QAAQ,KAAK;AACjD,eAAO,MAAM,aAAa,MAAM;AAAA,MAClC;AAAA,IACF,GAPM;AAAA,IAQN,OAAO,wBAAC,OAAO,MAAM,QAAQ,UAAU;AACrC,UAAI,MAAM,gBAAgB,MAAM;AAC9B,eAAO;AAAA,MACT,OAAO;AACL,cAAM,EAAE,WAAW,IAAI;AACvB,cAAM,aAAa;AAEnB,cAAM,OAAQ,KAAK,OAAO,QAAmB;AAE7C,cAAM,MAAM,KAAK,QAAQ,gBAAgB,MAAM;AAC/C,cAAM,YAAY,IAAI,SAAS,GAAG;AAElC,eAAO,eAAe,OAClB,MACA,QACG,YAAY,IAAI,GAAG,MAAM,QACzB,KAAK,OAAO,UAAU,SAAY,MAAM,KAAK,OAAO,OAAiB,QAAQ,MAAM,KAAK,CAAC,MAAM,MAChG;AAAA,MACR;AAAA,IACF,GAnBO;AAAA,IAoBP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,wBAAC,OAAO,MAAM,QAAQ,UAAU;AACpC,aAAO,aAAa,KAAK;AAAA,IAC3B,GAFM;AAAA,IAGN,OAAO,wBAAC,OAAO,MAAM,QAAQ,UAAU;AACrC,aAAO,aAAa,IAAI;AAAA,IAC1B,GAFO;AAAA,IAGP,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,QAAQ;AAAA,EACV;AACF;AAUO,MAAM,cAAgC;AAAA,EAvY7C,OAuY6C;AAAA;AAAA;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,QAAQ,YACR,QAAQ,YACR,UAAwB,EAAE,YAAY,MAAM,QAAQ,UAAU,UAAU,UAAU,GAClF;AACA,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ,KAAK,MAAM;AACxB,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,QAAQ;AACxB,SAAK,aAAa,QAAQ,cAAc;AAExC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAY,MAAoB;AAC9B,QAAI,KAAK,QAAQ;AACf,UAAI,CAAC,KAAK,QAAQ,EAAG,MAAK,OAAO;AACjC,UAAI,OAAO,GAAG;AACZ,aAAK,SAAS,IAAI;AAAA,MACpB;AACA,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,SAAU,MAAoB;AACpC,QAAI,WAAW,KAAK;AACpB,UAAM,OAAO,OAAO,KAAK,QAAQ;AACjC,QAAI,SAAS,MAAM;AACjB,iBAAW,SAAS,MAAM,GAAG,SAAS,SAAS,KAAK,CAAC,EAAE,MAAM;AAAA,IAC/D;AACA,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,WAAK,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,WAAY,MAA0B;AACpC,WAAO,KAAK,WAAW,IAAI;AAAA,EAC7B;AAAA,EAEA,UAAW,OAAe,YAA2B,MAAkB,GAAqB;AAC1F,UAAM,MAAM,KAAK;AACjB,SAAK,MAAM,cAAc,KAAK;AAC9B,SAAK,SAAS;AACd,MAAE;AACF,SAAK,QAAQ;AACb,SAAK,WAAW,IAAI;AAAA,EACtB;AAAA,EAEA,UAAoB;AAClB,WAAO,UAAU,KAAK,KAAK,GAAG;AAAA,EAChC;AAAA;AAAA;AAAA,EAIA,gBAAuB;AACrB,QAAI,CAAC,KAAK,QAAQ,EAAG,MAAK,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAO,SAAuB;AAC5B,SAAK,WAAW,CAAC;AACjB,QAAI,KAAK,UAAU,UAAa,KAAK,QAAQ,EAAG,MAAK,OAAO,KAAK;AACjE,QAAI,QAAQ,SAAS,EAAG,MAAK,OAAO;AAAA,EACtC;AAAA;AAAA;AAAA,EAIA,WAAY,MAAwB;AAClC,SAAK,aAAa;AAClB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAM,MAAc,SAAS,OAAa;AACxC,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,cAAc,KAAK,QAAQ,KAAK,KAAK;AAC3C,WAAK,MAAM,EAAE;AACb,WAAK,OAAO,SAAS,KAAK,IAAI,MAAM,CAAC,GAAG,WAAW,IAAI,MAAM,CAAC;AAC9D,UAAI,MAAM,MAAM,SAAS,EAAG,MAAK,OAAO;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,OAAQ,MAAkB,QAAoB,OAAqB;AACjE,QAAI,KAAK,MAAM,KAAK,IAAI,MAAM,QAAW;AACvC,YAAM,IAAI,MAAM,iBAAiB,KAAK,OAAO,sCAAsC;AAAA,IACrF;AACA,SAAK,MAAM,KAAK,IAAI,EAAE,MAAM,MAAM,QAAQ,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA,EAIA,cAAe,QAA0B;AACvC,iCAAY,MAAM,EAAE,QAAQ,CAAC,MAAkB,MAAc;AAC3D,WAAK,OAAO,MAAM,QAAQ,CAAC;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,mBAAoB,OAAoB,MAAkB,GAAW,KAAmB;AACtF,aAAS,IAAI,GAAG,IAAI,MAAM,OAAO,QAAQ,KAAK;AAC5C,YAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,UAAI,CAAC,KAAK,MAAM,MAAM,IAAI,EAAE,WAAW,KAAK,iBAAiB,GAAG,GAAG,OAAO,MAAM,OAAO,GAAG,GAAG;AAC3F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAAqB,OAAoB,KAAmB;AAM1D,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,YAAM,KAAK,KAAK,MAAM,KAAK,IAAI;AAC/B,UAAI,MAAM,MAAM;AACd;AAAA,MACF;AACA,UAAI,CAAC,GAAG,QAAS;AACjB,WAAK,mBAAmB,OAAO,MAAM,GAAG,GAAG;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,iBACN,GACA,GACA,OACA,MACA,OACA,KACS;AACT,QAAI,KAAC,qBAAO,MAAM,KAAK,KAAK,MAAM,GAAG;AACnC,aAAO;AAAA,IACT;AACA,SAAK,YAAY,GAAG,GAAG,OAAO,MAAM,GAAG;AACvC,WAAO;AAAA,EACT;AAAA,EAEQ,YAAa,GAAW,GAAW,OAAoB,MAAkB,KAAmB;AAClG,QAAI,IAAI,GAAG;AACT,YAAM,QAAQ,MAAM,MACjB,MAAM,GAAG,CAAC,EACV,OAAO,IAAI,EACX,OAAO,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAC9B,OAAO,MAAM,MAAM,MAAM,IAAI,GAAG,GAAG,CAAC;AAAA,IACzC;AACA,QAAI,IAAI,GAAG;AACT,YAAM,QAAQ,MAAM,MACjB,MAAM,GAAG,CAAC,EACV,OAAO,MAAM,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,EAClC,OAAO,IAAI,EACX,OAAO,MAAM,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,iBAAkB,OAAoB,OAAqB;AACzD,UAAM,QAAQ,MAAM,MAAM,SAAS,CAAC;AACpC,SAAK,qBAAqB,OAAO,KAAK;AAEtC,UAAM,UAAU,KAAK,cAAc,KAAK;AAExC,UAAM,QAAgC,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,IAAI;AACrG,UAAM,QAAQ,UAAU,UAAa,EAAE,KAAK,MAAM,MAAM,IAAI,GAAG,UAAU;AACzE,UAAM,MAAM,MAAM,MAAM,UAAU,QAAQ,IAAI;AAE9C,SAAK,oBAAoB,OAAO,GAAG;AAGnC,SAAK,gBAAgB,OAAO,KAAK,KAAK;AAGtC,QAAI,YAAY,GAAI,MAAK,KAAK,OAAO;AAGrC,SAAK,eAAe,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,EACrD;AAAA,EAEQ,eACN,OACA,KACA,OACA,OACA,OACM;AACN,QAAI,MAAM,SAAS,QAAW;AAC5B,WAAK,kBAAkB,OAAO,KAAK,KAAK;AAIxC,UAAI,KAAK,kBAAkB,MAAM,MAAM,OAAO,OAAO,KAAK,GAAG;AAC3D,aAAK,eAAe,OAAqB,OAAO,KAAK;AAAA,MACvD,OAAO;AACL,aAAK,OAAO,MAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBACN,MACA,OACA,OACA,OACS;AACT,WAAO,UAAU,UAAa,SAAS,KAAK,SAAS,gCAAe;AAAA,EACtE;AAAA,EAEQ,eAAgB,OAAmB,OAAoB,OAAqB;AAClF,SAAK;AAAA,MACH,KAAK,WAAW,OAAO,MAAM,MAAM,QAAQ,KAAK,IAC7C,MAAM,MAAM,OACb,KAAK,WAAW,OAAO,OAAO,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAmB,OAAoB,KAAa,OAAqB;AAC/E,WAAO,MAAM,OAAO,SAAS,KAAK;AAChC,YAAM,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM;AAC3C,YAAM,OAAO,KAAK,GAAG;AACrB,WAAK,KAAK,KAAK,WAAW,KAAK,MAAM,MAAM,QAAQ,KAAK,GAAG,KAAK;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,gBAAiB,OAAoB,KAAa,OAAqB;AAC7E,QAAI,OAAO;AACX,WAAO,OAAO,KAAK,IAAI,MAAM,OAAO,QAAQ,GAAG,SAAK,qBAAO,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,IAAI,CAAC,GAAG;AACjG,QAAE;AAAA,IACJ;AAGA,WAAO,OAAO,MAAM,OAAO,QAAQ;AACjC,YAAM,OAAO,MAAM,OAAO,IAAI;AAC9B,UAAI,SAAS,QAAW;AACtB,aAAK,KAAK,KAAK,WAAW,MAAM,OAAO,MAAM,QAAQ,KAAK,GAAG,KAAK;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAe,OAA4B;AACjD,QAAI,UAAU,MAAM;AACpB,UAAM,WAAW;AAGjB,UAAM,OAAO,OAAO;AACpB,QAAI,KAAK,OAAO,IAAI,KAAK,KAAK,mCAAmC,KAAK,GAAG;AACvE,YAAM,QAAQ,qBAAqB,KAAK,MAAM,QAAQ,EAAE;AACxD,UAAI,UAAU,MAAM;AAClB,cAAM,CAAC,WAAW,YAAY,UAAU,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACzE,mBAAW;AACX,cAAM,WAAW;AACjB,aAAK,sBAAsB,WAAW,YAAY,OAAO,YAAY,IAAkB;AAAA,MACzF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mCAAoC,OAA6B;AACvE,WAAO,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,MAAM,KAAK,IAAI,GAAG,wBAAwB;AAAA,EACnF;AAAA,EAEQ,sBACN,MACA,OACA,OACA,OACA,MACM;AACN,QAAI,SAAS,MAAM,UAAU,IAAI;AAC/B,YAAM,OAAO,UAAU,SAAY,EAAE,GAAG,MAAM,MAAM,MAAM,IAAI;AAC9D,UAAI,MAAM,SAAS,QAAW;AAC5B,cAAM,QAAQ,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAsB,OAAoB,OAAqB;AACrE,QAAI,MAAM,SAAS,UAAa,MAAM,KAAK,SAAS,gCAAe,YAAY;AAC7E,YAAM,QAAQ,KAAK,qBAAqB,MAAM,OAAO,OAAO,KAAK;AAAA,IACnE;AAAA,EACF;AAAA,EAEQ,qBAAsB,OAAqB,OAAe,OAAkC;AAClG,UAAM,UAAU,MAAM,OAAO,WAAW,CAAC;AACzC,UAAM,OAAO,QAAQ,QAAQ,CAAC;AAC9B,QAAI,CAAC,KAAK,gBAAgB,IAAI,GAAG;AAC/B,aAAO,CAAC;AAAA,IACV;AACA,WAAO,MAAM,OAAO,CAAC,UAAM,sBAAQ,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,EACzD;AAAA,EAEQ,gBAAiB,MAA4B;AACnD,WACE,SAAS,WAAc,KAAK,SAAS,gCAAe,QAAS,KAAK,SAAS,UAAa,KAAK,KAAK,KAAK,IAAI;AAAA,EAE/G;AAAA,EAEQ,OAAQ,MAA4B;AAC1C,WAAO,SAAS,UAAa,KAAK,SAAS,gCAAe,QAAQ,KAAK,SAAS;AAAA,EAClF;AAAA;AAAA;AAAA,EAIA,aAAc,QAA0B;AACtC,UAAM,QAAqB,EAAE,QAAQ,CAAC,GAAG,UAAU,IAAI,QAAQ,OAAO,CAAC,EAAE;AACzE,iCAAY,MAAM,EAAE,QAAQ,CAAC,KAAK,UAAU;AAC1C,YAAM,OAAO;AACb,WAAK,iBAAiB,OAAO,KAAK;AAAA,IACpC,CAAC;AACD,UAAM,OAAO;AACb,SAAK,iBAAiB,OAAO,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAY,MAAkB,OAAe,YAA8B;AACzE,SAAK,eAAe,IAAI;AAExB,UAAM,UACJ,OAAO,KAAK,OAAO,UAAU,cAAc,KAAK,MAAM,UAAU,SAAS,KAAK,QAAQ;AACxF,UAAM,YAAY,KAAK;AACvB,SAAK,cAAc;AAEnB,iCAAY,IAAI,EAAE,QAAQ,CAAC,OAAO,MAAM;AACtC,WAAK,eAAe,MAAM,OAAO,GAAG,SAAS,OAAO,UAAU;AAAA,IAChE,CAAC;AACD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,eACE,MACA,OACA,GACA,SACA,OACA,YACM;AACN,QAAI,IAAI,KAAK,QAAS,MAAK,WAAW,CAAC;AACvC,SAAK,UAAU,OAAO,WAAW,GAAG,KAAK,UAAU,CAAC,EAAE,OAAO,KAAK,KAAK,GAAG,MAAM,MAAM;AACpF,WAAK,OAAO,OAAO,MAAM,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEQ,eAAgB,MAAwB;AAC9C,QAAI,KAAK,UAAU,KAAK,YAAY,SAAS,KAAK,MAAM;AACtD,WAAK,WAAW,CAAC;AAAA,IACnB,WAAW,KAAK,aAAa;AAC3B,WAAK,WAAW,CAAC;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAK,KAAa,cAAc,OAAe;AAC7C,QAAI,OAAO,MAAM;AACf,aAAO;AAAA,IACT;AACA,UAAM,IAAI,QAAQ,gBAAgB,MAAM;AACxC,QAAI,aAAa;AACf,YAAM,IAAI,QAAQ,aAAa,MAAM,EAAE,QAAQ,YAAY,OAAO;AAAA,IACpE;AACA,UAAM,IAAI,QAAQ,UAAU,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,QAAS,KAAqB;AAC5B,QAAI,OAAO,MAAM;AACf,aAAO;AAAA,IACT;AAEA,WAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAO,KAAqB;AAC1B,UAAM,OAAO,EAAE,KAAK,SAAS,GAAG,KAAK,SAAS,OAAO,EAAE,KAAK,SAAS,GAAG,KAAK,SAAS,OAAO;AAC7F,WAAO,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA,EAIA,OAAQ,KAAa,GAAmB;AACtC,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,QAAO;AACnC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAIA,WAAY,MAAkB,MAAe,QAAoB,OAAuB;AACtF,QAAI,QAAQ,KAAK,OAAO;AACxB,QAAI,UAAU,QAAW;AACvB,YAAM,OAAO,KAAK,MAAM,KAAK,IAAI;AACjC,UAAI,QAAQ,MAAM;AAChB,cAAM,IAAI,MAAM,oBAAoB,KAAK,IAAI,EAAE;AAAA,MACjD;AACA,cAAQ,OAAO,KAAK,OAAO,KAAK;AAAA,IAClC;AACA,WAAO,OAAO,UAAU,WAAW,QAAS,MAAM,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,EAClF;AACF;AAEA,SAAS,UAAW,KAA2E;AAC7F,SAAO,OAAO,KAAK,GAAG,EACnB,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,EAC5B,IAAI,SAAU,GAAG;AAChB,WAAO,mBAAmB,CAAC,IAAI,MAAM,mBAAmB,IAAI,CAAC,CAA8B;AAAA,EAC7F,CAAC,EACA,KAAK,GAAG;AACb;AAPS;",
|
|
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 { MarkupMark, MarkupNode, MarkupNodeType } from '@hcengineering/text-core'\nimport { markupToHtml } from '@hcengineering/text-html'\n\nimport { isInSet, markEq } from './marks'\nimport { nodeContent, nodeAttrs } from './node'\n\ntype FirstDelim = (i: number, attrs?: Record<string, any>, parentAttrs?: Record<string, any>) => string\ninterface IState {\n wrapBlock: (delim: string, firstDelim: string | null, node: MarkupNode, f: () => void) => void\n flushClose: (size: number) => void\n atBlank: () => void\n ensureNewLine: () => void\n write: (content: string) => void\n closeBlock: (node: any) => void\n text: (text: string, escape?: boolean) => void\n render: (node: MarkupNode, parent: MarkupNode, index: number) => void\n renderContent: (parent: MarkupNode) => void\n renderInline: (parent: MarkupNode) => void\n renderList: (node: MarkupNode, delim: string, firstDelim: FirstDelim) => void\n esc: (str: string, startOfLine?: boolean) => string\n htmlEsc: (str: string) => string\n quote: (str: string) => string\n repeat: (str: string, n: number) => string\n markString: (mark: MarkupMark, open: boolean, parent: MarkupNode, index: number) => string\n renderHtml: (node: MarkupNode) => string\n refUrl: string\n imageUrl: string\n inAutolink?: boolean\n renderAHref?: boolean\n}\n\ntype NodeProcessor = (state: IState, node: MarkupNode, parent: MarkupNode, index: number) => void\n\ninterface InlineState {\n active: MarkupMark[]\n trailing: string\n parent: MarkupNode\n node?: MarkupNode\n marks: MarkupMark[]\n}\n\n// *************************************************************\n\nfunction backticksFor (side: boolean): string {\n return side ? '`' : '`'\n}\n\nfunction isPlainURL (link: MarkupMark, parent: MarkupNode, index: number): boolean {\n if (link.attrs?.title !== undefined || !/^\\w+:/.test(link.attrs?.href)) return false\n const content = parent.content?.[index]\n if (content === undefined) {\n return false\n }\n if (\n content.type !== MarkupNodeType.text ||\n content.text !== link.attrs?.href ||\n content.marks?.[content.marks.length - 1] !== link\n ) {\n return false\n }\n return index === (parent.content?.length ?? 0) - 1 || !isInSet(link, parent.content?.[index + 1]?.marks ?? [])\n}\n\nconst formatTodoItem: FirstDelim = (i, attrs, parentAttrs?: Record<string, any>) => {\n const meta =\n attrs?.todoid !== undefined && attrs?.userid !== undefined\n ? `<!-- todoid=${attrs?.todoid},userid=${attrs?.userid} -->`\n : ''\n\n const bullet = parentAttrs?.bullet ?? '*'\n return `${bullet} [${attrs?.checked === true ? 'x' : ' '}] ${meta}`\n}\n\n// *************************************************************\n\nexport const storeNodes: Record<string, NodeProcessor> = {\n blockquote: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.renderContent(node)\n })\n },\n codeBlock: (state, node) => {\n state.write('```' + `${nodeAttrs(node).language ?? ''}` + '\\n')\n // TODO: Check for node.textContent\n state.renderInline(node)\n // state.text(node.text ?? '', false)\n state.ensureNewLine()\n state.write('```')\n state.closeBlock(node)\n },\n mermaid: (state, node) => {\n state.write('```mermaid\\n')\n state.renderInline(node)\n state.ensureNewLine()\n state.write('```')\n state.closeBlock(node)\n },\n heading: (state, node) => {\n const attrs = nodeAttrs(node)\n if (attrs.marker === '=' && attrs.level === 1) {\n state.renderInline(node)\n state.ensureNewLine()\n state.write('===\\n')\n } else if (attrs.marker === '-' && attrs.level === 2) {\n state.renderInline(node)\n state.ensureNewLine()\n state.write('---\\n')\n } else {\n state.write(state.repeat('#', attrs.level !== undefined ? Number(attrs.level) : 1) + ' ')\n state.renderInline(node)\n }\n state.closeBlock(node)\n },\n horizontalRule: (state, node) => {\n state.write(`${nodeAttrs(node).markup ?? '---'}`)\n state.closeBlock(node)\n },\n bulletList: (state, node) => {\n state.renderList(node, ' ', () => `${nodeAttrs(node).bullet ?? '*'}` + ' ')\n },\n taskList: (state, node) => {\n state.renderList(node, ' ', () => '* [ ]' + ' ')\n },\n todoList: (state, node) => {\n state.renderList(node, ' ', formatTodoItem)\n },\n orderedList: (state, node) => {\n let start = 1\n if (nodeAttrs(node).order !== undefined) {\n start = Number(nodeAttrs(node).order)\n }\n const maxW = String(start + nodeContent(node).length - 1).length\n const space = state.repeat(' ', maxW + 2)\n state.renderList(node, space, (i: number) => {\n const nStr = String(start + i)\n return state.repeat(' ', maxW - nStr.length) + nStr + '. '\n })\n },\n listItem: (state, node) => {\n state.renderContent(node)\n },\n taskItem: (state, node) => {\n state.renderContent(node)\n },\n todoItem: (state, node) => {\n state.renderContent(node)\n },\n paragraph: (state, node) => {\n state.renderInline(node)\n state.closeBlock(node)\n },\n subLink: (state, node) => {\n state.write('<sub>')\n state.renderAHref = true\n state.renderInline(node)\n state.renderAHref = false\n state.write('</sub>')\n },\n\n image: (state, node) => {\n const attrs = nodeAttrs(node)\n if (attrs.token != null && attrs['file-id'] != null) {\n // Convert image to token format\n state.write(\n ' : '') +\n (attrs.height != null ? '&height=' + state.esc(`${attrs.height}`) : '') +\n (attrs.token != null ? '&token=' + state.esc(`${attrs.token}`) : '')) +\n (attrs.title != null ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n } else if (attrs['file-id'] != null) {\n // Convert image to fileid format\n state.write(\n ' : '') +\n (attrs.height != null ? '&height=' + state.esc(`${attrs.height}`) : '')) +\n (attrs.title != null ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n } else {\n if (attrs.width != null || attrs.height != null) {\n state.write(\n '<img' +\n (attrs.width != null ? ` width=\"${state.esc(`${attrs.width}`)}\"` : '') +\n (attrs.height != null ? ` height=\"${state.esc(`${attrs.height}`)}\"` : '') +\n ` src=\"${state.esc(`${attrs.src}`)}\"` +\n (attrs.alt != null ? ` alt=\"${state.esc(`${attrs.alt}`)}\"` : '') +\n (attrs.title != null ? '>' + state.quote(`${attrs.title}`) + '</img>' : '>')\n )\n } else {\n state.write(\n ' +\n (attrs.title != null ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n }\n }\n },\n reference: (state, node) => {\n const attrs = nodeAttrs(node)\n let url = state.refUrl\n if (!url.includes('?')) {\n url += '?'\n } else {\n url += '&'\n }\n state.write(\n '[' +\n state.esc(`${attrs.label ?? ''}`) +\n '](' +\n `${url}${makeQuery({\n _class: attrs.objectclass,\n _id: attrs.id,\n label: attrs.label\n })}` +\n (attrs.title !== undefined ? ' ' + state.quote(`${attrs.title}`) : '') +\n ')'\n )\n },\n markdown: (state, node) => {\n state.renderInline(node)\n state.closeBlock(node)\n },\n comment: (state, node) => {\n state.write('<!--')\n state.renderInline(node)\n state.write('-->')\n },\n hardBreak: (state, node, parent, index) => {\n const content = nodeContent(parent)\n for (let i = index + 1; i < content.length; i++) {\n if (content[i].type !== node.type) {\n state.write('\\\\\\n')\n return\n }\n }\n },\n text: (state, node) => {\n // Check if test has reference mark, in this case we need to remove [[]]\n state.text(node.text ?? '')\n },\n emoji: (state, node) => {\n state.text(node.attrs?.emoji as string)\n },\n table: (state, node) => {\n state.write(state.renderHtml(node))\n state.closeBlock(node)\n },\n embed: (state, node) => {\n const attrs = nodeAttrs(node)\n const embedUrl = attrs.src as string\n state.write(`<a href=\"${encodeURI(embedUrl)}\" data-type=\"embed\">`)\n // Slashes are escaped to prevent autolink creation\n state.write(state.htmlEsc(embedUrl).replace(/\\//g, '/'))\n state.write('</a>')\n }\n}\n\ninterface MarkProcessor {\n open: ((_state: IState, mark: MarkupMark, parent: MarkupNode, index: number) => string) | string\n close: ((_state: IState, mark: MarkupMark, parent: MarkupNode, index: number) => string) | string\n mixable: boolean\n expelEnclosingWhitespace: boolean\n escape: boolean\n}\n\nexport const storeMarks: Record<string, MarkProcessor> = {\n em: {\n open: '*',\n close: '*',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n italic: {\n open: '*',\n close: '*',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n bold: {\n open: '**',\n close: '**',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n strong: {\n open: '**',\n close: '**',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n strike: {\n open: '~~',\n close: '~~',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n underline: {\n open: '<ins>',\n close: '</ins>',\n mixable: true,\n expelEnclosingWhitespace: true,\n escape: true\n },\n link: {\n open: (state, mark, parent, index) => {\n if (state.renderAHref === true) {\n return `<a href=\"${encodeURI(mark.attrs?.href)}\">`\n } else {\n state.inAutolink = isPlainURL(mark, parent, index)\n return state.inAutolink ? '<' : '['\n }\n },\n close: (state, mark, parent, index) => {\n if (state.renderAHref === true) {\n return '</a>'\n } else {\n const { inAutolink } = state\n state.inAutolink = undefined\n\n const href = (mark.attrs?.href as string) ?? ''\n // eslint-disable-next-line\n const url = href.replace(/[\\(\\)\"\\\\<>]/g, '\\\\$&')\n const hasSpaces = url.includes(' ')\n\n return inAutolink === true\n ? '>'\n : '](' +\n (hasSpaces ? `<${url}>` : url) +\n (mark.attrs?.title !== undefined ? ` \"${(mark.attrs?.title as string).replace(/\"/g, '\\\\\"')}\"` : '') +\n ')'\n }\n },\n mixable: false,\n expelEnclosingWhitespace: false,\n escape: true\n },\n code: {\n open: (state, mark, parent, index) => {\n return backticksFor(false)\n },\n close: (state, mark, parent, index) => {\n return backticksFor(true)\n },\n mixable: false,\n expelEnclosingWhitespace: false,\n escape: false\n },\n textColor: {\n open: (state, mark, parent, index) => {\n if (mark.attrs?.color === undefined) {\n return ''\n }\n return `<span style=\"color: ${mark.attrs.color}\" data-color=\"${mark.attrs.color}\">`\n },\n close: (state, mark, parent, index) => {\n if (mark.attrs?.color === undefined) {\n return ''\n }\n return '</span>'\n },\n mixable: false,\n expelEnclosingWhitespace: false,\n escape: false\n },\n textStyle: {\n open: (state, mark, parent, index) => {\n const attrs = mark.attrs ?? {}\n if (Object.keys(attrs).length === 0) {\n return ''\n }\n const styleAttrs = Object.entries(attrs)\n .map(([key, value]) => {\n const kebabKey = key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)\n return `${kebabKey}: ${value}`\n })\n .join('; ')\n\n return `<span style=\"${styleAttrs}\">`\n },\n close: (state, mark, parent, index) => {\n const attrs = mark.attrs ?? {}\n if (Object.keys(attrs).length === 0) {\n return ''\n }\n return '</span>'\n },\n mixable: false,\n expelEnclosingWhitespace: false,\n escape: false\n }\n}\n\nexport type HtmlWriter = (markup: MarkupNode) => string\n\nexport interface StateOptions {\n tightLists: boolean\n refUrl: string\n imageUrl: string\n htmlWriter?: HtmlWriter\n}\nexport class MarkdownState implements IState {\n nodes: Record<string, NodeProcessor>\n marks: Record<string, MarkProcessor>\n delim: string\n out: string\n closed: boolean\n closedNode?: MarkupNode\n inTightList: boolean\n options: StateOptions\n refUrl: string\n imageUrl: string\n htmlWriter: HtmlWriter\n\n constructor (\n nodes = storeNodes,\n marks = storeMarks,\n options: StateOptions = { tightLists: true, refUrl: 'ref://', imageUrl: 'http://' }\n ) {\n this.nodes = nodes\n this.marks = marks\n this.delim = this.out = ''\n this.closed = false\n this.inTightList = false\n this.refUrl = options.refUrl\n this.imageUrl = options.imageUrl\n this.htmlWriter = options.htmlWriter ?? markupToHtml\n\n this.options = options\n }\n\n flushClose (size: number): void {\n if (this.closed) {\n if (!this.atBlank()) this.out += '\\n'\n if (size > 1) {\n this.addDelim(size)\n }\n this.closed = false\n }\n }\n\n private addDelim (size: number): void {\n let delimMin = this.delim\n const trim = /\\s+$/.exec(delimMin)\n if (trim !== null) {\n delimMin = delimMin.slice(0, delimMin.length - trim[0].length)\n }\n for (let i = 1; i < size; i++) {\n this.out += delimMin + '\\n'\n }\n }\n\n renderHtml (node: MarkupNode): string {\n return this.htmlWriter(node)\n }\n\n wrapBlock (delim: string, firstDelim: string | null, node: MarkupNode, f: () => void): void {\n const old = this.delim\n this.write(firstDelim ?? delim)\n this.delim += delim\n f()\n this.delim = old\n this.closeBlock(node)\n }\n\n atBlank (): boolean {\n return /(^|\\n)$/.test(this.out)\n }\n\n // :: ()\n // Ensure the current content ends with a newline.\n ensureNewLine (): void {\n if (!this.atBlank()) this.out += '\\n'\n }\n\n // :: (?string)\n // Prepare the state for writing output (closing closed paragraphs,\n // adding delimiters, and so on), and then optionally add content\n // (unescaped) to the output.\n write (content: string): void {\n this.flushClose(2)\n if (this.delim !== undefined && this.atBlank()) this.out += this.delim\n if (content.length > 0) this.out += content\n }\n\n // :: (Node)\n // Close the block for the given node.\n closeBlock (node: MarkupNode): void {\n this.closedNode = node\n this.closed = true\n }\n\n // :: (string, ?bool)\n // Add the given text to the document. When escape is not `false`,\n // it will be escaped.\n text (text: string, escape = false): void {\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const startOfLine = this.atBlank() || this.closed\n this.write('')\n this.out += escape ? this.esc(lines[i], startOfLine) : lines[i]\n if (i !== lines.length - 1) this.out += '\\n'\n }\n }\n\n // :: (Node)\n // Render the given node as a block.\n render (node: MarkupNode, parent: MarkupNode, index: number): void {\n if (this.nodes[node.type] === undefined) {\n throw new Error('Token type `' + node.type + '` not supported by Markdown renderer')\n }\n this.nodes[node.type](this, node, parent, index)\n }\n\n // :: (Node)\n // Render the contents of `parent` as block nodes.\n renderContent (parent: MarkupNode): void {\n nodeContent(parent).forEach((node: MarkupNode, i: number) => {\n this.render(node, parent, i)\n })\n }\n\n reorderMixableMark (state: InlineState, mark: MarkupMark, i: number, len: number): void {\n for (let j = 0; j < state.active.length; j++) {\n const other = state.active[j]\n if (!this.marks[other.type].mixable || this.checkSwitchMarks(i, j, state, mark, other, len)) {\n break\n }\n }\n }\n\n reorderMixableMarks (state: InlineState, len: number): void {\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n\n for (let i = 0; i < len; i++) {\n const mark = state.marks[i]\n const mm = this.marks[mark.type]\n if (mm == null) {\n break\n }\n if (!mm.mixable) break\n this.reorderMixableMark(state, mark, i, len)\n }\n }\n\n private checkSwitchMarks (\n i: number,\n j: number,\n state: InlineState,\n mark: MarkupMark,\n other: MarkupMark,\n len: number\n ): boolean {\n if (!markEq(mark, other) || i === j) {\n return false\n }\n this.switchMarks(i, j, state, mark, len)\n return true\n }\n\n private switchMarks (i: number, j: number, state: InlineState, mark: MarkupMark, len: number): void {\n if (i > j) {\n state.marks = state.marks\n .slice(0, j)\n .concat(mark)\n .concat(state.marks.slice(j, i))\n .concat(state.marks.slice(i + 1, len))\n }\n if (j > i) {\n state.marks = state.marks\n .slice(0, i)\n .concat(state.marks.slice(i + 1, j))\n .concat(mark)\n .concat(state.marks.slice(j, len))\n }\n }\n\n renderNodeInline (state: InlineState, index: number): void {\n state.marks = state.node?.marks ?? []\n this.updateHardBreakMarks(state, index)\n\n const leading = this.adjustLeading(state)\n\n const inner: MarkupMark | undefined = state.marks.length > 0 ? state.marks[state.marks.length - 1] : undefined\n const noEsc = inner !== undefined && !(this.marks[inner.type]?.escape ?? false)\n const len = state.marks.length - (noEsc ? 1 : 0)\n\n this.reorderMixableMarks(state, len)\n\n // Find the prefix of the mark set that didn't change\n this.checkCloseMarks(state, len, index)\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading !== '') this.text(leading)\n\n // Open the marks that need to be opened\n this.checkOpenMarks(state, len, index, inner, noEsc)\n }\n\n private checkOpenMarks (\n state: InlineState,\n len: number,\n index: number,\n inner: MarkupMark | undefined,\n noEsc: boolean\n ): void {\n if (state.node !== undefined) {\n this.updateActiveMarks(state, len, index)\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (this.isNoEscapeRequire(state.node, inner, noEsc, state)) {\n this.renderMarkText(inner as MarkupMark, state, index)\n } else {\n this.render(state.node, state.parent, index)\n }\n }\n }\n\n private isNoEscapeRequire (\n node: MarkupNode,\n inner: MarkupMark | undefined,\n noEsc: boolean,\n state: InlineState\n ): boolean {\n return inner !== undefined && noEsc && node.type === MarkupNodeType.text\n }\n\n private renderMarkText (inner: MarkupMark, state: InlineState, index: number): void {\n this.text(\n this.markString(inner, true, state.parent, index) +\n (state.node?.text as string) +\n this.markString(inner, false, state.parent, index + 1),\n false\n )\n }\n\n private updateActiveMarks (state: InlineState, len: number, index: number): void {\n while (state.active.length < len) {\n const add = state.marks[state.active.length]\n state.active.push(add)\n this.text(this.markString(add, true, state.parent, index), false)\n }\n }\n\n private checkCloseMarks (state: InlineState, len: number, index: number): void {\n let keep = 0\n while (keep < Math.min(state.active.length, len) && markEq(state.marks[keep], state.active[keep])) {\n ++keep\n }\n\n // Close the marks that need to be closed\n while (keep < state.active.length) {\n const mark = state.active.pop()\n if (mark !== undefined) {\n this.text(this.markString(mark, false, state.parent, index), false)\n }\n }\n }\n\n private adjustLeading (state: InlineState): string {\n let leading = state.trailing\n state.trailing = ''\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n const node = state?.node\n if (this.isText(node) && this.isMarksHasExpelEnclosingWhitespace(state)) {\n const match = /^(\\s*)(.*?)(\\s*)$/m.exec(node?.text ?? '')\n if (match !== null) {\n const [leadMatch, innerMatch, trailMatch] = [match[1], match[2], match[3]]\n leading += leadMatch\n state.trailing = trailMatch\n this.adjustLeadingTextNode(leadMatch, trailMatch, state, innerMatch, node as MarkupNode)\n }\n }\n return leading\n }\n\n private isMarksHasExpelEnclosingWhitespace (state: InlineState): boolean {\n return state.marks.some((mark) => this.marks[mark.type]?.expelEnclosingWhitespace)\n }\n\n private adjustLeadingTextNode (\n lead: string,\n trail: string,\n state: InlineState,\n inner: string,\n node: MarkupNode\n ): void {\n if (lead !== '' || trail !== '') {\n state.node = inner !== undefined ? { ...node, text: inner } : undefined\n if (state.node === undefined) {\n state.marks = state.active\n }\n }\n }\n\n private updateHardBreakMarks (state: InlineState, index: number): void {\n if (state.node !== undefined && state.node.type === MarkupNodeType.hard_break) {\n state.marks = this.filterHardBreakMarks(state.marks, index, state)\n }\n }\n\n private filterHardBreakMarks (marks: MarkupMark[], index: number, state: InlineState): MarkupMark[] {\n const content = state.parent.content ?? []\n const next = content[index + 1]\n if (!this.isHardbreakText(next)) {\n return []\n }\n return marks.filter((m) => isInSet(m, next.marks ?? []))\n }\n\n private isHardbreakText (next?: MarkupNode): boolean {\n return (\n next !== undefined && (next.type !== MarkupNodeType.text || (next.text !== undefined && /\\S/.test(next.text)))\n )\n }\n\n private isText (node?: MarkupNode): boolean {\n return node !== undefined && node.type === MarkupNodeType.text && node.text !== undefined\n }\n\n // :: (Node)\n // Render the contents of `parent` as inline content.\n renderInline (parent: MarkupNode): void {\n const state: InlineState = { active: [], trailing: '', parent, marks: [] }\n nodeContent(parent).forEach((nde, index) => {\n state.node = nde\n this.renderNodeInline(state, index)\n })\n state.node = undefined\n this.renderNodeInline(state, 0)\n }\n\n // :: (Node, string, (number) \u2192 string)\n // Render a node's content as a list. `delim` should be the extra\n // indentation added to all lines except the first in an item,\n // `firstDelim` is a function going from an item index to a\n // delimiter for the first line of the item.\n renderList (node: MarkupNode, delim: string, firstDelim: FirstDelim): void {\n this.flushListClose(node)\n\n const isTight: boolean =\n typeof node.attrs?.tight !== 'undefined' ? node.attrs.tight === 'true' : this.options.tightLists\n const prevTight = this.inTightList\n this.inTightList = isTight\n\n nodeContent(node).forEach((child, i) => {\n this.renderListItem(node, child, i, isTight, delim, firstDelim)\n })\n this.inTightList = prevTight\n }\n\n renderListItem (\n node: MarkupNode,\n child: MarkupNode,\n i: number,\n isTight: boolean,\n delim: string,\n firstDelim: FirstDelim\n ): void {\n if (i > 0 && isTight) this.flushClose(1)\n this.wrapBlock(delim, firstDelim(i, node.content?.[i].attrs, node.attrs), node, () => {\n this.render(child, node, i)\n })\n }\n\n private flushListClose (node: MarkupNode): void {\n if (this.closed && this.closedNode?.type === node.type) {\n this.flushClose(3)\n } else if (this.inTightList) {\n this.flushClose(1)\n }\n }\n\n // :: (string, ?bool) \u2192 string\n // Escape the given string so that it can safely appear in Markdown\n // content. If `startOfLine` is true, also escape characters that\n // has special meaning only at the start of the line.\n esc (str: string, startOfLine = false): string {\n if (str == null) {\n return ''\n }\n str = str.replace(/[`*\\\\~\\[\\]]/g, '\\\\$&') // eslint-disable-line\n if (startOfLine) {\n str = str.replace(/^[:#\\-*+]/, '\\\\$&').replace(/^(\\d+)\\./, '$1\\\\.')\n }\n str = str.replace(/\\r?\\n/g, '\\\\\\n')\n return str\n }\n\n htmlEsc (str: string): string {\n if (str == null) {\n return ''\n }\n\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n }\n\n quote (str: string): string {\n const wrap = !(str?.includes('\"') ?? false) ? '\"\"' : !(str?.includes(\"'\") ?? false) ? \"''\" : '()'\n return wrap[0] + str + wrap[1]\n }\n\n // :: (string, number) \u2192 string\n // Repeat the given string `n` times.\n repeat (str: string, n: number): string {\n let out = ''\n for (let i = 0; i < n; i++) out += str\n return out\n }\n\n // : (Mark, bool, string?) \u2192 string\n // Get the markdown string for a given opening or closing mark.\n markString (mark: MarkupMark, open: boolean, parent: MarkupNode, index: number): string {\n let value = mark.attrs?.marker\n if (value === undefined) {\n const info = this.marks[mark.type]\n if (info == null) {\n throw new Error(`No info for mark ${mark.type}`)\n }\n value = open ? info.open : info.close\n }\n return typeof value === 'string' ? value : (value(this, mark, parent, index) ?? '')\n }\n}\n\nfunction makeQuery (obj: Record<string, string | number | boolean | null | undefined>): string {\n return Object.keys(obj)\n .filter((it) => it[1] != null)\n .map(function (k) {\n return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k] as string | number | boolean)\n })\n .join('&')\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hcengineering/text-markdown",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.19",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"svelte": "src/index.ts",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"eslint-plugin-svelte": "^2.35.1"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@hcengineering/text-core": "^0.7.
|
|
35
|
-
"@hcengineering/text-html": "^0.7.
|
|
34
|
+
"@hcengineering/text-core": "^0.7.18",
|
|
35
|
+
"@hcengineering/text-html": "^0.7.18",
|
|
36
36
|
"markdown-it": "^14.0.0",
|
|
37
37
|
"fast-equals": "^5.2.2"
|
|
38
38
|
},
|