@mdit/plugin-inline-rule
Advanced tools
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cdn.umd.js","names":["UNESCAPE_RE"],"sources":["../../helper/dist/index.js","../src/plugin.ts"],"sourcesContent":["const e=e=>{let t=e.split(`\n`),n=t.reduce((e,t)=>{for(let n=0;n<t.length;n++)if(t[n]!==` `&&t[n]!==`\t`)return Math.min(n,e);return e},1/0);return n<1/0?t.map(e=>e.slice(n)).join(`\n`):e},t=/[-/\\\\^$*+?.()|[\\]{}]/g,n=String.raw`\\$&`,r=e=>e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`\"`,`"`).replaceAll(`'`,`'`),i=e=>e.replaceAll(t,n),a=/\\r\\n?|\\n/g,o=/\\\\([ \\\\!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~-])/gu;export{a as NEWLINE_RE,o as UNESCAPE_RE,e as dedent,r as escapeHtml,i as escapeRegExp};\n//# sourceMappingURL=index.js.map","import { UNESCAPE_RE } from \"@mdit/helper\";\nimport type { PluginWithOptions } from \"markdown-it\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport type StateInline from \"markdown-it/lib/rules_inline/state_inline.mjs\";\nimport type { Delimiter } from \"markdown-it/lib/rules_inline/state_inline.mjs\";\n\nimport type { InlineRuleOptions } from \"./options.js\";\n\nconst UNESCAPED_SPACES_OR_NEW_LINES_RE = /(^|[^\\\\])(\\\\\\\\)*\\s/u;\n\ninterface LinearRuleConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n allowSpace: boolean;\n attrs: [string, string][] | undefined;\n}\n\nconst createLinearRule = (config: LinearRuleConfig): RuleInline => {\n const { markerCode, tag, token, markup, allowSpace, attrs } = config;\n const markerLength = markup.length;\n\n return (state, silent): boolean => {\n const max = state.posMax;\n const start = state.pos;\n\n if (state.src.charCodeAt(start) !== markerCode || silent || start + 2 * markerLength >= max)\n return false;\n\n // For double markers, check second char matches\n if (markerLength === 2 && state.src.charCodeAt(start + 1) !== markerCode) return false;\n\n state.pos = start + markerLength;\n\n let found = false;\n\n while (state.pos <= max - markerLength) {\n if (\n state.src.charCodeAt(state.pos) === markerCode &&\n (markerLength === 1 || state.src.charCodeAt(state.pos + 1) === markerCode)\n ) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + markerLength === state.pos) {\n state.pos = start;\n\n return false;\n }\n\n const content = state.src.slice(start + markerLength, state.pos);\n\n // Don't allow unescaped spaces/newlines inside if not allowed\n if (!allowSpace && UNESCAPED_SPACES_OR_NEW_LINES_RE.test(content)) {\n state.pos = start;\n\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + markerLength;\n\n const openToken = state.push(`${token}_open`, tag, 1);\n\n openToken.markup = markup;\n if (attrs) openToken.attrs = attrs;\n\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = content.replace(UNESCAPE_RE, \"$1\");\n\n const closeToken = state.push(`${token}_close`, tag, -1);\n\n closeToken.markup = markup;\n\n state.pos = state.posMax + markerLength;\n state.posMax = max;\n\n return true;\n };\n};\n\nconst createNestedTokenize =\n (markerCode: number): RuleInline =>\n (state, silent): boolean => {\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (silent || marker !== markerCode) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let { length } = scanned;\n\n if (length < 2) return false;\n\n const markerChar = String.fromCharCode(marker);\n\n if (length % 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar;\n length--;\n }\n\n for (let ii = 0; ii < length; ii += 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar + markerChar;\n\n if (scanned.can_open || scanned.can_close) {\n state.delimiters.push({\n marker: markerCode,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n }\n\n state.pos += scanned.length;\n\n return true;\n };\n\ninterface NestedPostProcessConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n attrs: [string, string][] | undefined;\n}\n\nconst createNestedPostProcess = (\n config: NestedPostProcessConfig,\n): ((state: StateInline, delimiters: Delimiter[]) => void) => {\n const { markerCode, tag, token, markup, attrs } = config;\n const closeType = `${token}_close`;\n\n return (state, delimiters): void => {\n let tk;\n const loneMarkers: number[] = [];\n const max = delimiters.length;\n\n for (let ii = 0; ii < max; ii++) {\n const startDelim = delimiters[ii];\n\n if (startDelim.marker === markerCode && startDelim.end !== -1) {\n const endDelim = delimiters[startDelim.end];\n\n tk = state.tokens[startDelim.token];\n tk.type = `${token}_open`;\n tk.tag = tag;\n tk.nesting = 1;\n tk.markup = markup;\n tk.content = \"\";\n if (attrs) tk.attrs = attrs;\n\n tk = state.tokens[endDelim.token];\n tk.type = closeType;\n tk.tag = tag;\n tk.nesting = -1;\n tk.markup = markup;\n tk.content = \"\";\n\n // Mark delimiters as consumed so other handlers (e.g., emphasis) won't re-process\n endDelim.end = -1;\n startDelim.end = -1;\n\n if (\n state.tokens[endDelim.token - 1].type === \"text\" &&\n state.tokens[endDelim.token - 1].content === String.fromCharCode(markerCode)\n )\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's split\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n // So, we have to move all those markers after subsequent close tags.\n while (loneMarkers.length > 0) {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const ii = loneMarkers.pop()!;\n let jj = ii + 1;\n\n while (jj < state.tokens.length && state.tokens[jj].type === closeType) jj++;\n\n jj--;\n\n tk = state.tokens[jj];\n state.tokens[jj] = state.tokens[ii];\n state.tokens[ii] = tk;\n }\n };\n};\n\nconst createRuler2Handler =\n (\n postProcess: (state: StateInline, delimiters: Delimiter[]) => void,\n ): ((state: StateInline) => boolean) =>\n (state): boolean => {\n postProcess(state, state.delimiters);\n\n const tokensMeta = state.tokens_meta;\n const tokensMetaLength = tokensMeta.length;\n\n for (let ii = 0; ii < tokensMetaLength; ii++) {\n const tokenMeta = tokensMeta[ii];\n\n // oxlint-disable-next-line typescript/strict-boolean-expressions\n if (tokenMeta?.delimiters.length) postProcess(state, tokenMeta.delimiters);\n }\n\n return true;\n };\n\nexport const inlineRule: PluginWithOptions<InlineRuleOptions> = (md, options) => {\n if (\n !options ||\n typeof options.marker !== \"string\" ||\n typeof options.token !== \"string\" ||\n typeof options.tag !== \"string\"\n ) {\n throw new Error(\n \"Invalid options for inlineRule plugin: 'marker', 'token', and 'tag' are required string properties.\",\n );\n }\n\n const { marker, tag, token, attrs, nested = false, placement = \"after-emphasis\" } = options;\n\n if (marker.length !== 1) {\n throw new Error(\"Invalid marker for inlineRule plugin: 'marker' must be a single character.\");\n }\n\n const double = nested ? true : (options?.double ?? false);\n const allowSpace = nested ? false : ((options as { allowSpace?: boolean })?.allowSpace ?? false);\n\n const markerCode = marker.charCodeAt(0);\n const markup = double ? marker + marker : marker;\n const ruleName = `${token}_${marker}`;\n const isBefore = placement === \"before-emphasis\";\n\n if (nested) {\n const tokenize = createNestedTokenize(markerCode);\n const postProcess = createNestedPostProcess({\n markerCode,\n tag,\n token,\n markup,\n attrs,\n });\n const ruler2Handler = createRuler2Handler(postProcess);\n\n if (isBefore) {\n md.inline.ruler.before(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.before(\"emphasis\", ruleName, ruler2Handler);\n } else {\n md.inline.ruler.after(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.after(\"emphasis\", ruleName, ruler2Handler);\n }\n } else {\n const rule = createLinearRule({\n markerCode,\n tag,\n token,\n markup,\n allowSpace,\n attrs,\n });\n\n if (isBefore) {\n md.inline.ruler.before(\"emphasis\", ruleName, rule);\n } else {\n md.inline.ruler.after(\"emphasis\", ruleName, rule);\n }\n }\n};\n"],"mappings":"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"} | ||
| {"version":3,"file":"cdn.umd.js","names":["UNESCAPE_RE"],"sources":["../../helper/dist/index.js","../src/plugin.ts"],"sourcesContent":["const e=e=>{let t=e.split(`\n`),n=t.reduce((e,t)=>{for(let n=0;n<t.length;n++)if(t[n]!==` `&&t[n]!==`\t`)return Math.min(n,e);return e},1/0);return n<1/0?t.map(e=>e.slice(n)).join(`\n`):e},t=/[-/\\\\^$*+?.()|[\\]{}]/g,n=String.raw`\\$&`,r=e=>e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`\"`,`"`).replaceAll(`'`,`'`),i=e=>e.replaceAll(t,n),a=/\\r\\n?|\\n/g,o=/\\\\([ \\\\!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~-])/gu;export{a as NEWLINE_RE,o as UNESCAPE_RE,e as dedent,r as escapeHtml,i as escapeRegExp};\n//# sourceMappingURL=index.js.map","import { UNESCAPE_RE } from \"@mdit/helper\";\nimport type { PluginWithOptions } from \"markdown-it\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport type StateInline from \"markdown-it/lib/rules_inline/state_inline.mjs\";\nimport type { Delimiter } from \"markdown-it/lib/rules_inline/state_inline.mjs\";\n\nimport type { InlineRuleOptions } from \"./options.js\";\n\nconst UNESCAPED_SPACES_OR_NEW_LINES_RE = /(^|[^\\\\])(\\\\\\\\)*\\s/u;\n\ninterface LinearRuleConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n allowSpace: boolean;\n attrs: [string, string][] | undefined;\n}\n\nconst createLinearRule = (config: LinearRuleConfig): RuleInline => {\n const { markerCode, tag, token, markup, allowSpace, attrs } = config;\n const markerLength = markup.length;\n\n return (state, silent): boolean => {\n const max = state.posMax;\n const start = state.pos;\n\n if (state.src.charCodeAt(start) !== markerCode || silent || start + 2 * markerLength >= max)\n return false;\n\n // For double markers, check second char matches\n if (markerLength === 2 && state.src.charCodeAt(start + 1) !== markerCode) return false;\n\n state.pos = start + markerLength;\n\n let found = false;\n\n while (state.pos <= max - markerLength) {\n if (\n state.src.charCodeAt(state.pos) === markerCode &&\n (markerLength === 1 || state.src.charCodeAt(state.pos + 1) === markerCode)\n ) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + markerLength === state.pos) {\n state.pos = start;\n\n return false;\n }\n\n const content = state.src.slice(start + markerLength, state.pos);\n\n // Don't allow unescaped spaces/newlines inside if not allowed\n if (!allowSpace && UNESCAPED_SPACES_OR_NEW_LINES_RE.test(content)) {\n state.pos = start;\n\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + markerLength;\n\n const openToken = state.push(`${token}_open`, tag, 1);\n\n openToken.markup = markup;\n if (attrs) openToken.attrs = attrs;\n\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = content.replace(UNESCAPE_RE, \"$1\");\n\n const closeToken = state.push(`${token}_close`, tag, -1);\n\n closeToken.markup = markup;\n\n state.pos = state.posMax + markerLength;\n state.posMax = max;\n\n return true;\n };\n};\n\nconst createNestedTokenize =\n (markerCode: number): RuleInline =>\n (state, silent): boolean => {\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (silent || marker !== markerCode) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let { length } = scanned;\n\n if (length < 2) return false;\n\n const markerChar = String.fromCharCode(marker);\n\n if (length % 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar;\n length--;\n }\n\n for (let ii = 0; ii < length; ii += 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar + markerChar;\n\n if (scanned.can_open || scanned.can_close) {\n state.delimiters.push({\n marker: markerCode,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n }\n\n state.pos += scanned.length;\n\n return true;\n };\n\ninterface NestedPostProcessConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n attrs: [string, string][] | undefined;\n}\n\nconst createNestedPostProcess = (\n config: NestedPostProcessConfig,\n): ((state: StateInline, delimiters: Delimiter[]) => void) => {\n const { markerCode, tag, token, markup, attrs } = config;\n const closeType = `${token}_close`;\n\n return (state, delimiters): void => {\n let tk;\n const loneMarkers: number[] = [];\n const max = delimiters.length;\n\n for (let ii = 0; ii < max; ii++) {\n const startDelim = delimiters[ii];\n\n if (startDelim.marker === markerCode && startDelim.end !== -1) {\n const endDelim = delimiters[startDelim.end];\n\n tk = state.tokens[startDelim.token];\n tk.type = `${token}_open`;\n tk.tag = tag;\n tk.nesting = 1;\n tk.markup = markup;\n tk.content = \"\";\n if (attrs) tk.attrs = attrs;\n\n tk = state.tokens[endDelim.token];\n tk.type = closeType;\n tk.tag = tag;\n tk.nesting = -1;\n tk.markup = markup;\n tk.content = \"\";\n\n // Mark delimiters as consumed so other handlers (e.g., emphasis) won't re-process\n endDelim.end = -1;\n startDelim.end = -1;\n\n if (\n state.tokens[endDelim.token - 1].type === \"text\" &&\n state.tokens[endDelim.token - 1].content === String.fromCharCode(markerCode)\n )\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's split\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n // So, we have to move all those markers after subsequent close tags.\n while (loneMarkers.length > 0) {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const ii = loneMarkers.pop()!;\n let jj = ii + 1;\n\n while (jj < state.tokens.length && state.tokens[jj].type === closeType) jj++;\n\n jj--;\n\n tk = state.tokens[jj];\n state.tokens[jj] = state.tokens[ii];\n state.tokens[ii] = tk;\n }\n };\n};\n\nconst createRuler2Handler =\n (\n postProcess: (state: StateInline, delimiters: Delimiter[]) => void,\n ): ((state: StateInline) => boolean) =>\n (state): boolean => {\n postProcess(state, state.delimiters);\n\n const tokensMeta = state.tokens_meta;\n const tokensMetaLength = tokensMeta.length;\n\n for (let ii = 0; ii < tokensMetaLength; ii++) {\n const tokenMeta = tokensMeta[ii];\n\n // oxlint-disable-next-line typescript/strict-boolean-expressions\n if (tokenMeta?.delimiters.length) postProcess(state, tokenMeta.delimiters);\n }\n\n return true;\n };\n\nexport const inlineRule: PluginWithOptions<InlineRuleOptions> = (md, options) => {\n if (\n !options ||\n typeof options.marker !== \"string\" ||\n typeof options.token !== \"string\" ||\n typeof options.tag !== \"string\"\n ) {\n throw new Error(\n \"Invalid options for inlineRule plugin: 'marker', 'token', and 'tag' are required string properties.\",\n );\n }\n\n const { marker, tag, token, attrs, nested = false, placement = \"after-emphasis\" } = options;\n\n if (marker.length !== 1)\n throw new Error(\"Invalid marker for inlineRule plugin: 'marker' must be a single character.\");\n\n const double = nested ? true : (options?.double ?? false);\n const allowSpace = nested ? false : ((options as { allowSpace?: boolean })?.allowSpace ?? false);\n\n const markerCode = marker.charCodeAt(0);\n const markup = double ? marker + marker : marker;\n const ruleName = `${token}_${marker}`;\n const isBefore = placement === \"before-emphasis\";\n\n if (nested) {\n const tokenize = createNestedTokenize(markerCode);\n const postProcess = createNestedPostProcess({\n markerCode,\n tag,\n token,\n markup,\n attrs,\n });\n const ruler2Handler = createRuler2Handler(postProcess);\n\n if (isBefore) {\n md.inline.ruler.before(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.before(\"emphasis\", ruleName, ruler2Handler);\n } else {\n md.inline.ruler.after(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.after(\"emphasis\", ruleName, ruler2Handler);\n }\n } else {\n const rule = createLinearRule({\n markerCode,\n tag,\n token,\n markup,\n allowSpace,\n attrs,\n });\n\n if (isBefore) md.inline.ruler.before(\"emphasis\", ruleName, rule);\n else md.inline.ruler.after(\"emphasis\", ruleName, rule);\n }\n};\n"],"mappings":"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"} |
+126
-126
@@ -5,130 +5,130 @@ import { PluginWithOptions } from "markdown-it"; | ||
| /** | ||
| * Base options shared by all inline rule configurations | ||
| * | ||
| * 所有内联规则配置共享的基础选项 | ||
| */ | ||
| * Base options shared by all inline rule configurations | ||
| * | ||
| * 所有内联规则配置共享的基础选项 | ||
| */ | ||
| interface InlineRuleBaseOptions { | ||
| /** | ||
| * The punctuation character used as the marker | ||
| * | ||
| * 用作标记的标点符号字符 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * // Single character for sub/sup | ||
| * marker: "~" | ||
| * // Single character that gets doubled for spoiler | ||
| * marker: "!" | ||
| * ``` | ||
| */ | ||
| * The punctuation character used as the marker | ||
| * | ||
| * 用作标记的标点符号字符 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * // Single character for sub/sup | ||
| * marker: "~" | ||
| * // Single character that gets doubled for spoiler | ||
| * marker: "!" | ||
| * ``` | ||
| */ | ||
| marker: string; | ||
| /** | ||
| * HTML tag name for the rendered element | ||
| * | ||
| * 渲染元素的 HTML 标签名称 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * tag: "sub" | ||
| * tag: "span" | ||
| * ``` | ||
| */ | ||
| * HTML tag name for the rendered element | ||
| * | ||
| * 渲染元素的 HTML 标签名称 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * tag: "sub" | ||
| * tag: "span" | ||
| * ``` | ||
| */ | ||
| tag: string; | ||
| /** | ||
| * Token type name used for markdown-it token identification | ||
| * | ||
| * 用于 markdown-it 令牌标识的令牌类型名称 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * token: "sub" | ||
| * token: "spoiler" | ||
| * ``` | ||
| */ | ||
| * Token type name used for markdown-it token identification | ||
| * | ||
| * 用于 markdown-it 令牌标识的令牌类型名称 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * token: "sub" | ||
| * token: "spoiler" | ||
| * ``` | ||
| */ | ||
| token: string; | ||
| /** | ||
| * Custom HTML attributes for the rendered element | ||
| * | ||
| * 渲染元素的自定义 HTML 属性 | ||
| * | ||
| * @default undefined | ||
| * @example | ||
| * ```ts | ||
| * attrs: [["class", "spoiler"], ["tabindex", "-1"]] | ||
| * ``` | ||
| */ | ||
| * Custom HTML attributes for the rendered element | ||
| * | ||
| * 渲染元素的自定义 HTML 属性 | ||
| * | ||
| * @default undefined | ||
| * @example | ||
| * ```ts | ||
| * attrs: [["class", "spoiler"], ["tabindex", "-1"]] | ||
| * ``` | ||
| */ | ||
| attrs?: [string, string][]; | ||
| /** | ||
| * Ruler placement relative to the core 'emphasis' rule | ||
| * | ||
| * 相对于核心 'emphasis' 规则的规则放置位置 | ||
| * | ||
| * @default "after-emphasis" | ||
| */ | ||
| * Ruler placement relative to the core 'emphasis' rule | ||
| * | ||
| * 相对于核心 'emphasis' 规则的规则放置位置 | ||
| * | ||
| * @default "after-emphasis" | ||
| */ | ||
| placement?: "before-emphasis" | "after-emphasis"; | ||
| } | ||
| /** | ||
| * Options for non-nested inline rules (linear scan) | ||
| * | ||
| * 非嵌套内联规则选项(线性扫描) | ||
| * | ||
| * @description Uses a high-performance linear scanner. | ||
| * No inline tags (bold, italic, etc.) are parsed inside the markers. | ||
| * Best for simple tags like sub/sup. | ||
| * | ||
| * 使用高性能线性扫描器。 | ||
| * 标记内部不会解析内联标签(粗体、斜体等)。 | ||
| * 最适合 sub/sup 等简单标签。 | ||
| */ | ||
| * Options for non-nested inline rules (linear scan) | ||
| * | ||
| * 非嵌套内联规则选项(线性扫描) | ||
| * | ||
| * @description Uses a high-performance linear scanner. | ||
| * No inline tags (bold, italic, etc.) are parsed inside the markers. | ||
| * Best for simple tags like sub/sup. | ||
| * | ||
| * 使用高性能线性扫描器。 | ||
| * 标记内部不会解析内联标签(粗体、斜体等)。 | ||
| * 最适合 sub/sup 等简单标签。 | ||
| */ | ||
| interface NonNestedInlineRuleOptions extends InlineRuleBaseOptions { | ||
| /** | ||
| * @default false | ||
| */ | ||
| * @default false | ||
| */ | ||
| nested?: false; | ||
| /** | ||
| * Whether markers must be doubled (e.g., `%%` vs `%`) | ||
| * | ||
| * 标记是否必须成对出现(例如 `%%` 而不是 `%`) | ||
| * | ||
| * @default false | ||
| */ | ||
| * Whether markers must be doubled (e.g., `%%` vs `%`) | ||
| * | ||
| * 标记是否必须成对出现(例如 `%%` 而不是 `%`) | ||
| * | ||
| * @default false | ||
| */ | ||
| double?: boolean; | ||
| /** | ||
| * Whether to allow unescaped spaces inside the content | ||
| * | ||
| * 是否允许内容中的未转义空格 | ||
| * | ||
| * @default false | ||
| */ | ||
| * Whether to allow unescaped spaces inside the content | ||
| * | ||
| * 是否允许内容中的未转义空格 | ||
| * | ||
| * @default false | ||
| */ | ||
| allowSpace?: boolean; | ||
| } | ||
| /** | ||
| * Options for nested inline rules (delimiter state machine) | ||
| * | ||
| * 嵌套内联规则选项(分隔符状态机) | ||
| * | ||
| * @description Integrates with markdown-it's delimiter state machine. | ||
| * Supports nested bold, italic, and other inline rules inside the markers. | ||
| * Best for complex tags like mark/spoiler/ins. | ||
| * Always uses double markers. | ||
| * | ||
| * 与 markdown-it 的分隔符状态机集成。 | ||
| * 支持标记内嵌套粗体、斜体和其他内联规则。 | ||
| * 最适合 mark/spoiler/ins 等复杂标签。 | ||
| * 始终使用双标记。 | ||
| */ | ||
| * Options for nested inline rules (delimiter state machine) | ||
| * | ||
| * 嵌套内联规则选项(分隔符状态机) | ||
| * | ||
| * @description Integrates with markdown-it's delimiter state machine. | ||
| * Supports nested bold, italic, and other inline rules inside the markers. | ||
| * Best for complex tags like mark/spoiler/ins. | ||
| * Always uses double markers. | ||
| * | ||
| * 与 markdown-it 的分隔符状态机集成。 | ||
| * 支持标记内嵌套粗体、斜体和其他内联规则。 | ||
| * 最适合 mark/spoiler/ins 等复杂标签。 | ||
| * 始终使用双标记。 | ||
| */ | ||
| interface NestedInlineRuleOptions extends InlineRuleBaseOptions { | ||
| nested: true; | ||
| /** | ||
| * Whether markers must be doubled | ||
| * | ||
| * 标记是否必须成对出现 | ||
| * | ||
| * @description Must be `true` for nested rules. The delimiter state machine | ||
| * requires double markers to function correctly. | ||
| * | ||
| * 嵌套规则必须为 `true`。分隔符状态机需要双标记才能正确运行。 | ||
| * | ||
| * @default true | ||
| */ | ||
| * Whether markers must be doubled | ||
| * | ||
| * 标记是否必须成对出现 | ||
| * | ||
| * @description Must be `true` for nested rules. The delimiter state machine | ||
| * requires double markers to function correctly. | ||
| * | ||
| * 嵌套规则必须为 `true`。分隔符状态机需要双标记才能正确运行。 | ||
| * | ||
| * @default true | ||
| */ | ||
| double?: true; | ||
@@ -139,25 +139,25 @@ /** Not applicable for nested rules / 不适用于嵌套规则 */ | ||
| /** | ||
| * Configuration options for the inline rule factory plugin | ||
| * | ||
| * 内联规则工厂插件的配置选项 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * // Non-nested (linear scan) - for simple tags like sub/sup | ||
| * md.use(inlineRule, { | ||
| * marker: "^", | ||
| * tag: "sup", | ||
| * token: "sup", | ||
| * }); | ||
| * | ||
| * // Nested (delimiter state machine) - for complex tags like mark/spoiler | ||
| * md.use(inlineRule, { | ||
| * marker: "=", | ||
| * tag: "mark", | ||
| * token: "mark", | ||
| * nested: true, | ||
| * placement: "before-emphasis", | ||
| * }); | ||
| * ``` | ||
| */ | ||
| * Configuration options for the inline rule factory plugin | ||
| * | ||
| * 内联规则工厂插件的配置选项 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * // Non-nested (linear scan) - for simple tags like sub/sup | ||
| * md.use(inlineRule, { | ||
| * marker: "^", | ||
| * tag: "sup", | ||
| * token: "sup", | ||
| * }); | ||
| * | ||
| * // Nested (delimiter state machine) - for complex tags like mark/spoiler | ||
| * md.use(inlineRule, { | ||
| * marker: "=", | ||
| * tag: "mark", | ||
| * token: "mark", | ||
| * nested: true, | ||
| * placement: "before-emphasis", | ||
| * }); | ||
| * ``` | ||
| */ | ||
| type InlineRuleOptions = NonNestedInlineRuleOptions | NestedInlineRuleOptions; | ||
@@ -164,0 +164,0 @@ //#endregion |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import { UNESCAPE_RE } from \"@mdit/helper\";\nimport type { PluginWithOptions } from \"markdown-it\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport type StateInline from \"markdown-it/lib/rules_inline/state_inline.mjs\";\nimport type { Delimiter } from \"markdown-it/lib/rules_inline/state_inline.mjs\";\n\nimport type { InlineRuleOptions } from \"./options.js\";\n\nconst UNESCAPED_SPACES_OR_NEW_LINES_RE = /(^|[^\\\\])(\\\\\\\\)*\\s/u;\n\ninterface LinearRuleConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n allowSpace: boolean;\n attrs: [string, string][] | undefined;\n}\n\nconst createLinearRule = (config: LinearRuleConfig): RuleInline => {\n const { markerCode, tag, token, markup, allowSpace, attrs } = config;\n const markerLength = markup.length;\n\n return (state, silent): boolean => {\n const max = state.posMax;\n const start = state.pos;\n\n if (state.src.charCodeAt(start) !== markerCode || silent || start + 2 * markerLength >= max)\n return false;\n\n // For double markers, check second char matches\n if (markerLength === 2 && state.src.charCodeAt(start + 1) !== markerCode) return false;\n\n state.pos = start + markerLength;\n\n let found = false;\n\n while (state.pos <= max - markerLength) {\n if (\n state.src.charCodeAt(state.pos) === markerCode &&\n (markerLength === 1 || state.src.charCodeAt(state.pos + 1) === markerCode)\n ) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + markerLength === state.pos) {\n state.pos = start;\n\n return false;\n }\n\n const content = state.src.slice(start + markerLength, state.pos);\n\n // Don't allow unescaped spaces/newlines inside if not allowed\n if (!allowSpace && UNESCAPED_SPACES_OR_NEW_LINES_RE.test(content)) {\n state.pos = start;\n\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + markerLength;\n\n const openToken = state.push(`${token}_open`, tag, 1);\n\n openToken.markup = markup;\n if (attrs) openToken.attrs = attrs;\n\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = content.replace(UNESCAPE_RE, \"$1\");\n\n const closeToken = state.push(`${token}_close`, tag, -1);\n\n closeToken.markup = markup;\n\n state.pos = state.posMax + markerLength;\n state.posMax = max;\n\n return true;\n };\n};\n\nconst createNestedTokenize =\n (markerCode: number): RuleInline =>\n (state, silent): boolean => {\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (silent || marker !== markerCode) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let { length } = scanned;\n\n if (length < 2) return false;\n\n const markerChar = String.fromCharCode(marker);\n\n if (length % 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar;\n length--;\n }\n\n for (let ii = 0; ii < length; ii += 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar + markerChar;\n\n if (scanned.can_open || scanned.can_close) {\n state.delimiters.push({\n marker: markerCode,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n }\n\n state.pos += scanned.length;\n\n return true;\n };\n\ninterface NestedPostProcessConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n attrs: [string, string][] | undefined;\n}\n\nconst createNestedPostProcess = (\n config: NestedPostProcessConfig,\n): ((state: StateInline, delimiters: Delimiter[]) => void) => {\n const { markerCode, tag, token, markup, attrs } = config;\n const closeType = `${token}_close`;\n\n return (state, delimiters): void => {\n let tk;\n const loneMarkers: number[] = [];\n const max = delimiters.length;\n\n for (let ii = 0; ii < max; ii++) {\n const startDelim = delimiters[ii];\n\n if (startDelim.marker === markerCode && startDelim.end !== -1) {\n const endDelim = delimiters[startDelim.end];\n\n tk = state.tokens[startDelim.token];\n tk.type = `${token}_open`;\n tk.tag = tag;\n tk.nesting = 1;\n tk.markup = markup;\n tk.content = \"\";\n if (attrs) tk.attrs = attrs;\n\n tk = state.tokens[endDelim.token];\n tk.type = closeType;\n tk.tag = tag;\n tk.nesting = -1;\n tk.markup = markup;\n tk.content = \"\";\n\n // Mark delimiters as consumed so other handlers (e.g., emphasis) won't re-process\n endDelim.end = -1;\n startDelim.end = -1;\n\n if (\n state.tokens[endDelim.token - 1].type === \"text\" &&\n state.tokens[endDelim.token - 1].content === String.fromCharCode(markerCode)\n )\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's split\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n // So, we have to move all those markers after subsequent close tags.\n while (loneMarkers.length > 0) {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const ii = loneMarkers.pop()!;\n let jj = ii + 1;\n\n while (jj < state.tokens.length && state.tokens[jj].type === closeType) jj++;\n\n jj--;\n\n tk = state.tokens[jj];\n state.tokens[jj] = state.tokens[ii];\n state.tokens[ii] = tk;\n }\n };\n};\n\nconst createRuler2Handler =\n (\n postProcess: (state: StateInline, delimiters: Delimiter[]) => void,\n ): ((state: StateInline) => boolean) =>\n (state): boolean => {\n postProcess(state, state.delimiters);\n\n const tokensMeta = state.tokens_meta;\n const tokensMetaLength = tokensMeta.length;\n\n for (let ii = 0; ii < tokensMetaLength; ii++) {\n const tokenMeta = tokensMeta[ii];\n\n // oxlint-disable-next-line typescript/strict-boolean-expressions\n if (tokenMeta?.delimiters.length) postProcess(state, tokenMeta.delimiters);\n }\n\n return true;\n };\n\nexport const inlineRule: PluginWithOptions<InlineRuleOptions> = (md, options) => {\n if (\n !options ||\n typeof options.marker !== \"string\" ||\n typeof options.token !== \"string\" ||\n typeof options.tag !== \"string\"\n ) {\n throw new Error(\n \"Invalid options for inlineRule plugin: 'marker', 'token', and 'tag' are required string properties.\",\n );\n }\n\n const { marker, tag, token, attrs, nested = false, placement = \"after-emphasis\" } = options;\n\n if (marker.length !== 1) {\n throw new Error(\"Invalid marker for inlineRule plugin: 'marker' must be a single character.\");\n }\n\n const double = nested ? true : (options?.double ?? false);\n const allowSpace = nested ? false : ((options as { allowSpace?: boolean })?.allowSpace ?? false);\n\n const markerCode = marker.charCodeAt(0);\n const markup = double ? marker + marker : marker;\n const ruleName = `${token}_${marker}`;\n const isBefore = placement === \"before-emphasis\";\n\n if (nested) {\n const tokenize = createNestedTokenize(markerCode);\n const postProcess = createNestedPostProcess({\n markerCode,\n tag,\n token,\n markup,\n attrs,\n });\n const ruler2Handler = createRuler2Handler(postProcess);\n\n if (isBefore) {\n md.inline.ruler.before(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.before(\"emphasis\", ruleName, ruler2Handler);\n } else {\n md.inline.ruler.after(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.after(\"emphasis\", ruleName, ruler2Handler);\n }\n } else {\n const rule = createLinearRule({\n markerCode,\n tag,\n token,\n markup,\n allowSpace,\n attrs,\n });\n\n if (isBefore) {\n md.inline.ruler.before(\"emphasis\", ruleName, rule);\n } else {\n md.inline.ruler.after(\"emphasis\", ruleName, rule);\n }\n }\n};\n"],"mappings":"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"} | ||
| {"version":3,"file":"index.js","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import { UNESCAPE_RE } from \"@mdit/helper\";\nimport type { PluginWithOptions } from \"markdown-it\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport type StateInline from \"markdown-it/lib/rules_inline/state_inline.mjs\";\nimport type { Delimiter } from \"markdown-it/lib/rules_inline/state_inline.mjs\";\n\nimport type { InlineRuleOptions } from \"./options.js\";\n\nconst UNESCAPED_SPACES_OR_NEW_LINES_RE = /(^|[^\\\\])(\\\\\\\\)*\\s/u;\n\ninterface LinearRuleConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n allowSpace: boolean;\n attrs: [string, string][] | undefined;\n}\n\nconst createLinearRule = (config: LinearRuleConfig): RuleInline => {\n const { markerCode, tag, token, markup, allowSpace, attrs } = config;\n const markerLength = markup.length;\n\n return (state, silent): boolean => {\n const max = state.posMax;\n const start = state.pos;\n\n if (state.src.charCodeAt(start) !== markerCode || silent || start + 2 * markerLength >= max)\n return false;\n\n // For double markers, check second char matches\n if (markerLength === 2 && state.src.charCodeAt(start + 1) !== markerCode) return false;\n\n state.pos = start + markerLength;\n\n let found = false;\n\n while (state.pos <= max - markerLength) {\n if (\n state.src.charCodeAt(state.pos) === markerCode &&\n (markerLength === 1 || state.src.charCodeAt(state.pos + 1) === markerCode)\n ) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + markerLength === state.pos) {\n state.pos = start;\n\n return false;\n }\n\n const content = state.src.slice(start + markerLength, state.pos);\n\n // Don't allow unescaped spaces/newlines inside if not allowed\n if (!allowSpace && UNESCAPED_SPACES_OR_NEW_LINES_RE.test(content)) {\n state.pos = start;\n\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + markerLength;\n\n const openToken = state.push(`${token}_open`, tag, 1);\n\n openToken.markup = markup;\n if (attrs) openToken.attrs = attrs;\n\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = content.replace(UNESCAPE_RE, \"$1\");\n\n const closeToken = state.push(`${token}_close`, tag, -1);\n\n closeToken.markup = markup;\n\n state.pos = state.posMax + markerLength;\n state.posMax = max;\n\n return true;\n };\n};\n\nconst createNestedTokenize =\n (markerCode: number): RuleInline =>\n (state, silent): boolean => {\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (silent || marker !== markerCode) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let { length } = scanned;\n\n if (length < 2) return false;\n\n const markerChar = String.fromCharCode(marker);\n\n if (length % 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar;\n length--;\n }\n\n for (let ii = 0; ii < length; ii += 2) {\n const textToken = state.push(\"text\", \"\", 0);\n\n textToken.content = markerChar + markerChar;\n\n if (scanned.can_open || scanned.can_close) {\n state.delimiters.push({\n marker: markerCode,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n }\n\n state.pos += scanned.length;\n\n return true;\n };\n\ninterface NestedPostProcessConfig {\n markerCode: number;\n tag: string;\n token: string;\n markup: string;\n attrs: [string, string][] | undefined;\n}\n\nconst createNestedPostProcess = (\n config: NestedPostProcessConfig,\n): ((state: StateInline, delimiters: Delimiter[]) => void) => {\n const { markerCode, tag, token, markup, attrs } = config;\n const closeType = `${token}_close`;\n\n return (state, delimiters): void => {\n let tk;\n const loneMarkers: number[] = [];\n const max = delimiters.length;\n\n for (let ii = 0; ii < max; ii++) {\n const startDelim = delimiters[ii];\n\n if (startDelim.marker === markerCode && startDelim.end !== -1) {\n const endDelim = delimiters[startDelim.end];\n\n tk = state.tokens[startDelim.token];\n tk.type = `${token}_open`;\n tk.tag = tag;\n tk.nesting = 1;\n tk.markup = markup;\n tk.content = \"\";\n if (attrs) tk.attrs = attrs;\n\n tk = state.tokens[endDelim.token];\n tk.type = closeType;\n tk.tag = tag;\n tk.nesting = -1;\n tk.markup = markup;\n tk.content = \"\";\n\n // Mark delimiters as consumed so other handlers (e.g., emphasis) won't re-process\n endDelim.end = -1;\n startDelim.end = -1;\n\n if (\n state.tokens[endDelim.token - 1].type === \"text\" &&\n state.tokens[endDelim.token - 1].content === String.fromCharCode(markerCode)\n )\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's split\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n // So, we have to move all those markers after subsequent close tags.\n while (loneMarkers.length > 0) {\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const ii = loneMarkers.pop()!;\n let jj = ii + 1;\n\n while (jj < state.tokens.length && state.tokens[jj].type === closeType) jj++;\n\n jj--;\n\n tk = state.tokens[jj];\n state.tokens[jj] = state.tokens[ii];\n state.tokens[ii] = tk;\n }\n };\n};\n\nconst createRuler2Handler =\n (\n postProcess: (state: StateInline, delimiters: Delimiter[]) => void,\n ): ((state: StateInline) => boolean) =>\n (state): boolean => {\n postProcess(state, state.delimiters);\n\n const tokensMeta = state.tokens_meta;\n const tokensMetaLength = tokensMeta.length;\n\n for (let ii = 0; ii < tokensMetaLength; ii++) {\n const tokenMeta = tokensMeta[ii];\n\n // oxlint-disable-next-line typescript/strict-boolean-expressions\n if (tokenMeta?.delimiters.length) postProcess(state, tokenMeta.delimiters);\n }\n\n return true;\n };\n\nexport const inlineRule: PluginWithOptions<InlineRuleOptions> = (md, options) => {\n if (\n !options ||\n typeof options.marker !== \"string\" ||\n typeof options.token !== \"string\" ||\n typeof options.tag !== \"string\"\n ) {\n throw new Error(\n \"Invalid options for inlineRule plugin: 'marker', 'token', and 'tag' are required string properties.\",\n );\n }\n\n const { marker, tag, token, attrs, nested = false, placement = \"after-emphasis\" } = options;\n\n if (marker.length !== 1)\n throw new Error(\"Invalid marker for inlineRule plugin: 'marker' must be a single character.\");\n\n const double = nested ? true : (options?.double ?? false);\n const allowSpace = nested ? false : ((options as { allowSpace?: boolean })?.allowSpace ?? false);\n\n const markerCode = marker.charCodeAt(0);\n const markup = double ? marker + marker : marker;\n const ruleName = `${token}_${marker}`;\n const isBefore = placement === \"before-emphasis\";\n\n if (nested) {\n const tokenize = createNestedTokenize(markerCode);\n const postProcess = createNestedPostProcess({\n markerCode,\n tag,\n token,\n markup,\n attrs,\n });\n const ruler2Handler = createRuler2Handler(postProcess);\n\n if (isBefore) {\n md.inline.ruler.before(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.before(\"emphasis\", ruleName, ruler2Handler);\n } else {\n md.inline.ruler.after(\"emphasis\", ruleName, tokenize);\n md.inline.ruler2.after(\"emphasis\", ruleName, ruler2Handler);\n }\n } else {\n const rule = createLinearRule({\n markerCode,\n tag,\n token,\n markup,\n allowSpace,\n attrs,\n });\n\n if (isBefore) md.inline.ruler.before(\"emphasis\", ruleName, rule);\n else md.inline.ruler.after(\"emphasis\", ruleName, rule);\n }\n};\n"],"mappings":"2CAQA,MAAM,EAAmC,sBAWnC,EAAoB,GAAyC,CACjE,GAAM,CAAE,aAAY,MAAK,QAAO,SAAQ,aAAY,SAAU,EACxD,EAAe,EAAO,OAE5B,OAAQ,EAAO,IAAoB,CACjC,IAAM,EAAM,EAAM,OACZ,EAAQ,EAAM,IAMpB,GAJI,EAAM,IAAI,WAAW,EAAM,GAAK,GAAc,GAAU,EAAQ,EAAI,GAAgB,GAIpF,IAAiB,GAAK,EAAM,IAAI,WAAW,EAAQ,EAAE,GAAK,EAAY,MAAO,GAEjF,EAAM,IAAM,EAAQ,EAEpB,IAAI,EAAQ,GAEZ,KAAO,EAAM,KAAO,EAAM,GAAc,CACtC,GACE,EAAM,IAAI,WAAW,EAAM,IAAI,GAAK,IACnC,IAAiB,GAAK,EAAM,IAAI,WAAW,EAAM,IAAM,EAAE,GAAK,GAC/D,CACA,EAAQ,GACR,MAGF,EAAM,GAAG,OAAO,UAAU,EAAM,CAGlC,GAAI,CAAC,GAAS,EAAQ,IAAiB,EAAM,IAG3C,MAFA,GAAM,IAAM,EAEL,GAGT,IAAM,EAAU,EAAM,IAAI,MAAM,EAAQ,EAAc,EAAM,IAAI,CAGhE,GAAI,CAAC,GAAc,EAAiC,KAAK,EAAQ,CAG/D,MAFA,GAAM,IAAM,EAEL,GAIT,EAAM,OAAS,EAAM,IACrB,EAAM,IAAM,EAAQ,EAEpB,IAAM,EAAY,EAAM,KAAK,GAAG,EAAM,OAAQ,EAAK,EAAE,CAErD,EAAU,OAAS,EACf,IAAO,EAAU,MAAQ,GAE7B,IAAM,EAAY,EAAM,KAAK,OAAQ,GAAI,EAAE,CAE3C,EAAU,QAAU,EAAQ,QAAQ,EAAa,KAAK,CAEtD,IAAM,EAAa,EAAM,KAAK,GAAG,EAAM,QAAS,EAAK,GAAG,CAOxD,MALA,GAAW,OAAS,EAEpB,EAAM,IAAM,EAAM,OAAS,EAC3B,EAAM,OAAS,EAER,KAIL,EACH,IACA,EAAO,IAAoB,CAC1B,IAAM,EAAQ,EAAM,IACd,EAAS,EAAM,IAAI,WAAW,EAAM,CAE1C,GAAI,GAAU,IAAW,EAAY,MAAO,GAE5C,IAAM,EAAU,EAAM,WAAW,EAAM,IAAK,GAAK,CAC7C,CAAE,UAAW,EAEjB,GAAI,EAAS,EAAG,MAAO,GAEvB,IAAM,EAAa,OAAO,aAAa,EAAO,CAE9C,GAAI,EAAS,EAAG,CACd,IAAM,EAAY,EAAM,KAAK,OAAQ,GAAI,EAAE,CAE3C,EAAU,QAAU,EACpB,IAGF,IAAK,IAAI,EAAK,EAAG,EAAK,EAAQ,GAAM,EAAG,CACrC,IAAM,EAAY,EAAM,KAAK,OAAQ,GAAI,EAAE,CAE3C,EAAU,QAAU,EAAa,GAE7B,EAAQ,UAAY,EAAQ,YAC9B,EAAM,WAAW,KAAK,CACpB,OAAQ,EACR,OAAQ,EACR,MAAO,EAAM,OAAO,OAAS,EAC7B,IAAK,GACL,KAAM,EAAQ,SACd,MAAO,EAAQ,UAChB,CAAC,CAMN,MAFA,GAAM,KAAO,EAAQ,OAEd,IAWL,EACJ,GAC4D,CAC5D,GAAM,CAAE,aAAY,MAAK,QAAO,SAAQ,SAAU,EAC5C,EAAY,GAAG,EAAM,QAE3B,OAAQ,EAAO,IAAqB,CAClC,IAAI,EACE,EAAwB,EAAE,CAC1B,EAAM,EAAW,OAEvB,IAAK,IAAI,EAAK,EAAG,EAAK,EAAK,IAAM,CAC/B,IAAM,EAAa,EAAW,GAE9B,GAAI,EAAW,SAAW,GAAc,EAAW,MAAQ,GAAI,CAC7D,IAAM,EAAW,EAAW,EAAW,KAEvC,EAAK,EAAM,OAAO,EAAW,OAC7B,EAAG,KAAO,GAAG,EAAM,OACnB,EAAG,IAAM,EACT,EAAG,QAAU,EACb,EAAG,OAAS,EACZ,EAAG,QAAU,GACT,IAAO,EAAG,MAAQ,GAEtB,EAAK,EAAM,OAAO,EAAS,OAC3B,EAAG,KAAO,EACV,EAAG,IAAM,EACT,EAAG,QAAU,GACb,EAAG,OAAS,EACZ,EAAG,QAAU,GAGb,EAAS,IAAM,GACf,EAAW,IAAM,GAGf,EAAM,OAAO,EAAS,MAAQ,GAAG,OAAS,QAC1C,EAAM,OAAO,EAAS,MAAQ,GAAG,UAAY,OAAO,aAAa,EAAW,EAE5E,EAAY,KAAK,EAAS,MAAQ,EAAE,EAQ1C,KAAO,EAAY,OAAS,GAAG,CAE7B,IAAM,EAAK,EAAY,KAAK,CACxB,EAAK,EAAK,EAEd,KAAO,EAAK,EAAM,OAAO,QAAU,EAAM,OAAO,GAAI,OAAS,GAAW,IAExE,IAEA,EAAK,EAAM,OAAO,GAClB,EAAM,OAAO,GAAM,EAAM,OAAO,GAChC,EAAM,OAAO,GAAM,KAKnB,EAEF,GAED,GAAmB,CAClB,EAAY,EAAO,EAAM,WAAW,CAEpC,IAAM,EAAa,EAAM,YACnB,EAAmB,EAAW,OAEpC,IAAK,IAAI,EAAK,EAAG,EAAK,EAAkB,IAAM,CAC5C,IAAM,EAAY,EAAW,GAGzB,GAAW,WAAW,QAAQ,EAAY,EAAO,EAAU,WAAW,CAG5E,MAAO,IAGE,GAAoD,EAAI,IAAY,CAC/E,GACE,CAAC,GACD,OAAO,EAAQ,QAAW,UAC1B,OAAO,EAAQ,OAAU,UACzB,OAAO,EAAQ,KAAQ,SAEvB,MAAU,MACR,sGACD,CAGH,GAAM,CAAE,SAAQ,MAAK,QAAO,QAAO,SAAS,GAAO,YAAY,kBAAqB,EAEpF,GAAI,EAAO,SAAW,EACpB,MAAU,MAAM,6EAA6E,CAE/F,IAAM,EAAS,EAAS,GAAQ,GAAS,QAAU,GAC7C,EAAa,EAAS,GAAU,GAAsC,YAAc,GAEpF,EAAa,EAAO,WAAW,EAAE,CACjC,EAAS,EAAS,EAAS,EAAS,EACpC,EAAW,GAAG,EAAM,GAAG,IACvB,EAAW,IAAc,kBAE/B,GAAI,EAAQ,CACV,IAAM,EAAW,EAAqB,EAAW,CAQ3C,EAAgB,EAPF,EAAwB,CAC1C,aACA,MACA,QACA,SACA,QACD,CAAC,CACoD,CAElD,GACF,EAAG,OAAO,MAAM,OAAO,WAAY,EAAU,EAAS,CACtD,EAAG,OAAO,OAAO,OAAO,WAAY,EAAU,EAAc,GAE5D,EAAG,OAAO,MAAM,MAAM,WAAY,EAAU,EAAS,CACrD,EAAG,OAAO,OAAO,MAAM,WAAY,EAAU,EAAc,MAExD,CACL,IAAM,EAAO,EAAiB,CAC5B,aACA,MACA,QACA,SACA,aACA,QACD,CAAC,CAEE,EAAU,EAAG,OAAO,MAAM,OAAO,WAAY,EAAU,EAAK,CAC3D,EAAG,OAAO,MAAM,MAAM,WAAY,EAAU,EAAK"} |
+2
-2
| { | ||
| "name": "@mdit/plugin-inline-rule", | ||
| "version": "0.23.1", | ||
| "version": "0.23.2", | ||
| "description": "Unified inline syntax factory plugin for MarkdownIt", | ||
@@ -44,3 +44,3 @@ "keywords": [ | ||
| "@types/markdown-it": "^14.1.2", | ||
| "@mdit/helper": "0.23.1" | ||
| "@mdit/helper": "0.23.2" | ||
| }, | ||
@@ -47,0 +47,0 @@ "peerDependencies": { |
| {"version":3,"file":"index.d.ts","names":[],"sources":["../src/options.ts","../src/plugin.ts"],"mappings":";;;;;;;;UAKU,qBAAA;EAAA;;;;;;;;AA8EV;;;;;EAhEE,MAAA;;;;;AAwGF;;;;;;;EA3FE,GAAA;;;AAwIF;;;;;;;;ACwDA;EDnLE,KAAA;;;;;;;;;;;;EAaA,KAAA;;;;;;;;EASA,SAAA;AAAA;;;;;;;;;;;;;;UAgBe,0BAAA,SAAmC,qBAAA;;;;EAIlD,MAAA;;;;;;;;EASA,MAAA;;;;;;;;EASA,UAAA;AAAA;;;;;;;;;;;;;;;;UAkBe,uBAAA,SAAgC,qBAAA;EAC/C,MAAA;;;;;;;;;;;;;EAcA,MAAA;;EAGA,UAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;KA2BU,iBAAA,GAAoB,0BAAA,GAA6B,uBAAA;;;cCwDhD,UAAA,EAAY,iBAAA,CAAkB,iBAAA"} |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
37170
-1.27%7
-12.5%+ Added
- Removed
Updated