@chayns-components/format 5.0.0-beta.1352 → 5.0.0-beta.1357
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/cjs/utils/formatString/bb-code/findBBCode.js +5 -2
- package/lib/cjs/utils/formatString/bb-code/findBBCode.js.map +1 -1
- package/lib/cjs/utils/formatString/formatString.js +1 -1
- package/lib/cjs/utils/formatString/formatString.js.map +1 -1
- package/lib/cjs/utils/formatString/formatString.test.js +1 -1
- package/lib/cjs/utils/formatString/formatString.test.js.map +1 -1
- package/lib/cjs/utils/formatString/markdown/formatMarkdown.js +27 -2
- package/lib/cjs/utils/formatString/markdown/formatMarkdown.js.map +1 -1
- package/lib/esm/utils/formatString/bb-code/findBBCode.js +5 -2
- package/lib/esm/utils/formatString/bb-code/findBBCode.js.map +1 -1
- package/lib/esm/utils/formatString/formatString.js +1 -1
- package/lib/esm/utils/formatString/formatString.js.map +1 -1
- package/lib/esm/utils/formatString/formatString.test.js +1 -1
- package/lib/esm/utils/formatString/formatString.test.js.map +1 -1
- package/lib/esm/utils/formatString/markdown/formatMarkdown.js +27 -2
- package/lib/esm/utils/formatString/markdown/formatMarkdown.js.map +1 -1
- package/package.json +2 -2
|
@@ -20,11 +20,14 @@ function findFirstBBCode(inputString) {
|
|
|
20
20
|
const {
|
|
21
21
|
index
|
|
22
22
|
} = matches;
|
|
23
|
-
if (fullMatch === undefined || tag === undefined || params === undefined || content === undefined || openingTag === undefined || closingTag === undefined)
|
|
23
|
+
if (fullMatch === undefined || tag === undefined || params === undefined || content === undefined || openingTag === undefined || closingTag === undefined) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
24
26
|
const parameters = {};
|
|
27
|
+
const correctedParams = params.replaceAll('"', '"');
|
|
25
28
|
let match = null;
|
|
26
29
|
// eslint-disable-next-line no-cond-assign
|
|
27
|
-
while (match = PARAMETER_REGEX.exec(
|
|
30
|
+
while (match = PARAMETER_REGEX.exec(correctedParams)) {
|
|
28
31
|
const [, key, value] = match;
|
|
29
32
|
if (value) {
|
|
30
33
|
parameters[key || 'url'] = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findBBCode.js","names":["BB_REGEX","PARAMETER_REGEX","findFirstBBCode","inputString","matches","exec","fullMatch","openingTag","tag","params","content","closingTag","index","undefined","parameters","match","key","value"],"sources":["../../../../../src/utils/formatString/bb-code/findBBCode.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BB_REGEX = /(\\[([a-zA-Z0-9_]*)(.*?)\\])(.*?)(\\[\\/\\2\\])/s;\n// Also matches \"\\\" before quote to fix button for voucher messages\nconst PARAMETER_REGEX = /([\\w]*?)=\\\\?[\"„“‚'‘](.*?)[\"“”‘'’]/g;\n\nexport interface BBCodeMatch {\n fullMatch: string;\n tag: string;\n parameters: Record<string, string>;\n content: string;\n index: number;\n openingTag: string;\n closingTag: string;\n}\n\n// TODO Use external package instead of RegExp to parse BBCode.\n// It is not recommended to use RegExp to parse markup languages like BBCode, because it is not possible to parse nested tags with it.\n\n// Finds and returns the first BBCode tag in the input string.\nexport function findFirstBBCode(inputString: string): BBCodeMatch | null {\n const matches = BB_REGEX.exec(inputString);\n\n if (matches !== null) {\n const [fullMatch, openingTag, tag, params, content, closingTag] = matches;\n const { index } = matches;\n\n if (\n fullMatch === undefined ||\n tag === undefined ||\n params === undefined ||\n content === undefined ||\n openingTag === undefined ||\n closingTag === undefined\n )\n return null;\n\n const parameters: Record<string, string> = {};\n\n let match: RegExpExecArray | null = null;\n // eslint-disable-next-line no-cond-assign\n while ((match = PARAMETER_REGEX.exec(
|
|
1
|
+
{"version":3,"file":"findBBCode.js","names":["BB_REGEX","PARAMETER_REGEX","findFirstBBCode","inputString","matches","exec","fullMatch","openingTag","tag","params","content","closingTag","index","undefined","parameters","correctedParams","replaceAll","match","key","value"],"sources":["../../../../../src/utils/formatString/bb-code/findBBCode.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BB_REGEX = /(\\[([a-zA-Z0-9_]*)(.*?)\\])(.*?)(\\[\\/\\2\\])/s;\n// Also matches \"\\\" before quote to fix button for voucher messages\nconst PARAMETER_REGEX = /([\\w]*?)=\\\\?[\"„“‚'‘](.*?)[\"“”‘'’]/g;\n\nexport interface BBCodeMatch {\n fullMatch: string;\n tag: string;\n parameters: Record<string, string>;\n content: string;\n index: number;\n openingTag: string;\n closingTag: string;\n}\n\n// TODO Use external package instead of RegExp to parse BBCode.\n// It is not recommended to use RegExp to parse markup languages like BBCode, because it is not possible to parse nested tags with it.\n\n// Finds and returns the first BBCode tag in the input string.\nexport function findFirstBBCode(inputString: string): BBCodeMatch | null {\n const matches = BB_REGEX.exec(inputString);\n\n if (matches !== null) {\n const [fullMatch, openingTag, tag, params, content, closingTag] = matches;\n const { index } = matches;\n\n if (\n fullMatch === undefined ||\n tag === undefined ||\n params === undefined ||\n content === undefined ||\n openingTag === undefined ||\n closingTag === undefined\n ) {\n return null;\n }\n\n const parameters: Record<string, string> = {};\n\n const correctedParams = params.replaceAll('"', '\"');\n\n let match: RegExpExecArray | null = null;\n // eslint-disable-next-line no-cond-assign\n while ((match = PARAMETER_REGEX.exec(correctedParams))) {\n const [, key, value] = match;\n\n if (value) {\n parameters[key || 'url'] = value;\n }\n }\n\n return {\n fullMatch,\n tag,\n parameters,\n content,\n index,\n openingTag,\n closingTag,\n };\n }\n\n return null;\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA,MAAMA,QAAQ,GAAG,4CAA4C;AAC7D;AACA,MAAMC,eAAe,GAAG,oCAAoC;AAY5D;AACA;;AAEA;AACO,SAASC,eAAeA,CAACC,WAAmB,EAAsB;EACrE,MAAMC,OAAO,GAAGJ,QAAQ,CAACK,IAAI,CAACF,WAAW,CAAC;EAE1C,IAAIC,OAAO,KAAK,IAAI,EAAE;IAClB,MAAM,CAACE,SAAS,EAAEC,UAAU,EAAEC,GAAG,EAAEC,MAAM,EAAEC,OAAO,EAAEC,UAAU,CAAC,GAAGP,OAAO;IACzE,MAAM;MAAEQ;IAAM,CAAC,GAAGR,OAAO;IAEzB,IACIE,SAAS,KAAKO,SAAS,IACvBL,GAAG,KAAKK,SAAS,IACjBJ,MAAM,KAAKI,SAAS,IACpBH,OAAO,KAAKG,SAAS,IACrBN,UAAU,KAAKM,SAAS,IACxBF,UAAU,KAAKE,SAAS,EAC1B;MACE,OAAO,IAAI;IACf;IAEA,MAAMC,UAAkC,GAAG,CAAC,CAAC;IAE7C,MAAMC,eAAe,GAAGN,MAAM,CAACO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;IAExD,IAAIC,KAA6B,GAAG,IAAI;IACxC;IACA,OAAQA,KAAK,GAAGhB,eAAe,CAACI,IAAI,CAACU,eAAe,CAAC,EAAG;MACpD,MAAM,GAAGG,GAAG,EAAEC,KAAK,CAAC,GAAGF,KAAK;MAE5B,IAAIE,KAAK,EAAE;QACPL,UAAU,CAACI,GAAG,IAAI,KAAK,CAAC,GAAGC,KAAK;MACpC;IACJ;IAEA,OAAO;MACHb,SAAS;MACTE,GAAG;MACHM,UAAU;MACVJ,OAAO;MACPE,KAAK;MACLL,UAAU;MACVI;IACJ,CAAC;EACL;EAEA,OAAO,IAAI;AACf","ignoreList":[]}
|
|
@@ -39,7 +39,7 @@ const formatStringToHtml = (string, options) => {
|
|
|
39
39
|
// Escape BB-Code to prevent conflicts between Markdown and BB-code. Specifically [b]test[/b]()
|
|
40
40
|
// would be a problem, since Markdown interprets parts of this as a link.
|
|
41
41
|
|
|
42
|
-
// Parses
|
|
42
|
+
// Parses Markdown to HTML.
|
|
43
43
|
if (parseMarkdownOption) {
|
|
44
44
|
try {
|
|
45
45
|
if (parseBBCodeOption) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatString.js","names":["_escape","require","_formatBBCode","_formatMarkdown","formatStringToHtml","string","options","html","tables","parseMarkdown","parseMarkdownOption","parseBBCode","parseBBCodeOption","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags","formattedString","push","getMarkdownTables","error","console","warn","escapeHtmlInText","justEscapeSquareBrackets","replace","unescapeBBCodeSquareBrackets","exports"],"sources":["../../../../src/utils/formatString/formatString.ts"],"sourcesContent":["import type { TableObject } from '../../types/format';\nimport { escapeHtmlInText } from '../escape';\nimport {\n parseBBCode,\n ParseBBCodesOptions,\n unescapeBBCodeSquareBrackets,\n} from './bb-code/formatBBCode';\nimport { getMarkdownTables, parseMarkdown } from './markdown/formatMarkdown';\n\ninterface FormatStringOptions extends ParseBBCodesOptions {\n parseMarkdown?: boolean;\n parseBBCode?: boolean;\n}\n\ninterface FormatStringResult {\n html: string;\n tables: TableObject[];\n}\n\n// This function takes a string and returns formatted HTML as a string.\nexport const formatStringToHtml = (\n string: string,\n options?: FormatStringOptions,\n): FormatStringResult => {\n if (!string) {\n return {\n html: '',\n tables: [],\n };\n }\n\n const {\n parseMarkdown: parseMarkdownOption = true,\n parseBBCode: parseBBCodeOption = false,\n customInlineLevelBBCodeTags = [],\n customBlockLevelBBCodeTags = [],\n } = options || {};\n\n let formattedString = string;\n\n // Needs to get the tables before escaping HTML and parsing bb-code, so the original content can be extracted.\n const tables: TableObject[] = [];\n\n if (parseMarkdownOption) {\n try {\n tables.push(...getMarkdownTables(formattedString));\n } catch (error) {\n console.warn(\n '[@chayns-components/format] Warning: Failed to get markdown tables',\n error,\n );\n }\n }\n\n // Escape HTML entities.\n formattedString = escapeHtmlInText(formattedString);\n\n // Escape BB-Code to prevent conflicts between Markdown and BB-code. Specifically [b]test[/b]()\n // would be a problem, since Markdown interprets parts of this as a link.\n\n // Parses
|
|
1
|
+
{"version":3,"file":"formatString.js","names":["_escape","require","_formatBBCode","_formatMarkdown","formatStringToHtml","string","options","html","tables","parseMarkdown","parseMarkdownOption","parseBBCode","parseBBCodeOption","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags","formattedString","push","getMarkdownTables","error","console","warn","escapeHtmlInText","justEscapeSquareBrackets","replace","unescapeBBCodeSquareBrackets","exports"],"sources":["../../../../src/utils/formatString/formatString.ts"],"sourcesContent":["import type { TableObject } from '../../types/format';\nimport { escapeHtmlInText } from '../escape';\nimport {\n parseBBCode,\n ParseBBCodesOptions,\n unescapeBBCodeSquareBrackets,\n} from './bb-code/formatBBCode';\nimport { getMarkdownTables, parseMarkdown } from './markdown/formatMarkdown';\n\ninterface FormatStringOptions extends ParseBBCodesOptions {\n parseMarkdown?: boolean;\n parseBBCode?: boolean;\n}\n\ninterface FormatStringResult {\n html: string;\n tables: TableObject[];\n}\n\n// This function takes a string and returns formatted HTML as a string.\nexport const formatStringToHtml = (\n string: string,\n options?: FormatStringOptions,\n): FormatStringResult => {\n if (!string) {\n return {\n html: '',\n tables: [],\n };\n }\n\n const {\n parseMarkdown: parseMarkdownOption = true,\n parseBBCode: parseBBCodeOption = false,\n customInlineLevelBBCodeTags = [],\n customBlockLevelBBCodeTags = [],\n } = options || {};\n\n let formattedString = string;\n\n // Needs to get the tables before escaping HTML and parsing bb-code, so the original content can be extracted.\n const tables: TableObject[] = [];\n\n if (parseMarkdownOption) {\n try {\n tables.push(...getMarkdownTables(formattedString));\n } catch (error) {\n console.warn(\n '[@chayns-components/format] Warning: Failed to get markdown tables',\n error,\n );\n }\n }\n\n // Escape HTML entities.\n formattedString = escapeHtmlInText(formattedString);\n\n // Escape BB-Code to prevent conflicts between Markdown and BB-code. Specifically [b]test[/b]()\n // would be a problem, since Markdown interprets parts of this as a link.\n\n // Parses Markdown to HTML.\n if (parseMarkdownOption) {\n try {\n if (parseBBCodeOption) {\n // Escapes BB-Code brackets.\n formattedString = parseBBCode(formattedString, {\n customInlineLevelBBCodeTags,\n customBlockLevelBBCodeTags,\n justEscapeSquareBrackets: true,\n });\n }\n\n formattedString = parseMarkdown(formattedString, parseBBCodeOption);\n\n // Remove trailing \\n\n formattedString = formattedString.replace(/\\n$/, '');\n\n if (parseBBCodeOption) {\n // Unescapes BB-Code brackets.\n formattedString = unescapeBBCodeSquareBrackets(formattedString);\n }\n } catch (error) {\n console.warn('[@chayns-components/format] Warning: Failed to parse markdown', error);\n }\n }\n\n // Parses BB-Code to HTML.\n if (parseBBCodeOption) {\n try {\n formattedString = parseBBCode(formattedString, {\n customInlineLevelBBCodeTags,\n customBlockLevelBBCodeTags,\n });\n formattedString = unescapeBBCodeSquareBrackets(formattedString);\n } catch (error) {\n console.warn('[@chayns-components/format] Warning: Failed to parse bb-code', error);\n }\n }\n\n return {\n html: formattedString,\n tables,\n };\n};\n"],"mappings":";;;;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AAKA,IAAAE,eAAA,GAAAF,OAAA;AAYA;AACO,MAAMG,kBAAkB,GAAGA,CAC9BC,MAAc,EACdC,OAA6B,KACR;EACrB,IAAI,CAACD,MAAM,EAAE;IACT,OAAO;MACHE,IAAI,EAAE,EAAE;MACRC,MAAM,EAAE;IACZ,CAAC;EACL;EAEA,MAAM;IACFC,aAAa,EAAEC,mBAAmB,GAAG,IAAI;IACzCC,WAAW,EAAEC,iBAAiB,GAAG,KAAK;IACtCC,2BAA2B,GAAG,EAAE;IAChCC,0BAA0B,GAAG;EACjC,CAAC,GAAGR,OAAO,IAAI,CAAC,CAAC;EAEjB,IAAIS,eAAe,GAAGV,MAAM;;EAE5B;EACA,MAAMG,MAAqB,GAAG,EAAE;EAEhC,IAAIE,mBAAmB,EAAE;IACrB,IAAI;MACAF,MAAM,CAACQ,IAAI,CAAC,GAAG,IAAAC,iCAAiB,EAACF,eAAe,CAAC,CAAC;IACtD,CAAC,CAAC,OAAOG,KAAK,EAAE;MACZC,OAAO,CAACC,IAAI,CACR,oEAAoE,EACpEF,KACJ,CAAC;IACL;EACJ;;EAEA;EACAH,eAAe,GAAG,IAAAM,wBAAgB,EAACN,eAAe,CAAC;;EAEnD;EACA;;EAEA;EACA,IAAIL,mBAAmB,EAAE;IACrB,IAAI;MACA,IAAIE,iBAAiB,EAAE;QACnB;QACAG,eAAe,GAAG,IAAAJ,yBAAW,EAACI,eAAe,EAAE;UAC3CF,2BAA2B;UAC3BC,0BAA0B;UAC1BQ,wBAAwB,EAAE;QAC9B,CAAC,CAAC;MACN;MAEAP,eAAe,GAAG,IAAAN,6BAAa,EAACM,eAAe,EAAEH,iBAAiB,CAAC;;MAEnE;MACAG,eAAe,GAAGA,eAAe,CAACQ,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;MAEpD,IAAIX,iBAAiB,EAAE;QACnB;QACAG,eAAe,GAAG,IAAAS,0CAA4B,EAACT,eAAe,CAAC;MACnE;IACJ,CAAC,CAAC,OAAOG,KAAK,EAAE;MACZC,OAAO,CAACC,IAAI,CAAC,+DAA+D,EAAEF,KAAK,CAAC;IACxF;EACJ;;EAEA;EACA,IAAIN,iBAAiB,EAAE;IACnB,IAAI;MACAG,eAAe,GAAG,IAAAJ,yBAAW,EAACI,eAAe,EAAE;QAC3CF,2BAA2B;QAC3BC;MACJ,CAAC,CAAC;MACFC,eAAe,GAAG,IAAAS,0CAA4B,EAACT,eAAe,CAAC;IACnE,CAAC,CAAC,OAAOG,KAAK,EAAE;MACZC,OAAO,CAACC,IAAI,CAAC,8DAA8D,EAAEF,KAAK,CAAC;IACvF;EACJ;EAEA,OAAO;IACHX,IAAI,EAAEQ,eAAe;IACrBP;EACJ,CAAC;AACL,CAAC;AAACiB,OAAA,CAAArB,kBAAA,GAAAA,kBAAA","ignoreList":[]}
|
|
@@ -94,7 +94,7 @@ const removeLinebreaks = text => text.replace(/\n/g, '');
|
|
|
94
94
|
});
|
|
95
95
|
(0, _vitest.test)('should format links correctly', () => {
|
|
96
96
|
const result = (0, _formatString.formatStringToHtml)('[Link](https://example.com)');
|
|
97
|
-
(0, _vitest.expect)(result.html).toEqual('<p><a href="https://example.com">Link</a></p>');
|
|
97
|
+
(0, _vitest.expect)(result.html).toEqual('<p><a href="https://example.com" rel="noopener noreferrer" target="_blank">Link</a></p>');
|
|
98
98
|
(0, _vitest.expect)(result.tables).toEqual([]);
|
|
99
99
|
});
|
|
100
100
|
(0, _vitest.test)('should format images correctly', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatString.test.js","names":["_vitest","require","_formatString","removeLinebreaks","text","replace","describe","test","result","formatStringToHtml","expect","html","toEqual","tables","resultEscape","resultEscape1","resultEscape2","boldResult","italicResult","inlineCodeResult","h1Result","h2Result","h3Result","h4Result","h5Result","h6Result","expectedUnorderedListResult","expectedOrderedListResult","unorderedListResult1","unorderedListResult2","orderedListResult","orderedListResult2","expectedThematicBreakResult","result1","result2","resultWithoutLanguage","resultWithLanguage","inputString","csv","raw","id","parseBBCode","table1","getTable1Result","index","table1Csv","table2","getTable2TResult","table2Csv","getHeadingInput","tag","getHeadingOutput","headingTags","forEach","input","output","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags"],"sources":["../../../../src/utils/formatString/formatString.test.ts"],"sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { formatStringToHtml } from './formatString';\n\nconst removeLinebreaks = (text: string) => text.replace(/\\n/g, '');\n\ndescribe('HTML Formatter Function', () => {\n describe('Format Plain Text', () => {\n describe('Line breaks', () => {\n test('should format line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\nLine 2');\n expect(result.html).toEqual('<p>Line 1\\nLine 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format multiple line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\n\\nLine 2');\n expect(result.html).toEqual('<p>Line 1</p>\\n<p>Line 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should remove trailing and leading new lines', () => {\n const result = formatStringToHtml('\\n\\n\\nLine 1\\n\\n\\n');\n expect(result.html).toEqual('<p>Line 1</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Whitespaces', () => {\n test('should not remove repeated whitespaces', () => {\n const result = formatStringToHtml('Text with spaces');\n expect(result.html).toEqual('<p>Text with spaces</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not remove leading and trailing whitespaces', () => {\n const result = formatStringToHtml(' Text ');\n expect(result.html).toEqual('<p> Text </p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('HTML', () => {\n test('should escape < and > correctly', () => {\n const resultEscape = formatStringToHtml('<div>Test</div>');\n expect(resultEscape.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape.tables).toEqual([]);\n });\n\n test('should not escape &', () => {\n const resultEscape1 = formatStringToHtml('<div>Test</div>');\n expect(resultEscape1.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '&lt;div&gt;Test&lt;/div&gt;',\n );\n expect(resultEscape2.html).toEqual(\n '<p>&lt;div&gt;Test&lt;/div&gt;</p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n\n // TODO Decide if & should be escaped, when they are not part of an HTML entity.\n });\n\n describe('URLs', () => {\n test('should not format URLs', () => {\n const result = formatStringToHtml('https://example.com');\n expect(result.html).toEqual('<p>https://example.com</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format Markdown', () => {\n describe('All Elements', () => {\n test('should format text styling correctly', () => {\n const boldResult = formatStringToHtml('**bold**');\n expect(boldResult.html).toEqual('<p><strong>bold</strong></p>');\n expect(boldResult.tables).toEqual([]);\n\n const italicResult = formatStringToHtml('*italic*');\n expect(italicResult.html).toEqual('<p><em>italic</em></p>');\n expect(italicResult.tables).toEqual([]);\n\n const inlineCodeResult = formatStringToHtml('`inline code`');\n expect(inlineCodeResult.html).toEqual('<p><code>inline code</code></p>');\n expect(inlineCodeResult.tables).toEqual([]);\n });\n\n test('should format headings correctly', () => {\n const h1Result = formatStringToHtml('# h1');\n expect(h1Result.html).toEqual('<h1>h1</h1>');\n expect(h1Result.tables).toEqual([]);\n\n const h2Result = formatStringToHtml('## h2');\n expect(h2Result.html).toEqual('<h2>h2</h2>');\n expect(h2Result.tables).toEqual([]);\n\n const h3Result = formatStringToHtml('### h3');\n expect(h3Result.html).toEqual('<h3>h3</h3>');\n expect(h3Result.tables).toEqual([]);\n\n const h4Result = formatStringToHtml('#### h4');\n expect(h4Result.html).toEqual('<h4>h4</h4>');\n expect(h4Result.tables).toEqual([]);\n\n const h5Result = formatStringToHtml('##### h5');\n expect(h5Result.html).toEqual('<h5>h5</h5>');\n expect(h5Result.tables).toEqual([]);\n\n const h6Result = formatStringToHtml('###### h6');\n expect(h6Result.html).toEqual('<h6>h6</h6>');\n expect(h6Result.tables).toEqual([]);\n });\n\n test('should format links correctly', () => {\n const result = formatStringToHtml('[Link](https://example.com)');\n expect(result.html).toEqual('<p><a href=\"https://example.com\">Link</a></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format images correctly', () => {\n const result = formatStringToHtml('');\n expect(result.html).toEqual(\n '<p><img src=\"https://example.com/image.jpg\" alt=\"Alt Text\"></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format lists correctly', () => {\n const expectedUnorderedListResult =\n '<ul>\\n<li>Item 1</li>\\n<li>Item 2</li>\\n<li>Item 3</li>\\n</ul>';\n const expectedOrderedListResult =\n '<ol>\\n<li value=\"1\">Item 1</li>\\n<li value=\"2\">Item 2</li>\\n<li value=\"3\">Item 3</li>\\n</ol>';\n\n const unorderedListResult1 = formatStringToHtml('- Item 1\\n- Item 2\\n- Item 3');\n expect(unorderedListResult1.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult1.tables).toEqual([]);\n\n const unorderedListResult2 = formatStringToHtml('* Item 1\\n* Item 2\\n* Item 3');\n expect(unorderedListResult2.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult2.tables).toEqual([]);\n\n const orderedListResult = formatStringToHtml('1. Item 1\\n2. Item 2\\n3. Item 3');\n expect(orderedListResult.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult.tables).toEqual([]);\n\n const orderedListResult2 = formatStringToHtml('1) Item 1\\n2) Item 2\\n3) Item 3');\n expect(orderedListResult2.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult2.tables).toEqual([]);\n });\n\n test('should format thematic breaks correctly', () => {\n const expectedThematicBreakResult = '<hr>';\n\n const result1 = formatStringToHtml('---');\n expect(result1.html).toEqual(expectedThematicBreakResult);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('***');\n expect(result2.html).toEqual(expectedThematicBreakResult);\n expect(result2.tables).toEqual([]);\n });\n\n test('should format code blocks correctly', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\nconst a = 1;\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>const a = 1;</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```js\\nconst a = 1;\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should format tables correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\nCell 1,Cell 2\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n });\n\n describe('Inline Code', () => {\n describe('HTML In Code', () => {\n test('should escape < and > within inline code correctly', () => {\n const result1 = formatStringToHtml('`<div>Test</div>`');\n expect(result1.html).toEqual('<p><code><div>Test</div></code></p>');\n expect(result1.tables).toEqual([]);\n });\n\n test('should not escape & within inline code', () => {\n const resultEscape1 = formatStringToHtml('`<div>Test</div>`');\n expect(resultEscape1.html).toEqual(\n '<p><code><div>Test</div></code></p>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '`&lt;div&gt;Test&lt;/div&gt;`',\n );\n expect(resultEscape2.html).toEqual(\n '<p><code>&lt;div&gt;Test&lt;/div&gt;</code></p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within inline code', () => {\n const result = formatStringToHtml('`**bold** *italic*`');\n expect(result.html).toEqual('<p><code>**bold** *italic*</code></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not format bb-code within inline code', () => {\n const result = formatStringToHtml('`[b]bold[/b]`', { parseBBCode: true });\n expect(result.html).toEqual('<p><code>[b]bold[/b]</code></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Codeblock', () => {\n test('should format code blocks with multiple lines correctly', () => {\n const resultWithoutLanguage = formatStringToHtml(\n '```\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code>const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml(\n '```js\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format 4 spaces as code block', () => {\n const result = formatStringToHtml(' const a = 1;');\n expect(result.html).toEqual('<p> const a = 1;</p>');\n expect(result.tables).toEqual([]);\n });\n\n describe('HTML In Code', () => {\n test('should escape < and > within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n<div>Test</div>\\n```');\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n<div>Test</div>\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\"><div>Test</div></code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not escape & within code block', () => {\n const resultEscape1 = formatStringToHtml(\n '```\\n<div>Test</div>\\n```',\n );\n expect(resultEscape1.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '```\\n&lt;div&gt;Test&lt;/div&gt;\\n```',\n );\n expect(resultEscape2.html).toEqual(\n '<pre><code>&lt;div&gt;Test&lt;/div&gt;</code></pre>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n**Test**\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>**Test**</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n**Test**\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">**Test**</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format bb-code within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n[b]Test[/b]\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>[b]Test[/b]</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n[b]Test[/b]\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">[b]Test[/b]</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n });\n\n describe('Table', () => {\n test('should format markdown within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| **Cell 1** | *Cell 2* |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><strong>Cell 1</strong></td><td><em>Cell 2</em></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n**Cell 1**,*Cell 2*\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format bb-code within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| [b]Cell 1[/b] | [i]Cell 2[/i] |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><b>Cell 1</b></td><td><i>Cell 2</i></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n[b]Cell 1[/b],[i]Cell 2[/i]\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format html within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | &lt;div&gt;Cell 3&lt;/div&gt; |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th><th>Header 3</th></tr></thead><tbody><tr><td><div>Cell 1</div></td><td><div>Cell 2</div></td><td>&lt;div&gt;Cell 3&lt;/div&gt;</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2,Header 3\\n<div>Cell 1</div>,<div>Cell 2</div>,<div>Cell 3</div>\\n',\n raw: '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | <div>Cell 3</div> |',\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format multiple tables correctly', () => {\n const table1 =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const getTable1Result = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>`;\n const table1Csv = 'Header 1,Header 2\\nCell 1,Cell 2\\n';\n const table2 =\n '| Header 3 | Header 4 |\\n|----------|----------|\\n| Cell 3 | Cell 4 |';\n const getTable2TResult = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 3</th><th>Header 4</th></tr></thead><tbody><tr><td>Cell 3</td><td>Cell 4</td></tr></tbody></table>`;\n const table2Csv = 'Header 3,Header 4\\nCell 3,Cell 4\\n';\n\n const result1 = formatStringToHtml(`${table1}\\n\\n${table2}`);\n expect(removeLinebreaks(result1.html)).toEqual(\n `${getTable1Result(0)}${getTable2TResult(1)}`,\n );\n expect(result1.tables).toEqual([\n {\n csv: table1Csv,\n raw: `${table1}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table2Csv,\n raw: table2,\n id: 'formatted-table-1',\n },\n ]);\n\n // Tables in reverse order.\n const result2 = formatStringToHtml(`${table2}\\n\\n${table1}`);\n expect(removeLinebreaks(result2.html)).toEqual(\n `${getTable2TResult(0)}${getTable1Result(1)}`,\n );\n expect(result2.tables).toEqual([\n {\n csv: table2Csv,\n raw: `${table2}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table1Csv,\n raw: table1,\n id: 'formatted-table-1',\n },\n ]);\n });\n });\n\n describe('List', () => {\n test('should format markdown within list correctly', () => {\n const result = formatStringToHtml('- **Item 1**\\n- *Item 2*');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li><strong>Item 1</strong></li><li><em>Item 2</em></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format task lists correctly', () => {\n const result1 = formatStringToHtml('- [ ] 1\\n- [x] 2\\n- [X] 3');\n expect(removeLinebreaks(result1.html)).toEqual(\n '<ul><li>[ ] 1</li><li>[x] 2</li><li>[x] 3</li></ul>',\n );\n expect(result1.tables).toEqual([]);\n });\n });\n\n describe('Combined Elements', () => {\n test('should format code block within list correctly', () => {\n const result = formatStringToHtml('* test\\n ```\\n test\\n ```');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li>test<pre><code>test</code></pre></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Conflicts with BB-Code', () => {\n test('should not format bb code tag followed by paranthese to link', () => {\n const result = formatStringToHtml('[b]bold[/b](test)', { parseBBCode: true });\n expect(result.html).toEqual('<p><b>bold</b>(test)</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format BB-Code', () => {\n describe('All Elements', () => {\n describe('Inline Elements', () => {\n // b, strong, i, em, u, s, span, img\n test('should format b tag correctly', () => {\n const result = formatStringToHtml('[b]bold[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b>bold</b></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format strong tag correctly', () => {\n const result = formatStringToHtml('[strong]bold[/strong]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><strong>bold</strong></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format i tag correctly', () => {\n const result = formatStringToHtml('[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><i>italic</i></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format em tag correctly', () => {\n const result = formatStringToHtml('[em]italic[/em]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em>italic</em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format u tag correctly', () => {\n const result = formatStringToHtml('[u]underline[/u]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><u>underline</u></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format s tag correctly', () => {\n const result = formatStringToHtml('[s]strike[/s]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><s>strike</s></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format span tag correctly', () => {\n const result = formatStringToHtml('[span]span[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span>span</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format img tag correctly', () => {\n const result = formatStringToHtml(\n '[img src=\"https://example.com/image.jpg\"][/img]',\n {\n parseBBCode: true,\n },\n );\n expect(result.html).toEqual('<p><img src=\"https://example.com/image.jpg\"></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Block Level Elements', () => {\n test('should format center tag correctly', () => {\n const result = formatStringToHtml('[center]centered text[/center]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><center>centered text</center></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ul tag correctly', () => {\n const result = formatStringToHtml('[ul][li]Item 1[/li][li]Item 2[/li][/ul]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ul><li>Item 1</li><li>Item 2</li></ul></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ol tag correctly', () => {\n const result = formatStringToHtml('[ol][li]Item 1[/li][li]Item 2[/li][/ol]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ol><li>Item 1</li><li>Item 2</li></ol></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format li tag correctly', () => {\n const result = formatStringToHtml('[li]Item[/li]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><li>Item</li></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format heading tags correctly', () => {\n const getHeadingInput = (tag: string) => `[${tag}]${tag}[/${tag}]`;\n const getHeadingOutput = (tag: string) => `<p><${tag}>${tag}</${tag}></p>`;\n const headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n headingTags.forEach((tag) => {\n const result = formatStringToHtml(getHeadingInput(tag), {\n parseBBCode: true,\n });\n expect(result.html).toEqual(getHeadingOutput(tag));\n expect(result.tables).toEqual([]);\n });\n });\n\n test('should format p tag correctly', () => {\n const result = formatStringToHtml('[p]paragraph[/p]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><p>paragraph</p></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Custom Elements', () => {\n test('should format custom tags correctly', () => {\n const input = '[custom attribute1=\"test1\" attribute2=\"test2\"]custom[/custom]';\n const output =\n '<p><bb-code-custom attribute1=\"test1\" attribute2=\"test2\">custom</bb-code-custom></p>';\n const result1 = formatStringToHtml(input, {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['custom'],\n });\n expect(result1.html).toEqual(output);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml(input, {\n parseBBCode: true,\n customBlockLevelBBCodeTags: ['custom'],\n });\n expect(result2.html).toEqual(output);\n expect(result2.tables).toEqual([]);\n });\n\n test('should not format unknown custom tags', () => {\n const result = formatStringToHtml('[unknown]unknown[/unknown]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p>[unknown]unknown[/unknown]</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Line breaks', () => {\n describe('Between Elements', () => {\n test('should format line breaks between block level elements correctly', () => {\n const result1 = formatStringToHtml('[h1]h1[/h1]\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><h1>h1</h1><h2>h2</h2></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[h1]h1[/h1]\\n\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><h1>h1</h1></p>\\n<p><h2>h2</h2></p>');\n expect(result2.tables).toEqual([]);\n });\n\n test('should format line breaks between inline elements correctly', () => {\n const result1 = formatStringToHtml('[b]bold[/b]\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><b>bold</b>\\n<i>italic</i></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[b]bold[/b]\\n\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><b>bold</b></p>\\n<p><i>italic</i></p>');\n expect(result2.tables).toEqual([]);\n });\n });\n\n describe('Within Elements', () => {\n test('should format line breaks within block level elements correctly', () => {\n const result = formatStringToHtml('[h1]Line 1\\nLine 2[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n expect(result.tables).toEqual([]);\n });\n\n // This is a test that would fail!\n // test('should format multiple line breaks within block level elements correctly', () => {\n // const result = formatStringToHtml('[h1]Line 1\\n\\nLine 2[/h1]', {\n // parseBBCode: true,\n // });\n // expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n // expect(result.tables).toEqual([]);\n // });\n\n test('should remove trailing and leading new lines within block level elements', () => {\n const result = formatStringToHtml('[h1]\\n\\n\\nLine 1\\n\\n\\n[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1</h1></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n test('should not format url in tag attributes', () => {\n const result = formatStringToHtml(\n '[link url=\"https://www.google.com\"]Google[/link]',\n {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['link'],\n },\n );\n expect(result.html).toEqual(\n '<p><bb-code-link url=\"https://www.google.com\">Google</bb-code-link></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should apply style attribute correctly', () => {\n const result = formatStringToHtml('[span style=\"color: red;\"]red text[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span style=\"color: red;\">red text</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format nested elements correctly', () => {\n const result = formatStringToHtml('[b][i]bold italic[/i][/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><i>bold italic</i></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Combined Formatting (Markdown + BB-Code)', () => {\n test('should format bb-code within markdown correctly', () => {\n const result = formatStringToHtml('*[b]bold[/b]*', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em><b>bold</b></em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format markdown within bb-code correctly', () => {\n const result = formatStringToHtml('[b]*bold*[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><em>bold</em></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n});\n"],"mappings":";;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AAEA,MAAME,gBAAgB,GAAIC,IAAY,IAAKA,IAAI,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAElE,IAAAC,gBAAQ,EAAC,yBAAyB,EAAE,MAAM;EACtC,IAAAA,gBAAQ,EAAC,mBAAmB,EAAE,MAAM;IAChC,IAAAA,gBAAQ,EAAC,aAAa,EAAE,MAAM;MAC1B,IAAAC,YAAI,EAAC,qCAAqC,EAAE,MAAM;QAC9C,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,gBAAgB,CAAC;QACnD,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,uBAAuB,CAAC;QACpD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,8CAA8C,EAAE,MAAM;QACvD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,kBAAkB,CAAC;QACrD,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,8BAA8B,CAAC;QAC3D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,8CAA8C,EAAE,MAAM;QACvD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,oBAAoB,CAAC;QACvD,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,eAAe,CAAC;QAC5C,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAN,gBAAQ,EAAC,aAAa,EAAE,MAAM;MAC1B,IAAAC,YAAI,EAAC,wCAAwC,EAAE,MAAM;QACjD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,wBAAwB,CAAC;QAC3D,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,+BAA+B,CAAC;QAC5D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,oDAAoD,EAAE,MAAM;QAC7D,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,YAAY,CAAC;QAC/C,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,mBAAmB,CAAC;QAChD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAN,gBAAQ,EAAC,MAAM,EAAE,MAAM;MACnB,IAAAC,YAAI,EAAC,iCAAiC,EAAE,MAAM;QAC1C,MAAMO,YAAY,GAAG,IAAAL,gCAAkB,EAAC,iBAAiB,CAAC;QAC1D,IAAAC,cAAM,EAACI,YAAY,CAACH,IAAI,CAAC,CAACC,OAAO,CAAC,oCAAoC,CAAC;QACvE,IAAAF,cAAM,EAACI,YAAY,CAACD,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MAC3C,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,qBAAqB,EAAE,MAAM;QAC9B,MAAMQ,aAAa,GAAG,IAAAN,gCAAkB,EAAC,6BAA6B,CAAC;QACvE,IAAAC,cAAM,EAACK,aAAa,CAACJ,IAAI,CAAC,CAACC,OAAO,CAAC,oCAAoC,CAAC;QACxE,IAAAF,cAAM,EAACK,aAAa,CAACF,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAExC,MAAMI,aAAa,GAAG,IAAAP,gCAAkB,EACpC,6CACJ,CAAC;QACD,IAAAC,cAAM,EAACM,aAAa,CAACL,IAAI,CAAC,CAACC,OAAO,CAC9B,oDACJ,CAAC;QACD,IAAAF,cAAM,EAACM,aAAa,CAACH,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MAC5C,CAAC,CAAC;;MAEF;IACJ,CAAC,CAAC;IAEF,IAAAN,gBAAQ,EAAC,MAAM,EAAE,MAAM;MACnB,IAAAC,YAAI,EAAC,wBAAwB,EAAE,MAAM;QACjC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,qBAAqB,CAAC;QACxD,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,4BAA4B,CAAC;QACzD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,IAAAN,gBAAQ,EAAC,iBAAiB,EAAE,MAAM;IAC9B,IAAAA,gBAAQ,EAAC,cAAc,EAAE,MAAM;MAC3B,IAAAC,YAAI,EAAC,sCAAsC,EAAE,MAAM;QAC/C,MAAMU,UAAU,GAAG,IAAAR,gCAAkB,EAAC,UAAU,CAAC;QACjD,IAAAC,cAAM,EAACO,UAAU,CAACN,IAAI,CAAC,CAACC,OAAO,CAAC,8BAA8B,CAAC;QAC/D,IAAAF,cAAM,EAACO,UAAU,CAACJ,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAErC,MAAMM,YAAY,GAAG,IAAAT,gCAAkB,EAAC,UAAU,CAAC;QACnD,IAAAC,cAAM,EAACQ,YAAY,CAACP,IAAI,CAAC,CAACC,OAAO,CAAC,wBAAwB,CAAC;QAC3D,IAAAF,cAAM,EAACQ,YAAY,CAACL,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEvC,MAAMO,gBAAgB,GAAG,IAAAV,gCAAkB,EAAC,eAAe,CAAC;QAC5D,IAAAC,cAAM,EAACS,gBAAgB,CAACR,IAAI,CAAC,CAACC,OAAO,CAAC,iCAAiC,CAAC;QACxE,IAAAF,cAAM,EAACS,gBAAgB,CAACN,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MAC/C,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,kCAAkC,EAAE,MAAM;QAC3C,MAAMa,QAAQ,GAAG,IAAAX,gCAAkB,EAAC,MAAM,CAAC;QAC3C,IAAAC,cAAM,EAACU,QAAQ,CAACT,IAAI,CAAC,CAACC,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAAF,cAAM,EAACU,QAAQ,CAACP,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEnC,MAAMS,QAAQ,GAAG,IAAAZ,gCAAkB,EAAC,OAAO,CAAC;QAC5C,IAAAC,cAAM,EAACW,QAAQ,CAACV,IAAI,CAAC,CAACC,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAAF,cAAM,EAACW,QAAQ,CAACR,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEnC,MAAMU,QAAQ,GAAG,IAAAb,gCAAkB,EAAC,QAAQ,CAAC;QAC7C,IAAAC,cAAM,EAACY,QAAQ,CAACX,IAAI,CAAC,CAACC,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAAF,cAAM,EAACY,QAAQ,CAACT,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEnC,MAAMW,QAAQ,GAAG,IAAAd,gCAAkB,EAAC,SAAS,CAAC;QAC9C,IAAAC,cAAM,EAACa,QAAQ,CAACZ,IAAI,CAAC,CAACC,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAAF,cAAM,EAACa,QAAQ,CAACV,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEnC,MAAMY,QAAQ,GAAG,IAAAf,gCAAkB,EAAC,UAAU,CAAC;QAC/C,IAAAC,cAAM,EAACc,QAAQ,CAACb,IAAI,CAAC,CAACC,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAAF,cAAM,EAACc,QAAQ,CAACX,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEnC,MAAMa,QAAQ,GAAG,IAAAhB,gCAAkB,EAAC,WAAW,CAAC;QAChD,IAAAC,cAAM,EAACe,QAAQ,CAACd,IAAI,CAAC,CAACC,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAAF,cAAM,EAACe,QAAQ,CAACZ,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACvC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,+BAA+B,EAAE,MAAM;QACxC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,6BAA6B,CAAC;QAChE,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,+CAA+C,CAAC;QAC5E,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,gCAAgC,EAAE,MAAM;QACzC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,4CAA4C,CAAC;QAC/E,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CACvB,iEACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,+BAA+B,EAAE,MAAM;QACxC,MAAMmB,2BAA2B,GAC7B,gEAAgE;QACpE,MAAMC,yBAAyB,GAC3B,8FAA8F;QAElG,MAAMC,oBAAoB,GAAG,IAAAnB,gCAAkB,EAAC,8BAA8B,CAAC;QAC/E,IAAAC,cAAM,EAACkB,oBAAoB,CAACjB,IAAI,CAAC,CAACC,OAAO,CAACc,2BAA2B,CAAC;QACtE,IAAAhB,cAAM,EAACkB,oBAAoB,CAACf,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAE/C,MAAMiB,oBAAoB,GAAG,IAAApB,gCAAkB,EAAC,8BAA8B,CAAC;QAC/E,IAAAC,cAAM,EAACmB,oBAAoB,CAAClB,IAAI,CAAC,CAACC,OAAO,CAACc,2BAA2B,CAAC;QACtE,IAAAhB,cAAM,EAACmB,oBAAoB,CAAChB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAE/C,MAAMkB,iBAAiB,GAAG,IAAArB,gCAAkB,EAAC,iCAAiC,CAAC;QAC/E,IAAAC,cAAM,EAACoB,iBAAiB,CAACnB,IAAI,CAAC,CAACC,OAAO,CAACe,yBAAyB,CAAC;QACjE,IAAAjB,cAAM,EAACoB,iBAAiB,CAACjB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAE5C,MAAMmB,kBAAkB,GAAG,IAAAtB,gCAAkB,EAAC,iCAAiC,CAAC;QAChF,IAAAC,cAAM,EAACqB,kBAAkB,CAACpB,IAAI,CAAC,CAACC,OAAO,CAACe,yBAAyB,CAAC;QAClE,IAAAjB,cAAM,EAACqB,kBAAkB,CAAClB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACjD,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,yCAAyC,EAAE,MAAM;QAClD,MAAMyB,2BAA2B,GAAG,MAAM;QAE1C,MAAMC,OAAO,GAAG,IAAAxB,gCAAkB,EAAC,KAAK,CAAC;QACzC,IAAAC,cAAM,EAACuB,OAAO,CAACtB,IAAI,CAAC,CAACC,OAAO,CAACoB,2BAA2B,CAAC;QACzD,IAAAtB,cAAM,EAACuB,OAAO,CAACpB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAElC,MAAMsB,OAAO,GAAG,IAAAzB,gCAAkB,EAAC,KAAK,CAAC;QACzC,IAAAC,cAAM,EAACwB,OAAO,CAACvB,IAAI,CAAC,CAACC,OAAO,CAACoB,2BAA2B,CAAC;QACzD,IAAAtB,cAAM,EAACwB,OAAO,CAACrB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACtC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,qCAAqC,EAAE,MAAM;QAC9C,MAAM4B,qBAAqB,GAAG,IAAA1B,gCAAkB,EAAC,wBAAwB,CAAC;QAC1E,IAAAC,cAAM,EAACyB,qBAAqB,CAACxB,IAAI,CAAC,CAACC,OAAO,CAAC,sCAAsC,CAAC;QAClF,IAAAF,cAAM,EAACyB,qBAAqB,CAACtB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEhD,MAAMwB,kBAAkB,GAAG,IAAA3B,gCAAkB,EAAC,0BAA0B,CAAC;QACzE,IAAAC,cAAM,EAAC0B,kBAAkB,CAACzB,IAAI,CAAC,CAACC,OAAO,CACnC,0DACJ,CAAC;QACD,IAAAF,cAAM,EAAC0B,kBAAkB,CAACvB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACjD,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,gCAAgC,EAAE,MAAM;QACzC,MAAM8B,WAAW,GACb,2EAA2E;QAC/E,MAAM7B,MAAM,GAAG,IAAAC,gCAAkB,EAAC4B,WAAW,CAAC;QAC9C,IAAA3B,cAAM,EAACP,gBAAgB,CAACK,MAAM,CAACG,IAAI,CAAC,CAAC,CAACC,OAAO,CACzC,wJACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,CAC1B;UACI0B,GAAG,EAAE,oCAAoC;UACzCC,GAAG,EAAEF,WAAW;UAChBG,EAAE,EAAE;QACR,CAAC,CACJ,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAlC,gBAAQ,EAAC,aAAa,EAAE,MAAM;MAC1B,IAAAA,gBAAQ,EAAC,cAAc,EAAE,MAAM;QAC3B,IAAAC,YAAI,EAAC,oDAAoD,EAAE,MAAM;UAC7D,MAAM0B,OAAO,GAAG,IAAAxB,gCAAkB,EAAC,mBAAmB,CAAC;UACvD,IAAAC,cAAM,EAACuB,OAAO,CAACtB,IAAI,CAAC,CAACC,OAAO,CAAC,iDAAiD,CAAC;UAC/E,IAAAF,cAAM,EAACuB,OAAO,CAACpB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,wCAAwC,EAAE,MAAM;UACjD,MAAMQ,aAAa,GAAG,IAAAN,gCAAkB,EAAC,+BAA+B,CAAC;UACzE,IAAAC,cAAM,EAACK,aAAa,CAACJ,IAAI,CAAC,CAACC,OAAO,CAC9B,iDACJ,CAAC;UACD,IAAAF,cAAM,EAACK,aAAa,CAACF,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UAExC,MAAMI,aAAa,GAAG,IAAAP,gCAAkB,EACpC,+CACJ,CAAC;UACD,IAAAC,cAAM,EAACM,aAAa,CAACL,IAAI,CAAC,CAACC,OAAO,CAC9B,iEACJ,CAAC;UACD,IAAAF,cAAM,EAACM,aAAa,CAACH,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAC5C,CAAC,CAAC;MACN,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,+CAA+C,EAAE,MAAM;QACxD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,qBAAqB,CAAC;QACxD,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,uCAAuC,CAAC;QACpE,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,8CAA8C,EAAE,MAAM;QACvD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,eAAe,EAAE;UAAEgC,WAAW,EAAE;QAAK,CAAC,CAAC;QACzE,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,iCAAiC,CAAC;QAC9D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAN,gBAAQ,EAAC,WAAW,EAAE,MAAM;MACxB,IAAAC,YAAI,EAAC,yDAAyD,EAAE,MAAM;QAClE,MAAM4B,qBAAqB,GAAG,IAAA1B,gCAAkB,EAC5C,sCACJ,CAAC;QACD,IAAAC,cAAM,EAACyB,qBAAqB,CAACxB,IAAI,CAAC,CAACC,OAAO,CACtC,oDACJ,CAAC;QACD,IAAAF,cAAM,EAACyB,qBAAqB,CAACtB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEhD,MAAMwB,kBAAkB,GAAG,IAAA3B,gCAAkB,EACzC,wCACJ,CAAC;QACD,IAAAC,cAAM,EAAC0B,kBAAkB,CAACzB,IAAI,CAAC,CAACC,OAAO,CACnC,wEACJ,CAAC;QACD,IAAAF,cAAM,EAAC0B,kBAAkB,CAACvB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACjD,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,0CAA0C,EAAE,MAAM;QACnD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,kBAAkB,CAAC;QACrD,IAAAC,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,yBAAyB,CAAC;QACtD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAN,gBAAQ,EAAC,cAAc,EAAE,MAAM;QAC3B,IAAAC,YAAI,EAAC,yCAAyC,EAAE,MAAM;UAClD,MAAM4B,qBAAqB,GAAG,IAAA1B,gCAAkB,EAAC,2BAA2B,CAAC;UAC7E,IAAAC,cAAM,EAACyB,qBAAqB,CAACxB,IAAI,CAAC,CAACC,OAAO,CACtC,qDACJ,CAAC;UACD,IAAAF,cAAM,EAACyB,qBAAqB,CAACtB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UAEhD,MAAMwB,kBAAkB,GAAG,IAAA3B,gCAAkB,EAAC,+BAA+B,CAAC;UAC9E,IAAAC,cAAM,EAAC0B,kBAAkB,CAACzB,IAAI,CAAC,CAACC,OAAO,CACnC,2EACJ,CAAC;UACD,IAAAF,cAAM,EAAC0B,kBAAkB,CAACvB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACjD,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,uCAAuC,EAAE,MAAM;UAChD,MAAMQ,aAAa,GAAG,IAAAN,gCAAkB,EACpC,uCACJ,CAAC;UACD,IAAAC,cAAM,EAACK,aAAa,CAACJ,IAAI,CAAC,CAACC,OAAO,CAC9B,qDACJ,CAAC;UACD,IAAAF,cAAM,EAACK,aAAa,CAACF,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UAExC,MAAMI,aAAa,GAAG,IAAAP,gCAAkB,EACpC,uDACJ,CAAC;UACD,IAAAC,cAAM,EAACM,aAAa,CAACL,IAAI,CAAC,CAACC,OAAO,CAC9B,qEACJ,CAAC;UACD,IAAAF,cAAM,EAACM,aAAa,CAACH,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAC5C,CAAC,CAAC;MACN,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,8CAA8C,EAAE,MAAM;QACvD,MAAM4B,qBAAqB,GAAG,IAAA1B,gCAAkB,EAAC,oBAAoB,CAAC;QACtE,IAAAC,cAAM,EAACyB,qBAAqB,CAACxB,IAAI,CAAC,CAACC,OAAO,CAAC,kCAAkC,CAAC;QAC9E,IAAAF,cAAM,EAACyB,qBAAqB,CAACtB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEhD,MAAMwB,kBAAkB,GAAG,IAAA3B,gCAAkB,EAAC,wBAAwB,CAAC;QACvE,IAAAC,cAAM,EAAC0B,kBAAkB,CAACzB,IAAI,CAAC,CAACC,OAAO,CACnC,wDACJ,CAAC;QACD,IAAAF,cAAM,EAAC0B,kBAAkB,CAACvB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACjD,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,6CAA6C,EAAE,MAAM;QACtD,MAAM4B,qBAAqB,GAAG,IAAA1B,gCAAkB,EAAC,uBAAuB,CAAC;QACzE,IAAAC,cAAM,EAACyB,qBAAqB,CAACxB,IAAI,CAAC,CAACC,OAAO,CAAC,qCAAqC,CAAC;QACjF,IAAAF,cAAM,EAACyB,qBAAqB,CAACtB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QAEhD,MAAMwB,kBAAkB,GAAG,IAAA3B,gCAAkB,EAAC,2BAA2B,CAAC;QAC1E,IAAAC,cAAM,EAAC0B,kBAAkB,CAACzB,IAAI,CAAC,CAACC,OAAO,CACnC,2DACJ,CAAC;QACD,IAAAF,cAAM,EAAC0B,kBAAkB,CAACvB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACjD,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAN,gBAAQ,EAAC,OAAO,EAAE,MAAM;MACpB,IAAAC,YAAI,EAAC,+CAA+C,EAAE,MAAM;QACxD,MAAM8B,WAAW,GACb,6EAA6E;QACjF,MAAM7B,MAAM,GAAG,IAAAC,gCAAkB,EAAC4B,WAAW,CAAC;QAC9C,IAAA3B,cAAM,EAACP,gBAAgB,CAACK,MAAM,CAACG,IAAI,CAAC,CAAC,CAACC,OAAO,CACzC,kLACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,CAC1B;UACI0B,GAAG,EAAE,0CAA0C;UAC/CC,GAAG,EAAEF,WAAW;UAChBG,EAAE,EAAE;QACR,CAAC,CACJ,CAAC;MACN,CAAC,CAAC;MAEF,IAAAjC,YAAI,EAAC,8CAA8C,EAAE,MAAM;QACvD,MAAM8B,WAAW,GACb,qFAAqF;QACzF,MAAM7B,MAAM,GAAG,IAAAC,gCAAkB,EAAC4B,WAAW,EAAE;UAC3CI,WAAW,EAAE;QACjB,CAAC,CAAC;QACF,IAAA/B,cAAM,EAACP,gBAAgB,CAACK,MAAM,CAACG,IAAI,CAAC,CAAC,CAACC,OAAO,CACzC,sKACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,CAC1B;UACI0B,GAAG,EAAE,kDAAkD;UACvDC,GAAG,EAAEF,WAAW;UAChBG,EAAE,EAAE;QACR,CAAC,CACJ,CAAC;MACN,CAAC,CAAC;MAEF,IAAAjC,YAAI,EAAC,2CAA2C,EAAE,MAAM;QACpD,MAAM8B,WAAW,GACb,+KAA+K;QACnL,MAAM7B,MAAM,GAAG,IAAAC,gCAAkB,EAAC4B,WAAW,EAAE;UAC3CI,WAAW,EAAE;QACjB,CAAC,CAAC;QACF,IAAA/B,cAAM,EAACP,gBAAgB,CAACK,MAAM,CAACG,IAAI,CAAC,CAAC,CAACC,OAAO,CACzC,6QACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,CAC1B;UACI0B,GAAG,EAAE,iGAAiG;UACtGC,GAAG,EAAE,mJAAmJ;UACxJC,EAAE,EAAE;QACR,CAAC,CACJ,CAAC;MACN,CAAC,CAAC;MAEF,IAAAjC,YAAI,EAAC,yCAAyC,EAAE,MAAM;QAClD,MAAMmC,MAAM,GACR,2EAA2E;QAC/E,MAAMC,eAAe,GAAIC,KAAa,IAClC,8BAA8BA,KAAK,4HAA4H;QACnK,MAAMC,SAAS,GAAG,oCAAoC;QACtD,MAAMC,MAAM,GACR,2EAA2E;QAC/E,MAAMC,gBAAgB,GAAIH,KAAa,IACnC,8BAA8BA,KAAK,4HAA4H;QACnK,MAAMI,SAAS,GAAG,oCAAoC;QAEtD,MAAMf,OAAO,GAAG,IAAAxB,gCAAkB,EAAC,GAAGiC,MAAM,OAAOI,MAAM,EAAE,CAAC;QAC5D,IAAApC,cAAM,EAACP,gBAAgB,CAAC8B,OAAO,CAACtB,IAAI,CAAC,CAAC,CAACC,OAAO,CAC1C,GAAG+B,eAAe,CAAC,CAAC,CAAC,GAAGI,gBAAgB,CAAC,CAAC,CAAC,EAC/C,CAAC;QACD,IAAArC,cAAM,EAACuB,OAAO,CAACpB,MAAM,CAAC,CAACD,OAAO,CAAC,CAC3B;UACI0B,GAAG,EAAEO,SAAS;UACdN,GAAG,EAAE,GAAGG,MAAM,MAAM;UACpBF,EAAE,EAAE;QACR,CAAC,EACD;UACIF,GAAG,EAAEU,SAAS;UACdT,GAAG,EAAEO,MAAM;UACXN,EAAE,EAAE;QACR,CAAC,CACJ,CAAC;;QAEF;QACA,MAAMN,OAAO,GAAG,IAAAzB,gCAAkB,EAAC,GAAGqC,MAAM,OAAOJ,MAAM,EAAE,CAAC;QAC5D,IAAAhC,cAAM,EAACP,gBAAgB,CAAC+B,OAAO,CAACvB,IAAI,CAAC,CAAC,CAACC,OAAO,CAC1C,GAAGmC,gBAAgB,CAAC,CAAC,CAAC,GAAGJ,eAAe,CAAC,CAAC,CAAC,EAC/C,CAAC;QACD,IAAAjC,cAAM,EAACwB,OAAO,CAACrB,MAAM,CAAC,CAACD,OAAO,CAAC,CAC3B;UACI0B,GAAG,EAAEU,SAAS;UACdT,GAAG,EAAE,GAAGO,MAAM,MAAM;UACpBN,EAAE,EAAE;QACR,CAAC,EACD;UACIF,GAAG,EAAEO,SAAS;UACdN,GAAG,EAAEG,MAAM;UACXF,EAAE,EAAE;QACR,CAAC,CACJ,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAlC,gBAAQ,EAAC,MAAM,EAAE,MAAM;MACnB,IAAAC,YAAI,EAAC,8CAA8C,EAAE,MAAM;QACvD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,0BAA0B,CAAC;QAC7D,IAAAC,cAAM,EAACP,gBAAgB,CAACK,MAAM,CAACG,IAAI,CAAC,CAAC,CAACC,OAAO,CACzC,mEACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,oCAAoC,EAAE,MAAM;QAC7C,MAAM0B,OAAO,GAAG,IAAAxB,gCAAkB,EAAC,2BAA2B,CAAC;QAC/D,IAAAC,cAAM,EAACP,gBAAgB,CAAC8B,OAAO,CAACtB,IAAI,CAAC,CAAC,CAACC,OAAO,CAC1C,qDACJ,CAAC;QACD,IAAAF,cAAM,EAACuB,OAAO,CAACpB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACtC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAN,gBAAQ,EAAC,mBAAmB,EAAE,MAAM;MAChC,IAAAC,YAAI,EAAC,gDAAgD,EAAE,MAAM;QACzD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,8BAA8B,CAAC;QACjE,IAAAC,cAAM,EAACP,gBAAgB,CAACK,MAAM,CAACG,IAAI,CAAC,CAAC,CAACC,OAAO,CACzC,oDACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAAN,gBAAQ,EAAC,wBAAwB,EAAE,MAAM;MACrC,IAAAC,YAAI,EAAC,8DAA8D,EAAE,MAAM;QACvE,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,mBAAmB,EAAE;UAAEgC,WAAW,EAAE;QAAK,CAAC,CAAC;QAC7E,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,0BAA0B,CAAC;QACvD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,IAAAN,gBAAQ,EAAC,gBAAgB,EAAE,MAAM;IAC7B,IAAAA,gBAAQ,EAAC,cAAc,EAAE,MAAM;MAC3B,IAAAA,gBAAQ,EAAC,iBAAiB,EAAE,MAAM;QAC9B;QACA,IAAAC,YAAI,EAAC,+BAA+B,EAAE,MAAM;UACxC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,aAAa,EAAE;YAC7CgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,oBAAoB,CAAC;UACjD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,oCAAoC,EAAE,MAAM;UAC7C,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,uBAAuB,EAAE;YACvDgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,8BAA8B,CAAC;UAC3D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,+BAA+B,EAAE,MAAM;UACxC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,eAAe,EAAE;YAC/CgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,sBAAsB,CAAC;UACnD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,gCAAgC,EAAE,MAAM;UACzC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,iBAAiB,EAAE;YACjDgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,wBAAwB,CAAC;UACrD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,+BAA+B,EAAE,MAAM;UACxC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,kBAAkB,EAAE;YAClDgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,yBAAyB,CAAC;UACtD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,+BAA+B,EAAE,MAAM;UACxC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,eAAe,EAAE;YAC/CgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,sBAAsB,CAAC;UACnD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,kCAAkC,EAAE,MAAM;UAC3C,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,mBAAmB,EAAE;YACnDgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,0BAA0B,CAAC;UACvD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,iCAAiC,EAAE,MAAM;UAC1C,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAC7B,iDAAiD,EACjD;YACIgC,WAAW,EAAE;UACjB,CACJ,CAAC;UACD,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,kDAAkD,CAAC;UAC/E,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;MACN,CAAC,CAAC;MAEF,IAAAN,gBAAQ,EAAC,sBAAsB,EAAE,MAAM;QACnC,IAAAC,YAAI,EAAC,oCAAoC,EAAE,MAAM;UAC7C,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,gCAAgC,EAAE;YAChEgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,uCAAuC,CAAC;UACpE,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,gCAAgC,EAAE,MAAM;UACzC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,yCAAyC,EAAE;YACzEgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,gDAAgD,CAAC;UAC7E,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,gCAAgC,EAAE,MAAM;UACzC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,yCAAyC,EAAE;YACzEgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,gDAAgD,CAAC;UAC7E,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,gCAAgC,EAAE,MAAM;UACzC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,eAAe,EAAE;YAC/CgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,sBAAsB,CAAC;UACnD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,sCAAsC,EAAE,MAAM;UAC/C,MAAM0C,eAAe,GAAIC,GAAW,IAAK,IAAIA,GAAG,IAAIA,GAAG,KAAKA,GAAG,GAAG;UAClE,MAAMC,gBAAgB,GAAID,GAAW,IAAK,OAAOA,GAAG,IAAIA,GAAG,KAAKA,GAAG,OAAO;UAC1E,MAAME,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;UAExDA,WAAW,CAACC,OAAO,CAAEH,GAAG,IAAK;YACzB,MAAM1C,MAAM,GAAG,IAAAC,gCAAkB,EAACwC,eAAe,CAACC,GAAG,CAAC,EAAE;cACpDT,WAAW,EAAE;YACjB,CAAC,CAAC;YACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAACuC,gBAAgB,CAACD,GAAG,CAAC,CAAC;YAClD,IAAAxC,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UACrC,CAAC,CAAC;QACN,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,+BAA+B,EAAE,MAAM;UACxC,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,kBAAkB,EAAE;YAClDgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,yBAAyB,CAAC;UACtD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;MACN,CAAC,CAAC;MAEF,IAAAN,gBAAQ,EAAC,iBAAiB,EAAE,MAAM;QAC9B,IAAAC,YAAI,EAAC,qCAAqC,EAAE,MAAM;UAC9C,MAAM+C,KAAK,GAAG,+DAA+D;UAC7E,MAAMC,MAAM,GACR,sFAAsF;UAC1F,MAAMtB,OAAO,GAAG,IAAAxB,gCAAkB,EAAC6C,KAAK,EAAE;YACtCb,WAAW,EAAE,IAAI;YACjBe,2BAA2B,EAAE,CAAC,QAAQ;UAC1C,CAAC,CAAC;UACF,IAAA9C,cAAM,EAACuB,OAAO,CAACtB,IAAI,CAAC,CAACC,OAAO,CAAC2C,MAAM,CAAC;UACpC,IAAA7C,cAAM,EAACuB,OAAO,CAACpB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UAElC,MAAMsB,OAAO,GAAG,IAAAzB,gCAAkB,EAAC6C,KAAK,EAAE;YACtCb,WAAW,EAAE,IAAI;YACjBgB,0BAA0B,EAAE,CAAC,QAAQ;UACzC,CAAC,CAAC;UACF,IAAA/C,cAAM,EAACwB,OAAO,CAACvB,IAAI,CAAC,CAACC,OAAO,CAAC2C,MAAM,CAAC;UACpC,IAAA7C,cAAM,EAACwB,OAAO,CAACrB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC;QAEF,IAAAL,YAAI,EAAC,uCAAuC,EAAE,MAAM;UAChD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,4BAA4B,EAAE;YAC5DgC,WAAW,EAAE;UACjB,CAAC,CAAC;UACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,mCAAmC,CAAC;UAChE,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;QACrC,CAAC,CAAC;MACN,CAAC,CAAC;MAEF,IAAAN,gBAAQ,EAAC,aAAa,EAAE,MAAM;QAC1B,IAAAA,gBAAQ,EAAC,kBAAkB,EAAE,MAAM;UAC/B,IAAAC,YAAI,EAAC,kEAAkE,EAAE,MAAM;YAC3E,MAAM0B,OAAO,GAAG,IAAAxB,gCAAkB,EAAC,0BAA0B,EAAE;cAC3DgC,WAAW,EAAE;YACjB,CAAC,CAAC;YACF,IAAA/B,cAAM,EAACuB,OAAO,CAACtB,IAAI,CAAC,CAACC,OAAO,CAAC,+BAA+B,CAAC;YAC7D,IAAAF,cAAM,EAACuB,OAAO,CAACpB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;YAElC,MAAMsB,OAAO,GAAG,IAAAzB,gCAAkB,EAAC,4BAA4B,EAAE;cAC7DgC,WAAW,EAAE;YACjB,CAAC,CAAC;YACF,IAAA/B,cAAM,EAACwB,OAAO,CAACvB,IAAI,CAAC,CAACC,OAAO,CAAC,wCAAwC,CAAC;YACtE,IAAAF,cAAM,EAACwB,OAAO,CAACrB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UACtC,CAAC,CAAC;UAEF,IAAAL,YAAI,EAAC,6DAA6D,EAAE,MAAM;YACtE,MAAM0B,OAAO,GAAG,IAAAxB,gCAAkB,EAAC,4BAA4B,EAAE;cAC7DgC,WAAW,EAAE;YACjB,CAAC,CAAC;YACF,IAAA/B,cAAM,EAACuB,OAAO,CAACtB,IAAI,CAAC,CAACC,OAAO,CAAC,mCAAmC,CAAC;YACjE,IAAAF,cAAM,EAACuB,OAAO,CAACpB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;YAElC,MAAMsB,OAAO,GAAG,IAAAzB,gCAAkB,EAAC,8BAA8B,EAAE;cAC/DgC,WAAW,EAAE;YACjB,CAAC,CAAC;YACF,IAAA/B,cAAM,EAACwB,OAAO,CAACvB,IAAI,CAAC,CAACC,OAAO,CAAC,0CAA0C,CAAC;YACxE,IAAAF,cAAM,EAACwB,OAAO,CAACrB,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UACtC,CAAC,CAAC;QACN,CAAC,CAAC;QAEF,IAAAN,gBAAQ,EAAC,iBAAiB,EAAE,MAAM;UAC9B,IAAAC,YAAI,EAAC,iEAAiE,EAAE,MAAM;YAC1E,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,yBAAyB,EAAE;cACzDgC,WAAW,EAAE;YACjB,CAAC,CAAC;YACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,gCAAgC,CAAC;YAC7D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UACrC,CAAC,CAAC;;UAEF;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA,IAAAL,YAAI,EAAC,0EAA0E,EAAE,MAAM;YACnF,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,6BAA6B,EAAE;cAC7DgC,WAAW,EAAE;YACjB,CAAC,CAAC;YACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,wBAAwB,CAAC;YACrD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UACrC,CAAC,CAAC;QACN,CAAC,CAAC;MACN,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,yCAAyC,EAAE,MAAM;QAClD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAC7B,kDAAkD,EAClD;UACIgC,WAAW,EAAE,IAAI;UACjBe,2BAA2B,EAAE,CAAC,MAAM;QACxC,CACJ,CAAC;QACD,IAAA9C,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CACvB,yEACJ,CAAC;QACD,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,wCAAwC,EAAE,MAAM;QACjD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,2CAA2C,EAAE;UAC3EgC,WAAW,EAAE;QACjB,CAAC,CAAC;QACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,kDAAkD,CAAC;QAC/E,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;MAEF,IAAAL,YAAI,EAAC,yCAAyC,EAAE,MAAM;QAClD,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,2BAA2B,EAAE;UAC3DgC,WAAW,EAAE;QACjB,CAAC,CAAC;QACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,kCAAkC,CAAC;QAC/D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;MACrC,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,IAAAN,gBAAQ,EAAC,0CAA0C,EAAE,MAAM;IACvD,IAAAC,YAAI,EAAC,iDAAiD,EAAE,MAAM;MAC1D,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,eAAe,EAAE;QAC/CgC,WAAW,EAAE;MACjB,CAAC,CAAC;MACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,6BAA6B,CAAC;MAC1D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;IACrC,CAAC,CAAC;IAEF,IAAAL,YAAI,EAAC,iDAAiD,EAAE,MAAM;MAC1D,MAAMC,MAAM,GAAG,IAAAC,gCAAkB,EAAC,eAAe,EAAE;QAC/CgC,WAAW,EAAE;MACjB,CAAC,CAAC;MACF,IAAA/B,cAAM,EAACF,MAAM,CAACG,IAAI,CAAC,CAACC,OAAO,CAAC,6BAA6B,CAAC;MAC1D,IAAAF,cAAM,EAACF,MAAM,CAACK,MAAM,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;IACrC,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"formatString.test.js","names":["_vitest","require","_formatString","removeLinebreaks","text","replace","describe","test","result","formatStringToHtml","expect","html","toEqual","tables","resultEscape","resultEscape1","resultEscape2","boldResult","italicResult","inlineCodeResult","h1Result","h2Result","h3Result","h4Result","h5Result","h6Result","expectedUnorderedListResult","expectedOrderedListResult","unorderedListResult1","unorderedListResult2","orderedListResult","orderedListResult2","expectedThematicBreakResult","result1","result2","resultWithoutLanguage","resultWithLanguage","inputString","csv","raw","id","parseBBCode","table1","getTable1Result","index","table1Csv","table2","getTable2TResult","table2Csv","getHeadingInput","tag","getHeadingOutput","headingTags","forEach","input","output","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags"],"sources":["../../../../src/utils/formatString/formatString.test.ts"],"sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { formatStringToHtml } from './formatString';\n\nconst removeLinebreaks = (text: string) => text.replace(/\\n/g, '');\n\ndescribe('HTML Formatter Function', () => {\n describe('Format Plain Text', () => {\n describe('Line breaks', () => {\n test('should format line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\nLine 2');\n expect(result.html).toEqual('<p>Line 1\\nLine 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format multiple line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\n\\nLine 2');\n expect(result.html).toEqual('<p>Line 1</p>\\n<p>Line 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should remove trailing and leading new lines', () => {\n const result = formatStringToHtml('\\n\\n\\nLine 1\\n\\n\\n');\n expect(result.html).toEqual('<p>Line 1</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Whitespaces', () => {\n test('should not remove repeated whitespaces', () => {\n const result = formatStringToHtml('Text with spaces');\n expect(result.html).toEqual('<p>Text with spaces</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not remove leading and trailing whitespaces', () => {\n const result = formatStringToHtml(' Text ');\n expect(result.html).toEqual('<p> Text </p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('HTML', () => {\n test('should escape < and > correctly', () => {\n const resultEscape = formatStringToHtml('<div>Test</div>');\n expect(resultEscape.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape.tables).toEqual([]);\n });\n\n test('should not escape &', () => {\n const resultEscape1 = formatStringToHtml('<div>Test</div>');\n expect(resultEscape1.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '&lt;div&gt;Test&lt;/div&gt;',\n );\n expect(resultEscape2.html).toEqual(\n '<p>&lt;div&gt;Test&lt;/div&gt;</p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n\n // TODO Decide if & should be escaped, when they are not part of an HTML entity.\n });\n\n describe('URLs', () => {\n test('should not format URLs', () => {\n const result = formatStringToHtml('https://example.com');\n expect(result.html).toEqual('<p>https://example.com</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format Markdown', () => {\n describe('All Elements', () => {\n test('should format text styling correctly', () => {\n const boldResult = formatStringToHtml('**bold**');\n expect(boldResult.html).toEqual('<p><strong>bold</strong></p>');\n expect(boldResult.tables).toEqual([]);\n\n const italicResult = formatStringToHtml('*italic*');\n expect(italicResult.html).toEqual('<p><em>italic</em></p>');\n expect(italicResult.tables).toEqual([]);\n\n const inlineCodeResult = formatStringToHtml('`inline code`');\n expect(inlineCodeResult.html).toEqual('<p><code>inline code</code></p>');\n expect(inlineCodeResult.tables).toEqual([]);\n });\n\n test('should format headings correctly', () => {\n const h1Result = formatStringToHtml('# h1');\n expect(h1Result.html).toEqual('<h1>h1</h1>');\n expect(h1Result.tables).toEqual([]);\n\n const h2Result = formatStringToHtml('## h2');\n expect(h2Result.html).toEqual('<h2>h2</h2>');\n expect(h2Result.tables).toEqual([]);\n\n const h3Result = formatStringToHtml('### h3');\n expect(h3Result.html).toEqual('<h3>h3</h3>');\n expect(h3Result.tables).toEqual([]);\n\n const h4Result = formatStringToHtml('#### h4');\n expect(h4Result.html).toEqual('<h4>h4</h4>');\n expect(h4Result.tables).toEqual([]);\n\n const h5Result = formatStringToHtml('##### h5');\n expect(h5Result.html).toEqual('<h5>h5</h5>');\n expect(h5Result.tables).toEqual([]);\n\n const h6Result = formatStringToHtml('###### h6');\n expect(h6Result.html).toEqual('<h6>h6</h6>');\n expect(h6Result.tables).toEqual([]);\n });\n\n test('should format links correctly', () => {\n const result = formatStringToHtml('[Link](https://example.com)');\n expect(result.html).toEqual(\n '<p><a href=\"https://example.com\" rel=\"noopener noreferrer\" target=\"_blank\">Link</a></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format images correctly', () => {\n const result = formatStringToHtml('');\n expect(result.html).toEqual(\n '<p><img src=\"https://example.com/image.jpg\" alt=\"Alt Text\"></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format lists correctly', () => {\n const expectedUnorderedListResult =\n '<ul>\\n<li>Item 1</li>\\n<li>Item 2</li>\\n<li>Item 3</li>\\n</ul>';\n const expectedOrderedListResult =\n '<ol>\\n<li value=\"1\">Item 1</li>\\n<li value=\"2\">Item 2</li>\\n<li value=\"3\">Item 3</li>\\n</ol>';\n\n const unorderedListResult1 = formatStringToHtml('- Item 1\\n- Item 2\\n- Item 3');\n expect(unorderedListResult1.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult1.tables).toEqual([]);\n\n const unorderedListResult2 = formatStringToHtml('* Item 1\\n* Item 2\\n* Item 3');\n expect(unorderedListResult2.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult2.tables).toEqual([]);\n\n const orderedListResult = formatStringToHtml('1. Item 1\\n2. Item 2\\n3. Item 3');\n expect(orderedListResult.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult.tables).toEqual([]);\n\n const orderedListResult2 = formatStringToHtml('1) Item 1\\n2) Item 2\\n3) Item 3');\n expect(orderedListResult2.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult2.tables).toEqual([]);\n });\n\n test('should format thematic breaks correctly', () => {\n const expectedThematicBreakResult = '<hr>';\n\n const result1 = formatStringToHtml('---');\n expect(result1.html).toEqual(expectedThematicBreakResult);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('***');\n expect(result2.html).toEqual(expectedThematicBreakResult);\n expect(result2.tables).toEqual([]);\n });\n\n test('should format code blocks correctly', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\nconst a = 1;\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>const a = 1;</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```js\\nconst a = 1;\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should format tables correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\nCell 1,Cell 2\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n });\n\n describe('Inline Code', () => {\n describe('HTML In Code', () => {\n test('should escape < and > within inline code correctly', () => {\n const result1 = formatStringToHtml('`<div>Test</div>`');\n expect(result1.html).toEqual('<p><code><div>Test</div></code></p>');\n expect(result1.tables).toEqual([]);\n });\n\n test('should not escape & within inline code', () => {\n const resultEscape1 = formatStringToHtml('`<div>Test</div>`');\n expect(resultEscape1.html).toEqual(\n '<p><code><div>Test</div></code></p>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '`&lt;div&gt;Test&lt;/div&gt;`',\n );\n expect(resultEscape2.html).toEqual(\n '<p><code>&lt;div&gt;Test&lt;/div&gt;</code></p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within inline code', () => {\n const result = formatStringToHtml('`**bold** *italic*`');\n expect(result.html).toEqual('<p><code>**bold** *italic*</code></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not format bb-code within inline code', () => {\n const result = formatStringToHtml('`[b]bold[/b]`', { parseBBCode: true });\n expect(result.html).toEqual('<p><code>[b]bold[/b]</code></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Codeblock', () => {\n test('should format code blocks with multiple lines correctly', () => {\n const resultWithoutLanguage = formatStringToHtml(\n '```\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code>const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml(\n '```js\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format 4 spaces as code block', () => {\n const result = formatStringToHtml(' const a = 1;');\n expect(result.html).toEqual('<p> const a = 1;</p>');\n expect(result.tables).toEqual([]);\n });\n\n describe('HTML In Code', () => {\n test('should escape < and > within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n<div>Test</div>\\n```');\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n<div>Test</div>\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\"><div>Test</div></code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not escape & within code block', () => {\n const resultEscape1 = formatStringToHtml(\n '```\\n<div>Test</div>\\n```',\n );\n expect(resultEscape1.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '```\\n&lt;div&gt;Test&lt;/div&gt;\\n```',\n );\n expect(resultEscape2.html).toEqual(\n '<pre><code>&lt;div&gt;Test&lt;/div&gt;</code></pre>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n**Test**\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>**Test**</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n**Test**\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">**Test**</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format bb-code within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n[b]Test[/b]\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>[b]Test[/b]</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n[b]Test[/b]\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">[b]Test[/b]</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n });\n\n describe('Table', () => {\n test('should format markdown within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| **Cell 1** | *Cell 2* |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><strong>Cell 1</strong></td><td><em>Cell 2</em></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n**Cell 1**,*Cell 2*\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format bb-code within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| [b]Cell 1[/b] | [i]Cell 2[/i] |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><b>Cell 1</b></td><td><i>Cell 2</i></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n[b]Cell 1[/b],[i]Cell 2[/i]\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format html within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | &lt;div&gt;Cell 3&lt;/div&gt; |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th><th>Header 3</th></tr></thead><tbody><tr><td><div>Cell 1</div></td><td><div>Cell 2</div></td><td>&lt;div&gt;Cell 3&lt;/div&gt;</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2,Header 3\\n<div>Cell 1</div>,<div>Cell 2</div>,<div>Cell 3</div>\\n',\n raw: '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | <div>Cell 3</div> |',\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format multiple tables correctly', () => {\n const table1 =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const getTable1Result = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>`;\n const table1Csv = 'Header 1,Header 2\\nCell 1,Cell 2\\n';\n const table2 =\n '| Header 3 | Header 4 |\\n|----------|----------|\\n| Cell 3 | Cell 4 |';\n const getTable2TResult = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 3</th><th>Header 4</th></tr></thead><tbody><tr><td>Cell 3</td><td>Cell 4</td></tr></tbody></table>`;\n const table2Csv = 'Header 3,Header 4\\nCell 3,Cell 4\\n';\n\n const result1 = formatStringToHtml(`${table1}\\n\\n${table2}`);\n expect(removeLinebreaks(result1.html)).toEqual(\n `${getTable1Result(0)}${getTable2TResult(1)}`,\n );\n expect(result1.tables).toEqual([\n {\n csv: table1Csv,\n raw: `${table1}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table2Csv,\n raw: table2,\n id: 'formatted-table-1',\n },\n ]);\n\n // Tables in reverse order.\n const result2 = formatStringToHtml(`${table2}\\n\\n${table1}`);\n expect(removeLinebreaks(result2.html)).toEqual(\n `${getTable2TResult(0)}${getTable1Result(1)}`,\n );\n expect(result2.tables).toEqual([\n {\n csv: table2Csv,\n raw: `${table2}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table1Csv,\n raw: table1,\n id: 'formatted-table-1',\n },\n ]);\n });\n });\n\n describe('List', () => {\n test('should format markdown within list correctly', () => {\n const result = formatStringToHtml('- **Item 1**\\n- *Item 2*');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li><strong>Item 1</strong></li><li><em>Item 2</em></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format task lists correctly', () => {\n const result1 = formatStringToHtml('- [ ] 1\\n- [x] 2\\n- [X] 3');\n expect(removeLinebreaks(result1.html)).toEqual(\n '<ul><li>[ ] 1</li><li>[x] 2</li><li>[x] 3</li></ul>',\n );\n expect(result1.tables).toEqual([]);\n });\n });\n\n describe('Combined Elements', () => {\n test('should format code block within list correctly', () => {\n const result = formatStringToHtml('* test\\n ```\\n test\\n ```');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li>test<pre><code>test</code></pre></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Conflicts with BB-Code', () => {\n test('should not format bb code tag followed by paranthese to link', () => {\n const result = formatStringToHtml('[b]bold[/b](test)', { parseBBCode: true });\n expect(result.html).toEqual('<p><b>bold</b>(test)</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format BB-Code', () => {\n describe('All Elements', () => {\n describe('Inline Elements', () => {\n // b, strong, i, em, u, s, span, img\n test('should format b tag correctly', () => {\n const result = formatStringToHtml('[b]bold[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b>bold</b></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format strong tag correctly', () => {\n const result = formatStringToHtml('[strong]bold[/strong]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><strong>bold</strong></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format i tag correctly', () => {\n const result = formatStringToHtml('[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><i>italic</i></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format em tag correctly', () => {\n const result = formatStringToHtml('[em]italic[/em]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em>italic</em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format u tag correctly', () => {\n const result = formatStringToHtml('[u]underline[/u]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><u>underline</u></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format s tag correctly', () => {\n const result = formatStringToHtml('[s]strike[/s]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><s>strike</s></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format span tag correctly', () => {\n const result = formatStringToHtml('[span]span[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span>span</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format img tag correctly', () => {\n const result = formatStringToHtml(\n '[img src=\"https://example.com/image.jpg\"][/img]',\n {\n parseBBCode: true,\n },\n );\n expect(result.html).toEqual('<p><img src=\"https://example.com/image.jpg\"></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Block Level Elements', () => {\n test('should format center tag correctly', () => {\n const result = formatStringToHtml('[center]centered text[/center]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><center>centered text</center></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ul tag correctly', () => {\n const result = formatStringToHtml('[ul][li]Item 1[/li][li]Item 2[/li][/ul]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ul><li>Item 1</li><li>Item 2</li></ul></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ol tag correctly', () => {\n const result = formatStringToHtml('[ol][li]Item 1[/li][li]Item 2[/li][/ol]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ol><li>Item 1</li><li>Item 2</li></ol></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format li tag correctly', () => {\n const result = formatStringToHtml('[li]Item[/li]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><li>Item</li></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format heading tags correctly', () => {\n const getHeadingInput = (tag: string) => `[${tag}]${tag}[/${tag}]`;\n const getHeadingOutput = (tag: string) => `<p><${tag}>${tag}</${tag}></p>`;\n const headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n headingTags.forEach((tag) => {\n const result = formatStringToHtml(getHeadingInput(tag), {\n parseBBCode: true,\n });\n expect(result.html).toEqual(getHeadingOutput(tag));\n expect(result.tables).toEqual([]);\n });\n });\n\n test('should format p tag correctly', () => {\n const result = formatStringToHtml('[p]paragraph[/p]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><p>paragraph</p></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Custom Elements', () => {\n test('should format custom tags correctly', () => {\n const input = '[custom attribute1=\"test1\" attribute2=\"test2\"]custom[/custom]';\n const output =\n '<p><bb-code-custom attribute1=\"test1\" attribute2=\"test2\">custom</bb-code-custom></p>';\n const result1 = formatStringToHtml(input, {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['custom'],\n });\n expect(result1.html).toEqual(output);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml(input, {\n parseBBCode: true,\n customBlockLevelBBCodeTags: ['custom'],\n });\n expect(result2.html).toEqual(output);\n expect(result2.tables).toEqual([]);\n });\n\n test('should not format unknown custom tags', () => {\n const result = formatStringToHtml('[unknown]unknown[/unknown]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p>[unknown]unknown[/unknown]</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Line breaks', () => {\n describe('Between Elements', () => {\n test('should format line breaks between block level elements correctly', () => {\n const result1 = formatStringToHtml('[h1]h1[/h1]\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><h1>h1</h1><h2>h2</h2></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[h1]h1[/h1]\\n\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><h1>h1</h1></p>\\n<p><h2>h2</h2></p>');\n expect(result2.tables).toEqual([]);\n });\n\n test('should format line breaks between inline elements correctly', () => {\n const result1 = formatStringToHtml('[b]bold[/b]\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><b>bold</b>\\n<i>italic</i></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[b]bold[/b]\\n\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><b>bold</b></p>\\n<p><i>italic</i></p>');\n expect(result2.tables).toEqual([]);\n });\n });\n\n describe('Within Elements', () => {\n test('should format line breaks within block level elements correctly', () => {\n const result = formatStringToHtml('[h1]Line 1\\nLine 2[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n expect(result.tables).toEqual([]);\n });\n\n // This is a test that would fail!\n // test('should format multiple line breaks within block level elements correctly', () => {\n // const result = formatStringToHtml('[h1]Line 1\\n\\nLine 2[/h1]', {\n // parseBBCode: true,\n // });\n // expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n // expect(result.tables).toEqual([]);\n // });\n\n test('should remove trailing and leading new lines within block level elements', () => {\n const result = formatStringToHtml('[h1]\\n\\n\\nLine 1\\n\\n\\n[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1</h1></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n test('should not format url in tag attributes', () => {\n const result = formatStringToHtml(\n '[link url=\"https://www.google.com\"]Google[/link]',\n {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['link'],\n },\n );\n expect(result.html).toEqual(\n '<p><bb-code-link url=\"https://www.google.com\">Google</bb-code-link></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should apply style attribute correctly', () => {\n const result = formatStringToHtml('[span style=\"color: red;\"]red text[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span style=\"color: red;\">red text</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format nested elements correctly', () => {\n const result = formatStringToHtml('[b][i]bold italic[/i][/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><i>bold italic</i></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Combined Formatting (Markdown + BB-Code)', () => {\n test('should format bb-code within markdown correctly', () => {\n const result = formatStringToHtml('*[b]bold[/b]*', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em><b>bold</b></em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format markdown within bb-code correctly', () => {\n const result = formatStringToHtml('[b]*bold*[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><em>bold</em></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -105,14 +105,19 @@ const renderer = {
|
|
|
105
105
|
}
|
|
106
106
|
return `<pre><code class="language-${langString}">${code}</code></pre>\n`;
|
|
107
107
|
},
|
|
108
|
+
codespan({
|
|
109
|
+
text
|
|
110
|
+
}) {
|
|
111
|
+
return `<code>${text}</code>`;
|
|
112
|
+
},
|
|
108
113
|
// Replaces the checkbox input elements with Markdown checkboxes. This is the easiest way to
|
|
109
114
|
// prevent the formatting of Markdown checkboxes in lists. This can modify the input string
|
|
110
115
|
// slightly, since the capitalization of the checkbox can be lost. If a user types '- [X]', it
|
|
111
116
|
// will be replaced with '- [x]'.
|
|
112
117
|
checkbox({
|
|
113
|
-
|
|
118
|
+
raw
|
|
114
119
|
}) {
|
|
115
|
-
return
|
|
120
|
+
return raw.toLowerCase();
|
|
116
121
|
},
|
|
117
122
|
// Replaces the link renderer to prevent opening links in the same tab. Therefore, the target
|
|
118
123
|
// attribute is set to "_blank". The function is copied from marked.js and slightly modified:
|
|
@@ -135,6 +140,26 @@ const renderer = {
|
|
|
135
140
|
}
|
|
136
141
|
result += `>${text}</a>`;
|
|
137
142
|
return result;
|
|
143
|
+
},
|
|
144
|
+
// Ensures that the numbering of ordered lists is preserved.
|
|
145
|
+
listitem(item) {
|
|
146
|
+
if (item.task) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const match = item.raw.trim().match(/^\d{1,9}[.)]/);
|
|
150
|
+
|
|
151
|
+
// Removes the trailing dot or parenthesis from the match.
|
|
152
|
+
const value = match ? match[0].slice(0, match[0].length - 1) : '';
|
|
153
|
+
if (value) {
|
|
154
|
+
let itemBody = '';
|
|
155
|
+
itemBody += this.parser.parse(item.tokens);
|
|
156
|
+
|
|
157
|
+
// Sets the value attribute of the list item to the number of the list item.
|
|
158
|
+
return `<li value="${value}">${itemBody}</li>\n`;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Ensures that the default listitem renderer from marked js is used.
|
|
162
|
+
return false;
|
|
138
163
|
}
|
|
139
164
|
};
|
|
140
165
|
const postprocess = html => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatMarkdown.js","names":["_sync","require","_marked","_formatBBCode","inlineCodeRule","inlineTextRule","TABLE_ID_PREFIX","tokenizer","codespan","src","cap","exec","text","replace","hasNonSpaceChars","test","hasSpaceCharsOnBothEnds","substring","length","raw","type","undefined","lheading","url","code","inlineText","escape","br","list","renderer","lang","_match","langString","match","checkbox","checked","link","href","title","tokens","parser","parseInline","cleanHref","encodeURI","result","postprocess","html","tableIndex","marked","use","hooks","parseMarkdown","parseBBCode","parse","walkTokens","token","escapeBBCodeSquareBrackets","exports","unescapeHtml","replaceAll","getMarkdownTables","tableTokens","push","tables","forEach","tableToken","index","_tableToken$header","_tableToken$rows","tableArray","header","rowArray","rows","row","cell","csv","stringify","id"],"sources":["../../../../../src/utils/formatString/markdown/formatMarkdown.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions,import/no-unresolved\nimport { stringify } from 'csv-stringify/browser/esm/sync';\nimport { marked, RendererObject, TokenizerObject, Tokens } from 'marked';\nimport type { TableObject } from '../../../types/format';\nimport { escapeBBCodeSquareBrackets } from '../bb-code/formatBBCode';\n\nconst inlineCodeRule = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst inlineTextRule = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<![`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\nconst TABLE_ID_PREFIX = 'formatted-table-';\n\n/*\n The marked Pipeline, including tokenizer, renderer and hooks, are explained here:\n https://marked.js.org/using_pro\n*/\n\nconst tokenizer: TokenizerObject = {\n // Codespan Tokenizer is overwritten to prevent HTML escaping, since HTML has been already\n // escaped. The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L749\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = inlineCodeRule.exec(src);\n\n if (cap) {\n let text = (cap[2] as string).replace(/\\n/g, ' ');\n\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n\n return { raw: cap[0], text, type: 'codespan' };\n }\n\n return undefined;\n },\n // Disables Markdown formatting for setext headings.\n lheading(): Tokens.Heading | undefined {\n return undefined;\n },\n // Disables converting urls to hyperlinks.\n url() {\n return undefined;\n },\n // Disables converting text with 4 leading spaces to the code block.\n code() {\n return undefined;\n },\n // inlineText is overwritten to prevent HTML escaping, specifically since quote characters are\n // escaped, which breaks the attributes of bb-code elements. The function is copied from\n // marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L854\n inlineText(src: string) {\n const cap = inlineTextRule.exec(src);\n\n if (cap) {\n return { raw: cap[0], text: cap[0], type: 'text' };\n }\n\n return undefined;\n },\n // Disables escaping of characters via backslash. This is needed for LaTeX formulas, since\n // multiline LaTeX formulas have 2 backslashes at the end of their lines. Without this function,\n // the backslashes would be escaped and the LaTeX formula would be broken.\n escape() {\n return undefined;\n },\n // Disables the conversion of backslash at the end of a line to a line break. This is needed for\n // LaTeX formulas, since multiline LaTeX formulas have 2 backslashes at the end of their lines.\n // Without this '\\\\' would be converted to '\\<br>' which breaks LaTeX formulas.\n br() {\n return undefined;\n },\n // Only recognizes ordered lists that start with the number 1. Also recognizes ordered lists\n // that contain a list item with the number 1, so those lists are\n list(src: string) {\n // The regex is copied from marked.js: https://github.com/markedjs/marked/blob/4fc639e053a605b25abf66dccaa70c1bf6562eb7/src/rules.ts#L115\n if (/^( {0,3}[*+-]|1[.)])/.test(src)) {\n return false;\n }\n\n // Prevents the text from being recognized as a list.\n return undefined;\n },\n};\n\nconst renderer: RendererObject = {\n // Code Renderer is overwritten to prevent HTML escaping, since HTML has been already escaped.\n // The function is copied from marked.js and slightly modified: https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Renderer.ts#L24\n code({ lang, text }: Tokens.Code): string {\n const langString = (lang || '').match(/^\\S*/)?.[0];\n\n const code = `${text.replace(/\\n$/, '')}`;\n\n if (!langString) {\n return `<pre><code>${code}</code></pre>\\n`;\n }\n\n return `<pre><code class=\"language-${langString}\">${code}</code></pre>\\n`;\n },\n // Replaces the checkbox input elements with Markdown checkboxes. This is the easiest way to\n // prevent the formatting of Markdown checkboxes in lists. This can modify the input string\n // slightly, since the capitalization of the checkbox can be lost. If a user types '- [X]', it\n // will be replaced with '- [x]'.\n checkbox({ checked }: Tokens.Checkbox) {\n return checked ? '[x]' : '[ ]';\n },\n // Replaces the link renderer to prevent opening links in the same tab. Therefore, the target\n // attribute is set to \"_blank\". The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/15c77deb9e099041d5e70e3b7b17e50ddc35ec2a/src/Renderer.ts#L160\n link({ href, title, tokens }: Tokens.Link): string {\n const text = this.parser.parseInline(tokens);\n\n let cleanHref;\n\n try {\n cleanHref = encodeURI(href).replace(/%25/g, '%');\n } catch {\n return text;\n }\n\n let result = `<a href=\"${cleanHref}\" rel=\"noopener noreferrer\" target=\"_blank\"`;\n\n if (title) {\n result += ` title=\"${title}\"`;\n }\n\n result += `>${text}</a>`;\n\n return result;\n },\n};\n\nconst postprocess = (html: string): string => {\n let tableIndex = -1;\n\n // Assigns ids to tables.\n return html.replace(/(<table>)/g, () => {\n tableIndex++;\n\n return `<table id=\"${TABLE_ID_PREFIX}${tableIndex}\">`;\n });\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nmarked.use({ tokenizer, renderer, hooks: { postprocess } });\n\n// Parses Markdown following the GitHub flavored Markdown specification. The tokenizer and renderer\n// are slightly modified to prevent HTML escaping in code block and inline code.\nexport const parseMarkdown = (text: string, parseBBCode: boolean) =>\n marked.parse(text, {\n walkTokens: (token) => {\n if (parseBBCode && (token.type === 'codespan' || token.type === 'code')) {\n // eslint-disable-next-line no-param-reassign\n (token as Tokens.Codespan).text = escapeBBCodeSquareBrackets(\n (token as Tokens.Codespan).text,\n );\n }\n },\n }) as string;\n\n// It is important that, & is replaced last to prevent double escaping.\nconst unescapeHtml = (text: string) =>\n text.replaceAll('<', '<').replaceAll('>', '>').replaceAll('&', '&');\n\nexport const getMarkdownTables = (text: string): TableObject[] => {\n const tableTokens: Tokens.Table[] = [];\n\n // Since walkTokens is not called with async functions and parseInline is not used, the result\n // of parse is synchronous. To match the type, it will be voided here.\n void marked.parse(text, {\n walkTokens: (token) => {\n if (token.type === 'table') {\n tableTokens.push(token as Tokens.Table);\n }\n },\n });\n\n const tables: TableObject[] = [];\n\n tableTokens.forEach((tableToken, index) => {\n const tableArray: string[][] = [];\n\n if (tableToken.header?.length > 0) {\n const rowArray: string[] = [];\n\n tableToken.header.forEach((header) => {\n rowArray.push(unescapeHtml(header.text));\n });\n\n tableArray.push(rowArray);\n }\n\n if (tableToken.rows?.length > 0) {\n tableToken.rows.forEach((row) => {\n const rowArray: string[] = [];\n\n row.forEach((cell) => {\n rowArray.push(unescapeHtml(cell.text));\n });\n\n tableArray.push(rowArray);\n });\n }\n\n const csv = stringify(tableArray || []);\n\n tables.push({\n raw: unescapeHtml(tableToken.raw),\n csv,\n id: `${TABLE_ID_PREFIX}${index}`,\n });\n });\n\n return tables;\n};\n"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,aAAA,GAAAF,OAAA;AAJA;;AAMA,MAAMG,cAAc,GAAG,qCAAqC;AAC5D,MAAMC,cAAc,GAAG,4EAA4E;AAEnG,MAAMC,eAAe,GAAG,kBAAkB;;AAE1C;AACA;AACA;AACA;;AAEA,MAAMC,SAA0B,GAAG;EAC/B;EACA;EACA;EACAC,QAAQA,CAACC,GAAW,EAA+B;IAC/C,MAAMC,GAAG,GAAGN,cAAc,CAACO,IAAI,CAACF,GAAG,CAAC;IAEpC,IAAIC,GAAG,EAAE;MACL,IAAIE,IAAI,GAAIF,GAAG,CAAC,CAAC,CAAC,CAAYG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;MAEjD,MAAMC,gBAAgB,GAAG,MAAM,CAACC,IAAI,CAACH,IAAI,CAAC;MAC1C,MAAMI,uBAAuB,GAAG,IAAI,CAACD,IAAI,CAACH,IAAI,CAAC,IAAI,IAAI,CAACG,IAAI,CAACH,IAAI,CAAC;MAElE,IAAIE,gBAAgB,IAAIE,uBAAuB,EAAE;QAC7CJ,IAAI,GAAGA,IAAI,CAACK,SAAS,CAAC,CAAC,EAAEL,IAAI,CAACM,MAAM,GAAG,CAAC,CAAC;MAC7C;MAEA,OAAO;QAAEC,GAAG,EAAET,GAAG,CAAC,CAAC,CAAC;QAAEE,IAAI;QAAEQ,IAAI,EAAE;MAAW,CAAC;IAClD;IAEA,OAAOC,SAAS;EACpB,CAAC;EACD;EACAC,QAAQA,CAAA,EAA+B;IACnC,OAAOD,SAAS;EACpB,CAAC;EACD;EACAE,GAAGA,CAAA,EAAG;IACF,OAAOF,SAAS;EACpB,CAAC;EACD;EACAG,IAAIA,CAAA,EAAG;IACH,OAAOH,SAAS;EACpB,CAAC;EACD;EACA;EACA;EACA;EACAI,UAAUA,CAAChB,GAAW,EAAE;IACpB,MAAMC,GAAG,GAAGL,cAAc,CAACM,IAAI,CAACF,GAAG,CAAC;IAEpC,IAAIC,GAAG,EAAE;MACL,OAAO;QAAES,GAAG,EAAET,GAAG,CAAC,CAAC,CAAC;QAAEE,IAAI,EAAEF,GAAG,CAAC,CAAC,CAAC;QAAEU,IAAI,EAAE;MAAO,CAAC;IACtD;IAEA,OAAOC,SAAS;EACpB,CAAC;EACD;EACA;EACA;EACAK,MAAMA,CAAA,EAAG;IACL,OAAOL,SAAS;EACpB,CAAC;EACD;EACA;EACA;EACAM,EAAEA,CAAA,EAAG;IACD,OAAON,SAAS;EACpB,CAAC;EACD;EACA;EACAO,IAAIA,CAACnB,GAAW,EAAE;IACd;IACA,IAAI,sBAAsB,CAACM,IAAI,CAACN,GAAG,CAAC,EAAE;MAClC,OAAO,KAAK;IAChB;;IAEA;IACA,OAAOY,SAAS;EACpB;AACJ,CAAC;AAED,MAAMQ,QAAwB,GAAG;EAC7B;EACA;EACAL,IAAIA,CAAC;IAAEM,IAAI;IAAElB;EAAkB,CAAC,EAAU;IAAA,IAAAmB,MAAA;IACtC,MAAMC,UAAU,IAAAD,MAAA,GAAG,CAACD,IAAI,IAAI,EAAE,EAAEG,KAAK,CAAC,MAAM,CAAC,cAAAF,MAAA,uBAA1BA,MAAA,CAA6B,CAAC,CAAC;IAElD,MAAMP,IAAI,GAAG,GAAGZ,IAAI,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;IAEzC,IAAI,CAACmB,UAAU,EAAE;MACb,OAAO,cAAcR,IAAI,iBAAiB;IAC9C;IAEA,OAAO,8BAA8BQ,UAAU,KAAKR,IAAI,iBAAiB;EAC7E,CAAC;EACD;EACA;EACA;EACA;EACAU,QAAQA,CAAC;IAAEC;EAAyB,CAAC,EAAE;IACnC,OAAOA,OAAO,GAAG,KAAK,GAAG,KAAK;EAClC,CAAC;EACD;EACA;EACA;EACAC,IAAIA,CAAC;IAAEC,IAAI;IAAEC,KAAK;IAAEC;EAAoB,CAAC,EAAU;IAC/C,MAAM3B,IAAI,GAAG,IAAI,CAAC4B,MAAM,CAACC,WAAW,CAACF,MAAM,CAAC;IAE5C,IAAIG,SAAS;IAEb,IAAI;MACAA,SAAS,GAAGC,SAAS,CAACN,IAAI,CAAC,CAACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;IACpD,CAAC,CAAC,MAAM;MACJ,OAAOD,IAAI;IACf;IAEA,IAAIgC,MAAM,GAAG,YAAYF,SAAS,6CAA6C;IAE/E,IAAIJ,KAAK,EAAE;MACPM,MAAM,IAAI,WAAWN,KAAK,GAAG;IACjC;IAEAM,MAAM,IAAI,IAAIhC,IAAI,MAAM;IAExB,OAAOgC,MAAM;EACjB;AACJ,CAAC;AAED,MAAMC,WAAW,GAAIC,IAAY,IAAa;EAC1C,IAAIC,UAAU,GAAG,CAAC,CAAC;;EAEnB;EACA,OAAOD,IAAI,CAACjC,OAAO,CAAC,YAAY,EAAE,MAAM;IACpCkC,UAAU,EAAE;IAEZ,OAAO,cAAczC,eAAe,GAAGyC,UAAU,IAAI;EACzD,CAAC,CAAC;AACN,CAAC;;AAED;AACAC,cAAM,CAACC,GAAG,CAAC;EAAE1C,SAAS;EAAEsB,QAAQ;EAAEqB,KAAK,EAAE;IAAEL;EAAY;AAAE,CAAC,CAAC;;AAE3D;AACA;AACO,MAAMM,aAAa,GAAGA,CAACvC,IAAY,EAAEwC,WAAoB,KAC5DJ,cAAM,CAACK,KAAK,CAACzC,IAAI,EAAE;EACf0C,UAAU,EAAGC,KAAK,IAAK;IACnB,IAAIH,WAAW,KAAKG,KAAK,CAACnC,IAAI,KAAK,UAAU,IAAImC,KAAK,CAACnC,IAAI,KAAK,MAAM,CAAC,EAAE;MACrE;MACCmC,KAAK,CAAqB3C,IAAI,GAAG,IAAA4C,wCAA0B,EACvDD,KAAK,CAAqB3C,IAC/B,CAAC;IACL;EACJ;AACJ,CAAC,CAAW;;AAEhB;AAAA6C,OAAA,CAAAN,aAAA,GAAAA,aAAA;AACA,MAAMO,YAAY,GAAI9C,IAAY,IAC9BA,IAAI,CAAC+C,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAACA,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAACA,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;AAE1E,MAAMC,iBAAiB,GAAIhD,IAAY,IAAoB;EAC9D,MAAMiD,WAA2B,GAAG,EAAE;;EAEtC;EACA;EACA,KAAKb,cAAM,CAACK,KAAK,CAACzC,IAAI,EAAE;IACpB0C,UAAU,EAAGC,KAAK,IAAK;MACnB,IAAIA,KAAK,CAACnC,IAAI,KAAK,OAAO,EAAE;QACxByC,WAAW,CAACC,IAAI,CAACP,KAAqB,CAAC;MAC3C;IACJ;EACJ,CAAC,CAAC;EAEF,MAAMQ,MAAqB,GAAG,EAAE;EAEhCF,WAAW,CAACG,OAAO,CAAC,CAACC,UAAU,EAAEC,KAAK,KAAK;IAAA,IAAAC,kBAAA,EAAAC,gBAAA;IACvC,MAAMC,UAAsB,GAAG,EAAE;IAEjC,IAAI,EAAAF,kBAAA,GAAAF,UAAU,CAACK,MAAM,cAAAH,kBAAA,uBAAjBA,kBAAA,CAAmBjD,MAAM,IAAG,CAAC,EAAE;MAC/B,MAAMqD,QAAkB,GAAG,EAAE;MAE7BN,UAAU,CAACK,MAAM,CAACN,OAAO,CAAEM,MAAM,IAAK;QAClCC,QAAQ,CAACT,IAAI,CAACJ,YAAY,CAACY,MAAM,CAAC1D,IAAI,CAAC,CAAC;MAC5C,CAAC,CAAC;MAEFyD,UAAU,CAACP,IAAI,CAACS,QAAQ,CAAC;IAC7B;IAEA,IAAI,EAAAH,gBAAA,GAAAH,UAAU,CAACO,IAAI,cAAAJ,gBAAA,uBAAfA,gBAAA,CAAiBlD,MAAM,IAAG,CAAC,EAAE;MAC7B+C,UAAU,CAACO,IAAI,CAACR,OAAO,CAAES,GAAG,IAAK;QAC7B,MAAMF,QAAkB,GAAG,EAAE;QAE7BE,GAAG,CAACT,OAAO,CAAEU,IAAI,IAAK;UAClBH,QAAQ,CAACT,IAAI,CAACJ,YAAY,CAACgB,IAAI,CAAC9D,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEFyD,UAAU,CAACP,IAAI,CAACS,QAAQ,CAAC;MAC7B,CAAC,CAAC;IACN;IAEA,MAAMI,GAAG,GAAG,IAAAC,eAAS,EAACP,UAAU,IAAI,EAAE,CAAC;IAEvCN,MAAM,CAACD,IAAI,CAAC;MACR3C,GAAG,EAAEuC,YAAY,CAACO,UAAU,CAAC9C,GAAG,CAAC;MACjCwD,GAAG;MACHE,EAAE,EAAE,GAAGvE,eAAe,GAAG4D,KAAK;IAClC,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,OAAOH,MAAM;AACjB,CAAC;AAACN,OAAA,CAAAG,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"formatMarkdown.js","names":["_sync","require","_marked","_formatBBCode","inlineCodeRule","inlineTextRule","TABLE_ID_PREFIX","tokenizer","codespan","src","cap","exec","text","replace","hasNonSpaceChars","test","hasSpaceCharsOnBothEnds","substring","length","raw","type","undefined","lheading","url","code","inlineText","escape","br","list","renderer","lang","_match","langString","match","checkbox","toLowerCase","link","href","title","tokens","parser","parseInline","cleanHref","encodeURI","result","listitem","item","task","trim","value","slice","itemBody","parse","postprocess","html","tableIndex","marked","use","hooks","parseMarkdown","parseBBCode","walkTokens","token","escapeBBCodeSquareBrackets","exports","unescapeHtml","replaceAll","getMarkdownTables","tableTokens","push","tables","forEach","tableToken","index","_tableToken$header","_tableToken$rows","tableArray","header","rowArray","rows","row","cell","csv","stringify","id"],"sources":["../../../../../src/utils/formatString/markdown/formatMarkdown.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions,import/no-unresolved\nimport { stringify } from 'csv-stringify/browser/esm/sync';\nimport { marked, RendererObject, TokenizerObject, Tokens } from 'marked';\nimport type { TableObject } from '../../../types/format';\nimport { escapeBBCodeSquareBrackets } from '../bb-code/formatBBCode';\n\nconst inlineCodeRule = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst inlineTextRule = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<![`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\nconst TABLE_ID_PREFIX = 'formatted-table-';\n\n/*\n The marked Pipeline, including tokenizer, renderer and hooks, are explained here:\n https://marked.js.org/using_pro\n*/\n\nconst tokenizer: TokenizerObject = {\n // Codespan Tokenizer is overwritten to prevent HTML escaping, since HTML has been already\n // escaped. The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L749\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = inlineCodeRule.exec(src);\n\n if (cap) {\n let text = (cap[2] as string).replace(/\\n/g, ' ');\n\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n\n return { raw: cap[0], text, type: 'codespan' };\n }\n\n return undefined;\n },\n // Disables Markdown formatting for setext headings.\n lheading(): Tokens.Heading | undefined {\n return undefined;\n },\n // Disables converting urls to hyperlinks.\n url() {\n return undefined;\n },\n // Disables converting text with 4 leading spaces to the code block.\n code() {\n return undefined;\n },\n // inlineText is overwritten to prevent HTML escaping, specifically since quote characters are\n // escaped, which breaks the attributes of bb-code elements. The function is copied from\n // marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L854\n inlineText(src: string) {\n const cap = inlineTextRule.exec(src);\n\n if (cap) {\n return { raw: cap[0], text: cap[0], type: 'text' };\n }\n\n return undefined;\n },\n // Disables escaping of characters via backslash. This is needed for LaTeX formulas, since\n // multiline LaTeX formulas have 2 backslashes at the end of their lines. Without this function,\n // the backslashes would be escaped and the LaTeX formula would be broken.\n escape() {\n return undefined;\n },\n // Disables the conversion of backslash at the end of a line to a line break. This is needed for\n // LaTeX formulas, since multiline LaTeX formulas have 2 backslashes at the end of their lines.\n // Without this '\\\\' would be converted to '\\<br>' which breaks LaTeX formulas.\n br() {\n return undefined;\n },\n // Only recognizes ordered lists that start with the number 1. Also recognizes ordered lists\n // that contain a list item with the number 1, so those lists are\n list(src: string) {\n // The regex is copied from marked.js: https://github.com/markedjs/marked/blob/4fc639e053a605b25abf66dccaa70c1bf6562eb7/src/rules.ts#L115\n if (/^( {0,3}[*+-]|1[.)])/.test(src)) {\n return false;\n }\n\n // Prevents the text from being recognized as a list.\n return undefined;\n },\n};\n\nconst renderer: RendererObject = {\n // Code Renderer is overwritten to prevent HTML escaping, since HTML has been already escaped.\n // The function is copied from marked.js and slightly modified: https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Renderer.ts#L24\n code({ lang, text }: Tokens.Code): string {\n const langString = (lang || '').match(/^\\S*/)?.[0];\n\n const code = `${text.replace(/\\n$/, '')}`;\n\n if (!langString) {\n return `<pre><code>${code}</code></pre>\\n`;\n }\n\n return `<pre><code class=\"language-${langString}\">${code}</code></pre>\\n`;\n },\n codespan({ text }: Tokens.Codespan): string {\n return `<code>${text}</code>`;\n },\n // Replaces the checkbox input elements with Markdown checkboxes. This is the easiest way to\n // prevent the formatting of Markdown checkboxes in lists. This can modify the input string\n // slightly, since the capitalization of the checkbox can be lost. If a user types '- [X]', it\n // will be replaced with '- [x]'.\n checkbox({ raw }: Tokens.Checkbox) {\n return raw.toLowerCase();\n },\n // Replaces the link renderer to prevent opening links in the same tab. Therefore, the target\n // attribute is set to \"_blank\". The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/15c77deb9e099041d5e70e3b7b17e50ddc35ec2a/src/Renderer.ts#L160\n link({ href, title, tokens }: Tokens.Link): string {\n const text = this.parser.parseInline(tokens);\n\n let cleanHref;\n\n try {\n cleanHref = encodeURI(href).replace(/%25/g, '%');\n } catch {\n return text;\n }\n\n let result = `<a href=\"${cleanHref}\" rel=\"noopener noreferrer\" target=\"_blank\"`;\n\n if (title) {\n result += ` title=\"${title}\"`;\n }\n\n result += `>${text}</a>`;\n\n return result;\n },\n // Ensures that the numbering of ordered lists is preserved.\n listitem(item: Tokens.ListItem) {\n if (item.task) {\n return false;\n }\n\n const match = item.raw.trim().match(/^\\d{1,9}[.)]/);\n\n // Removes the trailing dot or parenthesis from the match.\n const value = match ? match[0].slice(0, match[0].length - 1) : '';\n\n if (value) {\n let itemBody = '';\n\n itemBody += this.parser.parse(item.tokens);\n\n // Sets the value attribute of the list item to the number of the list item.\n return `<li value=\"${value}\">${itemBody}</li>\\n`;\n }\n\n // Ensures that the default listitem renderer from marked js is used.\n return false;\n },\n};\n\nconst postprocess = (html: string): string => {\n let tableIndex = -1;\n\n // Assigns ids to tables.\n return html.replace(/(<table>)/g, () => {\n tableIndex++;\n\n return `<table id=\"${TABLE_ID_PREFIX}${tableIndex}\">`;\n });\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nmarked.use({ tokenizer, renderer, hooks: { postprocess } });\n\n// Parses Markdown following the GitHub flavored Markdown specification. The tokenizer and renderer\n// are slightly modified to prevent HTML escaping in code block and inline code.\nexport const parseMarkdown = (text: string, parseBBCode: boolean) =>\n marked.parse(text, {\n walkTokens: (token) => {\n if (parseBBCode && (token.type === 'codespan' || token.type === 'code')) {\n // eslint-disable-next-line no-param-reassign\n (token as Tokens.Codespan).text = escapeBBCodeSquareBrackets(\n (token as Tokens.Codespan).text,\n );\n }\n },\n }) as string;\n\n// It is important that, & is replaced last to prevent double escaping.\nconst unescapeHtml = (text: string) =>\n text.replaceAll('<', '<').replaceAll('>', '>').replaceAll('&', '&');\n\nexport const getMarkdownTables = (text: string): TableObject[] => {\n const tableTokens: Tokens.Table[] = [];\n\n // Since walkTokens is not called with async functions and parseInline is not used, the result\n // of parse is synchronous. To match the type, it will be voided here.\n void marked.parse(text, {\n walkTokens: (token) => {\n if (token.type === 'table') {\n tableTokens.push(token as Tokens.Table);\n }\n },\n });\n\n const tables: TableObject[] = [];\n\n tableTokens.forEach((tableToken, index) => {\n const tableArray: string[][] = [];\n\n if (tableToken.header?.length > 0) {\n const rowArray: string[] = [];\n\n tableToken.header.forEach((header) => {\n rowArray.push(unescapeHtml(header.text));\n });\n\n tableArray.push(rowArray);\n }\n\n if (tableToken.rows?.length > 0) {\n tableToken.rows.forEach((row) => {\n const rowArray: string[] = [];\n\n row.forEach((cell) => {\n rowArray.push(unescapeHtml(cell.text));\n });\n\n tableArray.push(rowArray);\n });\n }\n\n const csv = stringify(tableArray || []);\n\n tables.push({\n raw: unescapeHtml(tableToken.raw),\n csv,\n id: `${TABLE_ID_PREFIX}${index}`,\n });\n });\n\n return tables;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,11 +14,14 @@ export function findFirstBBCode(inputString) {
|
|
|
14
14
|
const {
|
|
15
15
|
index
|
|
16
16
|
} = matches;
|
|
17
|
-
if (fullMatch === undefined || tag === undefined || params === undefined || content === undefined || openingTag === undefined || closingTag === undefined)
|
|
17
|
+
if (fullMatch === undefined || tag === undefined || params === undefined || content === undefined || openingTag === undefined || closingTag === undefined) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
18
20
|
const parameters = {};
|
|
21
|
+
const correctedParams = params.replaceAll('"', '"');
|
|
19
22
|
let match = null;
|
|
20
23
|
// eslint-disable-next-line no-cond-assign
|
|
21
|
-
while (match = PARAMETER_REGEX.exec(
|
|
24
|
+
while (match = PARAMETER_REGEX.exec(correctedParams)) {
|
|
22
25
|
const [, key, value] = match;
|
|
23
26
|
if (value) {
|
|
24
27
|
parameters[key || 'url'] = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findBBCode.js","names":["BB_REGEX","PARAMETER_REGEX","findFirstBBCode","inputString","matches","exec","fullMatch","openingTag","tag","params","content","closingTag","index","undefined","parameters","match","key","value"],"sources":["../../../../../src/utils/formatString/bb-code/findBBCode.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BB_REGEX = /(\\[([a-zA-Z0-9_]*)(.*?)\\])(.*?)(\\[\\/\\2\\])/s;\n// Also matches \"\\\" before quote to fix button for voucher messages\nconst PARAMETER_REGEX = /([\\w]*?)=\\\\?[\"„“‚'‘](.*?)[\"“”‘'’]/g;\n\nexport interface BBCodeMatch {\n fullMatch: string;\n tag: string;\n parameters: Record<string, string>;\n content: string;\n index: number;\n openingTag: string;\n closingTag: string;\n}\n\n// TODO Use external package instead of RegExp to parse BBCode.\n// It is not recommended to use RegExp to parse markup languages like BBCode, because it is not possible to parse nested tags with it.\n\n// Finds and returns the first BBCode tag in the input string.\nexport function findFirstBBCode(inputString: string): BBCodeMatch | null {\n const matches = BB_REGEX.exec(inputString);\n\n if (matches !== null) {\n const [fullMatch, openingTag, tag, params, content, closingTag] = matches;\n const { index } = matches;\n\n if (\n fullMatch === undefined ||\n tag === undefined ||\n params === undefined ||\n content === undefined ||\n openingTag === undefined ||\n closingTag === undefined\n )\n return null;\n\n const parameters: Record<string, string> = {};\n\n let match: RegExpExecArray | null = null;\n // eslint-disable-next-line no-cond-assign\n while ((match = PARAMETER_REGEX.exec(
|
|
1
|
+
{"version":3,"file":"findBBCode.js","names":["BB_REGEX","PARAMETER_REGEX","findFirstBBCode","inputString","matches","exec","fullMatch","openingTag","tag","params","content","closingTag","index","undefined","parameters","correctedParams","replaceAll","match","key","value"],"sources":["../../../../../src/utils/formatString/bb-code/findBBCode.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst BB_REGEX = /(\\[([a-zA-Z0-9_]*)(.*?)\\])(.*?)(\\[\\/\\2\\])/s;\n// Also matches \"\\\" before quote to fix button for voucher messages\nconst PARAMETER_REGEX = /([\\w]*?)=\\\\?[\"„“‚'‘](.*?)[\"“”‘'’]/g;\n\nexport interface BBCodeMatch {\n fullMatch: string;\n tag: string;\n parameters: Record<string, string>;\n content: string;\n index: number;\n openingTag: string;\n closingTag: string;\n}\n\n// TODO Use external package instead of RegExp to parse BBCode.\n// It is not recommended to use RegExp to parse markup languages like BBCode, because it is not possible to parse nested tags with it.\n\n// Finds and returns the first BBCode tag in the input string.\nexport function findFirstBBCode(inputString: string): BBCodeMatch | null {\n const matches = BB_REGEX.exec(inputString);\n\n if (matches !== null) {\n const [fullMatch, openingTag, tag, params, content, closingTag] = matches;\n const { index } = matches;\n\n if (\n fullMatch === undefined ||\n tag === undefined ||\n params === undefined ||\n content === undefined ||\n openingTag === undefined ||\n closingTag === undefined\n ) {\n return null;\n }\n\n const parameters: Record<string, string> = {};\n\n const correctedParams = params.replaceAll('"', '\"');\n\n let match: RegExpExecArray | null = null;\n // eslint-disable-next-line no-cond-assign\n while ((match = PARAMETER_REGEX.exec(correctedParams))) {\n const [, key, value] = match;\n\n if (value) {\n parameters[key || 'url'] = value;\n }\n }\n\n return {\n fullMatch,\n tag,\n parameters,\n content,\n index,\n openingTag,\n closingTag,\n };\n }\n\n return null;\n}\n"],"mappings":"AAAA;AACA;AACA,MAAMA,QAAQ,GAAG,4CAA4C;AAC7D;AACA,MAAMC,eAAe,GAAG,oCAAoC;AAY5D;AACA;;AAEA;AACA,OAAO,SAASC,eAAeA,CAACC,WAAmB,EAAsB;EACrE,MAAMC,OAAO,GAAGJ,QAAQ,CAACK,IAAI,CAACF,WAAW,CAAC;EAE1C,IAAIC,OAAO,KAAK,IAAI,EAAE;IAClB,MAAM,CAACE,SAAS,EAAEC,UAAU,EAAEC,GAAG,EAAEC,MAAM,EAAEC,OAAO,EAAEC,UAAU,CAAC,GAAGP,OAAO;IACzE,MAAM;MAAEQ;IAAM,CAAC,GAAGR,OAAO;IAEzB,IACIE,SAAS,KAAKO,SAAS,IACvBL,GAAG,KAAKK,SAAS,IACjBJ,MAAM,KAAKI,SAAS,IACpBH,OAAO,KAAKG,SAAS,IACrBN,UAAU,KAAKM,SAAS,IACxBF,UAAU,KAAKE,SAAS,EAC1B;MACE,OAAO,IAAI;IACf;IAEA,MAAMC,UAAkC,GAAG,CAAC,CAAC;IAE7C,MAAMC,eAAe,GAAGN,MAAM,CAACO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;IAExD,IAAIC,KAA6B,GAAG,IAAI;IACxC;IACA,OAAQA,KAAK,GAAGhB,eAAe,CAACI,IAAI,CAACU,eAAe,CAAC,EAAG;MACpD,MAAM,GAAGG,GAAG,EAAEC,KAAK,CAAC,GAAGF,KAAK;MAE5B,IAAIE,KAAK,EAAE;QACPL,UAAU,CAACI,GAAG,IAAI,KAAK,CAAC,GAAGC,KAAK;MACpC;IACJ;IAEA,OAAO;MACHb,SAAS;MACTE,GAAG;MACHM,UAAU;MACVJ,OAAO;MACPE,KAAK;MACLL,UAAU;MACVI;IACJ,CAAC;EACL;EAEA,OAAO,IAAI;AACf","ignoreList":[]}
|
|
@@ -33,7 +33,7 @@ export const formatStringToHtml = (string, options) => {
|
|
|
33
33
|
// Escape BB-Code to prevent conflicts between Markdown and BB-code. Specifically [b]test[/b]()
|
|
34
34
|
// would be a problem, since Markdown interprets parts of this as a link.
|
|
35
35
|
|
|
36
|
-
// Parses
|
|
36
|
+
// Parses Markdown to HTML.
|
|
37
37
|
if (parseMarkdownOption) {
|
|
38
38
|
try {
|
|
39
39
|
if (parseBBCodeOption) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatString.js","names":["escapeHtmlInText","parseBBCode","unescapeBBCodeSquareBrackets","getMarkdownTables","parseMarkdown","formatStringToHtml","string","options","html","tables","parseMarkdownOption","parseBBCodeOption","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags","formattedString","push","error","console","warn","justEscapeSquareBrackets","replace"],"sources":["../../../../src/utils/formatString/formatString.ts"],"sourcesContent":["import type { TableObject } from '../../types/format';\nimport { escapeHtmlInText } from '../escape';\nimport {\n parseBBCode,\n ParseBBCodesOptions,\n unescapeBBCodeSquareBrackets,\n} from './bb-code/formatBBCode';\nimport { getMarkdownTables, parseMarkdown } from './markdown/formatMarkdown';\n\ninterface FormatStringOptions extends ParseBBCodesOptions {\n parseMarkdown?: boolean;\n parseBBCode?: boolean;\n}\n\ninterface FormatStringResult {\n html: string;\n tables: TableObject[];\n}\n\n// This function takes a string and returns formatted HTML as a string.\nexport const formatStringToHtml = (\n string: string,\n options?: FormatStringOptions,\n): FormatStringResult => {\n if (!string) {\n return {\n html: '',\n tables: [],\n };\n }\n\n const {\n parseMarkdown: parseMarkdownOption = true,\n parseBBCode: parseBBCodeOption = false,\n customInlineLevelBBCodeTags = [],\n customBlockLevelBBCodeTags = [],\n } = options || {};\n\n let formattedString = string;\n\n // Needs to get the tables before escaping HTML and parsing bb-code, so the original content can be extracted.\n const tables: TableObject[] = [];\n\n if (parseMarkdownOption) {\n try {\n tables.push(...getMarkdownTables(formattedString));\n } catch (error) {\n console.warn(\n '[@chayns-components/format] Warning: Failed to get markdown tables',\n error,\n );\n }\n }\n\n // Escape HTML entities.\n formattedString = escapeHtmlInText(formattedString);\n\n // Escape BB-Code to prevent conflicts between Markdown and BB-code. Specifically [b]test[/b]()\n // would be a problem, since Markdown interprets parts of this as a link.\n\n // Parses
|
|
1
|
+
{"version":3,"file":"formatString.js","names":["escapeHtmlInText","parseBBCode","unescapeBBCodeSquareBrackets","getMarkdownTables","parseMarkdown","formatStringToHtml","string","options","html","tables","parseMarkdownOption","parseBBCodeOption","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags","formattedString","push","error","console","warn","justEscapeSquareBrackets","replace"],"sources":["../../../../src/utils/formatString/formatString.ts"],"sourcesContent":["import type { TableObject } from '../../types/format';\nimport { escapeHtmlInText } from '../escape';\nimport {\n parseBBCode,\n ParseBBCodesOptions,\n unescapeBBCodeSquareBrackets,\n} from './bb-code/formatBBCode';\nimport { getMarkdownTables, parseMarkdown } from './markdown/formatMarkdown';\n\ninterface FormatStringOptions extends ParseBBCodesOptions {\n parseMarkdown?: boolean;\n parseBBCode?: boolean;\n}\n\ninterface FormatStringResult {\n html: string;\n tables: TableObject[];\n}\n\n// This function takes a string and returns formatted HTML as a string.\nexport const formatStringToHtml = (\n string: string,\n options?: FormatStringOptions,\n): FormatStringResult => {\n if (!string) {\n return {\n html: '',\n tables: [],\n };\n }\n\n const {\n parseMarkdown: parseMarkdownOption = true,\n parseBBCode: parseBBCodeOption = false,\n customInlineLevelBBCodeTags = [],\n customBlockLevelBBCodeTags = [],\n } = options || {};\n\n let formattedString = string;\n\n // Needs to get the tables before escaping HTML and parsing bb-code, so the original content can be extracted.\n const tables: TableObject[] = [];\n\n if (parseMarkdownOption) {\n try {\n tables.push(...getMarkdownTables(formattedString));\n } catch (error) {\n console.warn(\n '[@chayns-components/format] Warning: Failed to get markdown tables',\n error,\n );\n }\n }\n\n // Escape HTML entities.\n formattedString = escapeHtmlInText(formattedString);\n\n // Escape BB-Code to prevent conflicts between Markdown and BB-code. Specifically [b]test[/b]()\n // would be a problem, since Markdown interprets parts of this as a link.\n\n // Parses Markdown to HTML.\n if (parseMarkdownOption) {\n try {\n if (parseBBCodeOption) {\n // Escapes BB-Code brackets.\n formattedString = parseBBCode(formattedString, {\n customInlineLevelBBCodeTags,\n customBlockLevelBBCodeTags,\n justEscapeSquareBrackets: true,\n });\n }\n\n formattedString = parseMarkdown(formattedString, parseBBCodeOption);\n\n // Remove trailing \\n\n formattedString = formattedString.replace(/\\n$/, '');\n\n if (parseBBCodeOption) {\n // Unescapes BB-Code brackets.\n formattedString = unescapeBBCodeSquareBrackets(formattedString);\n }\n } catch (error) {\n console.warn('[@chayns-components/format] Warning: Failed to parse markdown', error);\n }\n }\n\n // Parses BB-Code to HTML.\n if (parseBBCodeOption) {\n try {\n formattedString = parseBBCode(formattedString, {\n customInlineLevelBBCodeTags,\n customBlockLevelBBCodeTags,\n });\n formattedString = unescapeBBCodeSquareBrackets(formattedString);\n } catch (error) {\n console.warn('[@chayns-components/format] Warning: Failed to parse bb-code', error);\n }\n }\n\n return {\n html: formattedString,\n tables,\n };\n};\n"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,WAAW;AAC5C,SACIC,WAAW,EAEXC,4BAA4B,QACzB,wBAAwB;AAC/B,SAASC,iBAAiB,EAAEC,aAAa,QAAQ,2BAA2B;AAY5E;AACA,OAAO,MAAMC,kBAAkB,GAAGA,CAC9BC,MAAc,EACdC,OAA6B,KACR;EACrB,IAAI,CAACD,MAAM,EAAE;IACT,OAAO;MACHE,IAAI,EAAE,EAAE;MACRC,MAAM,EAAE;IACZ,CAAC;EACL;EAEA,MAAM;IACFL,aAAa,EAAEM,mBAAmB,GAAG,IAAI;IACzCT,WAAW,EAAEU,iBAAiB,GAAG,KAAK;IACtCC,2BAA2B,GAAG,EAAE;IAChCC,0BAA0B,GAAG;EACjC,CAAC,GAAGN,OAAO,IAAI,CAAC,CAAC;EAEjB,IAAIO,eAAe,GAAGR,MAAM;;EAE5B;EACA,MAAMG,MAAqB,GAAG,EAAE;EAEhC,IAAIC,mBAAmB,EAAE;IACrB,IAAI;MACAD,MAAM,CAACM,IAAI,CAAC,GAAGZ,iBAAiB,CAACW,eAAe,CAAC,CAAC;IACtD,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZC,OAAO,CAACC,IAAI,CACR,oEAAoE,EACpEF,KACJ,CAAC;IACL;EACJ;;EAEA;EACAF,eAAe,GAAGd,gBAAgB,CAACc,eAAe,CAAC;;EAEnD;EACA;;EAEA;EACA,IAAIJ,mBAAmB,EAAE;IACrB,IAAI;MACA,IAAIC,iBAAiB,EAAE;QACnB;QACAG,eAAe,GAAGb,WAAW,CAACa,eAAe,EAAE;UAC3CF,2BAA2B;UAC3BC,0BAA0B;UAC1BM,wBAAwB,EAAE;QAC9B,CAAC,CAAC;MACN;MAEAL,eAAe,GAAGV,aAAa,CAACU,eAAe,EAAEH,iBAAiB,CAAC;;MAEnE;MACAG,eAAe,GAAGA,eAAe,CAACM,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;MAEpD,IAAIT,iBAAiB,EAAE;QACnB;QACAG,eAAe,GAAGZ,4BAA4B,CAACY,eAAe,CAAC;MACnE;IACJ,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZC,OAAO,CAACC,IAAI,CAAC,+DAA+D,EAAEF,KAAK,CAAC;IACxF;EACJ;;EAEA;EACA,IAAIL,iBAAiB,EAAE;IACnB,IAAI;MACAG,eAAe,GAAGb,WAAW,CAACa,eAAe,EAAE;QAC3CF,2BAA2B;QAC3BC;MACJ,CAAC,CAAC;MACFC,eAAe,GAAGZ,4BAA4B,CAACY,eAAe,CAAC;IACnE,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZC,OAAO,CAACC,IAAI,CAAC,8DAA8D,EAAEF,KAAK,CAAC;IACvF;EACJ;EAEA,OAAO;IACHR,IAAI,EAAEM,eAAe;IACrBL;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
|
|
@@ -92,7 +92,7 @@ describe('HTML Formatter Function', () => {
|
|
|
92
92
|
});
|
|
93
93
|
test('should format links correctly', () => {
|
|
94
94
|
const result = formatStringToHtml('[Link](https://example.com)');
|
|
95
|
-
expect(result.html).toEqual('<p><a href="https://example.com">Link</a></p>');
|
|
95
|
+
expect(result.html).toEqual('<p><a href="https://example.com" rel="noopener noreferrer" target="_blank">Link</a></p>');
|
|
96
96
|
expect(result.tables).toEqual([]);
|
|
97
97
|
});
|
|
98
98
|
test('should format images correctly', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatString.test.js","names":["describe","expect","test","formatStringToHtml","removeLinebreaks","text","replace","result","html","toEqual","tables","resultEscape","resultEscape1","resultEscape2","boldResult","italicResult","inlineCodeResult","h1Result","h2Result","h3Result","h4Result","h5Result","h6Result","expectedUnorderedListResult","expectedOrderedListResult","unorderedListResult1","unorderedListResult2","orderedListResult","orderedListResult2","expectedThematicBreakResult","result1","result2","resultWithoutLanguage","resultWithLanguage","inputString","csv","raw","id","parseBBCode","table1","getTable1Result","index","table1Csv","table2","getTable2TResult","table2Csv","getHeadingInput","tag","getHeadingOutput","headingTags","forEach","input","output","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags"],"sources":["../../../../src/utils/formatString/formatString.test.ts"],"sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { formatStringToHtml } from './formatString';\n\nconst removeLinebreaks = (text: string) => text.replace(/\\n/g, '');\n\ndescribe('HTML Formatter Function', () => {\n describe('Format Plain Text', () => {\n describe('Line breaks', () => {\n test('should format line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\nLine 2');\n expect(result.html).toEqual('<p>Line 1\\nLine 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format multiple line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\n\\nLine 2');\n expect(result.html).toEqual('<p>Line 1</p>\\n<p>Line 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should remove trailing and leading new lines', () => {\n const result = formatStringToHtml('\\n\\n\\nLine 1\\n\\n\\n');\n expect(result.html).toEqual('<p>Line 1</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Whitespaces', () => {\n test('should not remove repeated whitespaces', () => {\n const result = formatStringToHtml('Text with spaces');\n expect(result.html).toEqual('<p>Text with spaces</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not remove leading and trailing whitespaces', () => {\n const result = formatStringToHtml(' Text ');\n expect(result.html).toEqual('<p> Text </p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('HTML', () => {\n test('should escape < and > correctly', () => {\n const resultEscape = formatStringToHtml('<div>Test</div>');\n expect(resultEscape.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape.tables).toEqual([]);\n });\n\n test('should not escape &', () => {\n const resultEscape1 = formatStringToHtml('<div>Test</div>');\n expect(resultEscape1.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '&lt;div&gt;Test&lt;/div&gt;',\n );\n expect(resultEscape2.html).toEqual(\n '<p>&lt;div&gt;Test&lt;/div&gt;</p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n\n // TODO Decide if & should be escaped, when they are not part of an HTML entity.\n });\n\n describe('URLs', () => {\n test('should not format URLs', () => {\n const result = formatStringToHtml('https://example.com');\n expect(result.html).toEqual('<p>https://example.com</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format Markdown', () => {\n describe('All Elements', () => {\n test('should format text styling correctly', () => {\n const boldResult = formatStringToHtml('**bold**');\n expect(boldResult.html).toEqual('<p><strong>bold</strong></p>');\n expect(boldResult.tables).toEqual([]);\n\n const italicResult = formatStringToHtml('*italic*');\n expect(italicResult.html).toEqual('<p><em>italic</em></p>');\n expect(italicResult.tables).toEqual([]);\n\n const inlineCodeResult = formatStringToHtml('`inline code`');\n expect(inlineCodeResult.html).toEqual('<p><code>inline code</code></p>');\n expect(inlineCodeResult.tables).toEqual([]);\n });\n\n test('should format headings correctly', () => {\n const h1Result = formatStringToHtml('# h1');\n expect(h1Result.html).toEqual('<h1>h1</h1>');\n expect(h1Result.tables).toEqual([]);\n\n const h2Result = formatStringToHtml('## h2');\n expect(h2Result.html).toEqual('<h2>h2</h2>');\n expect(h2Result.tables).toEqual([]);\n\n const h3Result = formatStringToHtml('### h3');\n expect(h3Result.html).toEqual('<h3>h3</h3>');\n expect(h3Result.tables).toEqual([]);\n\n const h4Result = formatStringToHtml('#### h4');\n expect(h4Result.html).toEqual('<h4>h4</h4>');\n expect(h4Result.tables).toEqual([]);\n\n const h5Result = formatStringToHtml('##### h5');\n expect(h5Result.html).toEqual('<h5>h5</h5>');\n expect(h5Result.tables).toEqual([]);\n\n const h6Result = formatStringToHtml('###### h6');\n expect(h6Result.html).toEqual('<h6>h6</h6>');\n expect(h6Result.tables).toEqual([]);\n });\n\n test('should format links correctly', () => {\n const result = formatStringToHtml('[Link](https://example.com)');\n expect(result.html).toEqual('<p><a href=\"https://example.com\">Link</a></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format images correctly', () => {\n const result = formatStringToHtml('');\n expect(result.html).toEqual(\n '<p><img src=\"https://example.com/image.jpg\" alt=\"Alt Text\"></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format lists correctly', () => {\n const expectedUnorderedListResult =\n '<ul>\\n<li>Item 1</li>\\n<li>Item 2</li>\\n<li>Item 3</li>\\n</ul>';\n const expectedOrderedListResult =\n '<ol>\\n<li value=\"1\">Item 1</li>\\n<li value=\"2\">Item 2</li>\\n<li value=\"3\">Item 3</li>\\n</ol>';\n\n const unorderedListResult1 = formatStringToHtml('- Item 1\\n- Item 2\\n- Item 3');\n expect(unorderedListResult1.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult1.tables).toEqual([]);\n\n const unorderedListResult2 = formatStringToHtml('* Item 1\\n* Item 2\\n* Item 3');\n expect(unorderedListResult2.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult2.tables).toEqual([]);\n\n const orderedListResult = formatStringToHtml('1. Item 1\\n2. Item 2\\n3. Item 3');\n expect(orderedListResult.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult.tables).toEqual([]);\n\n const orderedListResult2 = formatStringToHtml('1) Item 1\\n2) Item 2\\n3) Item 3');\n expect(orderedListResult2.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult2.tables).toEqual([]);\n });\n\n test('should format thematic breaks correctly', () => {\n const expectedThematicBreakResult = '<hr>';\n\n const result1 = formatStringToHtml('---');\n expect(result1.html).toEqual(expectedThematicBreakResult);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('***');\n expect(result2.html).toEqual(expectedThematicBreakResult);\n expect(result2.tables).toEqual([]);\n });\n\n test('should format code blocks correctly', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\nconst a = 1;\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>const a = 1;</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```js\\nconst a = 1;\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should format tables correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\nCell 1,Cell 2\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n });\n\n describe('Inline Code', () => {\n describe('HTML In Code', () => {\n test('should escape < and > within inline code correctly', () => {\n const result1 = formatStringToHtml('`<div>Test</div>`');\n expect(result1.html).toEqual('<p><code><div>Test</div></code></p>');\n expect(result1.tables).toEqual([]);\n });\n\n test('should not escape & within inline code', () => {\n const resultEscape1 = formatStringToHtml('`<div>Test</div>`');\n expect(resultEscape1.html).toEqual(\n '<p><code><div>Test</div></code></p>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '`&lt;div&gt;Test&lt;/div&gt;`',\n );\n expect(resultEscape2.html).toEqual(\n '<p><code>&lt;div&gt;Test&lt;/div&gt;</code></p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within inline code', () => {\n const result = formatStringToHtml('`**bold** *italic*`');\n expect(result.html).toEqual('<p><code>**bold** *italic*</code></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not format bb-code within inline code', () => {\n const result = formatStringToHtml('`[b]bold[/b]`', { parseBBCode: true });\n expect(result.html).toEqual('<p><code>[b]bold[/b]</code></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Codeblock', () => {\n test('should format code blocks with multiple lines correctly', () => {\n const resultWithoutLanguage = formatStringToHtml(\n '```\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code>const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml(\n '```js\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format 4 spaces as code block', () => {\n const result = formatStringToHtml(' const a = 1;');\n expect(result.html).toEqual('<p> const a = 1;</p>');\n expect(result.tables).toEqual([]);\n });\n\n describe('HTML In Code', () => {\n test('should escape < and > within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n<div>Test</div>\\n```');\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n<div>Test</div>\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\"><div>Test</div></code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not escape & within code block', () => {\n const resultEscape1 = formatStringToHtml(\n '```\\n<div>Test</div>\\n```',\n );\n expect(resultEscape1.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '```\\n&lt;div&gt;Test&lt;/div&gt;\\n```',\n );\n expect(resultEscape2.html).toEqual(\n '<pre><code>&lt;div&gt;Test&lt;/div&gt;</code></pre>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n**Test**\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>**Test**</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n**Test**\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">**Test**</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format bb-code within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n[b]Test[/b]\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>[b]Test[/b]</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n[b]Test[/b]\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">[b]Test[/b]</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n });\n\n describe('Table', () => {\n test('should format markdown within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| **Cell 1** | *Cell 2* |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><strong>Cell 1</strong></td><td><em>Cell 2</em></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n**Cell 1**,*Cell 2*\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format bb-code within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| [b]Cell 1[/b] | [i]Cell 2[/i] |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><b>Cell 1</b></td><td><i>Cell 2</i></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n[b]Cell 1[/b],[i]Cell 2[/i]\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format html within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | &lt;div&gt;Cell 3&lt;/div&gt; |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th><th>Header 3</th></tr></thead><tbody><tr><td><div>Cell 1</div></td><td><div>Cell 2</div></td><td>&lt;div&gt;Cell 3&lt;/div&gt;</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2,Header 3\\n<div>Cell 1</div>,<div>Cell 2</div>,<div>Cell 3</div>\\n',\n raw: '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | <div>Cell 3</div> |',\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format multiple tables correctly', () => {\n const table1 =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const getTable1Result = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>`;\n const table1Csv = 'Header 1,Header 2\\nCell 1,Cell 2\\n';\n const table2 =\n '| Header 3 | Header 4 |\\n|----------|----------|\\n| Cell 3 | Cell 4 |';\n const getTable2TResult = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 3</th><th>Header 4</th></tr></thead><tbody><tr><td>Cell 3</td><td>Cell 4</td></tr></tbody></table>`;\n const table2Csv = 'Header 3,Header 4\\nCell 3,Cell 4\\n';\n\n const result1 = formatStringToHtml(`${table1}\\n\\n${table2}`);\n expect(removeLinebreaks(result1.html)).toEqual(\n `${getTable1Result(0)}${getTable2TResult(1)}`,\n );\n expect(result1.tables).toEqual([\n {\n csv: table1Csv,\n raw: `${table1}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table2Csv,\n raw: table2,\n id: 'formatted-table-1',\n },\n ]);\n\n // Tables in reverse order.\n const result2 = formatStringToHtml(`${table2}\\n\\n${table1}`);\n expect(removeLinebreaks(result2.html)).toEqual(\n `${getTable2TResult(0)}${getTable1Result(1)}`,\n );\n expect(result2.tables).toEqual([\n {\n csv: table2Csv,\n raw: `${table2}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table1Csv,\n raw: table1,\n id: 'formatted-table-1',\n },\n ]);\n });\n });\n\n describe('List', () => {\n test('should format markdown within list correctly', () => {\n const result = formatStringToHtml('- **Item 1**\\n- *Item 2*');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li><strong>Item 1</strong></li><li><em>Item 2</em></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format task lists correctly', () => {\n const result1 = formatStringToHtml('- [ ] 1\\n- [x] 2\\n- [X] 3');\n expect(removeLinebreaks(result1.html)).toEqual(\n '<ul><li>[ ] 1</li><li>[x] 2</li><li>[x] 3</li></ul>',\n );\n expect(result1.tables).toEqual([]);\n });\n });\n\n describe('Combined Elements', () => {\n test('should format code block within list correctly', () => {\n const result = formatStringToHtml('* test\\n ```\\n test\\n ```');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li>test<pre><code>test</code></pre></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Conflicts with BB-Code', () => {\n test('should not format bb code tag followed by paranthese to link', () => {\n const result = formatStringToHtml('[b]bold[/b](test)', { parseBBCode: true });\n expect(result.html).toEqual('<p><b>bold</b>(test)</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format BB-Code', () => {\n describe('All Elements', () => {\n describe('Inline Elements', () => {\n // b, strong, i, em, u, s, span, img\n test('should format b tag correctly', () => {\n const result = formatStringToHtml('[b]bold[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b>bold</b></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format strong tag correctly', () => {\n const result = formatStringToHtml('[strong]bold[/strong]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><strong>bold</strong></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format i tag correctly', () => {\n const result = formatStringToHtml('[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><i>italic</i></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format em tag correctly', () => {\n const result = formatStringToHtml('[em]italic[/em]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em>italic</em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format u tag correctly', () => {\n const result = formatStringToHtml('[u]underline[/u]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><u>underline</u></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format s tag correctly', () => {\n const result = formatStringToHtml('[s]strike[/s]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><s>strike</s></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format span tag correctly', () => {\n const result = formatStringToHtml('[span]span[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span>span</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format img tag correctly', () => {\n const result = formatStringToHtml(\n '[img src=\"https://example.com/image.jpg\"][/img]',\n {\n parseBBCode: true,\n },\n );\n expect(result.html).toEqual('<p><img src=\"https://example.com/image.jpg\"></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Block Level Elements', () => {\n test('should format center tag correctly', () => {\n const result = formatStringToHtml('[center]centered text[/center]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><center>centered text</center></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ul tag correctly', () => {\n const result = formatStringToHtml('[ul][li]Item 1[/li][li]Item 2[/li][/ul]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ul><li>Item 1</li><li>Item 2</li></ul></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ol tag correctly', () => {\n const result = formatStringToHtml('[ol][li]Item 1[/li][li]Item 2[/li][/ol]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ol><li>Item 1</li><li>Item 2</li></ol></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format li tag correctly', () => {\n const result = formatStringToHtml('[li]Item[/li]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><li>Item</li></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format heading tags correctly', () => {\n const getHeadingInput = (tag: string) => `[${tag}]${tag}[/${tag}]`;\n const getHeadingOutput = (tag: string) => `<p><${tag}>${tag}</${tag}></p>`;\n const headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n headingTags.forEach((tag) => {\n const result = formatStringToHtml(getHeadingInput(tag), {\n parseBBCode: true,\n });\n expect(result.html).toEqual(getHeadingOutput(tag));\n expect(result.tables).toEqual([]);\n });\n });\n\n test('should format p tag correctly', () => {\n const result = formatStringToHtml('[p]paragraph[/p]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><p>paragraph</p></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Custom Elements', () => {\n test('should format custom tags correctly', () => {\n const input = '[custom attribute1=\"test1\" attribute2=\"test2\"]custom[/custom]';\n const output =\n '<p><bb-code-custom attribute1=\"test1\" attribute2=\"test2\">custom</bb-code-custom></p>';\n const result1 = formatStringToHtml(input, {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['custom'],\n });\n expect(result1.html).toEqual(output);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml(input, {\n parseBBCode: true,\n customBlockLevelBBCodeTags: ['custom'],\n });\n expect(result2.html).toEqual(output);\n expect(result2.tables).toEqual([]);\n });\n\n test('should not format unknown custom tags', () => {\n const result = formatStringToHtml('[unknown]unknown[/unknown]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p>[unknown]unknown[/unknown]</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Line breaks', () => {\n describe('Between Elements', () => {\n test('should format line breaks between block level elements correctly', () => {\n const result1 = formatStringToHtml('[h1]h1[/h1]\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><h1>h1</h1><h2>h2</h2></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[h1]h1[/h1]\\n\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><h1>h1</h1></p>\\n<p><h2>h2</h2></p>');\n expect(result2.tables).toEqual([]);\n });\n\n test('should format line breaks between inline elements correctly', () => {\n const result1 = formatStringToHtml('[b]bold[/b]\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><b>bold</b>\\n<i>italic</i></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[b]bold[/b]\\n\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><b>bold</b></p>\\n<p><i>italic</i></p>');\n expect(result2.tables).toEqual([]);\n });\n });\n\n describe('Within Elements', () => {\n test('should format line breaks within block level elements correctly', () => {\n const result = formatStringToHtml('[h1]Line 1\\nLine 2[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n expect(result.tables).toEqual([]);\n });\n\n // This is a test that would fail!\n // test('should format multiple line breaks within block level elements correctly', () => {\n // const result = formatStringToHtml('[h1]Line 1\\n\\nLine 2[/h1]', {\n // parseBBCode: true,\n // });\n // expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n // expect(result.tables).toEqual([]);\n // });\n\n test('should remove trailing and leading new lines within block level elements', () => {\n const result = formatStringToHtml('[h1]\\n\\n\\nLine 1\\n\\n\\n[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1</h1></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n test('should not format url in tag attributes', () => {\n const result = formatStringToHtml(\n '[link url=\"https://www.google.com\"]Google[/link]',\n {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['link'],\n },\n );\n expect(result.html).toEqual(\n '<p><bb-code-link url=\"https://www.google.com\">Google</bb-code-link></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should apply style attribute correctly', () => {\n const result = formatStringToHtml('[span style=\"color: red;\"]red text[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span style=\"color: red;\">red text</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format nested elements correctly', () => {\n const result = formatStringToHtml('[b][i]bold italic[/i][/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><i>bold italic</i></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Combined Formatting (Markdown + BB-Code)', () => {\n test('should format bb-code within markdown correctly', () => {\n const result = formatStringToHtml('*[b]bold[/b]*', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em><b>bold</b></em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format markdown within bb-code correctly', () => {\n const result = formatStringToHtml('[b]*bold*[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><em>bold</em></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"formatString.test.js","names":["describe","expect","test","formatStringToHtml","removeLinebreaks","text","replace","result","html","toEqual","tables","resultEscape","resultEscape1","resultEscape2","boldResult","italicResult","inlineCodeResult","h1Result","h2Result","h3Result","h4Result","h5Result","h6Result","expectedUnorderedListResult","expectedOrderedListResult","unorderedListResult1","unorderedListResult2","orderedListResult","orderedListResult2","expectedThematicBreakResult","result1","result2","resultWithoutLanguage","resultWithLanguage","inputString","csv","raw","id","parseBBCode","table1","getTable1Result","index","table1Csv","table2","getTable2TResult","table2Csv","getHeadingInput","tag","getHeadingOutput","headingTags","forEach","input","output","customInlineLevelBBCodeTags","customBlockLevelBBCodeTags"],"sources":["../../../../src/utils/formatString/formatString.test.ts"],"sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { formatStringToHtml } from './formatString';\n\nconst removeLinebreaks = (text: string) => text.replace(/\\n/g, '');\n\ndescribe('HTML Formatter Function', () => {\n describe('Format Plain Text', () => {\n describe('Line breaks', () => {\n test('should format line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\nLine 2');\n expect(result.html).toEqual('<p>Line 1\\nLine 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format multiple line breaks correctly', () => {\n const result = formatStringToHtml('Line 1\\n\\nLine 2');\n expect(result.html).toEqual('<p>Line 1</p>\\n<p>Line 2</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should remove trailing and leading new lines', () => {\n const result = formatStringToHtml('\\n\\n\\nLine 1\\n\\n\\n');\n expect(result.html).toEqual('<p>Line 1</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Whitespaces', () => {\n test('should not remove repeated whitespaces', () => {\n const result = formatStringToHtml('Text with spaces');\n expect(result.html).toEqual('<p>Text with spaces</p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not remove leading and trailing whitespaces', () => {\n const result = formatStringToHtml(' Text ');\n expect(result.html).toEqual('<p> Text </p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('HTML', () => {\n test('should escape < and > correctly', () => {\n const resultEscape = formatStringToHtml('<div>Test</div>');\n expect(resultEscape.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape.tables).toEqual([]);\n });\n\n test('should not escape &', () => {\n const resultEscape1 = formatStringToHtml('<div>Test</div>');\n expect(resultEscape1.html).toEqual('<p><div>Test</div></p>');\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '&lt;div&gt;Test&lt;/div&gt;',\n );\n expect(resultEscape2.html).toEqual(\n '<p>&lt;div&gt;Test&lt;/div&gt;</p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n\n // TODO Decide if & should be escaped, when they are not part of an HTML entity.\n });\n\n describe('URLs', () => {\n test('should not format URLs', () => {\n const result = formatStringToHtml('https://example.com');\n expect(result.html).toEqual('<p>https://example.com</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format Markdown', () => {\n describe('All Elements', () => {\n test('should format text styling correctly', () => {\n const boldResult = formatStringToHtml('**bold**');\n expect(boldResult.html).toEqual('<p><strong>bold</strong></p>');\n expect(boldResult.tables).toEqual([]);\n\n const italicResult = formatStringToHtml('*italic*');\n expect(italicResult.html).toEqual('<p><em>italic</em></p>');\n expect(italicResult.tables).toEqual([]);\n\n const inlineCodeResult = formatStringToHtml('`inline code`');\n expect(inlineCodeResult.html).toEqual('<p><code>inline code</code></p>');\n expect(inlineCodeResult.tables).toEqual([]);\n });\n\n test('should format headings correctly', () => {\n const h1Result = formatStringToHtml('# h1');\n expect(h1Result.html).toEqual('<h1>h1</h1>');\n expect(h1Result.tables).toEqual([]);\n\n const h2Result = formatStringToHtml('## h2');\n expect(h2Result.html).toEqual('<h2>h2</h2>');\n expect(h2Result.tables).toEqual([]);\n\n const h3Result = formatStringToHtml('### h3');\n expect(h3Result.html).toEqual('<h3>h3</h3>');\n expect(h3Result.tables).toEqual([]);\n\n const h4Result = formatStringToHtml('#### h4');\n expect(h4Result.html).toEqual('<h4>h4</h4>');\n expect(h4Result.tables).toEqual([]);\n\n const h5Result = formatStringToHtml('##### h5');\n expect(h5Result.html).toEqual('<h5>h5</h5>');\n expect(h5Result.tables).toEqual([]);\n\n const h6Result = formatStringToHtml('###### h6');\n expect(h6Result.html).toEqual('<h6>h6</h6>');\n expect(h6Result.tables).toEqual([]);\n });\n\n test('should format links correctly', () => {\n const result = formatStringToHtml('[Link](https://example.com)');\n expect(result.html).toEqual(\n '<p><a href=\"https://example.com\" rel=\"noopener noreferrer\" target=\"_blank\">Link</a></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format images correctly', () => {\n const result = formatStringToHtml('');\n expect(result.html).toEqual(\n '<p><img src=\"https://example.com/image.jpg\" alt=\"Alt Text\"></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format lists correctly', () => {\n const expectedUnorderedListResult =\n '<ul>\\n<li>Item 1</li>\\n<li>Item 2</li>\\n<li>Item 3</li>\\n</ul>';\n const expectedOrderedListResult =\n '<ol>\\n<li value=\"1\">Item 1</li>\\n<li value=\"2\">Item 2</li>\\n<li value=\"3\">Item 3</li>\\n</ol>';\n\n const unorderedListResult1 = formatStringToHtml('- Item 1\\n- Item 2\\n- Item 3');\n expect(unorderedListResult1.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult1.tables).toEqual([]);\n\n const unorderedListResult2 = formatStringToHtml('* Item 1\\n* Item 2\\n* Item 3');\n expect(unorderedListResult2.html).toEqual(expectedUnorderedListResult);\n expect(unorderedListResult2.tables).toEqual([]);\n\n const orderedListResult = formatStringToHtml('1. Item 1\\n2. Item 2\\n3. Item 3');\n expect(orderedListResult.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult.tables).toEqual([]);\n\n const orderedListResult2 = formatStringToHtml('1) Item 1\\n2) Item 2\\n3) Item 3');\n expect(orderedListResult2.html).toEqual(expectedOrderedListResult);\n expect(orderedListResult2.tables).toEqual([]);\n });\n\n test('should format thematic breaks correctly', () => {\n const expectedThematicBreakResult = '<hr>';\n\n const result1 = formatStringToHtml('---');\n expect(result1.html).toEqual(expectedThematicBreakResult);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('***');\n expect(result2.html).toEqual(expectedThematicBreakResult);\n expect(result2.tables).toEqual([]);\n });\n\n test('should format code blocks correctly', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\nconst a = 1;\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>const a = 1;</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```js\\nconst a = 1;\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should format tables correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\nCell 1,Cell 2\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n });\n\n describe('Inline Code', () => {\n describe('HTML In Code', () => {\n test('should escape < and > within inline code correctly', () => {\n const result1 = formatStringToHtml('`<div>Test</div>`');\n expect(result1.html).toEqual('<p><code><div>Test</div></code></p>');\n expect(result1.tables).toEqual([]);\n });\n\n test('should not escape & within inline code', () => {\n const resultEscape1 = formatStringToHtml('`<div>Test</div>`');\n expect(resultEscape1.html).toEqual(\n '<p><code><div>Test</div></code></p>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '`&lt;div&gt;Test&lt;/div&gt;`',\n );\n expect(resultEscape2.html).toEqual(\n '<p><code>&lt;div&gt;Test&lt;/div&gt;</code></p>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within inline code', () => {\n const result = formatStringToHtml('`**bold** *italic*`');\n expect(result.html).toEqual('<p><code>**bold** *italic*</code></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should not format bb-code within inline code', () => {\n const result = formatStringToHtml('`[b]bold[/b]`', { parseBBCode: true });\n expect(result.html).toEqual('<p><code>[b]bold[/b]</code></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Codeblock', () => {\n test('should format code blocks with multiple lines correctly', () => {\n const resultWithoutLanguage = formatStringToHtml(\n '```\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code>const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml(\n '```js\\nconst a = 1;\\nconst b = 2;\\n```',\n );\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-js\">const a = 1;\\nconst b = 2;</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format 4 spaces as code block', () => {\n const result = formatStringToHtml(' const a = 1;');\n expect(result.html).toEqual('<p> const a = 1;</p>');\n expect(result.tables).toEqual([]);\n });\n\n describe('HTML In Code', () => {\n test('should escape < and > within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n<div>Test</div>\\n```');\n expect(resultWithoutLanguage.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n<div>Test</div>\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\"><div>Test</div></code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not escape & within code block', () => {\n const resultEscape1 = formatStringToHtml(\n '```\\n<div>Test</div>\\n```',\n );\n expect(resultEscape1.html).toEqual(\n '<pre><code><div>Test</div></code></pre>',\n );\n expect(resultEscape1.tables).toEqual([]);\n\n const resultEscape2 = formatStringToHtml(\n '```\\n&lt;div&gt;Test&lt;/div&gt;\\n```',\n );\n expect(resultEscape2.html).toEqual(\n '<pre><code>&lt;div&gt;Test&lt;/div&gt;</code></pre>',\n );\n expect(resultEscape2.tables).toEqual([]);\n });\n });\n\n test('should not format markdown within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n**Test**\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>**Test**</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n**Test**\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">**Test**</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n\n test('should not format bb-code within code block', () => {\n const resultWithoutLanguage = formatStringToHtml('```\\n[b]Test[/b]\\n```');\n expect(resultWithoutLanguage.html).toEqual('<pre><code>[b]Test[/b]</code></pre>');\n expect(resultWithoutLanguage.tables).toEqual([]);\n\n const resultWithLanguage = formatStringToHtml('```html\\n[b]Test[/b]\\n```');\n expect(resultWithLanguage.html).toEqual(\n '<pre><code class=\"language-html\">[b]Test[/b]</code></pre>',\n );\n expect(resultWithLanguage.tables).toEqual([]);\n });\n });\n\n describe('Table', () => {\n test('should format markdown within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| **Cell 1** | *Cell 2* |';\n const result = formatStringToHtml(inputString);\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><strong>Cell 1</strong></td><td><em>Cell 2</em></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n**Cell 1**,*Cell 2*\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format bb-code within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| [b]Cell 1[/b] | [i]Cell 2[/i] |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td><b>Cell 1</b></td><td><i>Cell 2</i></td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2\\n[b]Cell 1[/b],[i]Cell 2[/i]\\n',\n raw: inputString,\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format html within table correctly', () => {\n const inputString =\n '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | &lt;div&gt;Cell 3&lt;/div&gt; |';\n const result = formatStringToHtml(inputString, {\n parseBBCode: true,\n });\n expect(removeLinebreaks(result.html)).toEqual(\n '<table id=\"formatted-table-0\"><thead><tr><th>Header 1</th><th>Header 2</th><th>Header 3</th></tr></thead><tbody><tr><td><div>Cell 1</div></td><td><div>Cell 2</div></td><td>&lt;div&gt;Cell 3&lt;/div&gt;</td></tr></tbody></table>',\n );\n expect(result.tables).toEqual([\n {\n csv: 'Header 1,Header 2,Header 3\\n<div>Cell 1</div>,<div>Cell 2</div>,<div>Cell 3</div>\\n',\n raw: '| Header 1 | Header 2 | Header 3 |\\n|----------|----------|----------|\\n| <div>Cell 1</div> | <div>Cell 2</div> | <div>Cell 3</div> |',\n id: 'formatted-table-0',\n },\n ]);\n });\n\n test('should format multiple tables correctly', () => {\n const table1 =\n '| Header 1 | Header 2 |\\n|----------|----------|\\n| Cell 1 | Cell 2 |';\n const getTable1Result = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody><tr><td>Cell 1</td><td>Cell 2</td></tr></tbody></table>`;\n const table1Csv = 'Header 1,Header 2\\nCell 1,Cell 2\\n';\n const table2 =\n '| Header 3 | Header 4 |\\n|----------|----------|\\n| Cell 3 | Cell 4 |';\n const getTable2TResult = (index: number) =>\n `<table id=\"formatted-table-${index}\"><thead><tr><th>Header 3</th><th>Header 4</th></tr></thead><tbody><tr><td>Cell 3</td><td>Cell 4</td></tr></tbody></table>`;\n const table2Csv = 'Header 3,Header 4\\nCell 3,Cell 4\\n';\n\n const result1 = formatStringToHtml(`${table1}\\n\\n${table2}`);\n expect(removeLinebreaks(result1.html)).toEqual(\n `${getTable1Result(0)}${getTable2TResult(1)}`,\n );\n expect(result1.tables).toEqual([\n {\n csv: table1Csv,\n raw: `${table1}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table2Csv,\n raw: table2,\n id: 'formatted-table-1',\n },\n ]);\n\n // Tables in reverse order.\n const result2 = formatStringToHtml(`${table2}\\n\\n${table1}`);\n expect(removeLinebreaks(result2.html)).toEqual(\n `${getTable2TResult(0)}${getTable1Result(1)}`,\n );\n expect(result2.tables).toEqual([\n {\n csv: table2Csv,\n raw: `${table2}\\n\\n`,\n id: 'formatted-table-0',\n },\n {\n csv: table1Csv,\n raw: table1,\n id: 'formatted-table-1',\n },\n ]);\n });\n });\n\n describe('List', () => {\n test('should format markdown within list correctly', () => {\n const result = formatStringToHtml('- **Item 1**\\n- *Item 2*');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li><strong>Item 1</strong></li><li><em>Item 2</em></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should format task lists correctly', () => {\n const result1 = formatStringToHtml('- [ ] 1\\n- [x] 2\\n- [X] 3');\n expect(removeLinebreaks(result1.html)).toEqual(\n '<ul><li>[ ] 1</li><li>[x] 2</li><li>[x] 3</li></ul>',\n );\n expect(result1.tables).toEqual([]);\n });\n });\n\n describe('Combined Elements', () => {\n test('should format code block within list correctly', () => {\n const result = formatStringToHtml('* test\\n ```\\n test\\n ```');\n expect(removeLinebreaks(result.html)).toEqual(\n '<ul><li>test<pre><code>test</code></pre></li></ul>',\n );\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Conflicts with BB-Code', () => {\n test('should not format bb code tag followed by paranthese to link', () => {\n const result = formatStringToHtml('[b]bold[/b](test)', { parseBBCode: true });\n expect(result.html).toEqual('<p><b>bold</b>(test)</p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Format BB-Code', () => {\n describe('All Elements', () => {\n describe('Inline Elements', () => {\n // b, strong, i, em, u, s, span, img\n test('should format b tag correctly', () => {\n const result = formatStringToHtml('[b]bold[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b>bold</b></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format strong tag correctly', () => {\n const result = formatStringToHtml('[strong]bold[/strong]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><strong>bold</strong></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format i tag correctly', () => {\n const result = formatStringToHtml('[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><i>italic</i></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format em tag correctly', () => {\n const result = formatStringToHtml('[em]italic[/em]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em>italic</em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format u tag correctly', () => {\n const result = formatStringToHtml('[u]underline[/u]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><u>underline</u></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format s tag correctly', () => {\n const result = formatStringToHtml('[s]strike[/s]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><s>strike</s></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format span tag correctly', () => {\n const result = formatStringToHtml('[span]span[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span>span</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format img tag correctly', () => {\n const result = formatStringToHtml(\n '[img src=\"https://example.com/image.jpg\"][/img]',\n {\n parseBBCode: true,\n },\n );\n expect(result.html).toEqual('<p><img src=\"https://example.com/image.jpg\"></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Block Level Elements', () => {\n test('should format center tag correctly', () => {\n const result = formatStringToHtml('[center]centered text[/center]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><center>centered text</center></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ul tag correctly', () => {\n const result = formatStringToHtml('[ul][li]Item 1[/li][li]Item 2[/li][/ul]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ul><li>Item 1</li><li>Item 2</li></ul></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format ol tag correctly', () => {\n const result = formatStringToHtml('[ol][li]Item 1[/li][li]Item 2[/li][/ol]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><ol><li>Item 1</li><li>Item 2</li></ol></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format li tag correctly', () => {\n const result = formatStringToHtml('[li]Item[/li]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><li>Item</li></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format heading tags correctly', () => {\n const getHeadingInput = (tag: string) => `[${tag}]${tag}[/${tag}]`;\n const getHeadingOutput = (tag: string) => `<p><${tag}>${tag}</${tag}></p>`;\n const headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n headingTags.forEach((tag) => {\n const result = formatStringToHtml(getHeadingInput(tag), {\n parseBBCode: true,\n });\n expect(result.html).toEqual(getHeadingOutput(tag));\n expect(result.tables).toEqual([]);\n });\n });\n\n test('should format p tag correctly', () => {\n const result = formatStringToHtml('[p]paragraph[/p]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><p>paragraph</p></p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Custom Elements', () => {\n test('should format custom tags correctly', () => {\n const input = '[custom attribute1=\"test1\" attribute2=\"test2\"]custom[/custom]';\n const output =\n '<p><bb-code-custom attribute1=\"test1\" attribute2=\"test2\">custom</bb-code-custom></p>';\n const result1 = formatStringToHtml(input, {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['custom'],\n });\n expect(result1.html).toEqual(output);\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml(input, {\n parseBBCode: true,\n customBlockLevelBBCodeTags: ['custom'],\n });\n expect(result2.html).toEqual(output);\n expect(result2.tables).toEqual([]);\n });\n\n test('should not format unknown custom tags', () => {\n const result = formatStringToHtml('[unknown]unknown[/unknown]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p>[unknown]unknown[/unknown]</p>');\n expect(result.tables).toEqual([]);\n });\n });\n\n describe('Line breaks', () => {\n describe('Between Elements', () => {\n test('should format line breaks between block level elements correctly', () => {\n const result1 = formatStringToHtml('[h1]h1[/h1]\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><h1>h1</h1><h2>h2</h2></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[h1]h1[/h1]\\n\\n[h2]h2[/h2]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><h1>h1</h1></p>\\n<p><h2>h2</h2></p>');\n expect(result2.tables).toEqual([]);\n });\n\n test('should format line breaks between inline elements correctly', () => {\n const result1 = formatStringToHtml('[b]bold[/b]\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result1.html).toEqual('<p><b>bold</b>\\n<i>italic</i></p>');\n expect(result1.tables).toEqual([]);\n\n const result2 = formatStringToHtml('[b]bold[/b]\\n\\n[i]italic[/i]', {\n parseBBCode: true,\n });\n expect(result2.html).toEqual('<p><b>bold</b></p>\\n<p><i>italic</i></p>');\n expect(result2.tables).toEqual([]);\n });\n });\n\n describe('Within Elements', () => {\n test('should format line breaks within block level elements correctly', () => {\n const result = formatStringToHtml('[h1]Line 1\\nLine 2[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n expect(result.tables).toEqual([]);\n });\n\n // This is a test that would fail!\n // test('should format multiple line breaks within block level elements correctly', () => {\n // const result = formatStringToHtml('[h1]Line 1\\n\\nLine 2[/h1]', {\n // parseBBCode: true,\n // });\n // expect(result.html).toEqual('<p><h1>Line 1\\nLine 2</h1></p>');\n // expect(result.tables).toEqual([]);\n // });\n\n test('should remove trailing and leading new lines within block level elements', () => {\n const result = formatStringToHtml('[h1]\\n\\n\\nLine 1\\n\\n\\n[/h1]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><h1>Line 1</h1></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n test('should not format url in tag attributes', () => {\n const result = formatStringToHtml(\n '[link url=\"https://www.google.com\"]Google[/link]',\n {\n parseBBCode: true,\n customInlineLevelBBCodeTags: ['link'],\n },\n );\n expect(result.html).toEqual(\n '<p><bb-code-link url=\"https://www.google.com\">Google</bb-code-link></p>',\n );\n expect(result.tables).toEqual([]);\n });\n\n test('should apply style attribute correctly', () => {\n const result = formatStringToHtml('[span style=\"color: red;\"]red text[/span]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><span style=\"color: red;\">red text</span></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format nested elements correctly', () => {\n const result = formatStringToHtml('[b][i]bold italic[/i][/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><i>bold italic</i></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n });\n\n describe('Combined Formatting (Markdown + BB-Code)', () => {\n test('should format bb-code within markdown correctly', () => {\n const result = formatStringToHtml('*[b]bold[/b]*', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><em><b>bold</b></em></p>');\n expect(result.tables).toEqual([]);\n });\n\n test('should format markdown within bb-code correctly', () => {\n const result = formatStringToHtml('[b]*bold*[/b]', {\n parseBBCode: true,\n });\n expect(result.html).toEqual('<p><b><em>bold</em></b></p>');\n expect(result.tables).toEqual([]);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -97,14 +97,19 @@ const renderer = {
|
|
|
97
97
|
}
|
|
98
98
|
return `<pre><code class="language-${langString}">${code}</code></pre>\n`;
|
|
99
99
|
},
|
|
100
|
+
codespan({
|
|
101
|
+
text
|
|
102
|
+
}) {
|
|
103
|
+
return `<code>${text}</code>`;
|
|
104
|
+
},
|
|
100
105
|
// Replaces the checkbox input elements with Markdown checkboxes. This is the easiest way to
|
|
101
106
|
// prevent the formatting of Markdown checkboxes in lists. This can modify the input string
|
|
102
107
|
// slightly, since the capitalization of the checkbox can be lost. If a user types '- [X]', it
|
|
103
108
|
// will be replaced with '- [x]'.
|
|
104
109
|
checkbox({
|
|
105
|
-
|
|
110
|
+
raw
|
|
106
111
|
}) {
|
|
107
|
-
return
|
|
112
|
+
return raw.toLowerCase();
|
|
108
113
|
},
|
|
109
114
|
// Replaces the link renderer to prevent opening links in the same tab. Therefore, the target
|
|
110
115
|
// attribute is set to "_blank". The function is copied from marked.js and slightly modified:
|
|
@@ -127,6 +132,26 @@ const renderer = {
|
|
|
127
132
|
}
|
|
128
133
|
result += `>${text}</a>`;
|
|
129
134
|
return result;
|
|
135
|
+
},
|
|
136
|
+
// Ensures that the numbering of ordered lists is preserved.
|
|
137
|
+
listitem(item) {
|
|
138
|
+
if (item.task) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
const match = item.raw.trim().match(/^\d{1,9}[.)]/);
|
|
142
|
+
|
|
143
|
+
// Removes the trailing dot or parenthesis from the match.
|
|
144
|
+
const value = match ? match[0].slice(0, match[0].length - 1) : '';
|
|
145
|
+
if (value) {
|
|
146
|
+
let itemBody = '';
|
|
147
|
+
itemBody += this.parser.parse(item.tokens);
|
|
148
|
+
|
|
149
|
+
// Sets the value attribute of the list item to the number of the list item.
|
|
150
|
+
return `<li value="${value}">${itemBody}</li>\n`;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Ensures that the default listitem renderer from marked js is used.
|
|
154
|
+
return false;
|
|
130
155
|
}
|
|
131
156
|
};
|
|
132
157
|
const postprocess = html => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatMarkdown.js","names":["stringify","marked","escapeBBCodeSquareBrackets","inlineCodeRule","inlineTextRule","TABLE_ID_PREFIX","tokenizer","codespan","src","cap","exec","text","replace","hasNonSpaceChars","test","hasSpaceCharsOnBothEnds","substring","length","raw","type","undefined","lheading","url","code","inlineText","escape","br","list","renderer","lang","langString","match","checkbox","checked","link","href","title","tokens","parser","parseInline","cleanHref","encodeURI","result","postprocess","html","tableIndex","use","hooks","parseMarkdown","parseBBCode","parse","walkTokens","token","unescapeHtml","replaceAll","getMarkdownTables","tableTokens","push","tables","forEach","tableToken","index","tableArray","header","rowArray","rows","row","cell","csv","id"],"sources":["../../../../../src/utils/formatString/markdown/formatMarkdown.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions,import/no-unresolved\nimport { stringify } from 'csv-stringify/browser/esm/sync';\nimport { marked, RendererObject, TokenizerObject, Tokens } from 'marked';\nimport type { TableObject } from '../../../types/format';\nimport { escapeBBCodeSquareBrackets } from '../bb-code/formatBBCode';\n\nconst inlineCodeRule = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst inlineTextRule = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<![`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\nconst TABLE_ID_PREFIX = 'formatted-table-';\n\n/*\n The marked Pipeline, including tokenizer, renderer and hooks, are explained here:\n https://marked.js.org/using_pro\n*/\n\nconst tokenizer: TokenizerObject = {\n // Codespan Tokenizer is overwritten to prevent HTML escaping, since HTML has been already\n // escaped. The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L749\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = inlineCodeRule.exec(src);\n\n if (cap) {\n let text = (cap[2] as string).replace(/\\n/g, ' ');\n\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n\n return { raw: cap[0], text, type: 'codespan' };\n }\n\n return undefined;\n },\n // Disables Markdown formatting for setext headings.\n lheading(): Tokens.Heading | undefined {\n return undefined;\n },\n // Disables converting urls to hyperlinks.\n url() {\n return undefined;\n },\n // Disables converting text with 4 leading spaces to the code block.\n code() {\n return undefined;\n },\n // inlineText is overwritten to prevent HTML escaping, specifically since quote characters are\n // escaped, which breaks the attributes of bb-code elements. The function is copied from\n // marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L854\n inlineText(src: string) {\n const cap = inlineTextRule.exec(src);\n\n if (cap) {\n return { raw: cap[0], text: cap[0], type: 'text' };\n }\n\n return undefined;\n },\n // Disables escaping of characters via backslash. This is needed for LaTeX formulas, since\n // multiline LaTeX formulas have 2 backslashes at the end of their lines. Without this function,\n // the backslashes would be escaped and the LaTeX formula would be broken.\n escape() {\n return undefined;\n },\n // Disables the conversion of backslash at the end of a line to a line break. This is needed for\n // LaTeX formulas, since multiline LaTeX formulas have 2 backslashes at the end of their lines.\n // Without this '\\\\' would be converted to '\\<br>' which breaks LaTeX formulas.\n br() {\n return undefined;\n },\n // Only recognizes ordered lists that start with the number 1. Also recognizes ordered lists\n // that contain a list item with the number 1, so those lists are\n list(src: string) {\n // The regex is copied from marked.js: https://github.com/markedjs/marked/blob/4fc639e053a605b25abf66dccaa70c1bf6562eb7/src/rules.ts#L115\n if (/^( {0,3}[*+-]|1[.)])/.test(src)) {\n return false;\n }\n\n // Prevents the text from being recognized as a list.\n return undefined;\n },\n};\n\nconst renderer: RendererObject = {\n // Code Renderer is overwritten to prevent HTML escaping, since HTML has been already escaped.\n // The function is copied from marked.js and slightly modified: https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Renderer.ts#L24\n code({ lang, text }: Tokens.Code): string {\n const langString = (lang || '').match(/^\\S*/)?.[0];\n\n const code = `${text.replace(/\\n$/, '')}`;\n\n if (!langString) {\n return `<pre><code>${code}</code></pre>\\n`;\n }\n\n return `<pre><code class=\"language-${langString}\">${code}</code></pre>\\n`;\n },\n // Replaces the checkbox input elements with Markdown checkboxes. This is the easiest way to\n // prevent the formatting of Markdown checkboxes in lists. This can modify the input string\n // slightly, since the capitalization of the checkbox can be lost. If a user types '- [X]', it\n // will be replaced with '- [x]'.\n checkbox({ checked }: Tokens.Checkbox) {\n return checked ? '[x]' : '[ ]';\n },\n // Replaces the link renderer to prevent opening links in the same tab. Therefore, the target\n // attribute is set to \"_blank\". The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/15c77deb9e099041d5e70e3b7b17e50ddc35ec2a/src/Renderer.ts#L160\n link({ href, title, tokens }: Tokens.Link): string {\n const text = this.parser.parseInline(tokens);\n\n let cleanHref;\n\n try {\n cleanHref = encodeURI(href).replace(/%25/g, '%');\n } catch {\n return text;\n }\n\n let result = `<a href=\"${cleanHref}\" rel=\"noopener noreferrer\" target=\"_blank\"`;\n\n if (title) {\n result += ` title=\"${title}\"`;\n }\n\n result += `>${text}</a>`;\n\n return result;\n },\n};\n\nconst postprocess = (html: string): string => {\n let tableIndex = -1;\n\n // Assigns ids to tables.\n return html.replace(/(<table>)/g, () => {\n tableIndex++;\n\n return `<table id=\"${TABLE_ID_PREFIX}${tableIndex}\">`;\n });\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nmarked.use({ tokenizer, renderer, hooks: { postprocess } });\n\n// Parses Markdown following the GitHub flavored Markdown specification. The tokenizer and renderer\n// are slightly modified to prevent HTML escaping in code block and inline code.\nexport const parseMarkdown = (text: string, parseBBCode: boolean) =>\n marked.parse(text, {\n walkTokens: (token) => {\n if (parseBBCode && (token.type === 'codespan' || token.type === 'code')) {\n // eslint-disable-next-line no-param-reassign\n (token as Tokens.Codespan).text = escapeBBCodeSquareBrackets(\n (token as Tokens.Codespan).text,\n );\n }\n },\n }) as string;\n\n// It is important that, & is replaced last to prevent double escaping.\nconst unescapeHtml = (text: string) =>\n text.replaceAll('<', '<').replaceAll('>', '>').replaceAll('&', '&');\n\nexport const getMarkdownTables = (text: string): TableObject[] => {\n const tableTokens: Tokens.Table[] = [];\n\n // Since walkTokens is not called with async functions and parseInline is not used, the result\n // of parse is synchronous. To match the type, it will be voided here.\n void marked.parse(text, {\n walkTokens: (token) => {\n if (token.type === 'table') {\n tableTokens.push(token as Tokens.Table);\n }\n },\n });\n\n const tables: TableObject[] = [];\n\n tableTokens.forEach((tableToken, index) => {\n const tableArray: string[][] = [];\n\n if (tableToken.header?.length > 0) {\n const rowArray: string[] = [];\n\n tableToken.header.forEach((header) => {\n rowArray.push(unescapeHtml(header.text));\n });\n\n tableArray.push(rowArray);\n }\n\n if (tableToken.rows?.length > 0) {\n tableToken.rows.forEach((row) => {\n const rowArray: string[] = [];\n\n row.forEach((cell) => {\n rowArray.push(unescapeHtml(cell.text));\n });\n\n tableArray.push(rowArray);\n });\n }\n\n const csv = stringify(tableArray || []);\n\n tables.push({\n raw: unescapeHtml(tableToken.raw),\n csv,\n id: `${TABLE_ID_PREFIX}${index}`,\n });\n });\n\n return tables;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"formatMarkdown.js","names":["stringify","marked","escapeBBCodeSquareBrackets","inlineCodeRule","inlineTextRule","TABLE_ID_PREFIX","tokenizer","codespan","src","cap","exec","text","replace","hasNonSpaceChars","test","hasSpaceCharsOnBothEnds","substring","length","raw","type","undefined","lheading","url","code","inlineText","escape","br","list","renderer","lang","langString","match","checkbox","toLowerCase","link","href","title","tokens","parser","parseInline","cleanHref","encodeURI","result","listitem","item","task","trim","value","slice","itemBody","parse","postprocess","html","tableIndex","use","hooks","parseMarkdown","parseBBCode","walkTokens","token","unescapeHtml","replaceAll","getMarkdownTables","tableTokens","push","tables","forEach","tableToken","index","tableArray","header","rowArray","rows","row","cell","csv","id"],"sources":["../../../../../src/utils/formatString/markdown/formatMarkdown.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions,import/no-unresolved\nimport { stringify } from 'csv-stringify/browser/esm/sync';\nimport { marked, RendererObject, TokenizerObject, Tokens } from 'marked';\nimport type { TableObject } from '../../../types/format';\nimport { escapeBBCodeSquareBrackets } from '../bb-code/formatBBCode';\n\nconst inlineCodeRule = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst inlineTextRule = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<![`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\nconst TABLE_ID_PREFIX = 'formatted-table-';\n\n/*\n The marked Pipeline, including tokenizer, renderer and hooks, are explained here:\n https://marked.js.org/using_pro\n*/\n\nconst tokenizer: TokenizerObject = {\n // Codespan Tokenizer is overwritten to prevent HTML escaping, since HTML has been already\n // escaped. The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L749\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = inlineCodeRule.exec(src);\n\n if (cap) {\n let text = (cap[2] as string).replace(/\\n/g, ' ');\n\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n\n return { raw: cap[0], text, type: 'codespan' };\n }\n\n return undefined;\n },\n // Disables Markdown formatting for setext headings.\n lheading(): Tokens.Heading | undefined {\n return undefined;\n },\n // Disables converting urls to hyperlinks.\n url() {\n return undefined;\n },\n // Disables converting text with 4 leading spaces to the code block.\n code() {\n return undefined;\n },\n // inlineText is overwritten to prevent HTML escaping, specifically since quote characters are\n // escaped, which breaks the attributes of bb-code elements. The function is copied from\n // marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L854\n inlineText(src: string) {\n const cap = inlineTextRule.exec(src);\n\n if (cap) {\n return { raw: cap[0], text: cap[0], type: 'text' };\n }\n\n return undefined;\n },\n // Disables escaping of characters via backslash. This is needed for LaTeX formulas, since\n // multiline LaTeX formulas have 2 backslashes at the end of their lines. Without this function,\n // the backslashes would be escaped and the LaTeX formula would be broken.\n escape() {\n return undefined;\n },\n // Disables the conversion of backslash at the end of a line to a line break. This is needed for\n // LaTeX formulas, since multiline LaTeX formulas have 2 backslashes at the end of their lines.\n // Without this '\\\\' would be converted to '\\<br>' which breaks LaTeX formulas.\n br() {\n return undefined;\n },\n // Only recognizes ordered lists that start with the number 1. Also recognizes ordered lists\n // that contain a list item with the number 1, so those lists are\n list(src: string) {\n // The regex is copied from marked.js: https://github.com/markedjs/marked/blob/4fc639e053a605b25abf66dccaa70c1bf6562eb7/src/rules.ts#L115\n if (/^( {0,3}[*+-]|1[.)])/.test(src)) {\n return false;\n }\n\n // Prevents the text from being recognized as a list.\n return undefined;\n },\n};\n\nconst renderer: RendererObject = {\n // Code Renderer is overwritten to prevent HTML escaping, since HTML has been already escaped.\n // The function is copied from marked.js and slightly modified: https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Renderer.ts#L24\n code({ lang, text }: Tokens.Code): string {\n const langString = (lang || '').match(/^\\S*/)?.[0];\n\n const code = `${text.replace(/\\n$/, '')}`;\n\n if (!langString) {\n return `<pre><code>${code}</code></pre>\\n`;\n }\n\n return `<pre><code class=\"language-${langString}\">${code}</code></pre>\\n`;\n },\n codespan({ text }: Tokens.Codespan): string {\n return `<code>${text}</code>`;\n },\n // Replaces the checkbox input elements with Markdown checkboxes. This is the easiest way to\n // prevent the formatting of Markdown checkboxes in lists. This can modify the input string\n // slightly, since the capitalization of the checkbox can be lost. If a user types '- [X]', it\n // will be replaced with '- [x]'.\n checkbox({ raw }: Tokens.Checkbox) {\n return raw.toLowerCase();\n },\n // Replaces the link renderer to prevent opening links in the same tab. Therefore, the target\n // attribute is set to \"_blank\". The function is copied from marked.js and slightly modified:\n // https://github.com/markedjs/marked/blob/15c77deb9e099041d5e70e3b7b17e50ddc35ec2a/src/Renderer.ts#L160\n link({ href, title, tokens }: Tokens.Link): string {\n const text = this.parser.parseInline(tokens);\n\n let cleanHref;\n\n try {\n cleanHref = encodeURI(href).replace(/%25/g, '%');\n } catch {\n return text;\n }\n\n let result = `<a href=\"${cleanHref}\" rel=\"noopener noreferrer\" target=\"_blank\"`;\n\n if (title) {\n result += ` title=\"${title}\"`;\n }\n\n result += `>${text}</a>`;\n\n return result;\n },\n // Ensures that the numbering of ordered lists is preserved.\n listitem(item: Tokens.ListItem) {\n if (item.task) {\n return false;\n }\n\n const match = item.raw.trim().match(/^\\d{1,9}[.)]/);\n\n // Removes the trailing dot or parenthesis from the match.\n const value = match ? match[0].slice(0, match[0].length - 1) : '';\n\n if (value) {\n let itemBody = '';\n\n itemBody += this.parser.parse(item.tokens);\n\n // Sets the value attribute of the list item to the number of the list item.\n return `<li value=\"${value}\">${itemBody}</li>\\n`;\n }\n\n // Ensures that the default listitem renderer from marked js is used.\n return false;\n },\n};\n\nconst postprocess = (html: string): string => {\n let tableIndex = -1;\n\n // Assigns ids to tables.\n return html.replace(/(<table>)/g, () => {\n tableIndex++;\n\n return `<table id=\"${TABLE_ID_PREFIX}${tableIndex}\">`;\n });\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nmarked.use({ tokenizer, renderer, hooks: { postprocess } });\n\n// Parses Markdown following the GitHub flavored Markdown specification. The tokenizer and renderer\n// are slightly modified to prevent HTML escaping in code block and inline code.\nexport const parseMarkdown = (text: string, parseBBCode: boolean) =>\n marked.parse(text, {\n walkTokens: (token) => {\n if (parseBBCode && (token.type === 'codespan' || token.type === 'code')) {\n // eslint-disable-next-line no-param-reassign\n (token as Tokens.Codespan).text = escapeBBCodeSquareBrackets(\n (token as Tokens.Codespan).text,\n );\n }\n },\n }) as string;\n\n// It is important that, & is replaced last to prevent double escaping.\nconst unescapeHtml = (text: string) =>\n text.replaceAll('<', '<').replaceAll('>', '>').replaceAll('&', '&');\n\nexport const getMarkdownTables = (text: string): TableObject[] => {\n const tableTokens: Tokens.Table[] = [];\n\n // Since walkTokens is not called with async functions and parseInline is not used, the result\n // of parse is synchronous. To match the type, it will be voided here.\n void marked.parse(text, {\n walkTokens: (token) => {\n if (token.type === 'table') {\n tableTokens.push(token as Tokens.Table);\n }\n },\n });\n\n const tables: TableObject[] = [];\n\n tableTokens.forEach((tableToken, index) => {\n const tableArray: string[][] = [];\n\n if (tableToken.header?.length > 0) {\n const rowArray: string[] = [];\n\n tableToken.header.forEach((header) => {\n rowArray.push(unescapeHtml(header.text));\n });\n\n tableArray.push(rowArray);\n }\n\n if (tableToken.rows?.length > 0) {\n tableToken.rows.forEach((row) => {\n const rowArray: string[] = [];\n\n row.forEach((cell) => {\n rowArray.push(unescapeHtml(cell.text));\n });\n\n tableArray.push(rowArray);\n });\n }\n\n const csv = stringify(tableArray || []);\n\n tables.push({\n raw: unescapeHtml(tableToken.raw),\n csv,\n id: `${TABLE_ID_PREFIX}${index}`,\n });\n });\n\n return tables;\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chayns-components/format",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.1357",
|
|
4
4
|
"description": "A set of beautiful React components for developing your own applications with chayns.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": [
|
|
@@ -74,5 +74,5 @@
|
|
|
74
74
|
"publishConfig": {
|
|
75
75
|
"access": "public"
|
|
76
76
|
},
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "9c89fac7158e0e18aca689ccf0498468352c1e0b"
|
|
78
78
|
}
|