@chayns-components/format 5.0.0-beta.1351 → 5.0.0-beta.1353
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/markdown/formatMarkdown.js +16 -6
- package/lib/cjs/utils/formatString/markdown/formatMarkdown.js.map +1 -1
- package/lib/esm/utils/formatString/markdown/formatMarkdown.js +16 -6
- package/lib/esm/utils/formatString/markdown/formatMarkdown.js.map +1 -1
- package/package.json +2 -2
|
@@ -115,16 +115,26 @@ const renderer = {
|
|
|
115
115
|
return checked ? '[x]' : '[ ]';
|
|
116
116
|
},
|
|
117
117
|
// Replaces the link renderer to prevent opening links in the same tab. Therefore, the target
|
|
118
|
-
// attribute is set to "_blank".
|
|
118
|
+
// attribute is set to "_blank". The function is copied from marked.js and slightly modified:
|
|
119
|
+
// https://github.com/markedjs/marked/blob/15c77deb9e099041d5e70e3b7b17e50ddc35ec2a/src/Renderer.ts#L160
|
|
119
120
|
link({
|
|
120
121
|
href,
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
title,
|
|
123
|
+
tokens
|
|
123
124
|
}) {
|
|
125
|
+
const text = this.parser.parseInline(tokens);
|
|
126
|
+
let cleanHref;
|
|
127
|
+
try {
|
|
128
|
+
cleanHref = encodeURI(href).replace(/%25/g, '%');
|
|
129
|
+
} catch {
|
|
130
|
+
return text;
|
|
131
|
+
}
|
|
132
|
+
let result = `<a href="${cleanHref}" rel="noopener noreferrer" target="_blank"`;
|
|
124
133
|
if (title) {
|
|
125
|
-
|
|
134
|
+
result += ` title="${title}"`;
|
|
126
135
|
}
|
|
127
|
-
|
|
136
|
+
result += `>${text}</a>`;
|
|
137
|
+
return result;
|
|
128
138
|
},
|
|
129
139
|
// Ensures that the numbering of ordered lists is preserved.
|
|
130
140
|
listitem(item) {
|
|
@@ -166,7 +176,7 @@ _marked.marked.use({
|
|
|
166
176
|
}
|
|
167
177
|
});
|
|
168
178
|
|
|
169
|
-
// Parses
|
|
179
|
+
// Parses Markdown following the GitHub flavored Markdown specification. The tokenizer and renderer
|
|
170
180
|
// are slightly modified to prevent HTML escaping in code block and inline code.
|
|
171
181
|
const parseMarkdown = (text, parseBBCode) => _marked.marked.parse(text, {
|
|
172
182
|
walkTokens: token => {
|
|
@@ -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","listitem","item","task","trim","value","slice","itemBody","parser","parse","tokens","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 // 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\".\n link({ href, text, title }: Tokens.Link): string {\n if (title) {\n return `<a href=\"${href}\" rel=\"noopener noreferrer\" target=\"_blank\" title=\"${title}\">${text}</a>`;\n }\n\n return `<a href=\"${href}\" rel=\"noopener noreferrer\" target=\"_blank\">${text}</a>`;\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":[]}
|
|
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","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 // 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 // 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":[]}
|
|
@@ -107,16 +107,26 @@ const renderer = {
|
|
|
107
107
|
return checked ? '[x]' : '[ ]';
|
|
108
108
|
},
|
|
109
109
|
// Replaces the link renderer to prevent opening links in the same tab. Therefore, the target
|
|
110
|
-
// attribute is set to "_blank".
|
|
110
|
+
// attribute is set to "_blank". The function is copied from marked.js and slightly modified:
|
|
111
|
+
// https://github.com/markedjs/marked/blob/15c77deb9e099041d5e70e3b7b17e50ddc35ec2a/src/Renderer.ts#L160
|
|
111
112
|
link({
|
|
112
113
|
href,
|
|
113
|
-
|
|
114
|
-
|
|
114
|
+
title,
|
|
115
|
+
tokens
|
|
115
116
|
}) {
|
|
117
|
+
const text = this.parser.parseInline(tokens);
|
|
118
|
+
let cleanHref;
|
|
119
|
+
try {
|
|
120
|
+
cleanHref = encodeURI(href).replace(/%25/g, '%');
|
|
121
|
+
} catch {
|
|
122
|
+
return text;
|
|
123
|
+
}
|
|
124
|
+
let result = `<a href="${cleanHref}" rel="noopener noreferrer" target="_blank"`;
|
|
116
125
|
if (title) {
|
|
117
|
-
|
|
126
|
+
result += ` title="${title}"`;
|
|
118
127
|
}
|
|
119
|
-
|
|
128
|
+
result += `>${text}</a>`;
|
|
129
|
+
return result;
|
|
120
130
|
},
|
|
121
131
|
// Ensures that the numbering of ordered lists is preserved.
|
|
122
132
|
listitem(item) {
|
|
@@ -158,7 +168,7 @@ marked.use({
|
|
|
158
168
|
}
|
|
159
169
|
});
|
|
160
170
|
|
|
161
|
-
// Parses
|
|
171
|
+
// Parses Markdown following the GitHub flavored Markdown specification. The tokenizer and renderer
|
|
162
172
|
// are slightly modified to prevent HTML escaping in code block and inline code.
|
|
163
173
|
export const parseMarkdown = (text, parseBBCode) => marked.parse(text, {
|
|
164
174
|
walkTokens: token => {
|
|
@@ -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","listitem","item","task","trim","value","slice","itemBody","parser","parse","tokens","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 // 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\".\n link({ href, text, title }: Tokens.Link): string {\n if (title) {\n return `<a href=\"${href}\" rel=\"noopener noreferrer\" target=\"_blank\" title=\"${title}\">${text}</a>`;\n }\n\n return `<a href=\"${href}\" rel=\"noopener noreferrer\" target=\"_blank\">${text}</a>`;\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":[]}
|
|
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","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 // 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 // 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.1353",
|
|
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": "659e1d7836b6c5c6f9af47976f53170da733c258"
|
|
78
78
|
}
|