@cosense-toolbox/parser 0.1.0-beta.0 → 0.1.0-beta.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.
Files changed (60) hide show
  1. package/README.md +61 -751
  2. package/dist/compile.cjs +4 -3
  3. package/dist/compile.cjs.map +1 -1
  4. package/dist/compile.d.cts +24 -5
  5. package/dist/compile.d.cts.map +1 -1
  6. package/dist/compile.d.mts +24 -5
  7. package/dist/compile.d.mts.map +1 -1
  8. package/dist/compile.mjs +4 -3
  9. package/dist/compile.mjs.map +1 -1
  10. package/dist/decoration-DODaJKeA.cjs +103 -0
  11. package/dist/decoration-DODaJKeA.cjs.map +1 -0
  12. package/dist/decoration-Dq_5e20j.mjs +68 -0
  13. package/dist/decoration-Dq_5e20j.mjs.map +1 -0
  14. package/dist/extensions.cjs +14 -0
  15. package/dist/extensions.cjs.map +1 -0
  16. package/dist/extensions.d.cts +13 -0
  17. package/dist/extensions.d.cts.map +1 -0
  18. package/dist/extensions.d.mts +13 -0
  19. package/dist/extensions.d.mts.map +1 -0
  20. package/dist/extensions.mjs +13 -0
  21. package/dist/extensions.mjs.map +1 -0
  22. package/dist/index.cjs +16 -68
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +2 -2
  25. package/dist/index.d.mts +2 -2
  26. package/dist/index.mjs +8 -60
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/schema.cjs +1 -0
  29. package/dist/schema.cjs.map +1 -1
  30. package/dist/schema.d.cts +1 -1
  31. package/dist/schema.d.cts.map +1 -1
  32. package/dist/schema.d.mts +1 -1
  33. package/dist/schema.d.mts.map +1 -1
  34. package/dist/schema.mjs +1 -0
  35. package/dist/schema.mjs.map +1 -1
  36. package/dist/{types-BXlnUFr0.d.mts → types-9vAAFHka.d.mts} +2 -2
  37. package/dist/{types-BXlnUFr0.d.mts.map → types-9vAAFHka.d.mts.map} +1 -1
  38. package/dist/{types-DVwlUtla.d.cts → types-CiwPj2R8.d.cts} +2 -2
  39. package/dist/{types-DVwlUtla.d.cts.map → types-CiwPj2R8.d.cts.map} +1 -1
  40. package/dist/{types-Bo_BrmvK.d.cts → types-DmfFumcw.d.cts} +4 -2
  41. package/dist/types-DmfFumcw.d.cts.map +1 -0
  42. package/dist/{types-Bo_BrmvK.d.mts → types-DmfFumcw.d.mts} +4 -2
  43. package/dist/types-DmfFumcw.d.mts.map +1 -0
  44. package/dist/utils.cjs +1 -1
  45. package/dist/utils.cjs.map +1 -1
  46. package/dist/utils.d.cts +1 -1
  47. package/dist/utils.d.mts +1 -1
  48. package/dist/utils.mjs +1 -1
  49. package/dist/utils.mjs.map +1 -1
  50. package/package.json +8 -8
  51. package/dist/create-compiler-CvlndKOA.d.cts +0 -23
  52. package/dist/create-compiler-CvlndKOA.d.cts.map +0 -1
  53. package/dist/create-compiler-jdA408ny.d.mts +0 -23
  54. package/dist/create-compiler-jdA408ny.d.mts.map +0 -1
  55. package/dist/plugin.cjs +0 -0
  56. package/dist/plugin.d.cts +0 -4
  57. package/dist/plugin.d.mts +0 -4
  58. package/dist/plugin.mjs +0 -1
  59. package/dist/types-Bo_BrmvK.d.cts.map +0 -1
  60. package/dist/types-Bo_BrmvK.d.mts.map +0 -1
package/dist/utils.cjs CHANGED
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_ast = require("./ast-uYWtkHwT.cjs");
3
3
  //#region src/utils/visit.ts
4
4
  /**
5
- * visit.ts — unist-util-visit 風の走査。外部依存を増やさないための自前実装。
5
+ * visit.ts — AST を深さ優先で走査する。外部依存を増やさないための自前実装。
6
6
  */
