@chayns-components/format 5.0.0-beta.1159 → 5.0.0-beta.1162

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.
@@ -69,10 +69,7 @@ export const parseBBCode = (text, options) => {
69
69
  }
70
70
  const isCustomTag = [...customBlockLevelTags, ...customInlineLevelTags].includes(Tag);
71
71
  const htmlTag = isCustomTag ? `${BB_CODE_HTML_TAG_PREFIX}${Tag}` : Tag;
72
- const openingHtmlTag = `<${htmlTag}${Object.entries(parameters).length > 0 ? ' ' : ''}${Object.entries(parameters).map(_ref => {
73
- let [key, value] = _ref;
74
- return `${key}="${value}"`;
75
- }).join(' ')}>`;
72
+ const openingHtmlTag = `<${htmlTag}${Object.entries(parameters).length > 0 ? ' ' : ''}${Object.entries(parameters).map(([key, value]) => `${key}="${value}"`).join(' ')}>`;
76
73
  const closingHtmlTag = `</${htmlTag}>`;
77
74
  const element = Tag === 'img' ? openingHtmlTag : openingHtmlTag + parsedContent + closingHtmlTag;
78
75
  html = `${html.slice(0, indexOfFullMatch)}${element}${htmlAfterTag}`;
@@ -1 +1 @@
1
- {"version":3,"file":"formatBBCode.js","names":["BB_CODE_HTML_TAG_PREFIX","findFirstBBCode","BLOCK_LEVEL_TAGS","INLINE_LEVEL_TAGS","parseBBCode","text","options","customBlockLevelBBCodeTags","customBlockLevelTags","customInlineLevelBBCodeTags","customInlineLevelTags","justEscapeSquareBrackets","html","parseBehindIndex","length","htmlToParse","slice","firstBBCodeMatch","content","fullMatch","parameters","index","openingTag","closingTag","Tag","tag","toLowerCase","isValidTag","includes","isBlockLevelTag","parsedContent","indexOfFullMatch","indexOf","escapedOpeningTag","escapeBBCodeSquareBrackets","escapedClosingTag","replace","htmlAfterTag","isCustomTag","htmlTag","openingHtmlTag","Object","entries","map","_ref","key","value","join","closingHtmlTag","element","replaceAll","unescapeBBCodeSquareBrackets"],"sources":["../../../../../src/utils/formatString/bb-code/formatBBCode.ts"],"sourcesContent":["import { BB_CODE_HTML_TAG_PREFIX } from '../../../constants/format';\nimport { findFirstBBCode } from './findBBCode';\n\nconst BLOCK_LEVEL_TAGS = ['center', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p'];\nconst INLINE_LEVEL_TAGS = ['b', 'strong', 'i', 'em', 'u', 's', 'span', 'img'];\n\nexport interface ParseBBCodesOptions {\n customBlockLevelBBCodeTags?: string[];\n customInlineLevelBBCodeTags?: string[];\n}\n\ninterface ParseBBCodePrivateOptions extends ParseBBCodesOptions {\n justEscapeSquareBrackets?: boolean;\n}\n\n// Parses BB-Code to HTML recursively.\n// When justEscapeSquareBrackets is true, square brackets are escaped to prevent conflicts between markdown and BB Code.\n// In that case the function only escapes square brackets and doesn't remove line breaks.\nexport const parseBBCode = (text: string, options?: ParseBBCodePrivateOptions) => {\n const {\n customBlockLevelBBCodeTags: customBlockLevelTags = [],\n customInlineLevelBBCodeTags: customInlineLevelTags = [],\n justEscapeSquareBrackets = false,\n } = options || {};\n\n let html = text;\n\n // This index is used to keep track of the position in the html string that is being parsed.\n let parseBehindIndex = 0;\n\n while (parseBehindIndex < html.length) {\n const htmlToParse = html.slice(parseBehindIndex);\n\n const firstBBCodeMatch = findFirstBBCode(htmlToParse);\n\n // Stops parsing if no BB-Code is found.\n if (!firstBBCodeMatch) {\n return html;\n }\n\n const { content, fullMatch, parameters, index, openingTag, closingTag } = firstBBCodeMatch;\n\n const Tag = firstBBCodeMatch.tag.toLowerCase();\n const isValidTag = [\n ...BLOCK_LEVEL_TAGS,\n ...customBlockLevelTags,\n ...INLINE_LEVEL_TAGS,\n ...customInlineLevelTags,\n ].includes(Tag);\n const isBlockLevelTag = [...BLOCK_LEVEL_TAGS, ...customBlockLevelTags].includes(Tag);\n\n // Ignores tags that are not supported.\n if (!isValidTag) {\n // The parsing continues behind the first square bracket of the BB-Code tag.\n parseBehindIndex += index + 1;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // Converts BB-Code tag's content before converting itself, because it may contain other BB-Codes.\n let parsedContent = parseBBCode(content, options);\n\n if (justEscapeSquareBrackets) {\n const indexOfFullMatch = html.indexOf(fullMatch);\n const escapedOpeningTag = escapeBBCodeSquareBrackets(openingTag);\n const escapedClosingTag = escapeBBCodeSquareBrackets(closingTag);\n\n // Removes leading and trailing line-breaks from within bb code elements, to prevent unwanted spacing.\n // This needs to be done before formatting Markdown, so the Markdown formatting doesn't interpret line breaks unexpectedly.\n parsedContent = parsedContent.replace(/^\\n+|\\n+$/g, '');\n\n // Simply escapes the square brackets of the BB-Code opening and closing tag.\n html =\n html.slice(0, indexOfFullMatch) +\n escapedOpeningTag +\n parsedContent +\n escapedClosingTag +\n html.slice(indexOfFullMatch + fullMatch.length);\n\n // Continues parsing behind the parsed bb-code.\n parseBehindIndex =\n indexOfFullMatch +\n escapedOpeningTag.length +\n parsedContent.length +\n escapedClosingTag.length;\n } else {\n const indexOfFullMatch = html.indexOf(fullMatch);\n\n let htmlAfterTag = html.slice(indexOfFullMatch + fullMatch.length);\n\n // Removes leading line-break (ONE, NOT ALL) after block level elements, to prevent unwanted spacing.\n if (isBlockLevelTag) {\n htmlAfterTag = htmlAfterTag.replace(/^\\n/, '');\n }\n\n const isCustomTag = [...customBlockLevelTags, ...customInlineLevelTags].includes(Tag);\n const htmlTag = isCustomTag ? `${BB_CODE_HTML_TAG_PREFIX}${Tag}` : Tag;\n const openingHtmlTag = `<${htmlTag}${Object.entries(parameters).length > 0 ? ' ' : ''}${Object.entries(\n parameters,\n )\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ')}>`;\n const closingHtmlTag = `</${htmlTag}>`;\n\n const element =\n Tag === 'img' ? openingHtmlTag : openingHtmlTag + parsedContent + closingHtmlTag;\n\n html = `${html.slice(0, indexOfFullMatch)}${element}${htmlAfterTag}`;\n\n // Continues parsing behind the parsed bb-code.\n parseBehindIndex = indexOfFullMatch + element.length;\n }\n }\n\n return html;\n};\n\nexport const escapeBBCodeSquareBrackets = (text: string) =>\n text.replaceAll('[', '&zwj;[&zwj;').replaceAll(']', '&zwj;]&zwj;');\n\nexport const unescapeBBCodeSquareBrackets = (text: string) =>\n text.replaceAll('&zwj;[&zwj;', '[').replaceAll('&zwj;]&zwj;', ']');\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"formatBBCode.js","names":["BB_CODE_HTML_TAG_PREFIX","findFirstBBCode","BLOCK_LEVEL_TAGS","INLINE_LEVEL_TAGS","parseBBCode","text","options","customBlockLevelBBCodeTags","customBlockLevelTags","customInlineLevelBBCodeTags","customInlineLevelTags","justEscapeSquareBrackets","html","parseBehindIndex","length","htmlToParse","slice","firstBBCodeMatch","content","fullMatch","parameters","index","openingTag","closingTag","Tag","tag","toLowerCase","isValidTag","includes","isBlockLevelTag","parsedContent","indexOfFullMatch","indexOf","escapedOpeningTag","escapeBBCodeSquareBrackets","escapedClosingTag","replace","htmlAfterTag","isCustomTag","htmlTag","openingHtmlTag","Object","entries","map","key","value","join","closingHtmlTag","element","replaceAll","unescapeBBCodeSquareBrackets"],"sources":["../../../../../src/utils/formatString/bb-code/formatBBCode.ts"],"sourcesContent":["import { BB_CODE_HTML_TAG_PREFIX } from '../../../constants/format';\nimport { findFirstBBCode } from './findBBCode';\n\nconst BLOCK_LEVEL_TAGS = ['center', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p'];\nconst INLINE_LEVEL_TAGS = ['b', 'strong', 'i', 'em', 'u', 's', 'span', 'img'];\n\nexport interface ParseBBCodesOptions {\n customBlockLevelBBCodeTags?: string[];\n customInlineLevelBBCodeTags?: string[];\n}\n\ninterface ParseBBCodePrivateOptions extends ParseBBCodesOptions {\n justEscapeSquareBrackets?: boolean;\n}\n\n// Parses BB-Code to HTML recursively.\n// When justEscapeSquareBrackets is true, square brackets are escaped to prevent conflicts between markdown and BB Code.\n// In that case the function only escapes square brackets and doesn't remove line breaks.\nexport const parseBBCode = (text: string, options?: ParseBBCodePrivateOptions) => {\n const {\n customBlockLevelBBCodeTags: customBlockLevelTags = [],\n customInlineLevelBBCodeTags: customInlineLevelTags = [],\n justEscapeSquareBrackets = false,\n } = options || {};\n\n let html = text;\n\n // This index is used to keep track of the position in the html string that is being parsed.\n let parseBehindIndex = 0;\n\n while (parseBehindIndex < html.length) {\n const htmlToParse = html.slice(parseBehindIndex);\n\n const firstBBCodeMatch = findFirstBBCode(htmlToParse);\n\n // Stops parsing if no BB-Code is found.\n if (!firstBBCodeMatch) {\n return html;\n }\n\n const { content, fullMatch, parameters, index, openingTag, closingTag } = firstBBCodeMatch;\n\n const Tag = firstBBCodeMatch.tag.toLowerCase();\n const isValidTag = [\n ...BLOCK_LEVEL_TAGS,\n ...customBlockLevelTags,\n ...INLINE_LEVEL_TAGS,\n ...customInlineLevelTags,\n ].includes(Tag);\n const isBlockLevelTag = [...BLOCK_LEVEL_TAGS, ...customBlockLevelTags].includes(Tag);\n\n // Ignores tags that are not supported.\n if (!isValidTag) {\n // The parsing continues behind the first square bracket of the BB-Code tag.\n parseBehindIndex += index + 1;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // Converts BB-Code tag's content before converting itself, because it may contain other BB-Codes.\n let parsedContent = parseBBCode(content, options);\n\n if (justEscapeSquareBrackets) {\n const indexOfFullMatch = html.indexOf(fullMatch);\n const escapedOpeningTag = escapeBBCodeSquareBrackets(openingTag);\n const escapedClosingTag = escapeBBCodeSquareBrackets(closingTag);\n\n // Removes leading and trailing line-breaks from within bb code elements, to prevent unwanted spacing.\n // This needs to be done before formatting Markdown, so the Markdown formatting doesn't interpret line breaks unexpectedly.\n parsedContent = parsedContent.replace(/^\\n+|\\n+$/g, '');\n\n // Simply escapes the square brackets of the BB-Code opening and closing tag.\n html =\n html.slice(0, indexOfFullMatch) +\n escapedOpeningTag +\n parsedContent +\n escapedClosingTag +\n html.slice(indexOfFullMatch + fullMatch.length);\n\n // Continues parsing behind the parsed bb-code.\n parseBehindIndex =\n indexOfFullMatch +\n escapedOpeningTag.length +\n parsedContent.length +\n escapedClosingTag.length;\n } else {\n const indexOfFullMatch = html.indexOf(fullMatch);\n\n let htmlAfterTag = html.slice(indexOfFullMatch + fullMatch.length);\n\n // Removes leading line-break (ONE, NOT ALL) after block level elements, to prevent unwanted spacing.\n if (isBlockLevelTag) {\n htmlAfterTag = htmlAfterTag.replace(/^\\n/, '');\n }\n\n const isCustomTag = [...customBlockLevelTags, ...customInlineLevelTags].includes(Tag);\n const htmlTag = isCustomTag ? `${BB_CODE_HTML_TAG_PREFIX}${Tag}` : Tag;\n const openingHtmlTag = `<${htmlTag}${Object.entries(parameters).length > 0 ? ' ' : ''}${Object.entries(\n parameters,\n )\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ')}>`;\n const closingHtmlTag = `</${htmlTag}>`;\n\n const element =\n Tag === 'img' ? openingHtmlTag : openingHtmlTag + parsedContent + closingHtmlTag;\n\n html = `${html.slice(0, indexOfFullMatch)}${element}${htmlAfterTag}`;\n\n // Continues parsing behind the parsed bb-code.\n parseBehindIndex = indexOfFullMatch + element.length;\n }\n }\n\n return html;\n};\n\nexport const escapeBBCodeSquareBrackets = (text: string) =>\n text.replaceAll('[', '&zwj;[&zwj;').replaceAll(']', '&zwj;]&zwj;');\n\nexport const unescapeBBCodeSquareBrackets = (text: string) =>\n text.replaceAll('&zwj;[&zwj;', '[').replaceAll('&zwj;]&zwj;', ']');\n"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ,2BAA2B;AACnE,SAASC,eAAe,QAAQ,cAAc;AAE9C,MAAMC,gBAAgB,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;AAC9F,MAAMC,iBAAiB,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC;AAW7E;AACA;AACA;AACA,OAAO,MAAMC,WAAW,GAAGA,CAACC,IAAY,EAAEC,OAAmC,KAAK;EAC9E,MAAM;IACFC,0BAA0B,EAAEC,oBAAoB,GAAG,EAAE;IACrDC,2BAA2B,EAAEC,qBAAqB,GAAG,EAAE;IACvDC,wBAAwB,GAAG;EAC/B,CAAC,GAAGL,OAAO,IAAI,CAAC,CAAC;EAEjB,IAAIM,IAAI,GAAGP,IAAI;;EAEf;EACA,IAAIQ,gBAAgB,GAAG,CAAC;EAExB,OAAOA,gBAAgB,GAAGD,IAAI,CAACE,MAAM,EAAE;IACnC,MAAMC,WAAW,GAAGH,IAAI,CAACI,KAAK,CAACH,gBAAgB,CAAC;IAEhD,MAAMI,gBAAgB,GAAGhB,eAAe,CAACc,WAAW,CAAC;;IAErD;IACA,IAAI,CAACE,gBAAgB,EAAE;MACnB,OAAOL,IAAI;IACf;IAEA,MAAM;MAAEM,OAAO;MAAEC,SAAS;MAAEC,UAAU;MAAEC,KAAK;MAAEC,UAAU;MAAEC;IAAW,CAAC,GAAGN,gBAAgB;IAE1F,MAAMO,GAAG,GAAGP,gBAAgB,CAACQ,GAAG,CAACC,WAAW,CAAC,CAAC;IAC9C,MAAMC,UAAU,GAAG,CACf,GAAGzB,gBAAgB,EACnB,GAAGM,oBAAoB,EACvB,GAAGL,iBAAiB,EACpB,GAAGO,qBAAqB,CAC3B,CAACkB,QAAQ,CAACJ,GAAG,CAAC;IACf,MAAMK,eAAe,GAAG,CAAC,GAAG3B,gBAAgB,EAAE,GAAGM,oBAAoB,CAAC,CAACoB,QAAQ,CAACJ,GAAG,CAAC;;IAEpF;IACA,IAAI,CAACG,UAAU,EAAE;MACb;MACAd,gBAAgB,IAAIQ,KAAK,GAAG,CAAC;MAC7B;MACA;IACJ;;IAEA;IACA,IAAIS,aAAa,GAAG1B,WAAW,CAACc,OAAO,EAAEZ,OAAO,CAAC;IAEjD,IAAIK,wBAAwB,EAAE;MAC1B,MAAMoB,gBAAgB,GAAGnB,IAAI,CAACoB,OAAO,CAACb,SAAS,CAAC;MAChD,MAAMc,iBAAiB,GAAGC,0BAA0B,CAACZ,UAAU,CAAC;MAChE,MAAMa,iBAAiB,GAAGD,0BAA0B,CAACX,UAAU,CAAC;;MAEhE;MACA;MACAO,aAAa,GAAGA,aAAa,CAACM,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;;MAEvD;MACAxB,IAAI,GACAA,IAAI,CAACI,KAAK,CAAC,CAAC,EAAEe,gBAAgB,CAAC,GAC/BE,iBAAiB,GACjBH,aAAa,GACbK,iBAAiB,GACjBvB,IAAI,CAACI,KAAK,CAACe,gBAAgB,GAAGZ,SAAS,CAACL,MAAM,CAAC;;MAEnD;MACAD,gBAAgB,GACZkB,gBAAgB,GAChBE,iBAAiB,CAACnB,MAAM,GACxBgB,aAAa,CAAChB,MAAM,GACpBqB,iBAAiB,CAACrB,MAAM;IAChC,CAAC,MAAM;MACH,MAAMiB,gBAAgB,GAAGnB,IAAI,CAACoB,OAAO,CAACb,SAAS,CAAC;MAEhD,IAAIkB,YAAY,GAAGzB,IAAI,CAACI,KAAK,CAACe,gBAAgB,GAAGZ,SAAS,CAACL,MAAM,CAAC;;MAElE;MACA,IAAIe,eAAe,EAAE;QACjBQ,YAAY,GAAGA,YAAY,CAACD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;MAClD;MAEA,MAAME,WAAW,GAAG,CAAC,GAAG9B,oBAAoB,EAAE,GAAGE,qBAAqB,CAAC,CAACkB,QAAQ,CAACJ,GAAG,CAAC;MACrF,MAAMe,OAAO,GAAGD,WAAW,GAAG,GAAGtC,uBAAuB,GAAGwB,GAAG,EAAE,GAAGA,GAAG;MACtE,MAAMgB,cAAc,GAAG,IAAID,OAAO,GAAGE,MAAM,CAACC,OAAO,CAACtB,UAAU,CAAC,CAACN,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG2B,MAAM,CAACC,OAAO,CAClGtB,UACJ,CAAC,CACIuB,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEC,KAAK,CAAC,KAAK,GAAGD,GAAG,KAAKC,KAAK,GAAG,CAAC,CAC1CC,IAAI,CAAC,GAAG,CAAC,GAAG;MACjB,MAAMC,cAAc,GAAG,KAAKR,OAAO,GAAG;MAEtC,MAAMS,OAAO,GACTxB,GAAG,KAAK,KAAK,GAAGgB,cAAc,GAAGA,cAAc,GAAGV,aAAa,GAAGiB,cAAc;MAEpFnC,IAAI,GAAG,GAAGA,IAAI,CAACI,KAAK,CAAC,CAAC,EAAEe,gBAAgB,CAAC,GAAGiB,OAAO,GAAGX,YAAY,EAAE;;MAEpE;MACAxB,gBAAgB,GAAGkB,gBAAgB,GAAGiB,OAAO,CAAClC,MAAM;IACxD;EACJ;EAEA,OAAOF,IAAI;AACf,CAAC;AAED,OAAO,MAAMsB,0BAA0B,GAAI7B,IAAY,IACnDA,IAAI,CAAC4C,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,CAACA,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC;AAEtE,OAAO,MAAMC,4BAA4B,GAAI7C,IAAY,IACrDA,IAAI,CAAC4C,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,CAACA,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC","ignoreList":[]}
@@ -93,10 +93,9 @@ const renderer = {
93
93
  // This is the easiest way to prevent the formatting of markdown checkboxes in lists.
94
94
  // This can modify the input string slightly, since the capitalization of the checkbox can be lost.
95
95
  // If a user types '- [X]' it will be replaced with '- [x]' => the capitalization is lost.
96
- checkbox(_ref) {
97
- let {
98
- checked
99
- } = _ref;
96
+ checkbox({
97
+ checked
98
+ }) {
100
99
  return checked ? '[x]' : '[ ]';
101
100
  },
102
101
  // Ensures that the numbering of ordered lists is preserved.
@@ -1 +1 @@
1
- {"version":3,"file":"formatMarkdown.js","names":["marked","stringify","escapeBBCodeSquareBrackets","inlineCodeRule","inlineTextRule","TABLE_ID_PREFIX","tokenizer","codespan","src","cap","exec","text","replace","hasNonSpaceChars","test","hasSpaceCharsOnBothEnds","substring","length","type","raw","undefined","lheading","url","code","inlineText","escape","br","list","renderer","lang","langString","match","checkbox","_ref","checked","listitem","item","task","trim","value","slice","itemBody","parser","parse","tokens","loose","postprocess","html","tableIndex","modifiedString","result","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":["import { marked, Tokens } from 'marked';\nimport type { TableObject } from '../../../types/format';\n// eslint-disable-next-line import/extensions,import/no-unresolved\nimport { stringify } from 'csv-stringify/browser/esm/sync';\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 = {\n // Codespan Tokenizer is overwritten to prevent html escaping, since html is already escaped.\n // The function is copied from marked.js and slightly modified: 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 if (cap) {\n let text = (cap[2] as string).replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\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 code block.\n code() {\n return undefined;\n },\n // inlineText is overwritten to prevent html escaping, specifically since quote characters are escaped, which breaks the attributes of bb-code elements.\n // The function is copied from marked.js and slightly modified: https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L854\n inlineText(src: string) {\n const cap = inlineTextRule.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n };\n }\n return undefined;\n },\n // Disables escaping of characters via backslash. This is needed for LaTeX formulas, since multiline LaTeX formulas have 2 backslashes at the end of their lines.\n // Without this function, 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 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.\n // Also recognizes ordered lists, 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 = {\n // Code Renderer is overwritten to prevent html escaping, since html is 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(text: string, lang: string): 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.\n // This is the easiest way to prevent the formatting of markdown checkboxes in lists.\n // This can modify the input string slightly, since the capitalization of the checkbox can be lost.\n // If a user types '- [X]' it will be replaced with '- [x]' => the capitalization is lost.\n checkbox({ checked }: Tokens.Checkbox) {\n return checked ? '[x]' : '[ ]';\n },\n // Ensures that the numbering of ordered lists is preserved.\n listitem: function (item: Tokens.ListItem) {\n if (item.task) {\n return false;\n }\n\n const match = item.raw.trim().match(/^\\d{1,9}[.)]/);\n // Removes the trailing dot or parenthesis from the match.\n const value = match ? match[0].slice(0, match[0].length - 1) : '';\n if (value) {\n let itemBody = '';\n // @ts-ignore\n itemBody += this.parser.parse(item.tokens, !!item.loose);\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 = 0;\n // Assigns ids to tables.\n const modifiedString = html.replace(/(<table>)/g, () => {\n const result = `<table id=\"${TABLE_ID_PREFIX}${tableIndex}\">`;\n tableIndex++;\n return result;\n });\n\n return modifiedString;\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nmarked.use({ tokenizer, renderer, hooks: { postprocess } });\n\n// Parses markdown following the Github Flavored Markdown specification.\n// The tokenizer and renderer 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, &amp; is replaced lastly to prevent double escaping.\nconst unescapeHtml = (text: string) =>\n text.replaceAll('&lt;', '<').replaceAll('&gt;', '>').replaceAll('&amp;', '&');\n\nexport const getMarkdownTables = (text: string): TableObject[] => {\n const tableTokens: Tokens.Table[] = [];\n\n marked.parse(text, {\n walkTokens: (token) => {\n if (token.type === 'table') {\n tableTokens.push(token as Tokens.Table);\n }\n },\n }) as string;\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 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":["marked","stringify","escapeBBCodeSquareBrackets","inlineCodeRule","inlineTextRule","TABLE_ID_PREFIX","tokenizer","codespan","src","cap","exec","text","replace","hasNonSpaceChars","test","hasSpaceCharsOnBothEnds","substring","length","type","raw","undefined","lheading","url","code","inlineText","escape","br","list","renderer","lang","langString","match","checkbox","checked","listitem","item","task","trim","value","slice","itemBody","parser","parse","tokens","loose","postprocess","html","tableIndex","modifiedString","result","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":["import { marked, Tokens } from 'marked';\nimport type { TableObject } from '../../../types/format';\n// eslint-disable-next-line import/extensions,import/no-unresolved\nimport { stringify } from 'csv-stringify/browser/esm/sync';\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 = {\n // Codespan Tokenizer is overwritten to prevent html escaping, since html is already escaped.\n // The function is copied from marked.js and slightly modified: 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 if (cap) {\n let text = (cap[2] as string).replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\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 code block.\n code() {\n return undefined;\n },\n // inlineText is overwritten to prevent html escaping, specifically since quote characters are escaped, which breaks the attributes of bb-code elements.\n // The function is copied from marked.js and slightly modified: https://github.com/markedjs/marked/blob/42954aaba960b6f815b24ec0d39da464960e4ec9/src/Tokenizer.ts#L854\n inlineText(src: string) {\n const cap = inlineTextRule.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n };\n }\n return undefined;\n },\n // Disables escaping of characters via backslash. This is needed for LaTeX formulas, since multiline LaTeX formulas have 2 backslashes at the end of their lines.\n // Without this function, 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 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.\n // Also recognizes ordered lists, 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 = {\n // Code Renderer is overwritten to prevent html escaping, since html is 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(text: string, lang: string): 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.\n // This is the easiest way to prevent the formatting of markdown checkboxes in lists.\n // This can modify the input string slightly, since the capitalization of the checkbox can be lost.\n // If a user types '- [X]' it will be replaced with '- [x]' => the capitalization is lost.\n checkbox({ checked }: Tokens.Checkbox) {\n return checked ? '[x]' : '[ ]';\n },\n // Ensures that the numbering of ordered lists is preserved.\n listitem: function (item: Tokens.ListItem) {\n if (item.task) {\n return false;\n }\n\n const match = item.raw.trim().match(/^\\d{1,9}[.)]/);\n // Removes the trailing dot or parenthesis from the match.\n const value = match ? match[0].slice(0, match[0].length - 1) : '';\n if (value) {\n let itemBody = '';\n // @ts-ignore\n itemBody += this.parser.parse(item.tokens, !!item.loose);\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 = 0;\n // Assigns ids to tables.\n const modifiedString = html.replace(/(<table>)/g, () => {\n const result = `<table id=\"${TABLE_ID_PREFIX}${tableIndex}\">`;\n tableIndex++;\n return result;\n });\n\n return modifiedString;\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nmarked.use({ tokenizer, renderer, hooks: { postprocess } });\n\n// Parses markdown following the Github Flavored Markdown specification.\n// The tokenizer and renderer 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, &amp; is replaced lastly to prevent double escaping.\nconst unescapeHtml = (text: string) =>\n text.replaceAll('&lt;', '<').replaceAll('&gt;', '>').replaceAll('&amp;', '&');\n\nexport const getMarkdownTables = (text: string): TableObject[] => {\n const tableTokens: Tokens.Table[] = [];\n\n marked.parse(text, {\n walkTokens: (token) => {\n if (token.type === 'table') {\n tableTokens.push(token as Tokens.Table);\n }\n },\n }) as string;\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 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.1159",
3
+ "version": "5.0.0-beta.1162",
4
4
  "description": "A set of beautiful React components for developing your own applications with chayns.",
5
5
  "sideEffects": false,
6
6
  "browserslist": [
@@ -52,16 +52,16 @@
52
52
  "url": "https://github.com/TobitSoftware/chayns-components/issues"
53
53
  },
54
54
  "devDependencies": {
55
- "@babel/cli": "^7.27.2",
56
- "@babel/core": "^7.27.4",
57
- "@babel/preset-env": "^7.27.2",
55
+ "@babel/cli": "^7.28.0",
56
+ "@babel/core": "^7.28.0",
57
+ "@babel/preset-env": "^7.28.0",
58
58
  "@babel/preset-react": "^7.27.1",
59
59
  "@babel/preset-typescript": "^7.27.1",
60
- "@types/commonmark": "^0.27.9",
60
+ "@types/commonmark": "^0.27.10",
61
61
  "@types/csv-stringify": "^3.1.3",
62
62
  "babel-loader": "^9.2.1",
63
63
  "cross-env": "^7.0.3",
64
- "lerna": "^8.2.2",
64
+ "lerna": "^8.2.3",
65
65
  "typescript": "^5.8.3",
66
66
  "vitest": "^1.6.1"
67
67
  },
@@ -73,5 +73,5 @@
73
73
  "publishConfig": {
74
74
  "access": "public"
75
75
  },
76
- "gitHead": "1fd3d2703e4f2e2ac176405fd896f4cc27ae1fea"
76
+ "gitHead": "711be48f9db5d545a98736e1c28cc2ab1e0b397c"
77
77
  }