@mirrordown/mdit-attrs 0.2.0 → 0.2.1

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/CHANGELOG.md CHANGED
@@ -4,6 +4,13 @@
4
4
 
5
5
 
6
6
 
7
+
8
+ ## 0.2.1
9
+ <sub>2026-10-28</sub>
10
+
11
+ - *(patch)*
12
+ The rule for which blocks a line of its own is written in now comes from `@mirrordown/core`, shared with the caption plugins, instead of a copy in each package.
13
+
7
14
  ## 0.2.0
8
15
  <sub>2026-10-28</sub>
9
16
 
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ import { containersKept, itemColumns } from "@mirrordown/core";
1
2
  // src/helper/getAttrs.ts
2
3
  const CLASS_MARKER = 46;
3
4
  const ID_MARKER = 35;
@@ -246,47 +247,6 @@ const getMatchingOpeningToken = (tokens, index) => {
246
247
  }
247
248
  return null;
248
249
  };
249
- // src/helper/containers.ts
250
- /**
251
- * How many of `containers`, outermost first, a line is written in: a line that
252
- * lazily continues a paragraph has fewer `>` markers, or less indentation,
253
- * than the blocks around that paragraph. Tabs count as one column.
254
- */
255
- const containersKept = (line, containers) => {
256
- const prefix = /^[ \t>]*/.exec(line)?.[0] ?? "";
257
- const markers = prefix.split(">").length - 1;
258
- let kept = 0;
259
- for (const container of containers) {
260
- if (container.kind === "quote" ? markers < container.markers : prefix.length < container.column) break;
261
- kept++;
262
- }
263
- return kept;
264
- };
265
- /**
266
- * The columns the content of the list items opened on a line starts at, in
267
- * the order they open, as CommonMark reads a list marker: up to four spaces
268
- * after it belong to the marker, more start indented content one column after.
269
- */
270
- const itemColumns = (line) => {
271
- const columns = [];
272
- let pos = 0;
273
- for (;;) {
274
- while (line[pos] === " " || line[pos] === " ") pos++;
275
- if (line[pos] === ">") {
276
- pos++;
277
- continue;
278
- }
279
- const marker = /^(?:[-+*]|\d{1,9}[.)])(?=[ \t]|$)/.exec(line.slice(pos));
280
- if (!marker) return columns;
281
- const end = pos + marker[0].length;
282
- let spaces = 0;
283
- while (line[end + spaces] === " " || line[end + spaces] === " ") spaces++;
284
- const column = end + spaces === line.length || spaces > 4 ? end + 1 : end + spaces;
285
- columns.push(column);
286
- if (spaces > 4) return columns;
287
- pos = column;
288
- }
289
- };
290
250
  // src/rules/block.ts