7
7
  function visit(tree, typesOrVisitor, maybeVisitor) {
8
8
  const visitor = maybeVisitor ?? typesOrVisitor;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["childrenOf"],"sources":["../src/utils/visit.ts","../src/utils/links.ts"],"sourcesContent":["/**\n * visit.ts — unist-util-visit 風の走査。外部依存を増やさないための自前実装。\n */\nimport { childrenOf } from '../ast'\nimport type { AnyNode, AnyNodeType, NodeOfType } from '../types'\n\n/**\n * visitor の戻り値。\n * - 何も返さない — そのまま子へ進む\n * - `'skip'` — このノードの子を辿らない\n * - `'exit'` — 走査全体を打ち切る\n */\n// biome-ignore lint/suspicious/noConfusingVoidType: undefined だと値を返さない visitor を渡せない\nexport type VisitResult = void | 'skip' | 'exit'\n\nexport type Visitor<T extends AnyNode> = (node: T, ancestors: readonly AnyNode[]) => VisitResult\n\n/** 木を深さ優先で辿る。`types` を渡すとその型のノードだけが visitor に届く。 */\nexport function visit(tree: AnyNode, visitor: Visitor<AnyNode>): void\nexport function visit<K extends AnyNodeType>(\n tree: AnyNode,\n types: K | readonly K[],\n visitor: Visitor<NodeOfType<K>>,\n): void\nexport function visit(\n tree: AnyNode,\n typesOrVisitor: AnyNodeType | readonly AnyNodeType[] | Visitor<AnyNode>,\n maybeVisitor?: Visitor<AnyNode>,\n): void {\n const visitor = maybeVisitor ?? (typesOrVisitor as Visitor<AnyNode>)\n const types =\n maybeVisitor === undefined\n ? undefined\n : new Set(\n typeof typesOrVisitor === 'string'\n ? [typesOrVisitor]\n : (typesOrVisitor as readonly AnyNodeType[]),\n )\n\n const walk = (node: AnyNode, ancestors: readonly AnyNode[]): VisitResult => {\n if (types === undefined || types.has(node.type)) {\n const result = visitor(node, ancestors)\n if (result === 'exit') return 'exit'\n if (result === 'skip') return undefined\n }\n const nextAncestors = [...ancestors, node]\n for (const child of childrenOf(node)) {\n if (walk(child, nextAncestors) === 'exit') return 'exit'\n }\n return undefined\n }\n\n walk(tree, [])\n}\n\n/** その型の最初のノードを返す。無ければ null。 */\nexport function find<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K> | null {\n let found: NodeOfType<K> | null = null\n visit(tree, type, (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n\n/** その型のノードを出現順にすべて集める。 */\nexport function collect<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K>[] {\n const out: NodeOfType<K>[] = []\n visit(tree, type, (node) => {\n out.push(node)\n })\n return out\n}\n","/**\n * links.ts — AST からリンクと画像を抜き出す。\n */\nimport type { AnyNode, ImageNode, ProjectLink } from '../types'\nimport { collect, visit } from './visit'\n\nexport interface CollectLinksOptions {\n /** `[/project/title]` も含めるか (既定: false)。同一プロジェクト内の被リンクだけが要るなら false */\n readonly includeProjectLinks?: boolean\n}\n\n/**\n * 同じプロジェクト内のページを指すリンクを、出現順・重複なしで集める。\n * `[title]` と `#tag` は同じページを指すので同じ 1 件として扱う。\n */\nexport const collectLinks = (tree: AnyNode, options?: CollectLinksOptions): string[] => {\n const out: string[] = []\n const seen = new Set<string>()\n const add = (value: string) => {\n if (value === '' || seen.has(value)) return\n seen.add(value)\n out.push(value)\n }\n\n visit(tree, (node) => {\n if (node.type === 'internalLink') add(node.target)\n else if (node.type === 'hashtag') add(node.value)\n else if (node.type === 'projectLink' && options?.includeProjectLinks) add(node.target)\n })\n\n return out\n}\n\n/** ページが参照している外部プロジェクトのリンクを、出現順に集める。 */\nexport const collectProjectLinks = (tree: AnyNode): ProjectLink[] => collect(tree, 'projectLink')\n\n/** 最初に現れる画像ノード。無ければ null。 */\nexport const firstImage = (tree: AnyNode): ImageNode | null => {\n let found: ImageNode | null = null\n visit(tree, 'image', (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n"],"mappings":";;;;;;AAwBA,SAAgB,MACd,MACA,gBACA,cACM;CACN,MAAM,UAAU,gBAAiB;CACjC,MAAM,QACJ,iBAAiB,KAAA,IACb,KAAA,IACA,IAAI,IACF,OAAO,mBAAmB,WACtB,CAAC,cAAc,IACd,cACP;CAEN,MAAM,QAAQ,MAAe,cAA+C;EAC1E,IAAI,UAAU,KAAA,KAAa,MAAM,IAAI,KAAK,IAAI,GAAG;GAC/C,MAAM,SAAS,QAAQ,MAAM,SAAS;GACtC,IAAI,WAAW,QAAQ,OAAO;GAC9B,IAAI,WAAW,QAAQ,OAAO,KAAA;EAChC;EACA,MAAM,gBAAgB,CAAC,GAAG,WAAW,IAAI;EACzC,KAAK,MAAM,SAASA,YAAAA,WAAW,IAAI,GACjC,IAAI,KAAK,OAAO,aAAa,MAAM,QAAQ,OAAO;CAGtD;CAEA,KAAK,MAAM,CAAC,CAAC;AACf;;AAGA,SAAgB,KAA4B,MAAe,MAA+B;CACxF,IAAI,QAA8B;CAClC,MAAM,MAAM,OAAO,SAAS;EAC1B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT;;AAGA,SAAgB,QAA+B,MAAe,MAA0B;CACtF,MAAM,MAAuB,CAAC;CAC9B,MAAM,MAAM,OAAO,SAAS;EAC1B,IAAI,KAAK,IAAI;CACf,CAAC;CACD,OAAO;AACT;;;;;;;ACzDA,MAAa,gBAAgB,MAAe,YAA4C;CACtF,MAAM,MAAgB,CAAC;CACvB,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,OAAO,UAAkB;EAC7B,IAAI,UAAU,MAAM,KAAK,IAAI,KAAK,GAAG;EACrC,KAAK,IAAI,KAAK;EACd,IAAI,KAAK,KAAK;CAChB;CAEA,MAAM,OAAO,SAAS;EACpB,IAAI,KAAK,SAAS,gBAAgB,IAAI,KAAK,MAAM;OAC5C,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,KAAK;OAC3C,IAAI,KAAK,SAAS,iBAAiB,SAAS,qBAAqB,IAAI,KAAK,MAAM;CACvF,CAAC;CAED,OAAO;AACT;;AAGA,MAAa,uBAAuB,SAAiC,QAAQ,MAAM,aAAa;;AAGhG,MAAa,cAAc,SAAoC;CAC7D,IAAI,QAA0B;CAC9B,MAAM,MAAM,UAAU,SAAS;EAC7B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT"}
