🚨 Active Supply Chain Attack:node-ipc Package Compromised.Learn More
Socket
Book a DemoSign in
Socket

@mdit/plugin-inline-rule

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mdit/plugin-inline-rule - npm Package Compare versions

Comparing version
0.23.1
to
0.23.2
+1
-1
dist/cdn.umd.js.map

@@ -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(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`\"`,`&quot;`).replaceAll(`'`,`&#39;`),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(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`\"`,`&quot;`).replaceAll(`'`,`&#39;`),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":"4RAEkC,OAAO,GAAG,MAF5C,IAEqN,EAAE,8CCMjN,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,QAAQA,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,kBAGsD,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"}

@@ -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":"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"}
{
"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"}