@hcengineering/text-markdown 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/markdown.test.js +1044 -0
- package/lib/__tests__/markdown.test.js.map +7 -0
- package/lib/compare.js +100 -0
- package/lib/compare.js.map +7 -0
- package/lib/index.js +47 -0
- package/lib/index.js.map +7 -0
- package/lib/marks.js +59 -0
- package/lib/marks.js.map +7 -0
- package/lib/node.js +34 -0
- package/lib/node.js.map +7 -0
- package/lib/parser.js +724 -0
- package/lib/parser.js.map +7 -0
- package/lib/serializer.js +614 -0
- package/lib/serializer.js.map +7 -0
- package/package.json +59 -0
- package/src/__tests__/markdown.test.ts +1076 -0
- package/src/compare.ts +119 -0
- package/src/index.ts +47 -0
- package/src/marks.ts +46 -0
- package/src/node.ts +24 -0
- package/src/parser.ts +853 -0
- package/src/serializer.ts +833 -0
- package/tsconfig.json +12 -0
- package/types/__tests__/markdown.test.d.ts +9 -0
- package/types/__tests__/markdown.test.d.ts.map +1 -0
- package/types/compare.d.ts +10 -0
- package/types/compare.d.ts.map +1 -0
- package/types/index.d.ts +14 -0
- package/types/index.d.ts.map +1 -0
- package/types/marks.d.ts +8 -0
- package/types/marks.d.ts.map +1 -0
- package/types/node.d.ts +4 -0
- package/types/node.d.ts.map +1 -0
- package/types/parser.d.ts +50 -0
- package/types/parser.d.ts.map +1 -0
- package/types/serializer.d.ts +102 -0
- package/types/serializer.d.ts.map +1 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/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": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hcengineering/text-markdown",
|
|
3
|
+
"version": "0.7.1",
|
|
4
|
+
"main": "lib/index.js",
|
|
5
|
+
"svelte": "src/index.ts",
|
|
6
|
+
"types": "types/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib/**/*",
|
|
9
|
+
"types/**/*",
|
|
10
|
+
"src/**/*",
|
|
11
|
+
"!src/**/__test__/**",
|
|
12
|
+
"tsconfig.json"
|
|
13
|
+
],
|
|
14
|
+
"author": "Anticrm Platform Contributors",
|
|
15
|
+
"license": "EPL-2.0",
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@hcengineering/platform-rig": "^0.7.9",
|
|
18
|
+
"@typescript-eslint/eslint-plugin": "^6.11.0",
|
|
19
|
+
"eslint-plugin-import": "^2.26.0",
|
|
20
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
21
|
+
"eslint-plugin-n": "^15.4.0",
|
|
22
|
+
"eslint": "^8.54.0",
|
|
23
|
+
"@typescript-eslint/parser": "^6.11.0",
|
|
24
|
+
"eslint-config-standard-with-typescript": "^40.0.0",
|
|
25
|
+
"prettier": "^3.1.0",
|
|
26
|
+
"typescript": "^5.8.3",
|
|
27
|
+
"jest": "^29.7.0",
|
|
28
|
+
"ts-jest": "^29.1.1",
|
|
29
|
+
"@types/jest": "^29.5.5",
|
|
30
|
+
"@types/markdown-it": "~13.0.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@hcengineering/text-core": "^0.7.1",
|
|
34
|
+
"@hcengineering/text-html": "^0.7.1",
|
|
35
|
+
"markdown-it": "^14.0.0",
|
|
36
|
+
"fast-equals": "^5.2.2"
|
|
37
|
+
},
|
|
38
|
+
"repository": "https://github.com/hcengineering/huly.core",
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"exports": {
|
|
43
|
+
".": {
|
|
44
|
+
"types": "./types/index.d.ts",
|
|
45
|
+
"require": "./lib/index.js",
|
|
46
|
+
"import": "./lib/index.js"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "compile",
|
|
51
|
+
"test": "jest --passWithNoTests --silent",
|
|
52
|
+
"build:watch": "compile",
|
|
53
|
+
"format": "format src",
|
|
54
|
+
"_phase:build": "compile transpile src",
|
|
55
|
+
"_phase:test": "jest --passWithNoTests --silent",
|
|
56
|
+
"_phase:format": "format src",
|
|
57
|
+
"_phase:validate": "compile validate"
|
|
58
|
+
}
|
|
59
|
+
}
|