1
+ {"version":3,"file":"utils.cjs","names":["childrenOf"],"sources":["../src/utils/visit.ts","../src/utils/links.ts"],"sourcesContent":["/**\n * visit.ts — AST を深さ優先で走査する。外部依存を増やさないための自前実装。\n */\nimport { childrenOf } from '../ast'\nimport type { AnyNode, AnyNodeType, NodeOfType } from '../types'\n\n/**\n * visitor の戻り値。\n * - 何も返さない — そのまま子へ進む\n * - `'skip'` — このノードの子を辿らない\n * - `'exit'` — 走査全体を打ち切る\n */\n// biome-ignore lint/suspicious/noConfusingVoidType: undefined だと値を返さない visitor を渡せない\nexport type VisitResult = void | 'skip' | 'exit'\n\nexport type Visitor<T extends AnyNode> = (node: T, ancestors: readonly AnyNode[]) => VisitResult\n\n/** 木を深さ優先で辿る。`types` を渡すとその型のノードだけが visitor に届く。 */\nexport function visit(tree: AnyNode, visitor: Visitor<AnyNode>): void\nexport function visit<K extends AnyNodeType>(\n tree: AnyNode,\n types: K | readonly K[],\n visitor: Visitor<NodeOfType<K>>,\n): void\nexport function visit(\n tree: AnyNode,\n typesOrVisitor: AnyNodeType | readonly AnyNodeType[] | Visitor<AnyNode>,\n maybeVisitor?: Visitor<AnyNode>,\n): void {\n const visitor = maybeVisitor ?? (typesOrVisitor as Visitor<AnyNode>)\n const types =\n maybeVisitor === undefined\n ? undefined\n : new Set(\n typeof typesOrVisitor === 'string'\n ? [typesOrVisitor]\n : (typesOrVisitor as readonly AnyNodeType[]),\n )\n\n const walk = (node: AnyNode, ancestors: readonly AnyNode[]): VisitResult => {\n if (types === undefined || types.has(node.type)) {\n const result = visitor(node, ancestors)\n if (result === 'exit') return 'exit'\n if (result === 'skip') return undefined\n }\n const nextAncestors = [...ancestors, node]\n for (const child of childrenOf(node)) {\n if (walk(child, nextAncestors) === 'exit') return 'exit'\n }\n return undefined\n }\n\n walk(tree, [])\n}\n\n/** その型の最初のノードを返す。無ければ null。 */\nexport function find<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K> | null {\n let found: NodeOfType<K> | null = null\n visit(tree, type, (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n\n/** その型のノードを出現順にすべて集める。 */\nexport function collect<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K>[] {\n const out: NodeOfType<K>[] = []\n visit(tree, type, (node) => {\n out.push(node)\n })\n return out\n}\n","/**\n * links.ts — AST からリンクと画像を抜き出す。\n */\nimport type { AnyNode, ImageNode, ProjectLink } from '../types'\nimport { collect, visit } from './visit'\n\nexport interface CollectLinksOptions {\n /** `[/project/title]` も含めるか (既定: false)。同一プロジェクト内の被リンクだけが要るなら false */\n readonly includeProjectLinks?: boolean\n}\n\n/**\n * 同じプロジェクト内のページを指すリンクを、出現順・重複なしで集める。\n * `[title]` と `#tag` は同じページを指すので同じ 1 件として扱う。\n */\nexport const collectLinks = (tree: AnyNode, options?: CollectLinksOptions): string[] => {\n const out: string[] = []\n const seen = new Set<string>()\n const add = (value: string) => {\n if (value === '' || seen.has(value)) return\n seen.add(value)\n out.push(value)\n }\n\n visit(tree, (node) => {\n if (node.type === 'internalLink') add(node.target)\n else if (node.type === 'hashtag') add(node.value)\n else if (node.type === 'projectLink' && options?.includeProjectLinks) add(node.target)\n })\n\n return out\n}\n\n/** ページが参照している外部プロジェクトのリンクを、出現順に集める。 */\nexport const collectProjectLinks = (tree: AnyNode): ProjectLink[] => collect(tree, 'projectLink')\n\n/** 最初に現れる画像ノード。無ければ null。 */\nexport const firstImage = (tree: AnyNode): ImageNode | null => {\n let found: ImageNode | null = null\n visit(tree, 'image', (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n"],"mappings":";;;;;;AAwBA,SAAgB,MACd,MACA,gBACA,cACM;CACN,MAAM,UAAU,gBAAiB;CACjC,MAAM,QACJ,iBAAiB,KAAA,IACb,KAAA,IACA,IAAI,IACF,OAAO,mBAAmB,WACtB,CAAC,cAAc,IACd,cACP;CAEN,MAAM,QAAQ,MAAe,cAA+C;EAC1E,IAAI,UAAU,KAAA,KAAa,MAAM,IAAI,KAAK,IAAI,GAAG;GAC/C,MAAM,SAAS,QAAQ,MAAM,SAAS;GACtC,IAAI,WAAW,QAAQ,OAAO;GAC9B,IAAI,WAAW,QAAQ,OAAO,KAAA;EAChC;EACA,MAAM,gBAAgB,CAAC,GAAG,WAAW,IAAI;EACzC,KAAK,MAAM,SAASA,YAAAA,WAAW,IAAI,GACjC,IAAI,KAAK,OAAO,aAAa,MAAM,QAAQ,OAAO;CAGtD;CAEA,KAAK,MAAM,CAAC,CAAC;AACf;;AAGA,SAAgB,KAA4B,MAAe,MAA+B;CACxF,IAAI,QAA8B;CAClC,MAAM,MAAM,OAAO,SAAS;EAC1B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT;;AAGA,SAAgB,QAA+B,MAAe,MAA0B;CACtF,MAAM,MAAuB,CAAC;CAC9B,MAAM,MAAM,OAAO,SAAS;EAC1B,IAAI,KAAK,IAAI;CACf,CAAC;CACD,OAAO;AACT;;;;;;;ACzDA,MAAa,gBAAgB,MAAe,YAA4C;CACtF,MAAM,MAAgB,CAAC;CACvB,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,OAAO,UAAkB;EAC7B,IAAI,UAAU,MAAM,KAAK,IAAI,KAAK,GAAG;EACrC,KAAK,IAAI,KAAK;EACd,IAAI,KAAK,KAAK;CAChB;CAEA,MAAM,OAAO,SAAS;EACpB,IAAI,KAAK,SAAS,gBAAgB,IAAI,KAAK,MAAM;OAC5C,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,KAAK;OAC3C,IAAI,KAAK,SAAS,iBAAiB,SAAS,qBAAqB,IAAI,KAAK,MAAM;CACvF,CAAC;CAED,OAAO;AACT;;AAGA,MAAa,uBAAuB,SAAiC,QAAQ,MAAM,aAAa;;AAGhG,MAAa,cAAc,SAAoC;CAC7D,IAAI,QAA0B;CAC9B,MAAM,MAAM,UAAU,SAAS;EAC7B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT"}
package/dist/utils.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as NodeOfType, D as ProjectLink, m as ImageNode, r as AnyNodeType, t as AnyNode } from "./types-Bo_BrmvK.cjs";
1
+ import { C as NodeOfType, D as ProjectLink, m as ImageNode, r as AnyNodeType, t as AnyNode } from "./types-DmfFumcw.cjs";
2
2
  //#region src/ast.d.ts
