@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/__tests__/markdown.test.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 { MarkupNode } from '@hcengineering/text-core'\nimport { markdownToMarkup, markupToMarkdown } from '..'\nimport { isMarkdownsEquals } from '../compare'\n\nconst refUrl: string = 'ref://'\nconst imageUrl: string = 'http://localhost'\nconst options = { refUrl, imageUrl }\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace jest {\n interface Matchers<R> {\n toEqualMarkdown: (expected: string) => R\n }\n }\n}\n\nexpect.extend({\n toEqualMarkdown (received: string, expected: string) {\n const pass = isMarkdownsEquals(received, expected)\n return {\n message: () =>\n pass\n ? `Expected markdown strings NOT to be equal:\\n Received:\\n${received}\\n Expected:\\n${expected}`\n : `Expected markdown strings to be equal:\\n Received:\\n${received}\\n Expected:\\n${expected}`,\n pass\n }\n }\n})\n\ndescribe('markdownToMarkup', () => {\n const tests: Array<{ name: string, markdown: string, markup: object }> = [\n {\n name: 'simple text',\n markdown: 'Lorem ipsum dolor sit amet.',\n markup: {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'Lorem ipsum dolor sit amet.',\n marks: []\n }\n ]\n }\n ]\n }\n },\n {\n name: 'text with heading',\n markdown: `# Lorem ipsum\n\nLorem ipsum dolor sit amet.\n`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'Lorem ipsum',\n marks: []\n }\n ]\n },\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'Lorem ipsum dolor sit amet.',\n marks: []\n }\n ]\n }\n ]\n }\n },\n {\n name: 'bullet list',\n markdown: `# bullet list\n- list item 1\n- list item 2\n`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'bullet list',\n marks: []\n }\n ]\n },\n {\n type: 'bulletList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'list item 1',\n marks: []\n }\n ]\n }\n ]\n },\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'list item 2',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n name: 'todos',\n markdown: `# TODO\n- [ ] todo 1\n- [x] todo 2\n `,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'TODO',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: false },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo 1',\n marks: []\n }\n ]\n }\n ]\n },\n {\n type: 'todoItem',\n attrs: { checked: true },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo 2',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n name: 'todos followed by list items',\n markdown: `# todo and list\n- [ ] todo 1\n- [x] todo 2\n- list item 1\n- list item 2\n`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'todo and list',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: false },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo 1',\n marks: []\n }\n ]\n }\n ]\n },\n {\n type: 'todoItem',\n attrs: { checked: true },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo 2',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n },\n {\n type: 'bulletList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'list item 1',\n marks: []\n }\n ]\n }\n ]\n },\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'list item 2',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n name: 'todos followed by list items',\n markdown: `# mixed lists\n- [ ] todo 1\n- list item 1\n- [x] todo 2\n- list item 2\n`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'mixed lists',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: false },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo 1',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n },\n {\n type: 'bulletList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'list item 1',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: true },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo 2',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n },\n {\n type: 'bulletList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'list item 2',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n name: 'nested todos',\n markdown: `# nested todos\n- [ ] todo\n - [x] sub todo\n`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'nested todos',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: false },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: true },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'sub todo',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n name: 'nested lists',\n markdown: `# nested lists\n- [ ] todo\n - sub list item\n - [x] sub todo\n- list item\n - [x] sub todo\n - sub list item\n`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'nested lists',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: false },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo',\n marks: []\n }\n ]\n },\n {\n type: 'bulletList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'sub list item',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: true },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'sub todo',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n },\n {\n type: 'bulletList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'list item',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: true },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'sub todo',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n },\n {\n type: 'bulletList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'sub list item',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n name: 'nested todos',\n markdown: `# nested todos\n- [ ] todo\n - [x] sub todo\n`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'heading',\n attrs: { level: 1, marker: '#' },\n content: [\n {\n type: 'text',\n text: 'nested todos',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: false },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'todo',\n marks: []\n }\n ]\n },\n {\n type: 'todoList',\n attrs: {\n bullet: '-'\n },\n content: [\n {\n type: 'todoItem',\n attrs: { checked: true },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'sub todo',\n marks: []\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n },\n {\n name: 'mermaid diagram',\n markdown: '```mermaid\\ngraph TD;\\n\\tA-->B;\\n\\tA-->C;\\n\\tB-->D;\\n\\tC-->D;\\n```',\n markup: {\n type: 'doc',\n content: [\n {\n type: 'mermaid',\n attrs: {\n language: 'mermaid'\n },\n content: [\n {\n marks: [],\n text: 'graph TD;\\n\\tA-->B;\\n\\tA-->C;\\n\\tB-->D;\\n\\tC-->D;',\n type: 'text'\n }\n ]\n }\n ]\n }\n },\n {\n name: 'embed',\n markdown: '<a href=\"http://localhost/embed\" data-type=\"embed\">http://localhost/embed</a>',\n markup: {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'embed',\n attrs: { src: 'http://localhost/embed' },\n content: []\n }\n ]\n }\n ]\n }\n },\n {\n name: 'embed-uri-escape',\n markdown:\n '<a href=\"http://localhost/embed%20spaces\" data-type=\"embed\">http://localhost/embed spaces</a>',\n markup: {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'embed',\n attrs: { src: 'http://localhost/embed spaces' },\n content: []\n }\n ]\n }\n ]\n }\n },\n {\n name: 'embed-html-escape',\n markdown:\n '<a href=\"http://localhost/embed%3Chtml%3E\" data-type=\"embed\">http://localhost/embed<html></a>',\n markup: {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'embed',\n attrs: { src: 'http://localhost/embed<html>' },\n content: []\n }\n ]\n }\n ]\n }\n },\n {\n name: 'multiline image alt',\n markdown: '',\n markup: {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'image',\n attrs: { src: 'http://example.com/image.png', alt: 'line0\\n\\nline1' },\n content: []\n }\n ]\n }\n ]\n }\n },\n {\n name: 'image in a table cell',\n markdown:\n '<table><tbody><tr><td><p>Some text</p><p> <img src=\"files/image_1.png\" alt=\"image-alt\"/></p></td></tr></tbody></table>',\n markup: {\n type: 'doc',\n content: [\n {\n type: 'table',\n content: [\n {\n type: 'tableRow',\n content: [\n {\n type: 'tableCell',\n attrs: {\n colspan: undefined,\n rowspan: undefined,\n colwidth: undefined\n },\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'Some text'\n }\n ]\n },\n {\n type: 'paragraph',\n attrs: {\n textAlign: null\n },\n content: [\n {\n type: 'text',\n text: ' '\n },\n {\n type: 'image',\n attrs: {\n src: 'files/image_1.png',\n alt: 'image-alt',\n 'file-id': null,\n title: null\n }\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n }\n ]\n\n describe('to markup', () => {\n tests.forEach(({ name, markdown, markup }) => {\n it(name, () => {\n const parsed = markdownToMarkup(markdown, options)\n expect(parsed).toEqual(markup)\n })\n })\n })\n\n describe('to markup and back', () => {\n tests.forEach(({ name, markdown, markup }) => {\n it(name, () => {\n const json = markdownToMarkup(markdown, options)\n const serialized = markupToMarkdown(json, options)\n expect(serialized).toEqualMarkdown(markdown)\n })\n })\n })\n})\n\ndescribe('markupToMarkdown', () => {\n const tests: Array<{ name: string, markdown: string, markup: object }> = [\n {\n name: 'links',\n markdown: `[Link](https://example.com)\n\n[Link with spaces](<https://example.com/with spaces>)\n\n[Link with spaces and braces](<https://example.com/\\\\<with spaces\\\\>>)`,\n markup: {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'Link',\n marks: [{ type: 'link', attrs: { href: 'https://example.com' } }]\n }\n ]\n },\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'Link with spaces',\n marks: [{ type: 'link', attrs: { href: 'https://example.com/with spaces' } }]\n }\n ]\n },\n {\n type: 'paragraph',\n content: [\n {\n type: 'text',\n text: 'Link with spaces and braces',\n marks: [{ type: 'link', attrs: { href: 'https://example.com/<with spaces>' } }]\n }\n ]\n }\n ]\n }\n }\n ]\n\n describe('to markdown', () => {\n tests.forEach(({ name, markdown, markup }) => {\n it(name, () => {\n const result = markupToMarkdown(markup as MarkupNode, options)\n expect(result).toEqual(markdown)\n })\n })\n })\n})\n\ndescribe('markdownToMarkup -> markupToMarkdown', () => {\n const tests: Array<{ name: string, markdown: string, alternate?: string }> = [\n { name: 'Italic', markdown: '*Asteriscs* and _Underscores_' },\n { name: 'Bold', markdown: '**Asteriscs** and __Underscores__' },\n { name: 'Bullet list with asteriscs', markdown: 'Asterisks :\\r\\n* Firstly\\r\\n* Secondly' },\n { name: 'Bullet list with dashes', markdown: 'Dashes :\\r\\n- Firstly\\r\\n- Secondly' },\n { name: 'TODO list with asteriscs', markdown: '* [ ] Take\\n* [ ] Do\\n\\n' },\n { name: 'TODO list with dashes', markdown: '- [x] Take\\n- [ ] Do\\n\\n' },\n {\n name: 'Different markers',\n markdown:\n 'Asterisks bulleted list:\\r\\n* Asterisks: *Italic* and **Bold*** Underscores: _Italic_ and __Bold__\\r\\n\\r\\nDash bulleted list:\\r\\n- Asterisks: *Italic* and **Bold**\\r\\n- Underscores: _Italic_ and __Bold__\\r\\n-'\n },\n { name: 'Single line comment', markdown: '<!-- Do not erase me -->' },\n {\n name: 'Multsiline comment',\n markdown:\n '\"<!--\\r\\n\\r\\nPlease title your PR as follows: `module: description` (e.g. `time: fix date format`).\\r\\nAlways start with the thing you are fixing, then describe the fix.\\r\\nDon\\'t use past tense (e.g. \"fixed foo bar\").\\r\\n\\r\\nExplain what your PR does and why.\\r\\n\\r\\nIf you are adding a new function, please document it and add tests:\\r\\n\\r\\n```\\r\\n// foo does foo and bar\\r\\nfn foo() {\\r\\n\\r\\n// file_test.v\\r\\nfn test_foo() {\\r\\n assert foo() == ...\\r\\n ...\\r\\n}\\r\\n```\\r\\n\\r\\nIf you are fixing a bug, please add a test that covers it.\\r\\n\\r\\nBefore submitting a PR, please run `v test-all` .\\r\\nSee also `TESTS.md`.\\r\\n\\r\\nI try to process PRs as soon as possible. They should be handled within 24 hours.\\r\\n\\r\\nApplying labels to PRs is not needed.\\r\\n\\r\\nThanks a lot for your contribution!\\r\\n\\r\\n-->\\r\\n\\r\\nThis PR fix issue #22424\\r\\n\\r\\n\\r\\n\"'\n },\n {\n name: 'Link',\n markdown: 'See [link](https://example.com)'\n },\n {\n name: 'Link with spaces',\n markdown: 'See [link](<https://example.com/with spaces>)',\n alternate: 'See [link](https://example.com/with%20spaces)'\n },\n {\n name: 'Link with spaces and braces',\n markdown: 'See [link](<https://example.com/\\\\<with spaces\\\\>>)',\n alternate: 'See [link](https://example.com/%3Cwith%20spaces%3E)'\n },\n {\n name: 'Codeblock',\n markdown: '```typescript\\nconst x: number = 42;\\n```'\n },\n {\n name: 'Image',\n markdown: '<img width=\"320\" height=\"160\" src=\"http://example.com/image\" alt=\"image\">'\n },\n {\n name: 'Images',\n markdown: `\n<img width=\"250\" height=\"330\" src=\"https://github.com/user-attachments/assets/f348e016-3f7d-45b1-b8a0-9098e9961885\" alt=\"Screenshot 2025-09-11 at 15 42 40\" />\n\n<img width=\"250\" height=\"230\" alt=\"Screenshot 2025-09-11 at 15 43 42\" src=\"https://github.com/user-attachments/assets/4502eba1-1f55-44df-b691-c4d3d3d3d67d\" >\n\n<img src=\"https://github.com/user-attachments/assets/e21431a3-2062-4b0b-9c8f-d06c92ede741\" alt=\"Screenshot 2025-09-11 at 15 43 50\" width=\"250\" height=\"210\" >`\n },\n {\n name: 'Image with multiline alt',\n markdown: ''\n },\n {\n name: 'Table',\n markdown:\n '<table><tbody><tr><th><p>Header 1</p></th><th><p>Header 2</p></th></tr><tr><td><p>Cell 1</p></td><td><p>Cell 2</p></td></tr><tr><td><p>Cell 3</p></td><td><p>Cell 4</p></td></tr></tbody></table>'\n },\n {\n name: 'Complex table',\n markdown:\n '<table><tbody><tr><td colspan=\"2\" colwidth=\"320\"><p>Header</p></td></tr><tr><td rowspan=\"2\"><p>Cell 1</p></td><td><p>Cell 2</p></td></tr><tr><td><p>Cell 3</p></td></tr></tbody></table>'\n },\n {\n name: 'Sub',\n markdown: '<sub>View in Huly <a href=\"http://localhost:8080/guest/github?token=token\">TSK-50</a></sub>'\n }\n // {\n // name: 'Malformed',\n // markdown: '<foo>try to parse me</bar></buzz>'\n // }\n ]\n\n tests.forEach(({ name, markdown, alternate }) => {\n it(name, () => {\n const json = markdownToMarkup(markdown, options)\n const serialized = markupToMarkdown(json, options)\n expect(serialized).toEqualMarkdown(alternate ?? markdown)\n })\n })\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/lib/compare.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var compare_exports = {};
|
|
21
|
+
__export(compare_exports, {
|
|
22
|
+
calcS\u00F8rensenDiceCoefficient: () => calcS\u00F8rensenDiceCoefficient,
|
|
23
|
+
isMarkdownsEquals: () => isMarkdownsEquals,
|
|
24
|
+
normalizeMarkdown: () => normalizeMarkdown
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(compare_exports);
|
|
27
|
+
function calcS\u00F8rensenDiceCoefficient(a, b) {
|
|
28
|
+
const first = a.replace(/\s+/g, "");
|
|
29
|
+
const second = b.replace(/\s+/g, "");
|
|
30
|
+
if (first === second) return 1;
|
|
31
|
+
if (first.length < 2 || second.length < 2) return 0;
|
|
32
|
+
const firstBigrams = /* @__PURE__ */ new Map();
|
|
33
|
+
for (let i = 0; i < first.length - 1; i++) {
|
|
34
|
+
const bigram = first.substring(i, i + 2);
|
|
35
|
+
const count = (firstBigrams.get(bigram) ?? 0) + 1;
|
|
36
|
+
firstBigrams.set(bigram, count);
|
|
37
|
+
}
|
|
38
|
+
let intersectionSize = 0;
|
|
39
|
+
for (let i = 0; i < second.length - 1; i++) {
|
|
40
|
+
const bigram = second.substring(i, i + 2);
|
|
41
|
+
const count = firstBigrams.get(bigram) ?? 0;
|
|
42
|
+
if (count > 0) {
|
|
43
|
+
firstBigrams.set(bigram, count - 1);
|
|
44
|
+
intersectionSize++;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return 2 * intersectionSize / (first.length + second.length - 2);
|
|
48
|
+
}
|
|
49
|
+
__name(calcS\u00F8rensenDiceCoefficient, "calcS\xF8rensenDiceCoefficient");
|
|
50
|
+
function isMarkdownsEquals(source1, source2) {
|
|
51
|
+
const normalized1 = normalizeMarkdown(source1);
|
|
52
|
+
const normalized2 = normalizeMarkdown(source2);
|
|
53
|
+
return normalized1 === normalized2;
|
|
54
|
+
}
|
|
55
|
+
__name(isMarkdownsEquals, "isMarkdownsEquals");
|
|
56
|
+
function normalizeMarkdown(source) {
|
|
57
|
+
const tagRegex = /<(\w+)([^>]*?)(\/?)>/g;
|
|
58
|
+
const attrRegex = /(\w+)(?:=(?:"([^"]*)"|'([^']*)'|([^\s>]+)))?/g;
|
|
59
|
+
source = source.replace(/\r?\n/g, "\n");
|
|
60
|
+
source = source.split("\n").map((it) => it.trimEnd()).filter((it) => it.length > 0).join("\n");
|
|
61
|
+
source = source.replace(tagRegex, (match, tagName, attributes) => {
|
|
62
|
+
const attrs = {};
|
|
63
|
+
let attrMatch = attrRegex.exec(attributes);
|
|
64
|
+
while (attrMatch !== null) {
|
|
65
|
+
const attrName = attrMatch[1];
|
|
66
|
+
const attrValue = attrMatch[2] ?? attrMatch[3] ?? attrMatch[4] ?? "";
|
|
67
|
+
attrs[attrName] = attrValue;
|
|
68
|
+
attrMatch = attrRegex.exec(attributes);
|
|
69
|
+
}
|
|
70
|
+
const sortedAttrs = Object.keys(attrs).sort().map((key) => {
|
|
71
|
+
const value = attrs[key];
|
|
72
|
+
return value !== "" ? `${key}="${value}"` : key;
|
|
73
|
+
}).join(" ");
|
|
74
|
+
const voidElements = [
|
|
75
|
+
"img",
|
|
76
|
+
"br",
|
|
77
|
+
"hr",
|
|
78
|
+
"input",
|
|
79
|
+
"meta",
|
|
80
|
+
"area",
|
|
81
|
+
"base",
|
|
82
|
+
"col",
|
|
83
|
+
"embed",
|
|
84
|
+
"link",
|
|
85
|
+
"param",
|
|
86
|
+
"source",
|
|
87
|
+
"track",
|
|
88
|
+
"wbr"
|
|
89
|
+
];
|
|
90
|
+
const isVoidElement = voidElements.includes(tagName.toLowerCase());
|
|
91
|
+
if (sortedAttrs !== "") {
|
|
92
|
+
return isVoidElement ? `<${tagName} ${sortedAttrs} />` : `<${tagName} ${sortedAttrs}>`;
|
|
93
|
+
} else {
|
|
94
|
+
return isVoidElement ? `<${tagName} />` : `<${tagName}>`;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return source;
|
|
98
|
+
}
|
|
99
|
+
__name(normalizeMarkdown, "normalizeMarkdown");
|
|
100
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/compare.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\n/**\n * Calculate S\u00F8rensen\u2013Dice coefficient\n */\nexport function calcS\u00F8rensenDiceCoefficient (a: string, b: string): number {\n const first = a.replace(/\\s+/g, '')\n const second = b.replace(/\\s+/g, '')\n\n if (first === second) return 1 // identical or empty\n if (first.length < 2 || second.length < 2) return 0 // if either is a 0-letter or 1-letter string\n\n const firstBigrams = new Map<string, number>()\n for (let i = 0; i < first.length - 1; i++) {\n const bigram = first.substring(i, i + 2)\n const count = (firstBigrams.get(bigram) ?? 0) + 1\n\n firstBigrams.set(bigram, count)\n }\n\n let intersectionSize = 0\n for (let i = 0; i < second.length - 1; i++) {\n const bigram = second.substring(i, i + 2)\n const count = firstBigrams.get(bigram) ?? 0\n\n if (count > 0) {\n firstBigrams.set(bigram, count - 1)\n intersectionSize++\n }\n }\n\n return (2.0 * intersectionSize) / (first.length + second.length - 2)\n}\n\n/**\n * Perform markdown diff/comparison to understand do we have a major differences.\n */\nexport function isMarkdownsEquals (source1: string, source2: string): boolean {\n const normalized1 = normalizeMarkdown(source1)\n const normalized2 = normalizeMarkdown(source2)\n return normalized1 === normalized2\n}\n\nexport function normalizeMarkdown (source: string): string {\n const tagRegex = /<(\\w+)([^>]*?)(\\/?)>/g\n const attrRegex = /(\\w+)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+)))?/g\n\n // Normalize line endings to LF\n source = source.replace(/\\r?\\n/g, '\\n')\n\n // Remove extra blank lines\n source = source\n .split('\\n')\n .map((it) => it.trimEnd())\n .filter((it) => it.length > 0)\n .join('\\n')\n\n // Normalize HTML tags\n source = source.replace(tagRegex, (match, tagName, attributes) => {\n const attrs: Record<string, string> = {}\n\n let attrMatch = attrRegex.exec(attributes)\n while (attrMatch !== null) {\n const attrName = attrMatch[1]\n const attrValue = attrMatch[2] ?? attrMatch[3] ?? attrMatch[4] ?? ''\n attrs[attrName] = attrValue\n attrMatch = attrRegex.exec(attributes)\n }\n\n // Sort attributes by name for consistent order\n const sortedAttrs = Object.keys(attrs)\n .sort()\n .map((key) => {\n const value = attrs[key]\n return value !== '' ? `${key}=\"${value}\"` : key\n })\n .join(' ')\n\n // Normalize to self-closing format for void elements\n const voidElements = [\n 'img',\n 'br',\n 'hr',\n 'input',\n 'meta',\n 'area',\n 'base',\n 'col',\n 'embed',\n 'link',\n 'param',\n 'source',\n 'track',\n 'wbr'\n ]\n const isVoidElement = voidElements.includes(tagName.toLowerCase())\n\n if (sortedAttrs !== '') {\n return isVoidElement ? `<${tagName} ${sortedAttrs} />` : `<${tagName} ${sortedAttrs}>`\n } else {\n return isVoidElement ? `<${tagName} />` : `<${tagName}>`\n }\n })\n\n return source\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBO,SAAS,iCAA6B,GAAW,GAAmB;AACzE,QAAM,QAAQ,EAAE,QAAQ,QAAQ,EAAE;AAClC,QAAM,SAAS,EAAE,QAAQ,QAAQ,EAAE;AAEnC,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,MAAM,SAAS,KAAK,OAAO,SAAS,EAAG,QAAO;AAElD,QAAM,eAAe,oBAAI,IAAoB;AAC7C,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,SAAS,MAAM,UAAU,GAAG,IAAI,CAAC;AACvC,UAAM,SAAS,aAAa,IAAI,MAAM,KAAK,KAAK;AAEhD,iBAAa,IAAI,QAAQ,KAAK;AAAA,EAChC;AAEA,MAAI,mBAAmB;AACvB,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,UAAM,SAAS,OAAO,UAAU,GAAG,IAAI,CAAC;AACxC,UAAM,QAAQ,aAAa,IAAI,MAAM,KAAK;AAE1C,QAAI,QAAQ,GAAG;AACb,mBAAa,IAAI,QAAQ,QAAQ,CAAC;AAClC;AAAA,IACF;AAAA,EACF;AAEA,SAAQ,IAAM,oBAAqB,MAAM,SAAS,OAAO,SAAS;AACpE;AA3BgB;AAgCT,SAAS,kBAAmB,SAAiB,SAA0B;AAC5E,QAAM,cAAc,kBAAkB,OAAO;AAC7C,QAAM,cAAc,kBAAkB,OAAO;AAC7C,SAAO,gBAAgB;AACzB;AAJgB;AAMT,SAAS,kBAAmB,QAAwB;AACzD,QAAM,WAAW;AACjB,QAAM,YAAY;AAGlB,WAAS,OAAO,QAAQ,UAAU,IAAI;AAGtC,WAAS,OACN,MAAM,IAAI,EACV,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,EACxB,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,EAC5B,KAAK,IAAI;AAGZ,WAAS,OAAO,QAAQ,UAAU,CAAC,OAAO,SAAS,eAAe;AAChE,UAAM,QAAgC,CAAC;AAEvC,QAAI,YAAY,UAAU,KAAK,UAAU;AACzC,WAAO,cAAc,MAAM;AACzB,YAAM,WAAW,UAAU,CAAC;AAC5B,YAAM,YAAY,UAAU,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU,CAAC,KAAK;AAClE,YAAM,QAAQ,IAAI;AAClB,kBAAY,UAAU,KAAK,UAAU;AAAA,IACvC;AAGA,UAAM,cAAc,OAAO,KAAK,KAAK,EAClC,KAAK,EACL,IAAI,CAAC,QAAQ;AACZ,YAAM,QAAQ,MAAM,GAAG;AACvB,aAAO,UAAU,KAAK,GAAG,GAAG,KAAK,KAAK,MAAM;AAAA,IAC9C,CAAC,EACA,KAAK,GAAG;AAGX,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,gBAAgB,aAAa,SAAS,QAAQ,YAAY,CAAC;AAEjE,QAAI,gBAAgB,IAAI;AACtB,aAAO,gBAAgB,IAAI,OAAO,IAAI,WAAW,QAAQ,IAAI,OAAO,IAAI,WAAW;AAAA,IACrF,OAAO;AACL,aAAO,gBAAgB,IAAI,OAAO,QAAQ,IAAI,OAAO;AAAA,IACvD;AAAA,EACF,CAAC;AAED,SAAO;AACT;AA9DgB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
20
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
markdownToMarkup: () => markdownToMarkup,
|
|
24
|
+
markupToMarkdown: () => markupToMarkdown
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(index_exports);
|
|
27
|
+
var import_parser = require("./parser");
|
|
28
|
+
var import_serializer = require("./serializer");
|
|
29
|
+
__reExport(index_exports, require("./compare"), module.exports);
|
|
30
|
+
__reExport(index_exports, require("./parser"), module.exports);
|
|
31
|
+
__reExport(index_exports, require("./serializer"), module.exports);
|
|
32
|
+
function markupToMarkdown(markup, options) {
|
|
33
|
+
const refUrl = options?.refUrl ?? "ref://";
|
|
34
|
+
const imageUrl = options?.imageUrl ?? "image://";
|
|
35
|
+
const state = new import_serializer.MarkdownState(import_serializer.storeNodes, import_serializer.storeMarks, { tightLists: true, refUrl, imageUrl });
|
|
36
|
+
state.renderContent(markup);
|
|
37
|
+
return state.out;
|
|
38
|
+
}
|
|
39
|
+
__name(markupToMarkdown, "markupToMarkdown");
|
|
40
|
+
function markdownToMarkup(markdown, options) {
|
|
41
|
+
const refUrl = options?.refUrl ?? "ref://";
|
|
42
|
+
const imageUrl = options?.imageUrl ?? "image://";
|
|
43
|
+
const parser = new import_parser.MarkdownParser({ refUrl, imageUrl });
|
|
44
|
+
return parser.parse(markdown ?? "");
|
|
45
|
+
}
|
|
46
|
+
__name(markdownToMarkup, "markdownToMarkup");
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.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 { MarkupNode } from '@hcengineering/text-core'\nimport { MarkdownParser } from './parser'\nimport { MarkdownState, storeMarks, storeNodes } from './serializer'\n\nexport * from './compare'\nexport * from './parser'\nexport * from './serializer'\n\n/** @public */\nexport interface MarkdownOptions {\n refUrl?: string\n imageUrl?: string\n}\n\n/** @public */\nexport function markupToMarkdown (markup: MarkupNode, options?: MarkdownOptions): string {\n const refUrl = options?.refUrl ?? 'ref://'\n const imageUrl = options?.imageUrl ?? 'image://'\n\n const state = new MarkdownState(storeNodes, storeMarks, { tightLists: true, refUrl, imageUrl })\n state.renderContent(markup)\n return state.out\n}\n\n/** @public */\nexport function markdownToMarkup (markdown: string, options?: MarkdownOptions): MarkupNode {\n const refUrl = options?.refUrl ?? 'ref://'\n const imageUrl = options?.imageUrl ?? 'image://'\n\n const parser = new MarkdownParser({ refUrl, imageUrl })\n return parser.parse(markdown ?? '')\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,oBAA+B;AAC/B,wBAAsD;AAEtD,0BAAc,sBAnBd;AAoBA,0BAAc,qBApBd;AAqBA,0BAAc,yBArBd;AA8BO,SAAS,iBAAkB,QAAoB,SAAmC;AACvF,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,WAAW,SAAS,YAAY;AAEtC,QAAM,QAAQ,IAAI,gCAAc,8BAAY,8BAAY,EAAE,YAAY,MAAM,QAAQ,SAAS,CAAC;AAC9F,QAAM,cAAc,MAAM;AAC1B,SAAO,MAAM;AACf;AAPgB;AAUT,SAAS,iBAAkB,UAAkB,SAAuC;AACzF,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,WAAW,SAAS,YAAY;AAEtC,QAAM,SAAS,IAAI,6BAAe,EAAE,QAAQ,SAAS,CAAC;AACtD,SAAO,OAAO,MAAM,YAAY,EAAE;AACpC;AANgB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/lib/marks.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var marks_exports = {};
|
|
21
|
+
__export(marks_exports, {
|
|
22
|
+
addToSet: () => addToSet,
|
|
23
|
+
isInSet: () => isInSet,
|
|
24
|
+
markAttrs: () => markAttrs,
|
|
25
|
+
markEq: () => markEq,
|
|
26
|
+
removeFromSet: () => removeFromSet,
|
|
27
|
+
sameSet: () => sameSet
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(marks_exports);
|
|
30
|
+
var import_fast_equals = require("fast-equals");
|
|
31
|
+
function markAttrs(mark) {
|
|
32
|
+
return mark.attrs ?? {};
|
|
33
|
+
}
|
|
34
|
+
__name(markAttrs, "markAttrs");
|
|
35
|
+
function isInSet(mark, marks) {
|
|
36
|
+
return marks.find((m) => markEq(mark, m)) !== void 0;
|
|
37
|
+
}
|
|
38
|
+
__name(isInSet, "isInSet");
|
|
39
|
+
function addToSet(mark, marks) {
|
|
40
|
+
const m = marks.find((m2) => markEq(mark, m2));
|
|
41
|
+
if (m !== void 0) {
|
|
42
|
+
return marks;
|
|
43
|
+
}
|
|
44
|
+
return [...marks, mark];
|
|
45
|
+
}
|
|
46
|
+
__name(addToSet, "addToSet");
|
|
47
|
+
function removeFromSet(markType, marks) {
|
|
48
|
+
return marks.filter((m) => m.type !== markType);
|
|
49
|
+
}
|
|
50
|
+
__name(removeFromSet, "removeFromSet");
|
|
51
|
+
function sameSet(a, b) {
|
|
52
|
+
return (0, import_fast_equals.deepEqual)(a, b);
|
|
53
|
+
}
|
|
54
|
+
__name(sameSet, "sameSet");
|
|
55
|
+
function markEq(first, other) {
|
|
56
|
+
return (0, import_fast_equals.deepEqual)(first, other);
|
|
57
|
+
}
|
|
58
|
+
__name(markEq, "markEq");
|
|
59
|
+
//# sourceMappingURL=marks.js.map
|
package/lib/marks.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/marks.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, MarkupMarkType } from '@hcengineering/text-core'\nimport { deepEqual } from 'fast-equals'\n\nexport function markAttrs (mark: MarkupMark): Record<string, string> {\n return mark.attrs ?? {}\n}\n\nexport function isInSet (mark: MarkupMark, marks: MarkupMark[]): boolean {\n return marks.find((m) => markEq(mark, m)) !== undefined\n}\n\nexport function addToSet (mark: MarkupMark, marks: MarkupMark[]): MarkupMark[] {\n const m = marks.find((m) => markEq(mark, m))\n if (m !== undefined) {\n // We already have mark\n return marks\n }\n return [...marks, mark]\n}\n\nexport function removeFromSet (markType: MarkupMarkType, marks: MarkupMark[]): MarkupMark[] {\n return marks.filter((m) => m.type !== markType)\n}\n\nexport function sameSet (a?: MarkupMark[], b?: MarkupMark[]): boolean {\n return deepEqual(a, b)\n}\n\nexport function markEq (first: MarkupMark, other: MarkupMark): boolean {\n return deepEqual(first, other)\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,yBAA0B;AAEnB,SAAS,UAAW,MAA0C;AACnE,SAAO,KAAK,SAAS,CAAC;AACxB;AAFgB;AAIT,SAAS,QAAS,MAAkB,OAA8B;AACvE,SAAO,MAAM,KAAK,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC,MAAM;AAChD;AAFgB;AAIT,SAAS,SAAU,MAAkB,OAAmC;AAC7E,QAAM,IAAI,MAAM,KAAK,CAACA,OAAM,OAAO,MAAMA,EAAC,CAAC;AAC3C,MAAI,MAAM,QAAW;AAEnB,WAAO;AAAA,EACT;AACA,SAAO,CAAC,GAAG,OAAO,IAAI;AACxB;AAPgB;AAST,SAAS,cAAe,UAA0B,OAAmC;AAC1F,SAAO,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AAChD;AAFgB;AAIT,SAAS,QAAS,GAAkB,GAA2B;AACpE,aAAO,8BAAU,GAAG,CAAC;AACvB;AAFgB;AAIT,SAAS,OAAQ,OAAmB,OAA4B;AACrE,aAAO,8BAAU,OAAO,KAAK;AAC/B;AAFgB;",
|
|
6
|
+
"names": ["m"]
|
|
7
|
+
}
|
package/lib/node.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var node_exports = {};
|
|
21
|
+
__export(node_exports, {
|
|
22
|
+
nodeAttrs: () => nodeAttrs,
|
|
23
|
+
nodeContent: () => nodeContent
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(node_exports);
|
|
26
|
+
function nodeContent(node) {
|
|
27
|
+
return node?.content ?? [];
|
|
28
|
+
}
|
|
29
|
+
__name(nodeContent, "nodeContent");
|
|
30
|
+
function nodeAttrs(node) {
|
|
31
|
+
return node.attrs ?? {};
|
|
32
|
+
}
|
|
33
|
+
__name(nodeAttrs, "nodeAttrs");
|
|
34
|
+
//# sourceMappingURL=node.js.map
|
package/lib/node.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/node.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, MarkupNode } from '@hcengineering/text-core'\n\nexport function nodeContent (node: MarkupNode): MarkupNode[] {\n return node?.content ?? []\n}\n\nexport function nodeAttrs (node: MarkupNode): Attrs {\n return node.attrs ?? {}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBO,SAAS,YAAa,MAAgC;AAC3D,SAAO,MAAM,WAAW,CAAC;AAC3B;AAFgB;AAIT,SAAS,UAAW,MAAyB;AAClD,SAAO,KAAK,SAAS,CAAC;AACxB;AAFgB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|