291
251
  const SKIP_TYPES = /* @__PURE__ */ new Set([
292
252
  "code_inline",
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/helper/getAttrs.ts","../src/helper/addAttrs.ts","../src/helper/getDelimiterChecker.ts","../src/helper/testRule.ts","../src/helper/getMatchingOpeningToken.ts","../src/helper/containers.ts","../src/rules/block.ts","../src/rules/inline.ts","../src/rules/fence.ts","../src/rules/heading.ts","../src/rules/hr.ts","../src/rules/list.ts","../src/rules/softbreak.ts","../src/rules/table.ts","../src/rules/rules.ts","../src/plugin.ts"],"sourcesContent":["import type { Attr, DelimiterRange } from \"../types.js\";\n\nconst CLASS_MARKER = 46; // '.'\nconst ID_MARKER = 35; // '#'\nconst PAIR_SEPARATOR = 32; // ' '\nconst KEY_SEPARATOR = 61; // '='\nconst QUOTE_MARKER = 34; // '\"'\n\nconst DISALLOWED_KEY_CHARS = new Set([9, 10, 12, 32, 47, 62, 34, 39, 61]);\n\nexport const getAttrs = (\n str: string,\n range: DelimiterRange,\n allowed: Array<string | RegExp>\n): Attr[] => {\n let key = \"\";\n let value = \"\";\n let parsingKey = true;\n let valueInsideQuotes = false;\n const attrs: Attr[] = [];\n\n for (let i = range[0]; i < range[1]; i++) {\n const code = str.charCodeAt(i);\n\n if (code === KEY_SEPARATOR && parsingKey) {\n parsingKey = false;\n continue;\n }\n\n if (code === CLASS_MARKER && key === \"\") {\n key =\n str.charCodeAt(i + 1) === CLASS_MARKER ? (i++, \"css-module\") : \"class\";\n parsingKey = false;\n continue;\n }\n\n if (code === ID_MARKER && key === \"\") {\n key = \"id\";\n parsingKey = false;\n continue;\n }\n\n if (code === QUOTE_MARKER) {\n if (value === \"\" && !valueInsideQuotes) {\n valueInsideQuotes = true;\n } else if (valueInsideQuotes) {\n valueInsideQuotes = false;\n }\n continue;\n }\n\n if (code === PAIR_SEPARATOR && !valueInsideQuotes) {\n if (key !== \"\") {\n attrs.push([key, value]);\n key = \"\";\n value = \"\";\n parsingKey = true;\n }\n continue;\n }\n\n if (parsingKey) {\n if (!DISALLOWED_KEY_CHARS.has(code)) key += str[i];\n } else {\n value += str[i];\n }\n }\n\n if (key !== \"\") attrs.push([key, value]);\n\n if (allowed.length === 0) return attrs;\n return attrs.filter(([attr]) =>\n allowed.some((item) =>\n item instanceof RegExp ? item.test(attr) : item === attr\n )\n );\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterRange } from \"../types.js\";\nimport { getAttrs } from \"./getAttrs.js\";\n\nexport const addAttrs = (\n token: Token,\n content: string,\n range: DelimiterRange,\n allowed: Array<string | RegExp>\n): void => {\n for (const [key, value] of getAttrs(content, range, allowed)) {\n if (key === \"class\" || key === \"css-module\") {\n token.attrJoin(key, value);\n } else {\n token.attrPush([key, value]);\n }\n }\n};\n","import type { DelimiterRange } from \"../types.js\";\n\ntype DelimiterPosition = \"start\" | \"end\" | \"only\";\n\nexport type DelimiterChecker = (\n str: string,\n pos: DelimiterPosition\n) => DelimiterRange | null;\n\n/**\n * Returns a function that checks whether `str` contains a valid attribute\n * block at the given position (\"start\", \"end\", or \"only\") and returns the\n * [start, end] range of the content inside the delimiters, or null if no\n * match. The returned range is exclusive of the delimiter characters.\n *\n * A valid block must contain at least one character (i.e. `{}` is invalid),\n * and the outer delimiters must not be repeated (i.e. `{{}}` is invalid).\n */\nexport const getDelimiterChecker = (\n left: string,\n right: string\n): DelimiterChecker => {\n const ll = left.length;\n const rl = right.length;\n const minLen = ll + 1 + rl;\n const doubleLeft = left + left;\n const doubleRight = right + right;\n\n return (str, pos): DelimiterRange | null => {\n if (str.length < minLen) return null;\n\n if (pos === \"start\" || pos === \"only\") {\n if (!str.startsWith(left)) return null;\n if (str.startsWith(doubleLeft)) return null;\n }\n\n if (pos === \"end\" || pos === \"only\") {\n if (!str.endsWith(right)) return null;\n if (str.endsWith(doubleRight)) return null;\n }\n\n if (pos === \"only\") {\n const contentEnd = str.length - rl;\n if (contentEnd <= ll) return null;\n // `{.a} {#b}` is text followed by a block, as \"end\" reads it, not one block.\n if (str.lastIndexOf(left, contentEnd - 1) !== 0) return null;\n return [ll, contentEnd];\n }\n\n if (pos === \"start\") {\n const end = str.indexOf(right, ll + 1);\n if (end === -1) return null;\n return [ll, end];\n }\n\n // pos === \"end\"\n const start = str.lastIndexOf(left, str.length - rl - 1);\n if (start === -1) return null;\n if (start >= ll && str.startsWith(left, start - ll)) return null;\n return [start + ll, str.length - rl];\n };\n};\n","// Token.meta is typed `any` by markdown-it; casts bridge to our richer rule-test predicates.\n/* oxlint-disable typescript/no-unsafe-type-assertion */\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterRange } from \"../types.js\";\nimport type { DelimiterChecker } from \"./getDelimiterChecker.js\";\n\nexport interface RuleTest {\n /** Offset from the current token index. Mutually exclusive with `position`. */\n shift?: number;\n /** Absolute token index. Mutually exclusive with `shift`. */\n position?: number;\n /** Token type must equal this string. */\n type?: string | ((t: string) => boolean);\n /** Token tag must equal this string. */\n tag?: string;\n /** Token nesting must equal this value. */\n nesting?: number | ((n: number) => boolean);\n /** Inspect token content; called with (content, token, tokens, index). */\n content?: string | ((c: string) => boolean);\n /** Inspect token.meta; predicate receives the meta object (may be null). */\n meta?: (meta: Record<string, unknown> | null) => boolean;\n /** Inspect a child token at the given index (negative = from end). */\n children?: Array<Omit<RuleTest, \"shift\" | \"position\"> & { index?: number }>;\n /** If set, use this delimiter checker to extract a range from token content. */\n attrChecker?: DelimiterChecker;\n /** Which position argument to pass to attrChecker (\"start\"|\"end\"|\"only\"). */\n attrPos?: \"start\" | \"end\" | \"only\";\n}\n\nexport interface TestResult {\n match: boolean;\n position: number | null;\n range: DelimiterRange | null;\n}\n\nconst matches = (test: unknown, actual: unknown): boolean => {\n if (typeof test === \"function\")\n return (test as (v: unknown) => boolean)(actual);\n return test === actual;\n};\n\nconst testChild = (\n child: Token,\n childTest: Omit<RuleTest, \"shift\" | \"position\">\n): { match: boolean; range: DelimiterRange | null } => {\n let range: DelimiterRange | null = null;\n\n if (childTest.type !== undefined && !matches(childTest.type, child.type)) {\n return { match: false, range: null };\n }\n if (\n childTest.nesting !== undefined &&\n !matches(childTest.nesting, child.nesting)\n ) {\n return { match: false, range: null };\n }\n if (childTest.tag !== undefined && child.tag !== childTest.tag) {\n return { match: false, range: null };\n }\n if (childTest.content !== undefined) {\n if (!matches(childTest.content, child.content))\n return { match: false, range: null };\n }\n if (childTest.attrChecker) {\n range = childTest.attrChecker(child.content, childTest.attrPos ?? \"only\");\n if (!range) return { match: false, range: null };\n }\n\n return { match: true, range };\n};\n\nexport const testRule = (\n tokens: Token[],\n index: number,\n test: RuleTest\n): TestResult => {\n let tokenIndex: number;\n if (test.position !== undefined) {\n tokenIndex =\n test.position < 0 ? tokens.length + test.position : test.position;\n } else {\n tokenIndex = index + (test.shift ?? 0);\n }\n\n const token = tokens[tokenIndex];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!token) return { match: false, position: null, range: null };\n\n let range: DelimiterRange | null = null;\n\n if (test.type !== undefined && !matches(test.type, token.type)) {\n return { match: false, position: null, range: null };\n }\n if (test.nesting !== undefined && !matches(test.nesting, token.nesting)) {\n return { match: false, position: null, range: null };\n }\n if (test.tag !== undefined && token.tag !== test.tag) {\n return { match: false, position: null, range: null };\n }\n if (test.content !== undefined && !matches(test.content, token.content)) {\n return { match: false, position: null, range: null };\n }\n if (\n test.meta !== undefined &&\n !test.meta((token.meta as Record<string, unknown> | null) ?? null)\n ) {\n return { match: false, position: null, range: null };\n }\n if (test.attrChecker) {\n range = test.attrChecker(token.content, test.attrPos ?? \"only\");\n if (!range) return { match: false, position: null, range: null };\n }\n\n if (test.children) {\n const children = token.children ?? [];\n for (const childTest of test.children) {\n const idx =\n childTest.index !== undefined\n ? childTest.index < 0\n ? children.length + childTest.index\n : childTest.index\n : -1;\n\n if (idx >= 0) {\n const child = children[idx];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!child) return { match: false, position: null, range: null };\n const result = testChild(child, childTest);\n if (!result.match) return { match: false, position: null, range: null };\n if (result.range) range = result.range;\n } else {\n // No index: find any matching child\n const found = children.some((child) => {\n const result = testChild(child, childTest);\n if (result.range) range = result.range;\n return result.match;\n });\n if (!found) return { match: false, position: null, range: null };\n }\n }\n }\n\n return { match: true, position: tokenIndex, range };\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\n\n/**\n * Given a closing or self-closing token at `index`, returns its matching\n * opening token by walking backwards to find the token of the same type at\n * the same nesting level. Returns the token itself for nesting === 0.\n */\nexport const getMatchingOpeningToken = (\n tokens: Token[],\n index: number\n): Token | null => {\n const token = tokens[index];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!token) return null;\n if (token.type === \"softbreak\") return null;\n if (token.nesting === 0) return token;\n\n const target = token.type.replace(/_close$/, \"_open\");\n let depth = 0;\n\n for (let i = index; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === token.type) depth++;\n else if (t.type === target) {\n depth--;\n if (depth === 0) return t;\n }\n }\n\n return null;\n};\n","/**\n * A block a line can be written in, outermost first: a blockquote, by how many\n * `>` markers lead up to its own, or a list item, by the column its content\n * starts at.\n */\nexport type LineContainer =\n | { kind: \"quote\"; markers: number }\n | { kind: \"item\"; column: number };\n\n/**\n * How many of `containers`, outermost first, a line is written in: a line that\n * lazily continues a paragraph has fewer `>` markers, or less indentation,\n * than the blocks around that paragraph. Tabs count as one column.\n */\nexport const containersKept = (\n line: string,\n containers: readonly LineContainer[]\n): number => {\n const prefix = /^[ \\t>]*/.exec(line)?.[0] ?? \"\";\n const markers = prefix.split(\">\").length - 1;\n let kept = 0;\n for (const container of containers) {\n if (\n container.kind === \"quote\"\n ? markers < container.markers\n : prefix.length < container.column\n )\n break;\n kept++;\n }\n return kept;\n};\n\n/**\n * The columns the content of the list items opened on a line starts at, in\n * the order they open, as CommonMark reads a list marker: up to four spaces\n * after it belong to the marker, more start indented content one column after.\n */\nexport const itemColumns = (line: string): number[] => {\n const columns: number[] = [];\n let pos = 0;\n for (;;) {\n while (line[pos] === \" \" || line[pos] === \"\\t\") pos++;\n if (line[pos] === \">\") {\n pos++;\n continue;\n }\n const marker = /^(?:[-+*]|\\d{1,9}[.)])(?=[ \\t]|$)/.exec(line.slice(pos));\n if (!marker) return columns;\n const end = pos + marker[0].length;\n let spaces = 0;\n while (line[end + spaces] === \" \" || line[end + spaces] === \"\\t\") spaces++;\n const column =\n end + spaces === line.length || spaces > 4 ? end + 1 : end + spaces;\n columns.push(column);\n if (spaces > 4) return columns;\n pos = column;\n }\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport {\n addAttrs,\n getDelimiterChecker,\n getMatchingOpeningToken\n} from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\n// Token types that should not be treated as attr targets\nconst SKIP_TYPES = new Set([\n \"code_inline\",\n \"math_inline\",\n \"fence\",\n \"code_block\"\n]);\n\nexport const createBlockRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"block attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n // Find the block-level opening token that contains this inline\n // Walk backwards: skip the paragraph_open immediately before, then\n // look for the outermost open that wraps this inline token.\n let openToken = null;\n\n // First: find the _close token that closes the block containing this inline\n // by walking forward from the inline's position\n let closeIdx = index + 1;\n while (closeIdx < tokens.length && tokens[closeIdx].nesting !== -1) {\n closeIdx++;\n }\n\n if (closeIdx < tokens.length) {\n openToken = getMatchingOpeningToken(tokens, closeIdx);\n }\n\n if (!openToken) return;\n if (SKIP_TYPES.has(openToken.type)) return;\n\n addAttrs(openToken, content, range, options.allowed);\n\n // Strip the attr block from the last child's content\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n\n // Drop the child if now empty\n if (lastChild.content === \"\" && children.length > 1) {\n children.pop();\n }\n }\n };\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createInlineRules = (options: DelimiterConfig): AttrRule[] => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // Blocks that open the text right after an element go on it, and the text\n // after them stays, as in markdown-it-attrs.\n const takeLeadingAttrs = (\n target: Token,\n children: Token[],\n i: number\n ): void => {\n const child = children[i];\n let content = child.content;\n let range = check(content, \"start\");\n while (range) {\n addAttrs(target, content, range, options.allowed);\n content = content.slice(range[1] + options.right.length);\n range = check(content, \"start\");\n }\n if (content) child.content = content;\n else children.splice(i, 1);\n };\n\n // Handles self-closing inline elements that render attributes: `code` and\n // images. Other nesting-0 tokens (hard breaks, raw HTML) drop attributes when\n // rendered, so they are left for the end-of-block rule, as in markdown-it-attrs.\n const selfClose: AttrRule = {\n name: \"inline nesting self-close\",\n tests: [{ shift: 0, type: \"inline\" }],\n transform(tokens, index) {\n const token = tokens[index];\n const children = token.children!;\n let modified = false;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (child.type !== \"text\") continue;\n\n if (!check(child.content, \"start\")) continue;\n\n const prev = children[i - 1];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (prev?.type !== \"image\" && prev?.type !== \"code_inline\") continue;\n\n takeLeadingAttrs(prev, children, i);\n modified = true;\n }\n\n return modified;\n }\n };\n\n // Handles closing inline elements: em, strong, s, etc. (nesting === -1)\n const closing: AttrRule = {\n name: \"inline attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\"\n }\n ],\n transform(tokens, index) {\n const token = tokens[index];\n const children = token.children!;\n let modified = false;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (child.type !== \"text\") continue;\n\n if (!check(child.content, \"start\")) continue;\n\n // The preceding sibling must be a closing tag (nesting === -1)\n const prev = children[i - 1];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!prev || prev.nesting !== -1) continue;\n\n // Find the matching opening token among children\n const openType = prev.type.replace(/_close$/, \"_open\");\n let openIdx = -1;\n for (let j = i - 2; j >= 0; j--) {\n if (\n children[j].type === openType &&\n children[j].level === prev.level\n ) {\n openIdx = j;\n break;\n }\n }\n if (openIdx === -1) continue;\n\n takeLeadingAttrs(children[openIdx], children, i);\n modified = true;\n }\n\n return modified;\n }\n };\n\n return [selfClose, closing];\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createFenceRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"fence attributes\",\n tests: [\n {\n shift: 0,\n type: \"fence\"\n }\n ],\n transform(tokens, index) {\n const token = tokens[index];\n const info = token.info.trim();\n const range = check(info, \"end\") ?? check(info, \"only\");\n if (!range) return;\n addAttrs(token, info, range, options.allowed);\n // Strip the attr block from the info string, preserving the language tag\n token.info = info\n .slice(0, info.lastIndexOf(options.left, range[0] - 1))\n .trimEnd();\n // markdown-it's fence renderer appends the language class to an existing\n // `class` attribute but otherwise adds `class` last. Reserve the slot\n // first, so `class` leads as it does in remd (mdast-util-to-hast creates\n // the language class before applying attributes, and a remark plugin\n // cannot reorder it). The renderer wrapper trims the leading space.\n if (token.info && token.attrIndex(\"class\") < 0) {\n token.attrs = [[\"class\", \"\"], ...(token.attrs ?? [])];\n token.meta = { ...token.meta, attrsReservedClass: true };\n }\n }\n };\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createHeadingRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"heading attributes\",\n // Anchored on the inline token, so the inline rules see it first and an\n // element ending the heading (`**b**{.x}`) takes the block.\n tests: [\n {\n shift: -1,\n type: \"heading_open\"\n },\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n }\n ],\n transform(tokens, index) {\n const openToken = tokens[index - 1];\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n\n const content = lastChild.content;\n const trimmed = content.trimEnd();\n const range = check(trimmed, \"end\")!;\n\n addAttrs(openToken, trimmed, range, options.allowed);\n\n // Strip the attr block from the last child content\n const before = trimmed.slice(\n 0,\n trimmed.lastIndexOf(options.left, range[0] - 1)\n );\n lastChild.content = before.trimEnd();\n\n // Drop the child entirely if it's now empty\n if (lastChild.content === \"\" && children.length > 1) {\n children.pop();\n }\n }\n };\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createHrRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"hr attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -2,\n type: \"hr\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const textChild = inline.children![0];\n const content = textChild.content.trim();\n const range = check(content, \"only\")!;\n\n const hr = tokens[index - 2];\n addAttrs(hr, content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createListRules = (options: DelimiterConfig): AttrRule[] => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // Rule 1: attrs at end of a list item inline \"- item{.red}\"\n // Structure: list_item_open(-2) paragraph_open(-1) inline(0)\n const listItemEnd: AttrRule = {\n name: \"list item end\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: \"list_item_open\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const listItemOpen = tokens[index - 2];\n addAttrs(listItemOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 1b (generic): attrs at end of a custom item title inline\n // Matches when the open token two before the inline has meta.attrsRole === \"containerItem\"\n // and the token one before has meta.attrsItemTitle === true.\n // Third-party plugins opt in by setting these meta fields on their tokens.\n const customItemEnd: AttrRule = {\n name: \"custom item end\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n meta: (m) => m?.attrsItemTitle === true\n },\n {\n shift: -2,\n meta: (m) => m?.attrsRole === \"containerItem\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const itemOpen = tokens[index - 2];\n addAttrs(itemOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 1c (direct): attrs at end of a custom item inline where the open token\n // itself carries both attrsRole === \"containerItem\" AND attrsItemTitle === true.\n // Matches dt_open → inline (no intermediate title token).\n const customItemEndDirect: AttrRule = {\n name: \"custom item end direct\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n meta: (m: Record<string, unknown> | null) =>\n m?.attrsItemTitle === true && m.attrsRole === \"containerItem\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const itemOpen = tokens[index - 1];\n addAttrs(itemOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 2: attrs on own paragraph after bullet/ordered list close → apply to list\n // Structure: bullet_list_close(-2) paragraph_open(-1) inline(0) paragraph_close(+1)\n const listAttr: AttrRule = {\n name: \"list attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: (t: string) =>\n t === \"bullet_list_close\" || t === \"ordered_list_close\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const textChild = children[0];\n const content = textChild.content.trim();\n const range = check(content, \"only\")!;\n\n // Find the matching list_open for the close token at index-2\n const closeToken = tokens[index - 2];\n const openType = closeToken.type.replace(\"_close\", \"_open\");\n\n let depth = 1;\n let listOpenIdx = -1;\n for (let i = index - 3; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === closeToken.type) depth++;\n else if (t.type === openType) {\n depth--;\n if (depth === 0) {\n listOpenIdx = i;\n break;\n }\n }\n }\n\n if (listOpenIdx === -1) return;\n addAttrs(tokens[listOpenIdx], content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n\n // Rule 2b (generic): attrs on own paragraph after a custom container close → apply to container open\n // Matches when the close token two before the paragraph has meta.attrsRole === \"container\".\n // Third-party plugins opt in by setting meta.attrsRole = \"container\" on their open/close tokens.\n const customListAttr: AttrRule = {\n name: \"custom list attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: (t: string) => t.endsWith(\"_close\"),\n meta: (m) => m?.attrsRole === \"container\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const textChild = children[0];\n const content = textChild.content.trim();\n const range = check(content, \"only\")!;\n\n // Walk back to find the matching open token (same type with _open suffix)\n const closeToken = tokens[index - 2];\n const openType = closeToken.type.replace(\"_close\", \"_open\");\n\n let depth = 1;\n let listOpenIdx = -1;\n for (let i = index - 3; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === closeToken.type) depth++;\n else if (t.type === openType) {\n depth--;\n if (depth === 0) {\n listOpenIdx = i;\n break;\n }\n }\n }\n\n if (listOpenIdx === -1) return;\n addAttrs(tokens[listOpenIdx], content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n\n return [\n listItemEnd,\n customItemEnd,\n customItemEndDirect,\n listAttr,\n customListAttr\n ];\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterConfig } from \"../types.js\";\nimport {\n addAttrs,\n containersKept,\n getDelimiterChecker,\n itemColumns\n} from \"../helper/index.js\";\nimport type { LineContainer } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\n/** A container the line holding an attribute block can be written in. */\ninterface Container {\n open: Token;\n /** The token the block goes on when the line is written outside the container. */\n target: Token;\n line: LineContainer;\n}\n\nexport const createSoftbreakRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // A block on a line of its own, ending a paragraph or setext heading after a\n // soft or hard break, goes on the block that ends right before it at the\n // level the line is written, as kramdown places a block IAL: the paragraph\n // (its list item, in a tight list), or, for a line lazily written outside\n // some of the blockquotes and list items around it, the outermost of those it\n // leaves (a list item's list). markdown-it-attrs can't tell those levels\n // apart, as the token stream drops the line's indentation; the source keeps it.\n return {\n name: \"softbreak attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -2,\n type: (type: string) => type === \"softbreak\" || type === \"hardbreak\"\n },\n {\n index: -1,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n }\n ],\n transform(tokens, index, _position, _range, src) {\n const inline = tokens[index];\n const children = inline.children!;\n const content = children[children.length - 1].content.trim();\n const range = check(content, \"only\")!;\n\n // The blocks around the inline, innermost first, up to the first that\n // holds its own source (a panel tokenized from its body), which token\n // maps inside it index instead.\n const ancestors: Token[] = [];\n let source = src;\n let level = inline.level;\n for (let i = index - 1; i >= 0 && level > 0; i--) {\n const token = tokens[i];\n if (token.nesting !== 1 || token.level >= level) continue;\n level = token.level;\n const meta: unknown = token.meta;\n const own =\n typeof meta === \"object\" && meta !== null && \"attrsSource\" in meta\n ? meta.attrsSource\n : undefined;\n if (typeof own === \"string\") {\n source = own;\n break;\n }\n ancestors.push(token);\n }\n const block = ancestors.at(0);\n if (!block) return;\n\n const lines = source.split(\"\\n\");\n const containers: Container[] = [];\n let quotes = 0;\n for (let i = ancestors.length - 1; i >= 1; i--) {\n const open = ancestors[i];\n if (open.type === \"blockquote_open\") {\n containers.push({\n open,\n target: open,\n line: { kind: \"quote\", markers: ++quotes }\n });\n } else if (open.type === \"list_item_open\" && open.map) {\n // Items opened on the same line as this one, outside it, come first there.\n const before = containers.filter(\n (c) =>\n c.open.type === \"list_item_open\" &&\n c.open.map?.[0] === open.map![0]\n ).length;\n const column = itemColumns(lines[open.map[0]] ?? \"\").at(before);\n if (column === undefined) return;\n containers.push({\n open,\n target: ancestors.at(i + 1) ?? open,\n line: { kind: \"item\", column }\n });\n }\n }\n\n const line = inline.map ? (lines[inline.map[1] - 1] ?? \"\") : \"\";\n const kept = inline.map\n ? containersKept(\n line,\n containers.map((c) => c.line)\n )\n : containers.length;\n\n let target = block;\n if (kept < containers.length) target = containers[kept].target;\n // A tight list hides its paragraphs, so the item shows the attributes.\n else if (block.hidden && ancestors[1]?.type === \"list_item_open\")\n target = ancestors[1];\n addAttrs(target, content, range, options.allowed);\n\n // Remove the attr text, and a soft break before it; keep a hard break,\n // as markdown-it-attrs does.\n const isSoft = children[children.length - 2].type === \"softbreak\";\n children.splice(children.length - (isSoft ? 2 : 1), isSoft ? 2 : 1);\n }\n };\n};\n","// TableMeta lives on Token.meta which markdown-it types as any — casts narrow to the rule-specific shape.\n/* oxlint-disable typescript/no-unsafe-type-assertion */\nimport type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createTableRules = (options: DelimiterConfig): AttrRule[] => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // Rule 1: table-level attrs — standalone paragraph after the table \"\\n{.class}\"\n const tableAttrs: AttrRule = {\n name: \"table attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: \"table_close\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const content = inline.children![0].content.trim();\n const range = check(content, \"only\")!;\n\n // Find the matching table_open (start from table_close at index-2)\n let tableOpenIdx = -1;\n let depth = 1;\n for (let i = index - 3; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === \"table_close\") depth++;\n else if (t.type === \"table_open\") {\n depth--;\n if (depth === 0) {\n tableOpenIdx = i;\n break;\n }\n }\n }\n if (tableOpenIdx === -1) return;\n\n addAttrs(tokens[tableOpenIdx], content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n\n // Rule 2: table cell attrs — \"cell content {.class}\" inside td/th\n const tableCellAttrs: AttrRule = {\n name: \"table cell attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: (t: string) => t === \"td_open\" || t === \"th_open\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const cellOpen = tokens[index - 1];\n addAttrs(cellOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 3: track column count in thead (stored as metadata for rowspan/colspan calc)\n interface TableMeta {\n cols: number;\n rowspan: number[];\n }\n\n const colTracker: AttrRule = {\n name: \"table column tracker\",\n tests: [{ shift: 0, type: \"tr_open\" }],\n transform(tokens, index) {\n // Count th tokens in this row to know column count; stored on thead_open meta\n let cols = 0;\n for (let i = index + 1; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === \"tr_close\") break;\n if (t.type === \"th_open\") cols++;\n }\n if (cols === 0) return;\n\n // Find thead_open and store column count\n for (let i = index - 1; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === \"thead_open\") {\n t.meta = t.meta ?? {};\n (t.meta as TableMeta).cols = cols;\n break;\n }\n if (t.type === \"table_open\") break;\n }\n }\n };\n\n // Rule 4: colspan/rowspan calculation — remove phantom cells, adjust span values\n const spanCalc: AttrRule = {\n name: \"table span calculator\",\n tests: [{ shift: 0, type: \"tbody_open\" }],\n transform(tokens, index) {\n // Find matching thead_open to get column count\n let cols = 0;\n for (let i = index - 1; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === \"thead_open\") {\n cols = (t.meta as TableMeta | undefined)?.cols ?? 0;\n break;\n }\n if (t.type === \"table_open\") break;\n }\n if (cols === 0) return;\n\n // Find the tbody_close\n let tbodyClose = index + 1;\n let depth = 1;\n while (tbodyClose < tokens.length && depth > 0) {\n const t = tokens[tbodyClose];\n if (t.type === \"tbody_open\") depth++;\n else if (t.type === \"tbody_close\") depth--;\n tbodyClose++;\n }\n tbodyClose--;\n\n // Process each row within tbody\n const occupied: number[] = Array.from({ length: cols }, () => 0);\n\n let i = index + 1;\n while (i < tbodyClose) {\n const t = tokens[i];\n if (t.type === \"tr_open\") {\n // Decrement all occupied counts\n for (let c = 0; c < cols; c++) {\n if (occupied[c] > 0) occupied[c]--;\n }\n\n // Collect td tokens in this row\n const tdIndices: number[] = [];\n for (let j = i + 1; j < tbodyClose; j++) {\n if (tokens[j].type === \"tr_close\") break;\n if (tokens[j].type === \"td_open\") tdIndices.push(j);\n }\n\n // Assign cells to columns, skipping occupied ones\n let col = 0;\n let tdIdx = 0;\n\n while (col < cols && tdIdx < tdIndices.length) {\n // Skip occupied columns (from rowspan)\n while (col < cols && occupied[col] > 0) col++;\n if (col >= cols) break;\n\n const tdOpen = tokens[tdIndices[tdIdx]];\n const rowspanAttr = tdOpen.attrGet(\"rowspan\");\n const colspanAttr = tdOpen.attrGet(\"colspan\");\n const rowspan = rowspanAttr ? parseInt(rowspanAttr, 10) : 1;\n let colspan = colspanAttr ? parseInt(colspanAttr, 10) : 1;\n\n // Count how many consecutive free columns are available\n let freeCols = 0;\n for (let c = col; c < cols && occupied[c] === 0; c++) freeCols++;\n\n // Clamp colspan to available free columns\n if (colspan > freeCols) {\n colspan = freeCols;\n if (colspan === 1) {\n // Remove colspan attr if it resolved to 1 (keep as-is if explicitly set)\n // We keep it to match reference behavior: colspan=\"1\" is left on token\n }\n tdOpen.attrSet(\"colspan\", String(colspan));\n }\n\n // Mark columns occupied by this cell's rowspan\n for (let c = col; c < col + colspan && c < cols; c++) {\n if (rowspan > 1) occupied[c] = rowspan - 1;\n }\n\n col += colspan;\n tdIdx++;\n }\n\n // Remove phantom cells beyond assigned ones\n // (cells that were merged away by rowspan from a previous row)\n while (tdIdx < tdIndices.length) {\n const phantomStart = tdIndices[tdIdx];\n // Find the matching td_close\n let phantomEnd = phantomStart + 1;\n while (\n phantomEnd < tokens.length &&\n tokens[phantomEnd].type !== \"td_close\"\n ) {\n phantomEnd++;\n }\n tokens.splice(phantomStart, phantomEnd - phantomStart + 1);\n tbodyClose -= phantomEnd - phantomStart + 1;\n // Don't increment tdIdx since we just spliced\n }\n }\n i++;\n }\n }\n };\n\n return [tableAttrs, tableCellAttrs, colTracker, spanCalc];\n};\n","import type { AttrsOptions, AttrRuleName, DelimiterConfig } from \"../types.js\";\nimport type { AttrRule } from \"./types.js\";\nimport { createBlockRule } from \"./block.js\";\nimport { createInlineRules } from \"./inline.js\";\nimport { createFenceRule } from \"./fence.js\";\nimport { createHeadingRule } from \"./heading.js\";\nimport { createHrRule } from \"./hr.js\";\nimport { createListRules } from \"./list.js\";\nimport { createSoftbreakRule } from \"./softbreak.js\";\nimport { createTableRules } from \"./table.js\";\n\nconst ALL_RULE_NAMES: AttrRuleName[] = [\n \"fence\",\n \"inline\",\n \"table\",\n \"list\",\n \"heading\",\n \"hr\",\n \"softbreak\",\n \"block\"\n];\n\nconst ALL_RULE_SET = new Set<string>(ALL_RULE_NAMES);\n\nexport const createRules = (\n options: DelimiterConfig & Pick<AttrsOptions, \"rule\">\n): AttrRule[] => {\n const { rule = \"all\" } = options;\n\n let enabled: Set<string>;\n if (rule === \"all\" || rule === true) {\n enabled = ALL_RULE_SET;\n } else if (!rule || (Array.isArray(rule) && rule.length === 0)) {\n return [];\n } else {\n enabled = new Set(rule.filter((r) => ALL_RULE_SET.has(r)));\n }\n\n const rules: AttrRule[] = [];\n\n if (enabled.has(\"fence\")) rules.push(createFenceRule(options));\n if (enabled.has(\"inline\")) rules.push(...createInlineRules(options));\n // Before the list rules, so a list item's line of its own is placed before\n // the item reads a block ending its first line.\n if (enabled.has(\"softbreak\")) rules.push(createSoftbreakRule(options));\n if (enabled.has(\"table\")) rules.push(...createTableRules(options));\n if (enabled.has(\"list\")) rules.push(...createListRules(options));\n if (enabled.has(\"heading\")) rules.push(createHeadingRule(options));\n if (enabled.has(\"hr\")) rules.push(createHrRule(options));\n if (enabled.has(\"block\")) rules.push(createBlockRule(options));\n\n return rules;\n};\n","import type { PluginWithOptions } from \"markdown-it\";\nimport type { AttrsOptions, DelimiterRange } from \"./types.js\";\nimport { createRules } from \"./rules/index.js\";\nimport { testRule } from \"./helper/index.js\";\n\n/** markdown-it plugin for attribute lists (`{.class #id key=value}`) on elements. */\nexport const attrs: PluginWithOptions<AttrsOptions> = (\n md,\n { left = \"{\", right = \"}\", allowed = [], rule = \"all\" } = {}\n) => {\n const rules = createRules({ left, right, allowed, rule });\n\n // A fence whose class slot the fence rule reserved renders as\n // `class=\" language-x\"`; drop the leading space.\n const renderFence = md.renderer.rules.fence;\n if (renderFence) {\n md.renderer.rules.fence = (tokens, idx, opts, env, self): string => {\n const html = renderFence(tokens, idx, opts, env, self);\n return tokens[idx].meta?.attrsReservedClass\n ? html.replace(' class=\" ', ' class=\"')\n : html;\n };\n }\n\n md.core.ruler.before(\"linkify\", \"attrs\", (state) => {\n const { tokens } = state;\n\n for (let index = 0; index < tokens.length; index++) {\n for (let ruleIndex = 0; ruleIndex < rules.length; ruleIndex++) {\n const pattern = rules[ruleIndex];\n let position: number | null = null;\n let range: DelimiterRange | null = null;\n\n const match = pattern.tests.every((test) => {\n const result = testRule(tokens, index, test);\n if (result.position != null) position = result.position;\n if (result.range) range = result.range;\n return result.match;\n });\n\n if (match) {\n const modified = pattern.transform(\n tokens,\n index,\n position!,\n range!,\n state.src\n );\n\n if (\n modified !== false &&\n (pattern.name === \"inline attributes\" ||\n pattern.name === \"inline nesting self-close\")\n ) {\n ruleIndex--;\n }\n }\n }\n }\n });\n};\n"],"mappings":";AAEA,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AACtB,MAAM,eAAe;AAErB,MAAM,uCAAuB,IAAI,IAAI;CAAC;CAAG;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;CAAI;AAAE,CAAC;AAExE,MAAa,YACX,KACA,OACA,YACW;CACX,IAAI,MAAM;CACV,IAAI,QAAQ;CACZ,IAAI,aAAa;CACjB,IAAI,oBAAoB;CACxB,MAAM,QAAgB,CAAC;CAEvB,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,KAAK;EACxC,MAAM,OAAO,IAAI,WAAW,CAAC;EAE7B,IAAI,SAAS,iBAAiB,YAAY;GACxC,aAAa;GACb;EACF;EAEA,IAAI,SAAS,gBAAgB,QAAQ,IAAI;GACvC,MACE,IAAI,WAAW,IAAI,CAAC,MAAM,gBAAgB,KAAK,gBAAgB;GACjE,aAAa;GACb;EACF;EAEA,IAAI,SAAS,aAAa,QAAQ,IAAI;GACpC,MAAM;GACN,aAAa;GACb;EACF;EAEA,IAAI,SAAS,cAAc;GACzB,IAAI,UAAU,MAAM,CAAC,mBACnB,oBAAoB;QACf,IAAI,mBACT,oBAAoB;GAEtB;EACF;EAEA,IAAI,SAAS,kBAAkB,CAAC,mBAAmB;GACjD,IAAI,QAAQ,IAAI;IACd,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC;IACvB,MAAM;IACN,QAAQ;IACR,aAAa;GACf;GACA;EACF;EAEA,IAAI,YACE;OAAA,CAAC,qBAAqB,IAAI,IAAI,GAAG,OAAO,IAAI;EAAA,OAEhD,SAAS,IAAI;CAEjB;CAEA,IAAI,QAAQ,IAAI,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC;CAEvC,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,OAAO,MAAM,QAAQ,CAAC,UACpB,QAAQ,MAAM,SACZ,gBAAgB,SAAS,KAAK,KAAK,IAAI,IAAI,SAAS,IACtD,CACF;AACF;;ACxEA,MAAa,YACX,OACA,SACA,OACA,YACS;CACT,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS,SAAS,OAAO,OAAO,GACzD,IAAI,QAAQ,WAAW,QAAQ,cAC7B,MAAM,SAAS,KAAK,KAAK;MAEzB,MAAM,SAAS,CAAC,KAAK,KAAK,CAAC;AAGjC;;;;;;;;;;;ACCA,MAAa,uBACX,MACA,UACqB;CACrB,MAAM,KAAK,KAAK;CAChB,MAAM,KAAK,MAAM;CACjB,MAAM,SAAS,KAAK,IAAI;CACxB,MAAM,aAAa,OAAO;CAC1B,MAAM,cAAc,QAAQ;CAE5B,QAAQ,KAAK,QAA+B;EAC1C,IAAI,IAAI,SAAS,QAAQ,OAAO;EAEhC,IAAI,QAAQ,WAAW,QAAQ,QAAQ;GACrC,IAAI,CAAC,IAAI,WAAW,IAAI,GAAG,OAAO;GAClC,IAAI,IAAI,WAAW,UAAU,GAAG,OAAO;EACzC;EAEA,IAAI,QAAQ,SAAS,QAAQ,QAAQ;GACnC,IAAI,CAAC,IAAI,SAAS,KAAK,GAAG,OAAO;GACjC,IAAI,IAAI,SAAS,WAAW,GAAG,OAAO;EACxC;EAEA,IAAI,QAAQ,QAAQ;GAClB,MAAM,aAAa,IAAI,SAAS;GAChC,IAAI,cAAc,IAAI,OAAO;GAE7B,IAAI,IAAI,YAAY,MAAM,aAAa,CAAC,MAAM,GAAG,OAAO;GACxD,OAAO,CAAC,IAAI,UAAU;EACxB;EAEA,IAAI,QAAQ,SAAS;GACnB,MAAM,MAAM,IAAI,QAAQ,OAAO,KAAK,CAAC;GACrC,IAAI,QAAQ,IAAI,OAAO;GACvB,OAAO,CAAC,IAAI,GAAG;EACjB;EAGA,MAAM,QAAQ,IAAI,YAAY,MAAM,IAAI,SAAS,KAAK,CAAC;EACvD,IAAI,UAAU,IAAI,OAAO;EACzB,IAAI,SAAS,MAAM,IAAI,WAAW,MAAM,QAAQ,EAAE,GAAG,OAAO;EAC5D,OAAO,CAAC,QAAQ,IAAI,IAAI,SAAS,EAAE;CACrC;AACF;;AC1BA,MAAM,WAAW,MAAe,WAA6B;CAC3D,IAAI,OAAO,SAAS,YAClB,OAAQ,KAAiC,MAAM;CACjD,OAAO,SAAS;AAClB;AAEA,MAAM,aACJ,OACA,cACqD;CACrD,IAAI,QAA+B;CAEnC,IAAI,UAAU,SAAS,KAAA,KAAa,CAAC,QAAQ,UAAU,MAAM,MAAM,IAAI,GACrE,OAAO;EAAE,OAAO;EAAO,OAAO;CAAK;CAErC,IACE,UAAU,YAAY,KAAA,KACtB,CAAC,QAAQ,UAAU,SAAS,MAAM,OAAO,GAEzC,OAAO;EAAE,OAAO;EAAO,OAAO;CAAK;CAErC,IAAI,UAAU,QAAQ,KAAA,KAAa,MAAM,QAAQ,UAAU,KACzD,OAAO;EAAE,OAAO;EAAO,OAAO;CAAK;CAErC,IAAI,UAAU,YAAY,KAAA,GACpB;MAAA,CAAC,QAAQ,UAAU,SAAS,MAAM,OAAO,GAC3C,OAAO;GAAE,OAAO;GAAO,OAAO;EAAK;CAAA;CAEvC,IAAI,UAAU,aAAa;EACzB,QAAQ,UAAU,YAAY,MAAM,SAAS,UAAU,WAAW,MAAM;EACxE,IAAI,CAAC,OAAO,OAAO;GAAE,OAAO;GAAO,OAAO;EAAK;CACjD;CAEA,OAAO;EAAE,OAAO;EAAM;CAAM;AAC9B;AAEA,MAAa,YACX,QACA,OACA,SACe;CACf,IAAI;CACJ,IAAI,KAAK,aAAa,KAAA,GACpB,aACE,KAAK,WAAW,IAAI,OAAO,SAAS,KAAK,WAAW,KAAK;MAE3D,aAAa,SAAS,KAAK,SAAS;CAGtC,MAAM,QAAQ,OAAO;CAErB,IAAI,CAAC,OAAO,OAAO;EAAE,OAAO;EAAO,UAAU;EAAM,OAAO;CAAK;CAE/D,IAAI,QAA+B;CAEnC,IAAI,KAAK,SAAS,KAAA,KAAa,CAAC,QAAQ,KAAK,MAAM,MAAM,IAAI,GAC3D,OAAO;EAAE,OAAO;EAAO,UAAU;EAAM,OAAO;CAAK;CAErD,IAAI,KAAK,YAAY,KAAA,KAAa,CAAC,QAAQ,KAAK,SAAS,MAAM,OAAO,GACpE,OAAO;EAAE,OAAO;EAAO,UAAU;EAAM,OAAO;CAAK;CAErD,IAAI,KAAK,QAAQ,KAAA,KAAa,MAAM,QAAQ,KAAK,KAC/C,OAAO;EAAE,OAAO;EAAO,UAAU;EAAM,OAAO;CAAK;CAErD,IAAI,KAAK,YAAY,KAAA,KAAa,CAAC,QAAQ,KAAK,SAAS,MAAM,OAAO,GACpE,OAAO;EAAE,OAAO;EAAO,UAAU;EAAM,OAAO;CAAK;CAErD,IACE,KAAK,SAAS,KAAA,KACd,CAAC,KAAK,KAAM,MAAM,QAA2C,IAAI,GAEjE,OAAO;EAAE,OAAO;EAAO,UAAU;EAAM,OAAO;CAAK;CAErD,IAAI,KAAK,aAAa;EACpB,QAAQ,KAAK,YAAY,MAAM,SAAS,KAAK,WAAW,MAAM;EAC9D,IAAI,CAAC,OAAO,OAAO;GAAE,OAAO;GAAO,UAAU;GAAM,OAAO;EAAK;CACjE;CAEA,IAAI,KAAK,UAAU;EACjB,MAAM,WAAW,MAAM,YAAY,CAAC;EACpC,KAAK,MAAM,aAAa,KAAK,UAAU;GACrC,MAAM,MACJ,UAAU,UAAU,KAAA,IAChB,UAAU,QAAQ,IAChB,SAAS,SAAS,UAAU,QAC5B,UAAU,QACZ;GAEN,IAAI,OAAO,GAAG;IACZ,MAAM,QAAQ,SAAS;IAEvB,IAAI,CAAC,OAAO,OAAO;KAAE,OAAO;KAAO,UAAU;KAAM,OAAO;IAAK;IAC/D,MAAM,SAAS,UAAU,OAAO,SAAS;IACzC,IAAI,CAAC,OAAO,OAAO,OAAO;KAAE,OAAO;KAAO,UAAU;KAAM,OAAO;IAAK;IACtE,IAAI,OAAO,OAAO,QAAQ,OAAO;GACnC,OAOE,IAAI,CALU,SAAS,MAAM,UAAU;IACrC,MAAM,SAAS,UAAU,OAAO,SAAS;IACzC,IAAI,OAAO,OAAO,QAAQ,OAAO;IACjC,OAAO,OAAO;GAChB,CACS,GAAG,OAAO;IAAE,OAAO;IAAO,UAAU;IAAM,OAAO;GAAK;EAEnE;CACF;CAEA,OAAO;EAAE,OAAO;EAAM,UAAU;EAAY;CAAM;AACpD;;;;;;;ACxIA,MAAa,2BACX,QACA,UACiB;CACjB,MAAM,QAAQ,OAAO;CAErB,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,MAAM,SAAS,aAAa,OAAO;CACvC,IAAI,MAAM,YAAY,GAAG,OAAO;CAEhC,MAAM,SAAS,MAAM,KAAK,QAAQ,WAAW,OAAO;CACpD,IAAI,QAAQ;CAEZ,KAAK,IAAI,IAAI,OAAO,KAAK,GAAG,KAAK;EAC/B,MAAM,IAAI,OAAO;EACjB,IAAI,EAAE,SAAS,MAAM,MAAM;OACtB,IAAI,EAAE,SAAS,QAAQ;GAC1B;GACA,IAAI,UAAU,GAAG,OAAO;EAC1B;CACF;CAEA,OAAO;AACT;;;;;;;AChBA,MAAa,kBACX,MACA,eACW;CACX,MAAM,SAAS,WAAW,KAAK,IAAI,CAAC,GAAG,MAAM;CAC7C,MAAM,UAAU,OAAO,MAAM,GAAG,CAAC,CAAC,SAAS;CAC3C,IAAI,OAAO;CACX,KAAK,MAAM,aAAa,YAAY;EAClC,IACE,UAAU,SAAS,UACf,UAAU,UAAU,UACpB,OAAO,SAAS,UAAU,QAE9B;EACF;CACF;CACA,OAAO;AACT;;;;;;AAOA,MAAa,eAAe,SAA2B;CACrD,MAAM,UAAoB,CAAC;CAC3B,IAAI,MAAM;CACV,SAAS;EACP,OAAO,KAAK,SAAS,OAAO,KAAK,SAAS,KAAM;EAChD,IAAI,KAAK,SAAS,KAAK;GACrB;GACA;EACF;EACA,MAAM,SAAS,oCAAoC,KAAK,KAAK,MAAM,GAAG,CAAC;EACvE,IAAI,CAAC,QAAQ,OAAO;EACpB,MAAM,MAAM,MAAM,OAAO,EAAE,CAAC;EAC5B,IAAI,SAAS;EACb,OAAO,KAAK,MAAM,YAAY,OAAO,KAAK,MAAM,YAAY,KAAM;EAClE,MAAM,SACJ,MAAM,WAAW,KAAK,UAAU,SAAS,IAAI,MAAM,IAAI,MAAM;EAC/D,QAAQ,KAAK,MAAM;EACnB,IAAI,SAAS,GAAG,OAAO;EACvB,MAAM;CACR;AACF;;ACjDA,MAAM,6BAAa,IAAI,IAAI;CACzB;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,mBAAmB,YAAuC;CACrE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAE7D,OAAO;EACL,MAAM;EACN,OAAO,CACL;GACE,OAAO;GACP,MAAM;GACN,UAAU,CACR;IACE,OAAO;IAEP,MAAM;IACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM;GACjE,CACF;EACF,CACF;EACA,UAAU,QAAQ,OAAO;GAEvB,MAAM,WADS,OAAO,MACC,CAAC;GACxB,MAAM,YAAY,SAAS,SAAS,SAAS;GAE7C,MAAM,UAAU,UAAU,QAAQ,QAAQ;GAC1C,MAAM,QAAQ,MAAM,SAAS,KAAK;GAKlC,IAAI,YAAY;GAIhB,IAAI,WAAW,QAAQ;GACvB,OAAO,WAAW,OAAO,UAAU,OAAO,SAAS,CAAC,YAAY,IAC9D;GAGF,IAAI,WAAW,OAAO,QACpB,YAAY,wBAAwB,QAAQ,QAAQ;GAGtD,IAAI,CAAC,WAAW;GAChB,IAAI,WAAW,IAAI,UAAU,IAAI,GAAG;GAEpC,SAAS,WAAW,SAAS,OAAO,QAAQ,OAAO;GAGnD,MAAM,YAAY,QAAQ,YAAY,QAAQ,MAAM,MAAM,KAAK,CAAC;GAChE,UAAU,UAAU,QAAQ,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ;GAGxD,IAAI,UAAU,YAAY,MAAM,SAAS,SAAS,GAChD,SAAS,IAAI;EAEjB;CACF;AACF;;ACrEA,MAAa,qBAAqB,YAAyC;CACzE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAI7D,MAAM,oBACJ,QACA,UACA,MACS;EACT,MAAM,QAAQ,SAAS;EACvB,IAAI,UAAU,MAAM;EACpB,IAAI,QAAQ,MAAM,SAAS,OAAO;EAClC,OAAO,OAAO;GACZ,SAAS,QAAQ,SAAS,OAAO,QAAQ,OAAO;GAChD,UAAU,QAAQ,MAAM,MAAM,KAAK,QAAQ,MAAM,MAAM;GACvD,QAAQ,MAAM,SAAS,OAAO;EAChC;EACA,IAAI,SAAS,MAAM,UAAU;OACxB,SAAS,OAAO,GAAG,CAAC;CAC3B;CA8EA,OAAO,CAAC;EAxEN,MAAM;EACN,OAAO,CAAC;GAAE,OAAO;GAAG,MAAM;EAAS,CAAC;EACpC,UAAU,QAAQ,OAAO;GAEvB,MAAM,WADQ,OAAO,MACC,CAAC;GACvB,IAAI,WAAW;GAEf,KAAK,IAAI,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;IAC7C,MAAM,QAAQ,SAAS;IACvB,IAAI,MAAM,SAAS,QAAQ;IAE3B,IAAI,CAAC,MAAM,MAAM,SAAS,OAAO,GAAG;IAEpC,MAAM,OAAO,SAAS,IAAI;IAE1B,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,eAAe;IAE5D,iBAAiB,MAAM,UAAU,CAAC;IAClC,WAAW;GACb;GAEA,OAAO;EACT;CAkDc,GAAG;EA7CjB,MAAM;EACN,OAAO,CACL;GACE,OAAO;GACP,MAAM;EACR,CACF;EACA,UAAU,QAAQ,OAAO;GAEvB,MAAM,WADQ,OAAO,MACC,CAAC;GACvB,IAAI,WAAW;GAEf,KAAK,IAAI,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;IAC7C,MAAM,QAAQ,SAAS;IACvB,IAAI,MAAM,SAAS,QAAQ;IAE3B,IAAI,CAAC,MAAM,MAAM,SAAS,OAAO,GAAG;IAGpC,MAAM,OAAO,SAAS,IAAI;IAE1B,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI;IAGlC,MAAM,WAAW,KAAK,KAAK,QAAQ,WAAW,OAAO;IACrD,IAAI,UAAU;IACd,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,GAAG,KAC1B,IACE,SAAS,EAAE,CAAC,SAAS,YACrB,SAAS,EAAE,CAAC,UAAU,KAAK,OAC3B;KACA,UAAU;KACV;IACF;IAEF,IAAI,YAAY,IAAI;IAEpB,iBAAiB,SAAS,UAAU,UAAU,CAAC;IAC/C,WAAW;GACb;GAEA,OAAO;EACT;CAGuB,CAAC;AAC5B;;ACpGA,MAAa,mBAAmB,YAAuC;CACrE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAE7D,OAAO;EACL,MAAM;EACN,OAAO,CACL;GACE,OAAO;GACP,MAAM;EACR,CACF;EACA,UAAU,QAAQ,OAAO;GACvB,MAAM,QAAQ,OAAO;GACrB,MAAM,OAAO,MAAM,KAAK,KAAK;GAC7B,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM;GACtD,IAAI,CAAC,OAAO;GACZ,SAAS,OAAO,MAAM,OAAO,QAAQ,OAAO;GAE5C,MAAM,OAAO,KACV,MAAM,GAAG,KAAK,YAAY,QAAQ,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,CACtD,QAAQ;GAMX,IAAI,MAAM,QAAQ,MAAM,UAAU,OAAO,IAAI,GAAG;IAC9C,MAAM,QAAQ,CAAC,CAAC,SAAS,EAAE,GAAG,GAAI,MAAM,SAAS,CAAC,CAAE;IACpD,MAAM,OAAO;KAAE,GAAG,MAAM;KAAM,oBAAoB;IAAK;GACzD;EACF;CACF;AACF;;AChCA,MAAa,qBAAqB,YAAuC;CACvE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAE7D,OAAO;EACL,MAAM;EAGN,OAAO,CACL;GACE,OAAO;GACP,MAAM;EACR,GACA;GACE,OAAO;GACP,MAAM;GACN,UAAU,CACR;IACE,OAAO;IAEP,MAAM;IACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM;GACjE,CACF;EACF,CACF;EACA,UAAU,QAAQ,OAAO;GACvB,MAAM,YAAY,OAAO,QAAQ;GAEjC,MAAM,WADS,OAAO,MACC,CAAC;GACxB,MAAM,YAAY,SAAS,SAAS,SAAS;GAG7C,MAAM,UADU,UAAU,QACF,QAAQ;GAChC,MAAM,QAAQ,MAAM,SAAS,KAAK;GAElC,SAAS,WAAW,SAAS,OAAO,QAAQ,OAAO;GAOnD,UAAU,UAJK,QAAQ,MACrB,GACA,QAAQ,YAAY,QAAQ,MAAM,MAAM,KAAK,CAAC,CAEvB,CAAC,CAAC,QAAQ;GAGnC,IAAI,UAAU,YAAY,MAAM,SAAS,SAAS,GAChD,SAAS,IAAI;EAEjB;CACF;AACF;;AClDA,MAAa,gBAAgB,YAAuC;CAClE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAE7D,OAAO;EACL,MAAM;EACN,OAAO,CACL;GACE,OAAO;GACP,MAAM;GACN,UAAU,CACR;IACE,OAAO;IACP,MAAM;IACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,MAAM,MAAM;GAClE,CACF;EACF,GACA;GACE,OAAO;GACP,MAAM;EACR,CACF;EACA,UAAU,QAAQ,OAAO;GAGvB,MAAM,UAFS,OAAO,MACE,CAAC,SAAU,EACV,CAAC,QAAQ,KAAK;GACvC,MAAM,QAAQ,MAAM,SAAS,MAAM;GAEnC,MAAM,KAAK,OAAO,QAAQ;GAC1B,SAAS,IAAI,SAAS,OAAO,QAAQ,OAAO;GAG5C,OAAO,OAAO,QAAQ,GAAG,CAAC;EAC5B;CACF;AACF;;ACnCA,MAAa,mBAAmB,YAAyC;CACvE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAuP7D,OAAO;EACL;GAnPA,MAAM;GACN,OAAO;IACL;KACE,OAAO;KACP,MAAM;KACN,UAAU,CACR;MACE,OAAO;MAEP,MAAM;MACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM;KACjE,CACF;IACF;IACA;KACE,OAAO;KACP,MAAM;IACR;IACA;KACE,OAAO;KACP,MAAM;IACR;GACF;GACA,UAAU,QAAQ,OAAO;IAEvB,MAAM,WADS,OAAO,MACC,CAAC;IACxB,MAAM,YAAY,SAAS,SAAS,SAAS;IAC7C,MAAM,UAAU,UAAU,QAAQ,QAAQ;IAC1C,MAAM,QAAQ,MAAM,SAAS,KAAK;IAElC,MAAM,eAAe,OAAO,QAAQ;IACpC,SAAS,cAAc,SAAS,OAAO,QAAQ,OAAO;IAEtD,MAAM,YAAY,QAAQ,YAAY,QAAQ,MAAM,MAAM,KAAK,CAAC;IAChE,UAAU,UAAU,QAAQ,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ;IACxD,IAAI,UAAU,YAAY,MAAM,SAAS,SAAS,GAAG,SAAS,IAAI;GACpE;EA+MU;EACV;GAxMA,MAAM;GACN,OAAO;IACL;KACE,OAAO;KACP,MAAM;KACN,UAAU,CACR;MACE,OAAO;MAEP,MAAM;MACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM;KACjE,CACF;IACF;IACA;KACE,OAAO;KACP,OAAO,MAAM,GAAG,mBAAmB;IACrC;IACA;KACE,OAAO;KACP,OAAO,MAAM,GAAG,cAAc;IAChC;GACF;GACA,UAAU,QAAQ,OAAO;IAEvB,MAAM,WADS,OAAO,MACC,CAAC;IACxB,MAAM,YAAY,SAAS,SAAS,SAAS;IAC7C,MAAM,UAAU,UAAU,QAAQ,QAAQ;IAC1C,MAAM,QAAQ,MAAM,SAAS,KAAK;IAElC,MAAM,WAAW,OAAO,QAAQ;IAChC,SAAS,UAAU,SAAS,OAAO,QAAQ,OAAO;IAElD,MAAM,YAAY,QAAQ,YAAY,QAAQ,MAAM,MAAM,KAAK,CAAC;IAChE,UAAU,UAAU,QAAQ,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ;IACxD,IAAI,UAAU,YAAY,MAAM,SAAS,SAAS,GAAG,SAAS,IAAI;GACpE;EAoKY;EACZ;GA9JA,MAAM;GACN,OAAO,CACL;IACE,OAAO;IACP,MAAM;IACN,UAAU,CACR;KACE,OAAO;KAEP,MAAM;KACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM;IACjE,CACF;GACF,GACA;IACE,OAAO;IACP,OAAO,MACL,GAAG,mBAAmB,QAAQ,EAAE,cAAc;GAClD,CACF;GACA,UAAU,QAAQ,OAAO;IAEvB,MAAM,WADS,OAAO,MACC,CAAC;IACxB,MAAM,YAAY,SAAS,SAAS,SAAS;IAC7C,MAAM,UAAU,UAAU,QAAQ,QAAQ;IAC1C,MAAM,QAAQ,MAAM,SAAS,KAAK;IAElC,MAAM,WAAW,OAAO,QAAQ;IAChC,SAAS,UAAU,SAAS,OAAO,QAAQ,OAAO;IAElD,MAAM,YAAY,QAAQ,YAAY,QAAQ,MAAM,MAAM,KAAK,CAAC;IAChE,UAAU,UAAU,QAAQ,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ;IACxD,IAAI,UAAU,YAAY,MAAM,SAAS,SAAS,GAAG,SAAS,IAAI;GACpE;EA6HkB;EAClB;GAxHA,MAAM;GACN,OAAO;IACL;KACE,OAAO;KACP,MAAM;KACN,UAAU,CACR;MACE,OAAO;MACP,MAAM;MACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,MAAM,MAAM;KAClE,CACF;IACF;IACA;KACE,OAAO;KACP,MAAM;IACR;IACA;KACE,OAAO;KACP,OAAO,MACL,MAAM,uBAAuB,MAAM;IACvC;GACF;GACA,UAAU,QAAQ,OAAO;IAIvB,MAAM,UAHS,OAAO,MACC,CAAC,SACG,EACF,CAAC,QAAQ,KAAK;IACvC,MAAM,QAAQ,MAAM,SAAS,MAAM;IAGnC,MAAM,aAAa,OAAO,QAAQ;IAClC,MAAM,WAAW,WAAW,KAAK,QAAQ,UAAU,OAAO;IAE1D,IAAI,QAAQ;IACZ,IAAI,cAAc;IAClB,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;KACnC,MAAM,IAAI,OAAO;KACjB,IAAI,EAAE,SAAS,WAAW,MAAM;UAC3B,IAAI,EAAE,SAAS,UAAU;MAC5B;MACA,IAAI,UAAU,GAAG;OACf,cAAc;OACd;MACF;KACF;IACF;IAEA,IAAI,gBAAgB,IAAI;IACxB,SAAS,OAAO,cAAc,SAAS,OAAO,QAAQ,OAAO;IAG7D,OAAO,OAAO,QAAQ,GAAG,CAAC;GAC5B;EAmEO;EACP;GA7DA,MAAM;GACN,OAAO;IACL;KACE,OAAO;KACP,MAAM;KACN,UAAU,CACR;MACE,OAAO;MACP,MAAM;MACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,MAAM,MAAM;KAClE,CACF;IACF;IACA;KACE,OAAO;KACP,MAAM;IACR;IACA;KACE,OAAO;KACP,OAAO,MAAc,EAAE,SAAS,QAAQ;KACxC,OAAO,MAAM,GAAG,cAAc;IAChC;GACF;GACA,UAAU,QAAQ,OAAO;IAIvB,MAAM,UAHS,OAAO,MACC,CAAC,SACG,EACF,CAAC,QAAQ,KAAK;IACvC,MAAM,QAAQ,MAAM,SAAS,MAAM;IAGnC,MAAM,aAAa,OAAO,QAAQ;IAClC,MAAM,WAAW,WAAW,KAAK,QAAQ,UAAU,OAAO;IAE1D,IAAI,QAAQ;IACZ,IAAI,cAAc;IAClB,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;KACnC,MAAM,IAAI,OAAO;KACjB,IAAI,EAAE,SAAS,WAAW,MAAM;UAC3B,IAAI,EAAE,SAAS,UAAU;MAC5B;MACA,IAAI,UAAU,GAAG;OACf,cAAc;OACd;MACF;KACF;IACF;IAEA,IAAI,gBAAgB,IAAI;IACxB,SAAS,OAAO,cAAc,SAAS,OAAO,QAAQ,OAAO;IAG7D,OAAO,OAAO,QAAQ,GAAG,CAAC;GAC5B;EAQa;CACf;AACF;;AChPA,MAAa,uBAAuB,YAAuC;CACzE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAS7D,OAAO;EACL,MAAM;EACN,OAAO,CACL;GACE,OAAO;GACP,MAAM;GACN,UAAU,CACR;IACE,OAAO;IACP,OAAO,SAAiB,SAAS,eAAe,SAAS;GAC3D,GACA;IACE,OAAO;IACP,MAAM;IACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,MAAM,MAAM;GAClE,CACF;EACF,CACF;EACA,UAAU,QAAQ,OAAO,WAAW,QAAQ,KAAK;GAC/C,MAAM,SAAS,OAAO;GACtB,MAAM,WAAW,OAAO;GACxB,MAAM,UAAU,SAAS,SAAS,SAAS,EAAE,CAAC,QAAQ,KAAK;GAC3D,MAAM,QAAQ,MAAM,SAAS,MAAM;GAKnC,MAAM,YAAqB,CAAC;GAC5B,IAAI,SAAS;GACb,IAAI,QAAQ,OAAO;GACnB,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,KAAK,QAAQ,GAAG,KAAK;IAChD,MAAM,QAAQ,OAAO;IACrB,IAAI,MAAM,YAAY,KAAK,MAAM,SAAS,OAAO;IACjD,QAAQ,MAAM;IACd,MAAM,OAAgB,MAAM;IAC5B,MAAM,MACJ,OAAO,SAAS,YAAY,SAAS,QAAQ,iBAAiB,OAC1D,KAAK,cACL,KAAA;IACN,IAAI,OAAO,QAAQ,UAAU;KAC3B,SAAS;KACT;IACF;IACA,UAAU,KAAK,KAAK;GACtB;GACA,MAAM,QAAQ,UAAU,GAAG,CAAC;GAC5B,IAAI,CAAC,OAAO;GAEZ,MAAM,QAAQ,OAAO,MAAM,IAAI;GAC/B,MAAM,aAA0B,CAAC;GACjC,IAAI,SAAS;GACb,KAAK,IAAI,IAAI,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;IAC9C,MAAM,OAAO,UAAU;IACvB,IAAI,KAAK,SAAS,mBAChB,WAAW,KAAK;KACd;KACA,QAAQ;KACR,MAAM;MAAE,MAAM;MAAS,SAAS,EAAE;KAAO;IAC3C,CAAC;SACI,IAAI,KAAK,SAAS,oBAAoB,KAAK,KAAK;KAErD,MAAM,SAAS,WAAW,QACvB,MACC,EAAE,KAAK,SAAS,oBAChB,EAAE,KAAK,MAAM,OAAO,KAAK,IAAK,EAClC,CAAC,CAAC;KACF,MAAM,SAAS,YAAY,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,GAAG,MAAM;KAC9D,IAAI,WAAW,KAAA,GAAW;KAC1B,WAAW,KAAK;MACd;MACA,QAAQ,UAAU,GAAG,IAAI,CAAC,KAAK;MAC/B,MAAM;OAAE,MAAM;OAAQ;MAAO;KAC/B,CAAC;IACH;GACF;GAEA,MAAM,OAAO,OAAO,MAAO,MAAM,OAAO,IAAI,KAAK,MAAM,KAAM;GAC7D,MAAM,OAAO,OAAO,MAChB,eACE,MACA,WAAW,KAAK,MAAM,EAAE,IAAI,CAC9B,IACA,WAAW;GAEf,IAAI,SAAS;GACb,IAAI,OAAO,WAAW,QAAQ,SAAS,WAAW,KAAK,CAAC;QAEnD,IAAI,MAAM,UAAU,UAAU,EAAE,EAAE,SAAS,kBAC9C,SAAS,UAAU;GACrB,SAAS,QAAQ,SAAS,OAAO,QAAQ,OAAO;GAIhD,MAAM,SAAS,SAAS,SAAS,SAAS,EAAE,CAAC,SAAS;GACtD,SAAS,OAAO,SAAS,UAAU,SAAS,IAAI,IAAI,SAAS,IAAI,CAAC;EACpE;CACF;AACF;;ACzHA,MAAa,oBAAoB,YAAyC;CACxE,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,KAAK;CAqO7D,OAAO;EAAC;GAjON,MAAM;GACN,OAAO;IACL;KACE,OAAO;KACP,MAAM;KACN,UAAU,CACR;MACE,OAAO;MACP,MAAM;MACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,MAAM,MAAM;KAClE,CACF;IACF;IACA;KACE,OAAO;KACP,MAAM;IACR;IACA;KACE,OAAO;KACP,MAAM;IACR;GACF;GACA,UAAU,QAAQ,OAAO;IAEvB,MAAM,UADS,OAAO,MACA,CAAC,SAAU,EAAE,CAAC,QAAQ,KAAK;IACjD,MAAM,QAAQ,MAAM,SAAS,MAAM;IAGnC,IAAI,eAAe;IACnB,IAAI,QAAQ;IACZ,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;KACnC,MAAM,IAAI,OAAO;KACjB,IAAI,EAAE,SAAS,eAAe;UACzB,IAAI,EAAE,SAAS,cAAc;MAChC;MACA,IAAI,UAAU,GAAG;OACf,eAAe;OACf;MACF;KACF;IACF;IACA,IAAI,iBAAiB,IAAI;IAEzB,SAAS,OAAO,eAAe,SAAS,OAAO,QAAQ,OAAO;IAG9D,OAAO,OAAO,QAAQ,GAAG,CAAC;GAC5B;EAkLe;EAAG;GA7KlB,MAAM;GACN,OAAO,CACL;IACE,OAAO;IACP,MAAM;IACN,UAAU,CACR;KACE,OAAO;KACP,MAAM;KACN,UAAU,YAAoB,MAAM,QAAQ,KAAK,GAAG,KAAK,MAAM;IACjE,CACF;GACF,GACA;IACE,OAAO;IACP,OAAO,MAAc,MAAM,aAAa,MAAM;GAChD,CACF;GACA,UAAU,QAAQ,OAAO;IAEvB,MAAM,WADS,OAAO,MACC,CAAC;IACxB,MAAM,YAAY,SAAS,SAAS,SAAS;IAC7C,MAAM,UAAU,UAAU,QAAQ,QAAQ;IAC1C,MAAM,QAAQ,MAAM,SAAS,KAAK;IAElC,MAAM,WAAW,OAAO,QAAQ;IAChC,SAAS,UAAU,SAAS,OAAO,QAAQ,OAAO;IAElD,MAAM,YAAY,QAAQ,YAAY,QAAQ,MAAM,MAAM,KAAK,CAAC;IAChE,UAAU,UAAU,QAAQ,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ;IACxD,IAAI,UAAU,YAAY,MAAM,SAAS,SAAS,GAAG,SAAS,IAAI;GACpE;EA8I+B;EAAG;GApIlC,MAAM;GACN,OAAO,CAAC;IAAE,OAAO;IAAG,MAAM;GAAU,CAAC;GACrC,UAAU,QAAQ,OAAO;IAEvB,IAAI,OAAO;IACX,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,OAAO,QAAQ,KAAK;KAC9C,MAAM,IAAI,OAAO;KACjB,IAAI,EAAE,SAAS,YAAY;KAC3B,IAAI,EAAE,SAAS,WAAW;IAC5B;IACA,IAAI,SAAS,GAAG;IAGhB,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;KACnC,MAAM,IAAI,OAAO;KACjB,IAAI,EAAE,SAAS,cAAc;MAC3B,EAAE,OAAO,EAAE,QAAQ,CAAC;MACpB,EAAG,KAAmB,OAAO;MAC7B;KACF;KACA,IAAI,EAAE,SAAS,cAAc;IAC/B;GACF;EA8G2C;EAAG;GAzG9C,MAAM;GACN,OAAO,CAAC;IAAE,OAAO;IAAG,MAAM;GAAa,CAAC;GACxC,UAAU,QAAQ,OAAO;IAEvB,IAAI,OAAO;IACX,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;KACnC,MAAM,IAAI,OAAO;KACjB,IAAI,EAAE,SAAS,cAAc;MAC3B,OAAQ,EAAE,MAAgC,QAAQ;MAClD;KACF;KACA,IAAI,EAAE,SAAS,cAAc;IAC/B;IACA,IAAI,SAAS,GAAG;IAGhB,IAAI,aAAa,QAAQ;IACzB,IAAI,QAAQ;IACZ,OAAO,aAAa,OAAO,UAAU,QAAQ,GAAG;KAC9C,MAAM,IAAI,OAAO;KACjB,IAAI,EAAE,SAAS,cAAc;UACxB,IAAI,EAAE,SAAS,eAAe;KACnC;IACF;IACA;IAGA,MAAM,WAAqB,MAAM,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC;IAE/D,IAAI,IAAI,QAAQ;IAChB,OAAO,IAAI,YAAY;KAErB,IADU,OAAO,EACZ,CAAC,SAAS,WAAW;MAExB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,KACxB,IAAI,SAAS,KAAK,GAAG,SAAS,EAAE;MAIlC,MAAM,YAAsB,CAAC;MAC7B,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;OACvC,IAAI,OAAO,EAAE,CAAC,SAAS,YAAY;OACnC,IAAI,OAAO,EAAE,CAAC,SAAS,WAAW,UAAU,KAAK,CAAC;MACpD;MAGA,IAAI,MAAM;MACV,IAAI,QAAQ;MAEZ,OAAO,MAAM,QAAQ,QAAQ,UAAU,QAAQ;OAE7C,OAAO,MAAM,QAAQ,SAAS,OAAO,GAAG;OACxC,IAAI,OAAO,MAAM;OAEjB,MAAM,SAAS,OAAO,UAAU;OAChC,MAAM,cAAc,OAAO,QAAQ,SAAS;OAC5C,MAAM,cAAc,OAAO,QAAQ,SAAS;OAC5C,MAAM,UAAU,cAAc,SAAS,aAAa,EAAE,IAAI;OAC1D,IAAI,UAAU,cAAc,SAAS,aAAa,EAAE,IAAI;OAGxD,IAAI,WAAW;OACf,KAAK,IAAI,IAAI,KAAK,IAAI,QAAQ,SAAS,OAAO,GAAG,KAAK;OAGtD,IAAI,UAAU,UAAU;QACtB,UAAU;QACV,IAAI,YAAY,GAAG,CAGnB;QACA,OAAO,QAAQ,WAAW,OAAO,OAAO,CAAC;OAC3C;OAGA,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,WAAW,IAAI,MAAM,KAC/C,IAAI,UAAU,GAAG,SAAS,KAAK,UAAU;OAG3C,OAAO;OACP;MACF;MAIA,OAAO,QAAQ,UAAU,QAAQ;OAC/B,MAAM,eAAe,UAAU;OAE/B,IAAI,aAAa,eAAe;OAChC,OACE,aAAa,OAAO,UACpB,OAAO,WAAW,CAAC,SAAS,YAE5B;OAEF,OAAO,OAAO,cAAc,aAAa,eAAe,CAAC;OACzD,cAAc,aAAa,eAAe;MAE5C;KACF;KACA;IACF;GACF;EAGqD;CAAC;AAC1D;;ACvNA,MAAM,+BAAe,IAAI,IAAY;CAVnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAGgD,CAAC;AAEnD,MAAa,eACX,YACe;CACf,MAAM,EAAE,OAAO,UAAU;CAEzB,IAAI;CACJ,IAAI,SAAS,SAAS,SAAS,MAC7B,UAAU;MACL,IAAI,CAAC,QAAS,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAC1D,OAAO,CAAC;MAER,UAAU,IAAI,IAAI,KAAK,QAAQ,MAAM,aAAa,IAAI,CAAC,CAAC,CAAC;CAG3D,MAAM,QAAoB,CAAC;CAE3B,IAAI,QAAQ,IAAI,OAAO,GAAG,MAAM,KAAK,gBAAgB,OAAO,CAAC;CAC7D,IAAI,QAAQ,IAAI,QAAQ,GAAG,MAAM,KAAK,GAAG,kBAAkB,OAAO,CAAC;CAGnE,IAAI,QAAQ,IAAI,WAAW,GAAG,MAAM,KAAK,oBAAoB,OAAO,CAAC;CACrE,IAAI,QAAQ,IAAI,OAAO,GAAG,MAAM,KAAK,GAAG,iBAAiB,OAAO,CAAC;CACjE,IAAI,QAAQ,IAAI,MAAM,GAAG,MAAM,KAAK,GAAG,gBAAgB,OAAO,CAAC;CAC/D,IAAI,QAAQ,IAAI,SAAS,GAAG,MAAM,KAAK,kBAAkB,OAAO,CAAC;CACjE,IAAI,QAAQ,IAAI,IAAI,GAAG,MAAM,KAAK,aAAa,OAAO,CAAC;CACvD,IAAI,QAAQ,IAAI,OAAO,GAAG,MAAM,KAAK,gBAAgB,OAAO,CAAC;CAE7D,OAAO;AACT;;;AC9CA,MAAa,SACX,IACA,EAAE,OAAO,KAAK,QAAQ,KAAK,UAAU,CAAC,GAAG,OAAO,UAAU,CAAC,MACxD;CACH,MAAM,QAAQ,YAAY;EAAE;EAAM;EAAO;EAAS;CAAK,CAAC;CAIxD,MAAM,cAAc,GAAG,SAAS,MAAM;CACtC,IAAI,aACF,GAAG,SAAS,MAAM,SAAS,QAAQ,KAAK,MAAM,KAAK,SAAiB;EAClE,MAAM,OAAO,YAAY,QAAQ,KAAK,MAAM,KAAK,IAAI;EACrD,OAAO,OAAO,IAAI,CAAC,MAAM,qBACrB,KAAK,QAAQ,cAAa,WAAU,IACpC;CACN;CAGF,GAAG,KAAK,MAAM,OAAO,WAAW,UAAU,UAAU;EAClD,MAAM,EAAE,WAAW;EAEnB,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SACzC,KAAK,IAAI,YAAY,GAAG,YAAY,MAAM,QAAQ,aAAa;GAC7D,MAAM,UAAU,MAAM;GACtB,IAAI,WAA0B;GAC9B,IAAI,QAA+B;GASnC,IAPc,QAAQ,MAAM,OAAO,SAAS;IAC1C,MAAM,SAAS,SAAS,QAAQ,OAAO,IAAI;IAC3C,IAAI,OAAO,YAAY,MAAM,WAAW,OAAO;IAC/C,IAAI,OAAO,OAAO,QAAQ,OAAO;IACjC,OAAO,OAAO;GAChB,CAEQ,GACW;QAAA,QAAQ,UACvB,QACA,OACA,UACA,OACA,MAAM,GAIC,MAAM,UACZ,QAAQ,SAAS,uBAChB,QAAQ,SAAS,8BAEnB;GAAA;EAGN;CAEJ,CAAC;AACH"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/helper/getAttrs.ts","../src/helper/addAttrs.ts","../src/helper/getDelimiterChecker.ts","../src/helper/testRule.ts","../src/helper/getMatchingOpeningToken.ts","../src/rules/block.ts","../src/rules/inline.ts","../src/rules/fence.ts","../src/rules/heading.ts","../src/rules/hr.ts","../src/rules/list.ts","../src/rules/softbreak.ts","../src/rules/table.ts","../src/rules/rules.ts","../src/plugin.ts"],"sourcesContent":["import type { Attr, DelimiterRange } from \"../types.js\";\n\nconst CLASS_MARKER = 46; // '.'\nconst ID_MARKER = 35; // '#'\nconst PAIR_SEPARATOR = 32; // ' '\nconst KEY_SEPARATOR = 61; // '='\nconst QUOTE_MARKER = 34; // '\"'\n\nconst DISALLOWED_KEY_CHARS = new Set([9, 10, 12, 32, 47, 62, 34, 39, 61]);\n\nexport const getAttrs = (\n str: string,\n range: DelimiterRange,\n allowed: Array<string | RegExp>\n): Attr[] => {\n let key = \"\";\n let value = \"\";\n let parsingKey = true;\n let valueInsideQuotes = false;\n const attrs: Attr[] = [];\n\n for (let i = range[0]; i < range[1]; i++) {\n const code = str.charCodeAt(i);\n\n if (code === KEY_SEPARATOR && parsingKey) {\n parsingKey = false;\n continue;\n }\n\n if (code === CLASS_MARKER && key === \"\") {\n key =\n str.charCodeAt(i + 1) === CLASS_MARKER ? (i++, \"css-module\") : \"class\";\n parsingKey = false;\n continue;\n }\n\n if (code === ID_MARKER && key === \"\") {\n key = \"id\";\n parsingKey = false;\n continue;\n }\n\n if (code === QUOTE_MARKER) {\n if (value === \"\" && !valueInsideQuotes) {\n valueInsideQuotes = true;\n } else if (valueInsideQuotes) {\n valueInsideQuotes = false;\n }\n continue;\n }\n\n if (code === PAIR_SEPARATOR && !valueInsideQuotes) {\n if (key !== \"\") {\n attrs.push([key, value]);\n key = \"\";\n value = \"\";\n parsingKey = true;\n }\n continue;\n }\n\n if (parsingKey) {\n if (!DISALLOWED_KEY_CHARS.has(code)) key += str[i];\n } else {\n value += str[i];\n }\n }\n\n if (key !== \"\") attrs.push([key, value]);\n\n if (allowed.length === 0) return attrs;\n return attrs.filter(([attr]) =>\n allowed.some((item) =>\n item instanceof RegExp ? item.test(attr) : item === attr\n )\n );\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterRange } from \"../types.js\";\nimport { getAttrs } from \"./getAttrs.js\";\n\nexport const addAttrs = (\n token: Token,\n content: string,\n range: DelimiterRange,\n allowed: Array<string | RegExp>\n): void => {\n for (const [key, value] of getAttrs(content, range, allowed)) {\n if (key === \"class\" || key === \"css-module\") {\n token.attrJoin(key, value);\n } else {\n token.attrPush([key, value]);\n }\n }\n};\n","import type { DelimiterRange } from \"../types.js\";\n\ntype DelimiterPosition = \"start\" | \"end\" | \"only\";\n\nexport type DelimiterChecker = (\n str: string,\n pos: DelimiterPosition\n) => DelimiterRange | null;\n\n/**\n * Returns a function that checks whether `str` contains a valid attribute\n * block at the given position (\"start\", \"end\", or \"only\") and returns the\n * [start, end] range of the content inside the delimiters, or null if no\n * match. The returned range is exclusive of the delimiter characters.\n *\n * A valid block must contain at least one character (i.e. `{}` is invalid),\n * and the outer delimiters must not be repeated (i.e. `{{}}` is invalid).\n */\nexport const getDelimiterChecker = (\n left: string,\n right: string\n): DelimiterChecker => {\n const ll = left.length;\n const rl = right.length;\n const minLen = ll + 1 + rl;\n const doubleLeft = left + left;\n const doubleRight = right + right;\n\n return (str, pos): DelimiterRange | null => {\n if (str.length < minLen) return null;\n\n if (pos === \"start\" || pos === \"only\") {\n if (!str.startsWith(left)) return null;\n if (str.startsWith(doubleLeft)) return null;\n }\n\n if (pos === \"end\" || pos === \"only\") {\n if (!str.endsWith(right)) return null;\n if (str.endsWith(doubleRight)) return null;\n }\n\n if (pos === \"only\") {\n const contentEnd = str.length - rl;\n if (contentEnd <= ll) return null;\n // `{.a} {#b}` is text followed by a block, as \"end\" reads it, not one block.\n if (str.lastIndexOf(left, contentEnd - 1) !== 0) return null;\n return [ll, contentEnd];\n }\n\n if (pos === \"start\") {\n const end = str.indexOf(right, ll + 1);\n if (end === -1) return null;\n return [ll, end];\n }\n\n // pos === \"end\"\n const start = str.lastIndexOf(left, str.length - rl - 1);\n if (start === -1) return null;\n if (start >= ll && str.startsWith(left, start - ll)) return null;\n return [start + ll, str.length - rl];\n };\n};\n","// Token.meta is typed `any` by markdown-it; casts bridge to our richer rule-test predicates.\n/* oxlint-disable typescript/no-unsafe-type-assertion */\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterRange } from \"../types.js\";\nimport type { DelimiterChecker } from \"./getDelimiterChecker.js\";\n\nexport interface RuleTest {\n /** Offset from the current token index. Mutually exclusive with `position`. */\n shift?: number;\n /** Absolute token index. Mutually exclusive with `shift`. */\n position?: number;\n /** Token type must equal this string. */\n type?: string | ((t: string) => boolean);\n /** Token tag must equal this string. */\n tag?: string;\n /** Token nesting must equal this value. */\n nesting?: number | ((n: number) => boolean);\n /** Inspect token content; called with (content, token, tokens, index). */\n content?: string | ((c: string) => boolean);\n /** Inspect token.meta; predicate receives the meta object (may be null). */\n meta?: (meta: Record<string, unknown> | null) => boolean;\n /** Inspect a child token at the given index (negative = from end). */\n children?: Array<Omit<RuleTest, \"shift\" | \"position\"> & { index?: number }>;\n /** If set, use this delimiter checker to extract a range from token content. */\n attrChecker?: DelimiterChecker;\n /** Which position argument to pass to attrChecker (\"start\"|\"end\"|\"only\"). */\n attrPos?: \"start\" | \"end\" | \"only\";\n}\n\nexport interface TestResult {\n match: boolean;\n position: number | null;\n range: DelimiterRange | null;\n}\n\nconst matches = (test: unknown, actual: unknown): boolean => {\n if (typeof test === \"function\")\n return (test as (v: unknown) => boolean)(actual);\n return test === actual;\n};\n\nconst testChild = (\n child: Token,\n childTest: Omit<RuleTest, \"shift\" | \"position\">\n): { match: boolean; range: DelimiterRange | null } => {\n let range: DelimiterRange | null = null;\n\n if (childTest.type !== undefined && !matches(childTest.type, child.type)) {\n return { match: false, range: null };\n }\n if (\n childTest.nesting !== undefined &&\n !matches(childTest.nesting, child.nesting)\n ) {\n return { match: false, range: null };\n }\n if (childTest.tag !== undefined && child.tag !== childTest.tag) {\n return { match: false, range: null };\n }\n if (childTest.content !== undefined) {\n if (!matches(childTest.content, child.content))\n return { match: false, range: null };\n }\n if (childTest.attrChecker) {\n range = childTest.attrChecker(child.content, childTest.attrPos ?? \"only\");\n if (!range) return { match: false, range: null };\n }\n\n return { match: true, range };\n};\n\nexport const testRule = (\n tokens: Token[],\n index: number,\n test: RuleTest\n): TestResult => {\n let tokenIndex: number;\n if (test.position !== undefined) {\n tokenIndex =\n test.position < 0 ? tokens.length + test.position : test.position;\n } else {\n tokenIndex = index + (test.shift ?? 0);\n }\n\n const token = tokens[tokenIndex];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!token) return { match: false, position: null, range: null };\n\n let range: DelimiterRange | null = null;\n\n if (test.type !== undefined && !matches(test.type, token.type)) {\n return { match: false, position: null, range: null };\n }\n if (test.nesting !== undefined && !matches(test.nesting, token.nesting)) {\n return { match: false, position: null, range: null };\n }\n if (test.tag !== undefined && token.tag !== test.tag) {\n return { match: false, position: null, range: null };\n }\n if (test.content !== undefined && !matches(test.content, token.content)) {\n return { match: false, position: null, range: null };\n }\n if (\n test.meta !== undefined &&\n !test.meta((token.meta as Record<string, unknown> | null) ?? null)\n ) {\n return { match: false, position: null, range: null };\n }\n if (test.attrChecker) {\n range = test.attrChecker(token.content, test.attrPos ?? \"only\");\n if (!range) return { match: false, position: null, range: null };\n }\n\n if (test.children) {\n const children = token.children ?? [];\n for (const childTest of test.children) {\n const idx =\n childTest.index !== undefined\n ? childTest.index < 0\n ? children.length + childTest.index\n : childTest.index\n : -1;\n\n if (idx >= 0) {\n const child = children[idx];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!child) return { match: false, position: null, range: null };\n const result = testChild(child, childTest);\n if (!result.match) return { match: false, position: null, range: null };\n if (result.range) range = result.range;\n } else {\n // No index: find any matching child\n const found = children.some((child) => {\n const result = testChild(child, childTest);\n if (result.range) range = result.range;\n return result.match;\n });\n if (!found) return { match: false, position: null, range: null };\n }\n }\n }\n\n return { match: true, position: tokenIndex, range };\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\n\n/**\n * Given a closing or self-closing token at `index`, returns its matching\n * opening token by walking backwards to find the token of the same type at\n * the same nesting level. Returns the token itself for nesting === 0.\n */\nexport const getMatchingOpeningToken = (\n tokens: Token[],\n index: number\n): Token | null => {\n const token = tokens[index];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!token) return null;\n if (token.type === \"softbreak\") return null;\n if (token.nesting === 0) return token;\n\n const target = token.type.replace(/_close$/, \"_open\");\n let depth = 0;\n\n for (let i = index; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === token.type) depth++;\n else if (t.type === target) {\n depth--;\n if (depth === 0) return t;\n }\n }\n\n return null;\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport {\n addAttrs,\n getDelimiterChecker,\n getMatchingOpeningToken\n} from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\n// Token types that should not be treated as attr targets\nconst SKIP_TYPES = new Set([\n \"code_inline\",\n \"math_inline\",\n \"fence\",\n \"code_block\"\n]);\n\nexport const createBlockRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"block attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n // Find the block-level opening token that contains this inline\n // Walk backwards: skip the paragraph_open immediately before, then\n // look for the outermost open that wraps this inline token.\n let openToken = null;\n\n // First: find the _close token that closes the block containing this inline\n // by walking forward from the inline's position\n let closeIdx = index + 1;\n while (closeIdx < tokens.length && tokens[closeIdx].nesting !== -1) {\n closeIdx++;\n }\n\n if (closeIdx < tokens.length) {\n openToken = getMatchingOpeningToken(tokens, closeIdx);\n }\n\n if (!openToken) return;\n if (SKIP_TYPES.has(openToken.type)) return;\n\n addAttrs(openToken, content, range, options.allowed);\n\n // Strip the attr block from the last child's content\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n\n // Drop the child if now empty\n if (lastChild.content === \"\" && children.length > 1) {\n children.pop();\n }\n }\n };\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createInlineRules = (options: DelimiterConfig): AttrRule[] => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // Blocks that open the text right after an element go on it, and the text\n // after them stays, as in markdown-it-attrs.\n const takeLeadingAttrs = (\n target: Token,\n children: Token[],\n i: number\n ): void => {\n const child = children[i];\n let content = child.content;\n let range = check(content, \"start\");\n while (range) {\n addAttrs(target, content, range, options.allowed);\n content = content.slice(range[1] + options.right.length);\n range = check(content, \"start\");\n }\n if (content) child.content = content;\n else children.splice(i, 1);\n };\n\n // Handles self-closing inline elements that render attributes: `code` and\n // images. Other nesting-0 tokens (hard breaks, raw HTML) drop attributes when\n // rendered, so they are left for the end-of-block rule, as in markdown-it-attrs.\n const selfClose: AttrRule = {\n name: \"inline nesting self-close\",\n tests: [{ shift: 0, type: \"inline\" }],\n transform(tokens, index) {\n const token = tokens[index];\n const children = token.children!;\n let modified = false;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (child.type !== \"text\") continue;\n\n if (!check(child.content, \"start\")) continue;\n\n const prev = children[i - 1];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (prev?.type !== \"image\" && prev?.type !== \"code_inline\") continue;\n\n takeLeadingAttrs(prev, children, i);\n modified = true;\n }\n\n return modified;\n }\n };\n\n // Handles closing inline elements: em, strong, s, etc. (nesting === -1)\n const closing: AttrRule = {\n name: \"inline attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\"\n }\n ],\n transform(tokens, index) {\n const token = tokens[index];\n const children = token.children!;\n let modified = false;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (child.type !== \"text\") continue;\n\n if (!check(child.content, \"start\")) continue;\n\n // The preceding sibling must be a closing tag (nesting === -1)\n const prev = children[i - 1];\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!prev || prev.nesting !== -1) continue;\n\n // Find the matching opening token among children\n const openType = prev.type.replace(/_close$/, \"_open\");\n let openIdx = -1;\n for (let j = i - 2; j >= 0; j--) {\n if (\n children[j].type === openType &&\n children[j].level === prev.level\n ) {\n openIdx = j;\n break;\n }\n }\n if (openIdx === -1) continue;\n\n takeLeadingAttrs(children[openIdx], children, i);\n modified = true;\n }\n\n return modified;\n }\n };\n\n return [selfClose, closing];\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createFenceRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"fence attributes\",\n tests: [\n {\n shift: 0,\n type: \"fence\"\n }\n ],\n transform(tokens, index) {\n const token = tokens[index];\n const info = token.info.trim();\n const range = check(info, \"end\") ?? check(info, \"only\");\n if (!range) return;\n addAttrs(token, info, range, options.allowed);\n // Strip the attr block from the info string, preserving the language tag\n token.info = info\n .slice(0, info.lastIndexOf(options.left, range[0] - 1))\n .trimEnd();\n // markdown-it's fence renderer appends the language class to an existing\n // `class` attribute but otherwise adds `class` last. Reserve the slot\n // first, so `class` leads as it does in remd (mdast-util-to-hast creates\n // the language class before applying attributes, and a remark plugin\n // cannot reorder it). The renderer wrapper trims the leading space.\n if (token.info && token.attrIndex(\"class\") < 0) {\n token.attrs = [[\"class\", \"\"], ...(token.attrs ?? [])];\n token.meta = { ...token.meta, attrsReservedClass: true };\n }\n }\n };\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createHeadingRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"heading attributes\",\n // Anchored on the inline token, so the inline rules see it first and an\n // element ending the heading (`**b**{.x}`) takes the block.\n tests: [\n {\n shift: -1,\n type: \"heading_open\"\n },\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n }\n ],\n transform(tokens, index) {\n const openToken = tokens[index - 1];\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n\n const content = lastChild.content;\n const trimmed = content.trimEnd();\n const range = check(trimmed, \"end\")!;\n\n addAttrs(openToken, trimmed, range, options.allowed);\n\n // Strip the attr block from the last child content\n const before = trimmed.slice(\n 0,\n trimmed.lastIndexOf(options.left, range[0] - 1)\n );\n lastChild.content = before.trimEnd();\n\n // Drop the child entirely if it's now empty\n if (lastChild.content === \"\" && children.length > 1) {\n children.pop();\n }\n }\n };\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createHrRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n return {\n name: \"hr attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -2,\n type: \"hr\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const textChild = inline.children![0];\n const content = textChild.content.trim();\n const range = check(content, \"only\")!;\n\n const hr = tokens[index - 2];\n addAttrs(hr, content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n};\n","import type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createListRules = (options: DelimiterConfig): AttrRule[] => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // Rule 1: attrs at end of a list item inline \"- item{.red}\"\n // Structure: list_item_open(-2) paragraph_open(-1) inline(0)\n const listItemEnd: AttrRule = {\n name: \"list item end\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: \"list_item_open\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const listItemOpen = tokens[index - 2];\n addAttrs(listItemOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 1b (generic): attrs at end of a custom item title inline\n // Matches when the open token two before the inline has meta.attrsRole === \"containerItem\"\n // and the token one before has meta.attrsItemTitle === true.\n // Third-party plugins opt in by setting these meta fields on their tokens.\n const customItemEnd: AttrRule = {\n name: \"custom item end\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n meta: (m) => m?.attrsItemTitle === true\n },\n {\n shift: -2,\n meta: (m) => m?.attrsRole === \"containerItem\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const itemOpen = tokens[index - 2];\n addAttrs(itemOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 1c (direct): attrs at end of a custom item inline where the open token\n // itself carries both attrsRole === \"containerItem\" AND attrsItemTitle === true.\n // Matches dt_open → inline (no intermediate title token).\n const customItemEndDirect: AttrRule = {\n name: \"custom item end direct\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n // Only literal text can end in an attribute block: an image's `content` is its alt text, a code span's is its code.\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n meta: (m: Record<string, unknown> | null) =>\n m?.attrsItemTitle === true && m.attrsRole === \"containerItem\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const itemOpen = tokens[index - 1];\n addAttrs(itemOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 2: attrs on own paragraph after bullet/ordered list close → apply to list\n // Structure: bullet_list_close(-2) paragraph_open(-1) inline(0) paragraph_close(+1)\n const listAttr: AttrRule = {\n name: \"list attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: (t: string) =>\n t === \"bullet_list_close\" || t === \"ordered_list_close\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const textChild = children[0];\n const content = textChild.content.trim();\n const range = check(content, \"only\")!;\n\n // Find the matching list_open for the close token at index-2\n const closeToken = tokens[index - 2];\n const openType = closeToken.type.replace(\"_close\", \"_open\");\n\n let depth = 1;\n let listOpenIdx = -1;\n for (let i = index - 3; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === closeToken.type) depth++;\n else if (t.type === openType) {\n depth--;\n if (depth === 0) {\n listOpenIdx = i;\n break;\n }\n }\n }\n\n if (listOpenIdx === -1) return;\n addAttrs(tokens[listOpenIdx], content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n\n // Rule 2b (generic): attrs on own paragraph after a custom container close → apply to container open\n // Matches when the close token two before the paragraph has meta.attrsRole === \"container\".\n // Third-party plugins opt in by setting meta.attrsRole = \"container\" on their open/close tokens.\n const customListAttr: AttrRule = {\n name: \"custom list attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: (t: string) => t.endsWith(\"_close\"),\n meta: (m) => m?.attrsRole === \"container\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const textChild = children[0];\n const content = textChild.content.trim();\n const range = check(content, \"only\")!;\n\n // Walk back to find the matching open token (same type with _open suffix)\n const closeToken = tokens[index - 2];\n const openType = closeToken.type.replace(\"_close\", \"_open\");\n\n let depth = 1;\n let listOpenIdx = -1;\n for (let i = index - 3; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === closeToken.type) depth++;\n else if (t.type === openType) {\n depth--;\n if (depth === 0) {\n listOpenIdx = i;\n break;\n }\n }\n }\n\n if (listOpenIdx === -1) return;\n addAttrs(tokens[listOpenIdx], content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n\n return [\n listItemEnd,\n customItemEnd,\n customItemEndDirect,\n listAttr,\n customListAttr\n ];\n};\n","import type Token from \"markdown-it/lib/token.mjs\";\nimport type { DelimiterConfig } from \"../types.js\";\nimport {\n addAttrs,\n containersKept,\n getDelimiterChecker,\n itemColumns\n} from \"../helper/index.js\";\nimport type { LineContainer } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\n/** A container the line holding an attribute block can be written in. */\ninterface Container {\n open: Token;\n /** The token the block goes on when the line is written outside the container. */\n target: Token;\n line: LineContainer;\n}\n\nexport const createSoftbreakRule = (options: DelimiterConfig): AttrRule => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // A block on a line of its own, ending a paragraph or setext heading after a\n // soft or hard break, goes on the block that ends right before it at the\n // level the line is written, as kramdown places a block IAL: the paragraph\n // (its list item, in a tight list), or, for a line lazily written outside\n // some of the blockquotes and list items around it, the outermost of those it\n // leaves (a list item's list). markdown-it-attrs can't tell those levels\n // apart, as the token stream drops the line's indentation; the source keeps it.\n return {\n name: \"softbreak attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -2,\n type: (type: string) => type === \"softbreak\" || type === \"hardbreak\"\n },\n {\n index: -1,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n }\n ],\n transform(tokens, index, _position, _range, src) {\n const inline = tokens[index];\n const children = inline.children!;\n const content = children[children.length - 1].content.trim();\n const range = check(content, \"only\")!;\n\n // The blocks around the inline, innermost first, up to the first that\n // holds its own source (a panel tokenized from its body), which token\n // maps inside it index instead.\n const ancestors: Token[] = [];\n let source = src;\n let level = inline.level;\n for (let i = index - 1; i >= 0 && level > 0; i--) {\n const token = tokens[i];\n if (token.nesting !== 1 || token.level >= level) continue;\n level = token.level;\n const meta: unknown = token.meta;\n const own =\n typeof meta === \"object\" && meta !== null && \"attrsSource\" in meta\n ? meta.attrsSource\n : undefined;\n if (typeof own === \"string\") {\n source = own;\n break;\n }\n ancestors.push(token);\n }\n const block = ancestors.at(0);\n if (!block) return;\n\n const lines = source.split(\"\\n\");\n const containers: Container[] = [];\n let quotes = 0;\n for (let i = ancestors.length - 1; i >= 1; i--) {\n const open = ancestors[i];\n if (open.type === \"blockquote_open\") {\n containers.push({\n open,\n target: open,\n line: { kind: \"quote\", markers: ++quotes }\n });\n } else if (open.type === \"list_item_open\" && open.map) {\n // Items opened on the same line as this one, outside it, come first there.\n const before = containers.filter(\n (c) =>\n c.open.type === \"list_item_open\" &&\n c.open.map?.[0] === open.map![0]\n ).length;\n const column = itemColumns(lines[open.map[0]] ?? \"\").at(before);\n if (column === undefined) return;\n containers.push({\n open,\n target: ancestors.at(i + 1) ?? open,\n line: { kind: \"item\", column }\n });\n }\n }\n\n const line = inline.map ? (lines[inline.map[1] - 1] ?? \"\") : \"\";\n const kept = inline.map\n ? containersKept(\n line,\n containers.map((c) => c.line)\n )\n : containers.length;\n\n let target = block;\n if (kept < containers.length) target = containers[kept].target;\n // A tight list hides its paragraphs, so the item shows the attributes.\n else if (block.hidden && ancestors[1]?.type === \"list_item_open\")\n target = ancestors[1];\n addAttrs(target, content, range, options.allowed);\n\n // Remove the attr text, and a soft break before it; keep a hard break,\n // as markdown-it-attrs does.\n const isSoft = children[children.length - 2].type === \"softbreak\";\n children.splice(children.length - (isSoft ? 2 : 1), isSoft ? 2 : 1);\n }\n };\n};\n","// TableMeta lives on Token.meta which markdown-it types as any — casts narrow to the rule-specific shape.\n/* oxlint-disable typescript/no-unsafe-type-assertion */\nimport type { DelimiterConfig } from \"../types.js\";\nimport { addAttrs, getDelimiterChecker } from \"../helper/index.js\";\nimport type { AttrRule } from \"./types.js\";\n\nexport const createTableRules = (options: DelimiterConfig): AttrRule[] => {\n const check = getDelimiterChecker(options.left, options.right);\n\n // Rule 1: table-level attrs — standalone paragraph after the table \"\\n{.class}\"\n const tableAttrs: AttrRule = {\n name: \"table attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: 0,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"only\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: \"paragraph_open\"\n },\n {\n shift: -2,\n type: \"table_close\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const content = inline.children![0].content.trim();\n const range = check(content, \"only\")!;\n\n // Find the matching table_open (start from table_close at index-2)\n let tableOpenIdx = -1;\n let depth = 1;\n for (let i = index - 3; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === \"table_close\") depth++;\n else if (t.type === \"table_open\") {\n depth--;\n if (depth === 0) {\n tableOpenIdx = i;\n break;\n }\n }\n }\n if (tableOpenIdx === -1) return;\n\n addAttrs(tokens[tableOpenIdx], content, range, options.allowed);\n\n // Remove paragraph_open + inline + paragraph_close\n tokens.splice(index - 1, 3);\n }\n };\n\n // Rule 2: table cell attrs — \"cell content {.class}\" inside td/th\n const tableCellAttrs: AttrRule = {\n name: \"table cell attributes\",\n tests: [\n {\n shift: 0,\n type: \"inline\",\n children: [\n {\n index: -1,\n type: \"text\",\n content: (content: string) => check(content.trim(), \"end\") !== null\n }\n ]\n },\n {\n shift: -1,\n type: (t: string) => t === \"td_open\" || t === \"th_open\"\n }\n ],\n transform(tokens, index) {\n const inline = tokens[index];\n const children = inline.children!;\n const lastChild = children[children.length - 1];\n const content = lastChild.content.trimEnd();\n const range = check(content, \"end\")!;\n\n const cellOpen = tokens[index - 1];\n addAttrs(cellOpen, content, range, options.allowed);\n\n const attrStart = content.lastIndexOf(options.left, range[0] - 1);\n lastChild.content = content.slice(0, attrStart).trimEnd();\n if (lastChild.content === \"\" && children.length > 1) children.pop();\n }\n };\n\n // Rule 3: track column count in thead (stored as metadata for rowspan/colspan calc)\n interface TableMeta {\n cols: number;\n rowspan: number[];\n }\n\n const colTracker: AttrRule = {\n name: \"table column tracker\",\n tests: [{ shift: 0, type: \"tr_open\" }],\n transform(tokens, index) {\n // Count th tokens in this row to know column count; stored on thead_open meta\n let cols = 0;\n for (let i = index + 1; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === \"tr_close\") break;\n if (t.type === \"th_open\") cols++;\n }\n if (cols === 0) return;\n\n // Find thead_open and store column count\n for (let i = index - 1; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === \"thead_open\") {\n t.meta = t.meta ?? {};\n (t.meta as TableMeta).cols = cols;\n break;\n }\n if (t.type === \"table_open\") break;\n }\n }\n };\n\n // Rule 4: colspan/rowspan calculation — remove phantom cells, adjust span values\n const spanCalc: AttrRule = {\n name: \"table span calculator\",\n tests: [{ shift: 0, type: \"tbody_open\" }],\n transform(tokens, index) {\n // Find matching thead_open to get column count\n let cols = 0;\n for (let i = index - 1; i >= 0; i--) {\n const t = tokens[i];\n if (t.type === \"thead_open\") {\n cols = (t.meta as TableMeta | undefined)?.cols ?? 0;\n break;\n }\n if (t.type === \"table_open\") break;\n }\n if (cols === 0) return;\n\n // Find the tbody_close\n let tbodyClose = index + 1;\n let depth = 1;\n while (tbodyClose < tokens.length && depth > 0) {\n const t = tokens[tbodyClose];\n if (t.type === \"tbody_open\") depth++;\n else if (t.type === \"tbody_close\") depth--;\n tbodyClose++;\n }\n tbodyClose--;\n\n // Process each row within tbody\n const occupied: number[] = Array.from({ length: cols }, () => 0);\n\n let i = index + 1;\n while (i < tbodyClose) {\n const t = tokens[i];\n if (t.type === \"tr_open\") {\n // Decrement all occupied counts\n for (let c = 0; c < cols; c++) {\n if (occupied[c] > 0) occupied[c]--;\n }\n\n // Collect td tokens in this row\n const tdIndices: number[] = [];\n for (let j = i + 1; j < tbodyClose; j++) {\n if (tokens[j].type === \"tr_close\") break;\n if (tokens[j].type === \"td_open\") tdIndices.push(j);\n }\n\n // Assign cells to columns, skipping occupied ones\n let col = 0;\n let tdIdx = 0;\n\n while (col < cols && tdIdx < tdIndices.length) {\n // Skip occupied columns (from rowspan)\n while (col < cols && occupied[col] > 0) col++;\n if (col >= cols) break;\n\n const tdOpen = tokens[tdIndices[tdIdx]];\n const rowspanAttr = tdOpen.attrGet(\"rowspan\");\n const colspanAttr = tdOpen.attrGet(\"colspan\");\n const rowspan = rowspanAttr ? parseInt(rowspanAttr, 10) : 1;\n let colspan = colspanAttr ? parseInt(colspanAttr, 10) : 1;\n\n // Count how many consecutive free columns are available\n let freeCols = 0;\n for (let c = col; c < cols && occupied[c] === 0; c++) freeCols++;\n\n // Clamp colspan to available free columns\n if (colspan > freeCols) {\n colspan = freeCols;\n if (colspan === 1) {\n // Remove colspan attr if it resolved to 1 (keep as-is if explicitly set)\n // We keep it to match reference behavior: colspan=\"1\" is left on token\n }\n tdOpen.attrSet(\"colspan\", String(colspan));\n }\n\n // Mark columns occupied by this cell's rowspan\n for (let c = col; c < col + colspan && c < cols; c++) {\n if (rowspan > 1) occupied[c] = rowspan - 1;\n }\n\n col += colspan;\n tdIdx++;\n }\n\n // Remove phantom cells beyond assigned ones\n // (cells that were merged away by rowspan from a previous row)\n while (tdIdx < tdIndices.length) {\n const phantomStart = tdIndices[tdIdx];\n // Find the matching td_close\n let phantomEnd = phantomStart + 1;\n while (\n phantomEnd < tokens.length &&\n tokens[phantomEnd].type !== \"td_close\"\n ) {\n phantomEnd++;\n }\n tokens.splice(phantomStart, phantomEnd - phantomStart + 1);\n tbodyClose -= phantomEnd - phantomStart + 1;\n // Don't increment tdIdx since we just spliced\n }\n }\n i++;\n }\n }\n };\n\n return [tableAttrs, tableCellAttrs, colTracker, spanCalc];\n};\n","import type { AttrsOptions, AttrRuleName, DelimiterConfig } from \"../types.js\";\nimport type { AttrRule } from \"./types.js\";\nimport { createBlockRule } from \"./block.js\";\nimport { createInlineRules } from \"./inline.js\";\nimport { createFenceRule } from \"./fence.js\";\nimport { createHeadingRule } from \"./heading.js\";\nimport { createHrRule } from \"./hr.js\";\nimport { createListRules } from \"./list.js\";\nimport { createSoftbreakRule } from \"./softbreak.js\";\nimport { createTableRules } from \"./table.js\";\n\nconst ALL_RULE_NAMES: AttrRuleName[] = [\n \"fence\",\n \"inline\",\n \"table\",\n \"list\",\n \"heading\",\n \"hr\",\n \"softbreak\",\n \"block\"\n];\n\nconst ALL_RULE_SET = new Set<string>(ALL_RULE_NAMES);\n\nexport const createRules = (\n options: DelimiterConfig & Pick<AttrsOptions, \"rule\">\n): AttrRule[] => {\n const { rule = \"all\" } = options;\n\n let enabled: Set<string>;\n if (rule === \"all\" || rule === true) {\n enabled = ALL_RULE_SET;\n } else if (!rule || (Array.isArray(rule) && rule.length === 0)) {\n return [];\n } else {\n enabled = new Set(rule.filter((r) => ALL_RULE_SET.has(r)));\n }\n\n const rules: AttrRule[] = [];\n\n if (enabled.has(\"fence\")) rules.push(createFenceRule(options));\n if (enabled.has(\"inline\")) rules.push(...createInlineRules(options));\n // Before the list rules, so a list item's line of its own is placed before\n // the item reads a block ending its first line.\n if (enabled.has(\"softbreak\")) rules.push(createSoftbreakRule(options));\n if (enabled.has(\"table\")) rules.push(...createTableRules(options));\n if (enabled.has(\"list\")) rules.push(...createListRules(options));\n if (enabled.has(\"heading\")) rules.push(createHeadingRule(options));\n if (enabled.has(\"hr\")) rules.push(createHrRule(options));\n if (enabled.has(\"block\")) rules.push(createBlockRule(options));\n\n return rules;\n};\n","import type { PluginWithOptions } from \"markdown-it\";\nimport type { AttrsOptions, DelimiterRange } from \"./types.js\";\nimport { createRules } from \"./rules/index.js\";\nimport { testRule } from \"./helper/index.js\";\n\n/** markdown-it plugin for attribute lists (`{.class #id key=value}`) on elements. */\nexport const attrs: PluginWithOptions<AttrsOptions> = (\n md,\n { left = \"{\", right = \"}\", allowed = [], rule = \"all\" } = {}\n) => {\n const rules = createRules({ left, right, allowed, rule });\n\n // A fence whose class slot the fence rule reserved renders as\n // `class=\" language-x\"`; drop the leading space.\n const renderFence = md.renderer.rules.fence;\n if (renderFence) {\n md.renderer.rules.fence = (tokens, idx, opts, env, self): string => {\n const html = renderFence(tokens, idx, opts, env, self);\n return tokens[idx].meta?.attrsReservedClass\n ? html.replace(' class=\" ', ' class=\"')\n : html;\n };\n }\n\n md.core.ruler.before(\"linkify\", \"attrs\", (state) => {\n const { tokens } = state;\n\n for (let index = 0; index < tokens.length; index++) {\n for (let ruleIndex = 0; ruleIndex < rules.length; ruleIndex++) {\n const pattern = rules[ruleIndex];\n let position: number | null = null;\n let range: DelimiterRange | null = null;\n\n const match = pattern.tests.every((test) => {\n const result = testRule(tokens, index, test);\n if (result.position != null) position = result.position;\n if (result.range) range = result.range;\n return result.match;\n });\n\n if (match) {\n const modified = pattern.transform(\n tokens,\n index,\n position!,\n range!,\n state.src\n );\n\n if (\n modified !== false &&\n (pattern.name === \"inline attributes\" ||\n pattern.name === \"inline nesting self-close\")\n ) {\n ruleIndex--;\n }\n }\n }\n }\n });\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mirrordown/mdit-attrs",
3
3
  "description": "A markdown-it plugin for attribute lists ({.class #id key=value}) that set classes, IDs, and attributes on elements.",
4
- "version": "0.2.0",
4
+ "version": "0.2.1",
5
5
  "license": "MIT",
6
6
  "author": "Drake Costa <drake@saeris.io> (https://saeris.gg)",
7
7
  "repository": {
@@ -19,6 +19,9 @@
19
19
  "import": "./dist/index.mjs"
20
20
  }
21
21
  },
22
+ "dependencies": {
23
+ "@mirrordown/core": "^0.1.1"
24
+ },
22
25
  "devDependencies": {
23
26
  "@types/markdown-it": "^14.1.2",
24
27
  "markdown-it": "^14.0.0"