3
3
  /**
4
4
  * ノードの子を返す。子を持たないノードでは空配列。
package/dist/utils.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as NodeOfType, D as ProjectLink, m as ImageNode, r as AnyNodeType, t as AnyNode } from "./types-Bo_BrmvK.mjs";
1
+ import { C as NodeOfType, D as ProjectLink, m as ImageNode, r as AnyNodeType, t as AnyNode } from "./types-DmfFumcw.mjs";
2
2
  //#region src/ast.d.ts
3
3
  /**
4
4
  * ノードの子を返す。子を持たないノードでは空配列。
package/dist/utils.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { n as rawTextOf, t as childrenOf } from "./ast-CIKXwSl5.mjs";
2
2
  //#region src/utils/visit.ts
3
3
  /**
4
- * visit.ts — unist-util-visit 風の走査。外部依存を増やさないための自前実装。
4
+ * visit.ts — AST を深さ優先で走査する。外部依存を増やさないための自前実装。
5
5
  */
6
6
  function visit(tree, typesOrVisitor, maybeVisitor) {
7
7
  const visitor = maybeVisitor ?? typesOrVisitor;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../src/utils/visit.ts","../src/utils/links.ts"],"sourcesContent":["/**\n * visit.ts — unist-util-visit 風の走査。外部依存を増やさないための自前実装。\n */\nimport { childrenOf } from '../ast'\nimport type { AnyNode, AnyNodeType, NodeOfType } from '../types'\n\n/**\n * visitor の戻り値。\n * - 何も返さない — そのまま子へ進む\n * - `'skip'` — このノードの子を辿らない\n * - `'exit'` — 走査全体を打ち切る\n */\n// biome-ignore lint/suspicious/noConfusingVoidType: undefined だと値を返さない visitor を渡せない\nexport type VisitResult = void | 'skip' | 'exit'\n\nexport type Visitor<T extends AnyNode> = (node: T, ancestors: readonly AnyNode[]) => VisitResult\n\n/** 木を深さ優先で辿る。`types` を渡すとその型のノードだけが visitor に届く。 */\nexport function visit(tree: AnyNode, visitor: Visitor<AnyNode>): void\nexport function visit<K extends AnyNodeType>(\n tree: AnyNode,\n types: K | readonly K[],\n visitor: Visitor<NodeOfType<K>>,\n): void\nexport function visit(\n tree: AnyNode,\n typesOrVisitor: AnyNodeType | readonly AnyNodeType[] | Visitor<AnyNode>,\n maybeVisitor?: Visitor<AnyNode>,\n): void {\n const visitor = maybeVisitor ?? (typesOrVisitor as Visitor<AnyNode>)\n const types =\n maybeVisitor === undefined\n ? undefined\n : new Set(\n typeof typesOrVisitor === 'string'\n ? [typesOrVisitor]\n : (typesOrVisitor as readonly AnyNodeType[]),\n )\n\n const walk = (node: AnyNode, ancestors: readonly AnyNode[]): VisitResult => {\n if (types === undefined || types.has(node.type)) {\n const result = visitor(node, ancestors)\n if (result === 'exit') return 'exit'\n if (result === 'skip') return undefined\n }\n const nextAncestors = [...ancestors, node]\n for (const child of childrenOf(node)) {\n if (walk(child, nextAncestors) === 'exit') return 'exit'\n }\n return undefined\n }\n\n walk(tree, [])\n}\n\n/** その型の最初のノードを返す。無ければ null。 */\nexport function find<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K> | null {\n let found: NodeOfType<K> | null = null\n visit(tree, type, (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n\n/** その型のノードを出現順にすべて集める。 */\nexport function collect<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K>[] {\n const out: NodeOfType<K>[] = []\n visit(tree, type, (node) => {\n out.push(node)\n })\n return out\n}\n","/**\n * links.ts — AST からリンクと画像を抜き出す。\n */\nimport type { AnyNode, ImageNode, ProjectLink } from '../types'\nimport { collect, visit } from './visit'\n\nexport interface CollectLinksOptions {\n /** `[/project/title]` も含めるか (既定: false)。同一プロジェクト内の被リンクだけが要るなら false */\n readonly includeProjectLinks?: boolean\n}\n\n/**\n * 同じプロジェクト内のページを指すリンクを、出現順・重複なしで集める。\n * `[title]` と `#tag` は同じページを指すので同じ 1 件として扱う。\n */\nexport const collectLinks = (tree: AnyNode, options?: CollectLinksOptions): string[] => {\n const out: string[] = []\n const seen = new Set<string>()\n const add = (value: string) => {\n if (value === '' || seen.has(value)) return\n seen.add(value)\n out.push(value)\n }\n\n visit(tree, (node) => {\n if (node.type === 'internalLink') add(node.target)\n else if (node.type === 'hashtag') add(node.value)\n else if (node.type === 'projectLink' && options?.includeProjectLinks) add(node.target)\n })\n\n return out\n}\n\n/** ページが参照している外部プロジェクトのリンクを、出現順に集める。 */\nexport const collectProjectLinks = (tree: AnyNode): ProjectLink[] => collect(tree, 'projectLink')\n\n/** 最初に現れる画像ノード。無ければ null。 */\nexport const firstImage = (tree: AnyNode): ImageNode | null => {\n let found: ImageNode | null = null\n visit(tree, 'image', (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n"],"mappings":";;;;;AAwBA,SAAgB,MACd,MACA,gBACA,cACM;CACN,MAAM,UAAU,gBAAiB;CACjC,MAAM,QACJ,iBAAiB,KAAA,IACb,KAAA,IACA,IAAI,IACF,OAAO,mBAAmB,WACtB,CAAC,cAAc,IACd,cACP;CAEN,MAAM,QAAQ,MAAe,cAA+C;EAC1E,IAAI,UAAU,KAAA,KAAa,MAAM,IAAI,KAAK,IAAI,GAAG;GAC/C,MAAM,SAAS,QAAQ,MAAM,SAAS;GACtC,IAAI,WAAW,QAAQ,OAAO;GAC9B,IAAI,WAAW,QAAQ,OAAO,KAAA;EAChC;EACA,MAAM,gBAAgB,CAAC,GAAG,WAAW,IAAI;EACzC,KAAK,MAAM,SAAS,WAAW,IAAI,GACjC,IAAI,KAAK,OAAO,aAAa,MAAM,QAAQ,OAAO;CAGtD;CAEA,KAAK,MAAM,CAAC,CAAC;AACf;;AAGA,SAAgB,KAA4B,MAAe,MAA+B;CACxF,IAAI,QAA8B;CAClC,MAAM,MAAM,OAAO,SAAS;EAC1B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT;;AAGA,SAAgB,QAA+B,MAAe,MAA0B;CACtF,MAAM,MAAuB,CAAC;CAC9B,MAAM,MAAM,OAAO,SAAS;EAC1B,IAAI,KAAK,IAAI;CACf,CAAC;CACD,OAAO;AACT;;;;;;;ACzDA,MAAa,gBAAgB,MAAe,YAA4C;CACtF,MAAM,MAAgB,CAAC;CACvB,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,OAAO,UAAkB;EAC7B,IAAI,UAAU,MAAM,KAAK,IAAI,KAAK,GAAG;EACrC,KAAK,IAAI,KAAK;EACd,IAAI,KAAK,KAAK;CAChB;CAEA,MAAM,OAAO,SAAS;EACpB,IAAI,KAAK,SAAS,gBAAgB,IAAI,KAAK,MAAM;OAC5C,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,KAAK;OAC3C,IAAI,KAAK,SAAS,iBAAiB,SAAS,qBAAqB,IAAI,KAAK,MAAM;CACvF,CAAC;CAED,OAAO;AACT;;AAGA,MAAa,uBAAuB,SAAiC,QAAQ,MAAM,aAAa;;AAGhG,MAAa,cAAc,SAAoC;CAC7D,IAAI,QAA0B;CAC9B,MAAM,MAAM,UAAU,SAAS;EAC7B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../src/utils/visit.ts","../src/utils/links.ts"],"sourcesContent":["/**\n * visit.ts — AST を深さ優先で走査する。外部依存を増やさないための自前実装。\n */\nimport { childrenOf } from '../ast'\nimport type { AnyNode, AnyNodeType, NodeOfType } from '../types'\n\n/**\n * visitor の戻り値。\n * - 何も返さない — そのまま子へ進む\n * - `'skip'` — このノードの子を辿らない\n * - `'exit'` — 走査全体を打ち切る\n */\n// biome-ignore lint/suspicious/noConfusingVoidType: undefined だと値を返さない visitor を渡せない\nexport type VisitResult = void | 'skip' | 'exit'\n\nexport type Visitor<T extends AnyNode> = (node: T, ancestors: readonly AnyNode[]) => VisitResult\n\n/** 木を深さ優先で辿る。`types` を渡すとその型のノードだけが visitor に届く。 */\nexport function visit(tree: AnyNode, visitor: Visitor<AnyNode>): void\nexport function visit<K extends AnyNodeType>(\n tree: AnyNode,\n types: K | readonly K[],\n visitor: Visitor<NodeOfType<K>>,\n): void\nexport function visit(\n tree: AnyNode,\n typesOrVisitor: AnyNodeType | readonly AnyNodeType[] | Visitor<AnyNode>,\n maybeVisitor?: Visitor<AnyNode>,\n): void {\n const visitor = maybeVisitor ?? (typesOrVisitor as Visitor<AnyNode>)\n const types =\n maybeVisitor === undefined\n ? undefined\n : new Set(\n typeof typesOrVisitor === 'string'\n ? [typesOrVisitor]\n : (typesOrVisitor as readonly AnyNodeType[]),\n )\n\n const walk = (node: AnyNode, ancestors: readonly AnyNode[]): VisitResult => {\n if (types === undefined || types.has(node.type)) {\n const result = visitor(node, ancestors)\n if (result === 'exit') return 'exit'\n if (result === 'skip') return undefined\n }\n const nextAncestors = [...ancestors, node]\n for (const child of childrenOf(node)) {\n if (walk(child, nextAncestors) === 'exit') return 'exit'\n }\n return undefined\n }\n\n walk(tree, [])\n}\n\n/** その型の最初のノードを返す。無ければ null。 */\nexport function find<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K> | null {\n let found: NodeOfType<K> | null = null\n visit(tree, type, (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n\n/** その型のノードを出現順にすべて集める。 */\nexport function collect<K extends AnyNodeType>(tree: AnyNode, type: K): NodeOfType<K>[] {\n const out: NodeOfType<K>[] = []\n visit(tree, type, (node) => {\n out.push(node)\n })\n return out\n}\n","/**\n * links.ts — AST からリンクと画像を抜き出す。\n */\nimport type { AnyNode, ImageNode, ProjectLink } from '../types'\nimport { collect, visit } from './visit'\n\nexport interface CollectLinksOptions {\n /** `[/project/title]` も含めるか (既定: false)。同一プロジェクト内の被リンクだけが要るなら false */\n readonly includeProjectLinks?: boolean\n}\n\n/**\n * 同じプロジェクト内のページを指すリンクを、出現順・重複なしで集める。\n * `[title]` と `#tag` は同じページを指すので同じ 1 件として扱う。\n */\nexport const collectLinks = (tree: AnyNode, options?: CollectLinksOptions): string[] => {\n const out: string[] = []\n const seen = new Set<string>()\n const add = (value: string) => {\n if (value === '' || seen.has(value)) return\n seen.add(value)\n out.push(value)\n }\n\n visit(tree, (node) => {\n if (node.type === 'internalLink') add(node.target)\n else if (node.type === 'hashtag') add(node.value)\n else if (node.type === 'projectLink' && options?.includeProjectLinks) add(node.target)\n })\n\n return out\n}\n\n/** ページが参照している外部プロジェクトのリンクを、出現順に集める。 */\nexport const collectProjectLinks = (tree: AnyNode): ProjectLink[] => collect(tree, 'projectLink')\n\n/** 最初に現れる画像ノード。無ければ null。 */\nexport const firstImage = (tree: AnyNode): ImageNode | null => {\n let found: ImageNode | null = null\n visit(tree, 'image', (node) => {\n found = node\n return 'exit'\n })\n return found\n}\n"],"mappings":";;;;;AAwBA,SAAgB,MACd,MACA,gBACA,cACM;CACN,MAAM,UAAU,gBAAiB;CACjC,MAAM,QACJ,iBAAiB,KAAA,IACb,KAAA,IACA,IAAI,IACF,OAAO,mBAAmB,WACtB,CAAC,cAAc,IACd,cACP;CAEN,MAAM,QAAQ,MAAe,cAA+C;EAC1E,IAAI,UAAU,KAAA,KAAa,MAAM,IAAI,KAAK,IAAI,GAAG;GAC/C,MAAM,SAAS,QAAQ,MAAM,SAAS;GACtC,IAAI,WAAW,QAAQ,OAAO;GAC9B,IAAI,WAAW,QAAQ,OAAO,KAAA;EAChC;EACA,MAAM,gBAAgB,CAAC,GAAG,WAAW,IAAI;EACzC,KAAK,MAAM,SAAS,WAAW,IAAI,GACjC,IAAI,KAAK,OAAO,aAAa,MAAM,QAAQ,OAAO;CAGtD;CAEA,KAAK,MAAM,CAAC,CAAC;AACf;;AAGA,SAAgB,KAA4B,MAAe,MAA+B;CACxF,IAAI,QAA8B;CAClC,MAAM,MAAM,OAAO,SAAS;EAC1B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT;;AAGA,SAAgB,QAA+B,MAAe,MAA0B;CACtF,MAAM,MAAuB,CAAC;CAC9B,MAAM,MAAM,OAAO,SAAS;EAC1B,IAAI,KAAK,IAAI;CACf,CAAC;CACD,OAAO;AACT;;;;;;;ACzDA,MAAa,gBAAgB,MAAe,YAA4C;CACtF,MAAM,MAAgB,CAAC;CACvB,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,OAAO,UAAkB;EAC7B,IAAI,UAAU,MAAM,KAAK,IAAI,KAAK,GAAG;EACrC,KAAK,IAAI,KAAK;EACd,IAAI,KAAK,KAAK;CAChB;CAEA,MAAM,OAAO,SAAS;EACpB,IAAI,KAAK,SAAS,gBAAgB,IAAI,KAAK,MAAM;OAC5C,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,KAAK;OAC3C,IAAI,KAAK,SAAS,iBAAiB,SAAS,qBAAqB,IAAI,KAAK,MAAM;CACvF,CAAC;CAED,OAAO;AACT;;AAGA,MAAa,uBAAuB,SAAiC,QAAQ,MAAM,aAAa;;AAGhG,MAAa,cAAc,SAAoC;CAC7D,IAAI,QAA0B;CAC9B,MAAM,MAAM,UAAU,SAAS;EAC7B,QAAQ;EACR,OAAO;CACT,CAAC;CACD,OAAO;AACT"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cosense-toolbox/parser",
3
- "version": "0.1.0-beta.0",
4
- "description": "Cosense (Scrapbox) notation parser — position-aware, unist-style AST. Zero runtime deps except effect.",
3
+ "version": "0.1.0-beta.1",
4
+ "description": "Cosense (Scrapbox) notation parser — every node carries its source position. Zero runtime deps except effect.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -42,14 +42,14 @@
42
42
  "default": "./dist/utils.cjs"
43
43
  }
44
44
  },
45
- "./plugin": {
45
+ "./extensions": {
46
46
  "import": {
47
- "types": "./dist/plugin.d.mts",
48
- "default": "./dist/plugin.mjs"
47
+ "types": "./dist/extensions.d.mts",
48
+ "default": "./dist/extensions.mjs"
49
49
  },
50
50
  "require": {
51
- "types": "./dist/plugin.d.cts",
52
- "default": "./dist/plugin.cjs"
51
+ "types": "./dist/extensions.d.cts",
52
+ "default": "./dist/extensions.cjs"
53
53
  }
54
54
  },
55
55
  "./compile": {
@@ -87,7 +87,7 @@
87
87
  "tag": "beta",
88
88
  "registry": "https://registry.npmjs.org/"
89
89
  },
90
- "keywords": ["cosense", "scrapbox", "parser", "ast", "unist", "effect"],
90
+ "keywords": ["cosense", "scrapbox", "parser", "ast", "syntax", "effect"],
91
91
  "repository": {
92
92
  "type": "git",
93
93
  "url": "git+https://github.com/qaynam/cosense-toolbox.git",
@@ -1,23 +0,0 @@
1
- import { C as NodeOfType, r as AnyNodeType, t as AnyNode } from "./types-Bo_BrmvK.cjs";
2
- //#region src/compile/create-compiler.d.ts
3
- /** ハンドラの中から再帰的に変換するための入口。 */
4
- interface CompileContext<Out> {
5
- readonly node: (node: AnyNode) => Out;
6
- readonly children: (node: AnyNode) => Out[];
7
- }
8
- type NodeHandler<Out, K extends AnyNodeType> = (node: NodeOfType<K>, ctx: CompileContext<Out>) => Out;
9
- /**
10
- * ノード型 → ハンドラの対応。`AnyNodeMap` から型を導出しているので、
11
- * ノード型が増えたらここも自動で新しいキーを受け入れる。
12
- */
13
- type NodeHandlers<Out> = { readonly [K in AnyNodeType]?: NodeHandler<Out, K>; };
14
- interface CompilerOptions<Out> {
15
- readonly handlers: NodeHandlers<Out>;
16
- /** ハンドラが無いノード型に使う既定の変換 */
17
- readonly fallback: NodeHandler<Out, AnyNodeType>;
18
- }
19
- /** AST をひとつの値に変換する関数を作る。 */
20
- declare const createCompiler: <Out>(options: CompilerOptions<Out>) => (node: AnyNode) => Out;
21
- //#endregion
22
- export { createCompiler as a, NodeHandlers as i, CompilerOptions as n, NodeHandler as r, CompileContext as t };
23
- //# sourceMappingURL=create-compiler-CvlndKOA.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-compiler-CvlndKOA.d.cts","names":[],"sources":["../src/compile/create-compiler.ts"],"mappings":";;;UAQiB,eAAe;WACrB,OAAO,MAAM,YAAY;WACzB,WAAW,MAAM,YAAY;;KAG5B,YAAY,KAAK,UAAU,gBACrC,MAAM,WAAW,IACjB,KAAK,eAAe,SACjB;;;;;KAMO,aAAa,mBACb,KAAK,eAAe,YAAY,KAAK;UAGhC,gBAAgB;WACtB,UAAU,aAAa;;WAEvB,UAAU,YAAY,KAAK;;;cAIzB,iBAAkB,KAAK,SAAS,gBAAgB,UAAI,MACxC,YAAU"}
@@ -1,23 +0,0 @@
1
- import { C as NodeOfType, r as AnyNodeType, t as AnyNode } from "./types-Bo_BrmvK.mjs";
2
- //#region src/compile/create-compiler.d.ts
3
- /** ハンドラの中から再帰的に変換するための入口。 */
4
- interface CompileContext<Out> {
5
- readonly node: (node: AnyNode) => Out;
6
- readonly children: (node: AnyNode) => Out[];
7
- }
8
- type NodeHandler<Out, K extends AnyNodeType> = (node: NodeOfType<K>, ctx: CompileContext<Out>) => Out;
9
- /**
10
- * ノード型 → ハンドラの対応。`AnyNodeMap` から型を導出しているので、
11
- * ノード型が増えたらここも自動で新しいキーを受け入れる。
12
- */
13
- type NodeHandlers<Out> = { readonly [K in AnyNodeType]?: NodeHandler<Out, K>; };
14
- interface CompilerOptions<Out> {
15
- readonly handlers: NodeHandlers<Out>;
16
- /** ハンドラが無いノード型に使う既定の変換 */
17
- readonly fallback: NodeHandler<Out, AnyNodeType>;
18
- }
19
- /** AST をひとつの値に変換する関数を作る。 */
20
- declare const createCompiler: <Out>(options: CompilerOptions<Out>) => (node: AnyNode) => Out;
21
- //#endregion
22
- export { createCompiler as a, NodeHandlers as i, CompilerOptions as n, NodeHandler as r, CompileContext as t };
23
- //# sourceMappingURL=create-compiler-jdA408ny.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-compiler-jdA408ny.d.mts","names":[],"sources":["../src/compile/create-compiler.ts"],"mappings":";;;UAQiB,eAAe;WACrB,OAAO,MAAM,YAAY;WACzB,WAAW,MAAM,YAAY;;KAG5B,YAAY,KAAK,UAAU,gBACrC,MAAM,WAAW,IACjB,KAAK,eAAe,SACjB;;;;;KAMO,aAAa,mBACb,KAAK,eAAe,YAAY,KAAK;UAGhC,gBAAgB;WACtB,UAAU,aAAa;;WAEvB,UAAU,YAAY,KAAK;;;cAIzB,iBAAkB,KAAK,SAAS,gBAAgB,UAAI,MACxC,YAAU"}
package/dist/plugin.cjs DELETED
File without changes
package/dist/plugin.d.cts DELETED
@@ -1,4 +0,0 @@
1
- import { F as WithoutPosition, _ as InlineNodeInit } from "./types-Bo_BrmvK.cjs";
2
- import { i as NodeHandlers, n as CompilerOptions, r as NodeHandler, t as CompileContext } from "./create-compiler-CvlndKOA.cjs";
3
- import { a as InlineConstruct, i as Extension, n as BracketRuleContext, o as InlineContext, r as ConstructMatch, s as Origin, t as BracketRule } from "./types-DVwlUtla.cjs";
4
- export type { BracketRule, BracketRuleContext, CompileContext, CompilerOptions, ConstructMatch, Extension, InlineConstruct, InlineContext, InlineNodeInit, NodeHandler, NodeHandlers, Origin, WithoutPosition };
package/dist/plugin.d.mts DELETED
@@ -1,4 +0,0 @@
1
- import { F as WithoutPosition, _ as InlineNodeInit } from "./types-Bo_BrmvK.mjs";
2
- import { i as NodeHandlers, n as CompilerOptions, r as NodeHandler, t as CompileContext } from "./create-compiler-jdA408ny.mjs";
3
- import { a as InlineConstruct, i as Extension, n as BracketRuleContext, o as InlineContext, r as ConstructMatch, s as Origin, t as BracketRule } from "./types-BXlnUFr0.mjs";
4
- export type { BracketRule, BracketRuleContext, CompileContext, CompilerOptions, ConstructMatch, Extension, InlineConstruct, InlineContext, InlineNodeInit, NodeHandler, NodeHandlers, Origin, WithoutPosition };
package/dist/plugin.mjs DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-Bo_BrmvK.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;;;;UAkBiB;;WAEN;;WAEA;;WAEA;;;;;;;UAQM;WACN,OAAO;WACP,KAAK;;;UAIC;WACN;WACA,UAAU;;;UAQJ,iBAAiB;WACvB;WACA;;;UAIM,qBAAqB;WAC3B;;WAEA;;WAEA;;;UAIM,qBAAqB;WAC3B;WACA;WACA;;;UAIM,oBAAoB;WAC1B;WACA;;WAEA;WACA;;WAEA;;;UAIM,gBAAgB;WACtB;WACA;;;UAIM,mBAAmB;WACzB;WACA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA;;;UAIM,iBAAiB;WACvB;WACA;;WAEA;;;UAIM,oBAAoB;WAC1B;WACA;;;;;;;;UASM,mBAAmB;WACzB;;WAEA;WACA;WACA;WACA;WACA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,MAAM;EACN,cAAc;EACd,cAAc;EACd,aAAa;EACb,SAAS;EACT,YAAY;EACZ,OAAO;EACP,MAAM;EACN,SAAS;EACT,YAAY;;KAGF,uBAAuB;KACvB,aAAa,cAAc;;UAOtB,mBAAmB;WACzB;;WAEA;WACA,mBAAmB;;;UAIb,iBAAiB;WACvB;;;;;WAKA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA,gBAAgB;;;UAIV,kBAAkB;WACxB;WACA;;;UAIM,iBAAiB;WACvB;WACA,gBAAgB;;;UAIV,mBAAmB;WACzB;WACA;WACA;WACA,eAAe;;;UAIT,kBAAkB;WACxB;;WAEA;;WAEA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,OAAO;EACP,WAAW;EACX,UAAU;EACV,OAAO;EACP,UAAU;EACV,WAAW;EACX,MAAM;;KAGI,sBAAsB;KACtB,YAAY,aAAa;;KAGzB,gBAAgB,aAAa,YAAY,aAAa;;UAOjD,aAAa;WACnB;WACA,mBAAmB;;UAOb;EACf,MAAM;;;KAII,aAAa,cAAc,eAAe;KAE1C,oBAAoB;KACpB,UAAU,WAAW;;KAGrB,WAAW,UAAU,eAAe,WAAW;;;;;;;KAQ/C,gBAAgB,KAAK,oBAAoB,KAAK;;KAG9C,iBAAiB,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-Bo_BrmvK.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;;;;UAkBiB;;WAEN;;WAEA;;WAEA;;;;;;;UAQM;WACN,OAAO;WACP,KAAK;;;UAIC;WACN;WACA,UAAU;;;UAQJ,iBAAiB;WACvB;WACA;;;UAIM,qBAAqB;WAC3B;;WAEA;;WAEA;;;UAIM,qBAAqB;WAC3B;WACA;WACA;;;UAIM,oBAAoB;WAC1B;WACA;;WAEA;WACA;;WAEA;;;UAIM,gBAAgB;WACtB;WACA;;;UAIM,mBAAmB;WACzB;WACA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA;;;UAIM,iBAAiB;WACvB;WACA;;WAEA;;;UAIM,oBAAoB;WAC1B;WACA;;;;;;;;UASM,mBAAmB;WACzB;;WAEA;WACA;WACA;WACA;WACA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,MAAM;EACN,cAAc;EACd,cAAc;EACd,aAAa;EACb,SAAS;EACT,YAAY;EACZ,OAAO;EACP,MAAM;EACN,SAAS;EACT,YAAY;;KAGF,uBAAuB;KACvB,aAAa,cAAc;;UAOtB,mBAAmB;WACzB;;WAEA;WACA,mBAAmB;;;UAIb,iBAAiB;WACvB;;;;;WAKA;;;UAIM,kBAAkB;WACxB;WACA;;WAEA;;WAEA,gBAAgB;;;UAIV,kBAAkB;WACxB;WACA;;;UAIM,iBAAiB;WACvB;WACA,gBAAgB;;;UAIV,mBAAmB;WACzB;WACA;WACA;WACA,eAAe;;;UAIT,kBAAkB;WACxB;;WAEA;;WAEA;;WAEA;;WAEA,mBAAmB;;;;;;UAOb;EACf,OAAO;EACP,WAAW;EACX,UAAU;EACV,OAAO;EACP,UAAU;EACV,WAAW;EACX,MAAM;;KAGI,sBAAsB;KACtB,YAAY,aAAa;;KAGzB,gBAAgB,aAAa,YAAY,aAAa;;UAOjD,aAAa;WACnB;WACA,mBAAmB;;UAOb;EACf,MAAM;;;KAII,aAAa,cAAc,eAAe;KAE1C,oBAAoB;KACpB,UAAU,WAAW;;KAGrB,WAAW,UAAU,eAAe,WAAW;;;;;;;KAQ/C,gBAAgB,KAAK,oBAAoB,KAAK;;KAG9C,iBAAiB,gBAAgB"}