@cosense-toolbox/parser 0.1.0-beta.1 → 0.1.0-beta.2

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 (78) hide show
  1. package/README.md +37 -29
  2. package/dist/{ast-uYWtkHwT.cjs → ast-C0BGz7X2.cjs} +2 -2
  3. package/dist/ast-C0BGz7X2.cjs.map +1 -0
  4. package/dist/{ast-CIKXwSl5.mjs → ast-CMQYawYl.mjs} +2 -2
  5. package/dist/ast-CMQYawYl.mjs.map +1 -0
  6. package/dist/compile.cjs +2 -213
  7. package/dist/compile.cjs.map +1 -1
  8. package/dist/compile.d.cts +2 -129
  9. package/dist/compile.d.cts.map +1 -1
  10. package/dist/compile.d.mts +2 -129
  11. package/dist/compile.d.mts.map +1 -1
  12. package/dist/compile.mjs +3 -207
  13. package/dist/compile.mjs.map +1 -1
  14. package/dist/{decoration-Dq_5e20j.mjs → decoration-BB1cS4lH.mjs} +5 -1
  15. package/dist/decoration-BB1cS4lH.mjs.map +1 -0
  16. package/dist/{decoration-DODaJKeA.cjs → decoration-BYXIXxCA.cjs} +5 -1
  17. package/dist/decoration-BYXIXxCA.cjs.map +1 -0
  18. package/dist/extensions.cjs +20 -2
  19. package/dist/extensions.cjs.map +1 -1
  20. package/dist/extensions.d.cts +16 -3
  21. package/dist/extensions.d.cts.map +1 -1
  22. package/dist/extensions.d.mts +16 -3
  23. package/dist/extensions.d.mts.map +1 -1
  24. package/dist/extensions.mjs +20 -3
  25. package/dist/extensions.mjs.map +1 -1
  26. package/dist/html.cjs +458 -0
  27. package/dist/html.cjs.map +1 -0
  28. package/dist/html.d.cts +274 -0
  29. package/dist/html.d.cts.map +1 -0
  30. package/dist/html.d.mts +274 -0
  31. package/dist/html.d.mts.map +1 -0
  32. package/dist/html.mjs +447 -0
  33. package/dist/html.mjs.map +1 -0
  34. package/dist/image-url-YcTed8tg.cjs.map +1 -1
  35. package/dist/image-url-eQ6X-oN0.mjs.map +1 -1
  36. package/dist/index-CrIlOW1k.d.mts +78 -0
  37. package/dist/index-CrIlOW1k.d.mts.map +1 -0
  38. package/dist/index-_o1STNhP.d.cts +78 -0
  39. package/dist/index-_o1STNhP.d.cts.map +1 -0
  40. package/dist/index.cjs +103 -27
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +4 -77
  43. package/dist/index.d.mts +4 -77
  44. package/dist/index.mjs +103 -27
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/schema.cjs +1 -0
  47. package/dist/schema.cjs.map +1 -1
  48. package/dist/schema.d.cts +1 -1
  49. package/dist/schema.d.cts.map +1 -1
  50. package/dist/schema.d.mts +1 -1
  51. package/dist/schema.d.mts.map +1 -1
  52. package/dist/schema.mjs +1 -0
  53. package/dist/schema.mjs.map +1 -1
  54. package/dist/{types-CiwPj2R8.d.cts → types-CdiHju1P.d.mts} +15 -12
  55. package/dist/types-CdiHju1P.d.mts.map +1 -0
  56. package/dist/{types-9vAAFHka.d.mts → types-_-ZAyNkz.d.cts} +15 -12
  57. package/dist/types-_-ZAyNkz.d.cts.map +1 -0
  58. package/dist/{types-DmfFumcw.d.cts → types-gWMrsXPX.d.cts} +28 -21
  59. package/dist/{types-DmfFumcw.d.cts.map → types-gWMrsXPX.d.cts.map} +1 -1
  60. package/dist/{types-DmfFumcw.d.mts → types-gWMrsXPX.d.mts} +28 -21
  61. package/dist/{types-DmfFumcw.d.mts.map → types-gWMrsXPX.d.mts.map} +1 -1
  62. package/dist/utils.cjs +1 -1
  63. package/dist/utils.cjs.map +1 -1
  64. package/dist/utils.d.cts +2 -2
  65. package/dist/utils.d.cts.map +1 -1
  66. package/dist/utils.d.mts +2 -2
  67. package/dist/utils.d.mts.map +1 -1
  68. package/dist/utils.mjs +1 -1
  69. package/dist/utils.mjs.map +1 -1
  70. package/package.json +27 -4
  71. package/dist/ast-CIKXwSl5.mjs.map +0 -1
  72. package/dist/ast-uYWtkHwT.cjs.map +0 -1
  73. package/dist/decoration-DODaJKeA.cjs.map +0 -1
  74. package/dist/decoration-Dq_5e20j.mjs.map +0 -1
  75. package/dist/index.d.cts.map +0 -1
  76. package/dist/index.d.mts.map +0 -1
  77. package/dist/types-9vAAFHka.d.mts.map +0 -1
  78. package/dist/types-CiwPj2R8.d.cts.map +0 -1
package/dist/utils.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_ast = require("./ast-uYWtkHwT.cjs");
2
+ const require_ast = require("./ast-C0BGz7X2.cjs");
3
3
  //#region src/utils/visit.ts
4
4
  /**
5
5
  * visit.ts — AST を深さ優先で走査する。外部依存を増やさないための自前実装。
@@ -1 +1 @@
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"}
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// void にしているのは、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-DmfFumcw.cjs";
1
+ import { C as NodeOfType, D as ProjectLink, m as ImageNode, r as AnyNodeType, t as AnyNode } from "./types-gWMrsXPX.cjs";
2
2
  //#region src/ast.d.ts
3
3
  /**
4
4
  * ノードの子を返す。子を持たないノードでは空配列。
@@ -32,7 +32,7 @@ declare const firstImage: (tree: AnyNode) => ImageNode | null;
32
32
  * - `'skip'` — このノードの子を辿らない
33
33
  * - `'exit'` — 走査全体を打ち切る
34
34
  */
35
- type VisitResult = void | 'skip' | 'exit';
35
+ type VisitResult = void | "skip" | "exit";
36
36
  type Visitor<T extends AnyNode> = (node: T, ancestors: readonly AnyNode[]) => VisitResult;
37
37
  /** 木を深さ優先で辿る。`types` を渡すとその型のノードだけが visitor に届く。 */
38
38
  declare function visit(tree: AnyNode, visitor: Visitor<AnyNode>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.cts","names":[],"sources":["../src/ast.ts","../src/utils/links.ts","../src/utils/visit.ts"],"mappings":";;;;;;;;cAiBa,aAAc,MAAM,qBAAmB;;cAuCvC,YAAa,gBAAgB,MAAM;;;UClD/B;;WAEN;;;;;;cAOE,eAAgB,MAAM,SAAS,UAAU;;cAmBzC,sBAAuB,MAAM,YAAU;;cAGvC,aAAc,MAAM,YAAU;;;;;;;;;KCxB/B;KAEA,QAAQ,UAAU,YAAY,MAAM,GAAG,oBAAoB,cAAc;;iBAGrE,MAAM,MAAM,SAAS,SAAS,QAAQ;iBACtC,MAAM,UAAU,aAC9B,MAAM,SACN,OAAO,aAAa,KACpB,SAAS,QAAQ,WAAW;;iBAkCd,KAAK,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW;;iBAUhE,QAAQ,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW"}
1
+ {"version":3,"file":"utils.d.cts","names":[],"sources":["../src/ast.ts","../src/utils/links.ts","../src/utils/visit.ts"],"mappings":";;;;;;;;cAiBa,aAAc,MAAM,qBAAmB;;cAwCvC,YAAa,gBAAgB,MAAM;;;UCnD/B;;WAEN;;;;;;cAOE,eAAgB,MAAM,SAAS,UAAU;;cAmBzC,sBAAuB,MAAM,YAAU;;cAGvC,aAAc,MAAM,YAAU;;;;;;;;;KCxB/B;KAEA,QAAQ,UAAU,YAAY,MAAM,GAAG,oBAAoB,cAAc;;iBAGrE,MAAM,MAAM,SAAS,SAAS,QAAQ;iBACtC,MAAM,UAAU,aAC9B,MAAM,SACN,OAAO,aAAa,KACpB,SAAS,QAAQ,WAAW;;iBAkCd,KAAK,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW;;iBAUhE,QAAQ,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW"}
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-DmfFumcw.mjs";
1
+ import { C as NodeOfType, D as ProjectLink, m as ImageNode, r as AnyNodeType, t as AnyNode } from "./types-gWMrsXPX.mjs";
2
2
  //#region src/ast.d.ts
3
3
  /**
4
4
  * ノードの子を返す。子を持たないノードでは空配列。
@@ -32,7 +32,7 @@ declare const firstImage: (tree: AnyNode) => ImageNode | null;
32
32
  * - `'skip'` — このノードの子を辿らない
33
33
  * - `'exit'` — 走査全体を打ち切る
34
34
  */
35
- type VisitResult = void | 'skip' | 'exit';
35
+ type VisitResult = void | "skip" | "exit";
36
36
  type Visitor<T extends AnyNode> = (node: T, ancestors: readonly AnyNode[]) => VisitResult;
37
37
  /** 木を深さ優先で辿る。`types` を渡すとその型のノードだけが visitor に届く。 */
38
38
  declare function visit(tree: AnyNode, visitor: Visitor<AnyNode>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","names":[],"sources":["../src/ast.ts","../src/utils/links.ts","../src/utils/visit.ts"],"mappings":";;;;;;;;cAiBa,aAAc,MAAM,qBAAmB;;cAuCvC,YAAa,gBAAgB,MAAM;;;UClD/B;;WAEN;;;;;;cAOE,eAAgB,MAAM,SAAS,UAAU;;cAmBzC,sBAAuB,MAAM,YAAU;;cAGvC,aAAc,MAAM,YAAU;;;;;;;;;KCxB/B;KAEA,QAAQ,UAAU,YAAY,MAAM,GAAG,oBAAoB,cAAc;;iBAGrE,MAAM,MAAM,SAAS,SAAS,QAAQ;iBACtC,MAAM,UAAU,aAC9B,MAAM,SACN,OAAO,aAAa,KACpB,SAAS,QAAQ,WAAW;;iBAkCd,KAAK,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW;;iBAUhE,QAAQ,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW"}
1
+ {"version":3,"file":"utils.d.mts","names":[],"sources":["../src/ast.ts","../src/utils/links.ts","../src/utils/visit.ts"],"mappings":";;;;;;;;cAiBa,aAAc,MAAM,qBAAmB;;cAwCvC,YAAa,gBAAgB,MAAM;;;UCnD/B;;WAEN;;;;;;cAOE,eAAgB,MAAM,SAAS,UAAU;;cAmBzC,sBAAuB,MAAM,YAAU;;cAGvC,aAAc,MAAM,YAAU;;;;;;;;;KCxB/B;KAEA,QAAQ,UAAU,YAAY,MAAM,GAAG,oBAAoB,cAAc;;iBAGrE,MAAM,MAAM,SAAS,SAAS,QAAQ;iBACtC,MAAM,UAAU,aAC9B,MAAM,SACN,OAAO,aAAa,KACpB,SAAS,QAAQ,WAAW;;iBAkCd,KAAK,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW;;iBAUhE,QAAQ,UAAU,aAAa,MAAM,SAAS,MAAM,IAAI,WAAW"}
package/dist/utils.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { n as rawTextOf, t as childrenOf } from "./ast-CIKXwSl5.mjs";
1
+ import { n as rawTextOf, t as childrenOf } from "./ast-CMQYawYl.mjs";
2
2
  //#region src/utils/visit.ts
3
3
  /**
4
4
  * visit.ts — AST を深さ優先で走査する。外部依存を増やさないための自前実装。
@@ -1 +1 @@
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"}
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// void にしているのは、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,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosense-toolbox/parser",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.2",
4
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",
@@ -62,9 +62,23 @@
62
62
  "default": "./dist/compile.cjs"
63
63
  }
64
64
  },
65
+ "./html": {
66
+ "import": {
67
+ "types": "./dist/html.d.mts",
68
+ "default": "./dist/html.mjs"
69
+ },
70
+ "require": {
71
+ "types": "./dist/html.d.cts",
72
+ "default": "./dist/html.cjs"
73
+ }
74
+ },
65
75
  "./package.json": "./package.json"
66
76
  },
67
- "files": ["dist", "README.md", "LICENSE"],
77
+ "files": [
78
+ "dist",
79
+ "README.md",
80
+ "LICENSE"
81
+ ],
68
82
  "scripts": {
69
83
  "build": "tsdown",
70
84
  "dev": "tsdown --watch",
@@ -74,7 +88,9 @@
74
88
  "prepublishOnly": "bun run build"
75
89
  },
76
90
  "dependencies": {
77
- "effect": "^3.22.1"
91
+ "@types/hast": "^3.0.4",
92
+ "effect": "^3.22.1",
93
+ "hast-util-to-html": "^9.0.5"
78
94
  },
79
95
  "devDependencies": {
80
96
  "fast-check": "^3.23.1",
@@ -87,7 +103,14 @@
87
103
  "tag": "beta",
88
104
  "registry": "https://registry.npmjs.org/"
89
105
  },
90
- "keywords": ["cosense", "scrapbox", "parser", "ast", "syntax", "effect"],
106
+ "keywords": [
107
+ "cosense",
108
+ "scrapbox",
109
+ "parser",
110
+ "ast",
111
+ "syntax",
112
+ "effect"
113
+ ],
91
114
  "repository": {
92
115
  "type": "git",
93
116
  "url": "git+https://github.com/qaynam/cosense-toolbox.git",
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast-CIKXwSl5.mjs","names":[],"sources":["../src/ast.ts"],"sourcesContent":["/**\n * ast.ts — AST に対する基本操作。パースはしない。\n */\nimport type { AnyNode } from './types'\n\n/** 型を知らないノードの子。mdast と同じく `children` 配列があればそれが子。 */\nconst unknownChildren = (node: unknown): readonly AnyNode[] => {\n const children = (node as { readonly children?: unknown }).children\n return Array.isArray(children) ? (children as readonly AnyNode[]) : []\n}\n\n/**\n * ノードの子を返す。子を持たないノードでは空配列。\n *\n * どのフィールドが子にあたるかはノード型ごとに違う (`children` / `lines` / `rows` / `cells`)。\n * その対応を知っているのはここだけで、AST を辿るコードはすべてこれを通る。\n */\nexport const childrenOf = (node: AnyNode): readonly AnyNode[] => {\n switch (node.type) {\n case 'page':\n return node.children\n case 'title':\n return node.children\n case 'codeBlock':\n return node.lines\n case 'table':\n return node.rows\n case 'tableRow':\n return node.cells\n case 'line':\n return node.children\n case 'decoration':\n return node.children\n case 'codeLine':\n case 'tableCell':\n case 'text':\n case 'internalLink':\n case 'externalLink':\n case 'projectLink':\n case 'hashtag':\n case 'inlineCode':\n case 'image':\n case 'icon':\n case 'formula':\n return []\n default: {\n // ノード型を足したのにここを更新していないとコンパイルエラーになる。\n node satisfies never\n // 型の上では到達しないが、実行時には declaration merging でノード型を足した\n // プラグインのノードが来うる。\n return unknownChildren(node)\n }\n }\n}\n\n/** そのノードがソース上で占めていた生のテキスト。位置情報から復元する。 */\nexport const rawTextOf = (source: string, node: AnyNode): string =>\n source.slice(node.position.start.offset, node.position.end.offset)\n"],"mappings":";;AAMA,MAAM,mBAAmB,SAAsC;CAC7D,MAAM,WAAY,KAAyC;CAC3D,OAAO,MAAM,QAAQ,QAAQ,IAAK,WAAkC,CAAC;AACvE;;;;;;;AAQA,MAAa,cAAc,SAAsC;CAC/D,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,KAAK;EACd,KAAK,SACH,OAAO,KAAK;EACd,KAAK,aACH,OAAO,KAAK;EACd,KAAK,SACH,OAAO,KAAK;EACd,KAAK,YACH,OAAO,KAAK;EACd,KAAK,QACH,OAAO,KAAK;EACd,KAAK,cACH,OAAO,KAAK;EACd,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO,CAAC;EACV,SAKE,OAAO,gBAAgB,IAAI;CAE/B;AACF;;AAGA,MAAa,aAAa,QAAgB,SACxC,OAAO,MAAM,KAAK,SAAS,MAAM,QAAQ,KAAK,SAAS,IAAI,MAAM"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast-uYWtkHwT.cjs","names":[],"sources":["../src/ast.ts"],"sourcesContent":["/**\n * ast.ts — AST に対する基本操作。パースはしない。\n */\nimport type { AnyNode } from './types'\n\n/** 型を知らないノードの子。mdast と同じく `children` 配列があればそれが子。 */\nconst unknownChildren = (node: unknown): readonly AnyNode[] => {\n const children = (node as { readonly children?: unknown }).children\n return Array.isArray(children) ? (children as readonly AnyNode[]) : []\n}\n\n/**\n * ノードの子を返す。子を持たないノードでは空配列。\n *\n * どのフィールドが子にあたるかはノード型ごとに違う (`children` / `lines` / `rows` / `cells`)。\n * その対応を知っているのはここだけで、AST を辿るコードはすべてこれを通る。\n */\nexport const childrenOf = (node: AnyNode): readonly AnyNode[] => {\n switch (node.type) {\n case 'page':\n return node.children\n case 'title':\n return node.children\n case 'codeBlock':\n return node.lines\n case 'table':\n return node.rows\n case 'tableRow':\n return node.cells\n case 'line':\n return node.children\n case 'decoration':\n return node.children\n case 'codeLine':\n case 'tableCell':\n case 'text':\n case 'internalLink':\n case 'externalLink':\n case 'projectLink':\n case 'hashtag':\n case 'inlineCode':\n case 'image':\n case 'icon':\n case 'formula':\n return []\n default: {\n // ノード型を足したのにここを更新していないとコンパイルエラーになる。\n node satisfies never\n // 型の上では到達しないが、実行時には declaration merging でノード型を足した\n // プラグインのノードが来うる。\n return unknownChildren(node)\n }\n }\n}\n\n/** そのノードがソース上で占めていた生のテキスト。位置情報から復元する。 */\nexport const rawTextOf = (source: string, node: AnyNode): string =>\n source.slice(node.position.start.offset, node.position.end.offset)\n"],"mappings":";;AAMA,MAAM,mBAAmB,SAAsC;CAC7D,MAAM,WAAY,KAAyC;CAC3D,OAAO,MAAM,QAAQ,QAAQ,IAAK,WAAkC,CAAC;AACvE;;;;;;;AAQA,MAAa,cAAc,SAAsC;CAC/D,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,KAAK;EACd,KAAK,SACH,OAAO,KAAK;EACd,KAAK,aACH,OAAO,KAAK;EACd,KAAK,SACH,OAAO,KAAK;EACd,KAAK,YACH,OAAO,KAAK;EACd,KAAK,QACH,OAAO,KAAK;EACd,KAAK,cACH,OAAO,KAAK;EACd,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO,CAAC;EACV,SAKE,OAAO,gBAAgB,IAAI;CAE/B;AACF;;AAGA,MAAa,aAAa,QAAgB,SACxC,OAAO,MAAM,KAAK,SAAS,MAAM,QAAQ,KAAK,SAAS,IAAI,MAAM"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"decoration-DODaJKeA.cjs","names":["Option"],"sources":["../src/core/position.ts","../src/inline/bracket-rules/decoration.ts"],"sourcesContent":["/**\n * position.ts — 位置情報の組み立て。\n *\n * インラインの走査は「1 行の中の部分文字列」を対象にするため、走査対象の先頭が\n * ソース上のどこかを表す Origin を持ち回り、そこからの相対インデックスで位置を作る。\n * 位置計算をここ 1 箇所に集約することで、装飾の中の再帰でオフセットがずれる事故を防ぐ。\n */\nimport type { Point, Position } from '../types'\n\n/** 走査対象の文字列のインデックス 0 が、ソース上のどこにあるか。 */\nexport interface Origin {\n readonly line: number\n readonly column: number\n readonly offset: number\n}\n\nexport const originOfLine = (line: number, offset: number): Origin => ({ line, column: 0, offset })\n\n/** Origin を `by` 文字ぶん進める (部分文字列を再帰的に走査するときに使う)。 */\nexport const shiftOrigin = (origin: Origin, by: number): Origin => ({\n line: origin.line,\n column: origin.column + by,\n offset: origin.offset + by,\n})\n\nexport const pointAt = (origin: Origin, index: number): Point => ({\n line: origin.line,\n column: origin.column + index,\n offset: origin.offset + index,\n})\n\n/** 走査対象の `[start, end)` が占める Position。end は exclusive。 */\nexport const spanAt = (origin: Origin, start: number, end: number): Position => ({\n start: pointAt(origin, start),\n end: pointAt(origin, end),\n})\n","import { Option } from 'effect'\nimport { shiftOrigin } from '../../core/position'\nimport type { BracketRule } from '../types'\n\n/** 意味を持つ文字装飾記法の記号。 */\nexport const OFFICIAL_MARKERS = '*/-_'\n\nconst MAX_SIZE_LEVEL = 4\n\n/** 文字クラスの中で特別扱いされる文字を潰す。 */\nconst escapeForCharClass = (chars: string): string => chars.replace(/[\\\\\\]^-]/g, '\\\\$&')\n\n/** 出現順を保ったまま重複を落とす。`[*** x]` の markers は `['*']` になる。 */\nconst uniqueChars = (marks: string): readonly string[] => [...new Set(marks)]\n\n/**\n * `[<記号> 中身]` を文字装飾記法として読む。`markerChars` に含まれる記号だけを受け付ける。\n *\n * 中身はリンクやアイコンとして再帰的に解釈するが、**装飾の入れ子は不可**。\n * そのため子の走査は allowDecoration=false で行う。\n * 例: `[* [* 太字]ですね]` の内側は装飾ではなく内部リンクになる。\n */\nexport const buildDecorationRule = (markerChars: string): BracketRule => {\n const pattern = new RegExp(`^([${escapeForCharClass(markerChars)}]+)\\\\s+([\\\\s\\\\S]+)$`)\n\n return (inner, ctx) => {\n if (!ctx.allowDecoration) return Option.none()\n\n const match = inner.match(pattern)\n if (!match) return Option.none()\n\n const marks = match[1] ?? ''\n const value = match[2] ?? ''\n const stars = (marks.match(/\\*/g) ?? []).length\n\n // 正規表現が末尾まで貪欲にマッチするので、中身は inner の末尾側の部分文字列になる。\n const valueOffset = inner.length - value.length\n\n return Option.some({\n type: 'decoration',\n value,\n markers: uniqueChars(marks),\n bold: stars > 0,\n italic: marks.includes('/'),\n strike: marks.includes('-'),\n underline: marks.includes('_'),\n sizeLevel: Math.min(Math.max(stars - 1, 0), MAX_SIZE_LEVEL),\n children: ctx.tokenize(value, shiftOrigin(ctx.innerOrigin, valueOffset), false),\n })\n }\n}\n\n/** `[* 太字]` `[/ 斜体]` `[- 打消し]` `[_ 下線]` とその複合 (`[-/ x]`)。 */\nexport const decorationRule: BracketRule = buildDecorationRule(OFFICIAL_MARKERS)\n"],"mappings":";;AAgBA,MAAa,gBAAgB,MAAc,YAA4B;CAAE;CAAM,QAAQ;CAAG;AAAO;;AAGjG,MAAa,eAAe,QAAgB,QAAwB;CAClE,MAAM,OAAO;CACb,QAAQ,OAAO,SAAS;CACxB,QAAQ,OAAO,SAAS;AAC1B;AAEA,MAAa,WAAW,QAAgB,WAA0B;CAChE,MAAM,OAAO;CACb,QAAQ,OAAO,SAAS;CACxB,QAAQ,OAAO,SAAS;AAC1B;;AAGA,MAAa,UAAU,QAAgB,OAAe,SAA2B;CAC/E,OAAO,QAAQ,QAAQ,KAAK;CAC5B,KAAK,QAAQ,QAAQ,GAAG;AAC1B;;;;AC9BA,MAAa,mBAAmB;AAEhC,MAAM,iBAAiB;;AAGvB,MAAM,sBAAsB,UAA0B,MAAM,QAAQ,aAAa,MAAM;;AAGvF,MAAM,eAAe,UAAqC,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;;;;;;;;AAS5E,MAAa,uBAAuB,gBAAqC;CACvE,MAAM,UAAU,IAAI,OAAO,MAAM,mBAAmB,WAAW,EAAE,oBAAoB;CAErF,QAAQ,OAAO,QAAQ;EACrB,IAAI,CAAC,IAAI,iBAAiB,OAAOA,OAAAA,OAAO,KAAK;EAE7C,MAAM,QAAQ,MAAM,MAAM,OAAO;EACjC,IAAI,CAAC,OAAO,OAAOA,OAAAA,OAAO,KAAK;EAE/B,MAAM,QAAQ,MAAM,MAAM;EAC1B,MAAM,QAAQ,MAAM,MAAM;EAC1B,MAAM,SAAS,MAAM,MAAM,KAAK,KAAK,CAAC,EAAA,CAAG;EAGzC,MAAM,cAAc,MAAM,SAAS,MAAM;EAEzC,OAAOA,OAAAA,OAAO,KAAK;GACjB,MAAM;GACN;GACA,SAAS,YAAY,KAAK;GAC1B,MAAM,QAAQ;GACd,QAAQ,MAAM,SAAS,GAAG;GAC1B,QAAQ,MAAM,SAAS,GAAG;GAC1B,WAAW,MAAM,SAAS,GAAG;GAC7B,WAAW,KAAK,IAAI,KAAK,IAAI,QAAQ,GAAG,CAAC,GAAG,cAAc;GAC1D,UAAU,IAAI,SAAS,OAAO,YAAY,IAAI,aAAa,WAAW,GAAG,KAAK;EAChF,CAAC;CACH;AACF;;AAGA,MAAa,iBAA8B,oBAAoB,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"decoration-Dq_5e20j.mjs","names":[],"sources":["../src/core/position.ts","../src/inline/bracket-rules/decoration.ts"],"sourcesContent":["/**\n * position.ts — 位置情報の組み立て。\n *\n * インラインの走査は「1 行の中の部分文字列」を対象にするため、走査対象の先頭が\n * ソース上のどこかを表す Origin を持ち回り、そこからの相対インデックスで位置を作る。\n * 位置計算をここ 1 箇所に集約することで、装飾の中の再帰でオフセットがずれる事故を防ぐ。\n */\nimport type { Point, Position } from '../types'\n\n/** 走査対象の文字列のインデックス 0 が、ソース上のどこにあるか。 */\nexport interface Origin {\n readonly line: number\n readonly column: number\n readonly offset: number\n}\n\nexport const originOfLine = (line: number, offset: number): Origin => ({ line, column: 0, offset })\n\n/** Origin を `by` 文字ぶん進める (部分文字列を再帰的に走査するときに使う)。 */\nexport const shiftOrigin = (origin: Origin, by: number): Origin => ({\n line: origin.line,\n column: origin.column + by,\n offset: origin.offset + by,\n})\n\nexport const pointAt = (origin: Origin, index: number): Point => ({\n line: origin.line,\n column: origin.column + index,\n offset: origin.offset + index,\n})\n\n/** 走査対象の `[start, end)` が占める Position。end は exclusive。 */\nexport const spanAt = (origin: Origin, start: number, end: number): Position => ({\n start: pointAt(origin, start),\n end: pointAt(origin, end),\n})\n","import { Option } from 'effect'\nimport { shiftOrigin } from '../../core/position'\nimport type { BracketRule } from '../types'\n\n/** 意味を持つ文字装飾記法の記号。 */\nexport const OFFICIAL_MARKERS = '*/-_'\n\nconst MAX_SIZE_LEVEL = 4\n\n/** 文字クラスの中で特別扱いされる文字を潰す。 */\nconst escapeForCharClass = (chars: string): string => chars.replace(/[\\\\\\]^-]/g, '\\\\$&')\n\n/** 出現順を保ったまま重複を落とす。`[*** x]` の markers は `['*']` になる。 */\nconst uniqueChars = (marks: string): readonly string[] => [...new Set(marks)]\n\n/**\n * `[<記号> 中身]` を文字装飾記法として読む。`markerChars` に含まれる記号だけを受け付ける。\n *\n * 中身はリンクやアイコンとして再帰的に解釈するが、**装飾の入れ子は不可**。\n * そのため子の走査は allowDecoration=false で行う。\n * 例: `[* [* 太字]ですね]` の内側は装飾ではなく内部リンクになる。\n */\nexport const buildDecorationRule = (markerChars: string): BracketRule => {\n const pattern = new RegExp(`^([${escapeForCharClass(markerChars)}]+)\\\\s+([\\\\s\\\\S]+)$`)\n\n return (inner, ctx) => {\n if (!ctx.allowDecoration) return Option.none()\n\n const match = inner.match(pattern)\n if (!match) return Option.none()\n\n const marks = match[1] ?? ''\n const value = match[2] ?? ''\n const stars = (marks.match(/\\*/g) ?? []).length\n\n // 正規表現が末尾まで貪欲にマッチするので、中身は inner の末尾側の部分文字列になる。\n const valueOffset = inner.length - value.length\n\n return Option.some({\n type: 'decoration',\n value,\n markers: uniqueChars(marks),\n bold: stars > 0,\n italic: marks.includes('/'),\n strike: marks.includes('-'),\n underline: marks.includes('_'),\n sizeLevel: Math.min(Math.max(stars - 1, 0), MAX_SIZE_LEVEL),\n children: ctx.tokenize(value, shiftOrigin(ctx.innerOrigin, valueOffset), false),\n })\n }\n}\n\n/** `[* 太字]` `[/ 斜体]` `[- 打消し]` `[_ 下線]` とその複合 (`[-/ x]`)。 */\nexport const decorationRule: BracketRule = buildDecorationRule(OFFICIAL_MARKERS)\n"],"mappings":";;AAgBA,MAAa,gBAAgB,MAAc,YAA4B;CAAE;CAAM,QAAQ;CAAG;AAAO;;AAGjG,MAAa,eAAe,QAAgB,QAAwB;CAClE,MAAM,OAAO;CACb,QAAQ,OAAO,SAAS;CACxB,QAAQ,OAAO,SAAS;AAC1B;AAEA,MAAa,WAAW,QAAgB,WAA0B;CAChE,MAAM,OAAO;CACb,QAAQ,OAAO,SAAS;CACxB,QAAQ,OAAO,SAAS;AAC1B;;AAGA,MAAa,UAAU,QAAgB,OAAe,SAA2B;CAC/E,OAAO,QAAQ,QAAQ,KAAK;CAC5B,KAAK,QAAQ,QAAQ,GAAG;AAC1B;;;;AC9BA,MAAa,mBAAmB;AAEhC,MAAM,iBAAiB;;AAGvB,MAAM,sBAAsB,UAA0B,MAAM,QAAQ,aAAa,MAAM;;AAGvF,MAAM,eAAe,UAAqC,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;;;;;;;;AAS5E,MAAa,uBAAuB,gBAAqC;CACvE,MAAM,UAAU,IAAI,OAAO,MAAM,mBAAmB,WAAW,EAAE,oBAAoB;CAErF,QAAQ,OAAO,QAAQ;EACrB,IAAI,CAAC,IAAI,iBAAiB,OAAO,OAAO,KAAK;EAE7C,MAAM,QAAQ,MAAM,MAAM,OAAO;EACjC,IAAI,CAAC,OAAO,OAAO,OAAO,KAAK;EAE/B,MAAM,QAAQ,MAAM,MAAM;EAC1B,MAAM,QAAQ,MAAM,MAAM;EAC1B,MAAM,SAAS,MAAM,MAAM,KAAK,KAAK,CAAC,EAAA,CAAG;EAGzC,MAAM,cAAc,MAAM,SAAS,MAAM;EAEzC,OAAO,OAAO,KAAK;GACjB,MAAM;GACN;GACA,SAAS,YAAY,KAAK;GAC1B,MAAM,QAAQ;GACd,QAAQ,MAAM,SAAS,GAAG;GAC1B,QAAQ,MAAM,SAAS,GAAG;GAC1B,WAAW,MAAM,SAAS,GAAG;GAC7B,WAAW,KAAK,IAAI,KAAK,IAAI,QAAQ,GAAG,CAAC,GAAG,cAAc;GAC1D,UAAU,IAAI,SAAS,OAAO,YAAY,IAAI,aAAa,WAAW,GAAG,KAAK;EAChF,CAAC;CACH;AACF;;AAGA,MAAa,iBAA8B,oBAAoB,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/core/image-url.ts","../src/inline/tokenize.ts","../src/parse.ts"],"mappings":";;;;cAwDa,aAAc;;;;;;;cAQd,aAAc;;;UC7CV;;WAEN;;WAEA;aACE;aACA;aACA;;;WAGF,sBAAsB;;;;;;;cAsGpB,iBACX,gBACA,UAAU,mCACA;;;;;;;;;cCxHC,uBAAwB;UAEpB;;WAEN,sBAAsB;;;;;;;;cAmBpB,QAAS,gBAAgB,UAAU,iBAAe;UAoB9C,yBAAyB;;WAE/B;;WAEA;;;;;;;;cASE,YAAa,aAAa,UAAU,qBAAmB;UAQnD;WACN,QAAQ,mBAAmB;WAC3B,YAAY,aAAa,UAAU,KAAK,oCAAoC;;;;;;cAO1E,eAAgB,UAAU,iBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/image-url.ts","../src/inline/tokenize.ts","../src/parse.ts"],"mappings":";;;;cAwDa,aAAc;;;;;;;cAQd,aAAc;;;UC7CV;;WAEN;;WAEA;aACE;aACA;aACA;;;WAGF,sBAAsB;;;;;;;cAsGpB,iBACX,gBACA,UAAU,mCACA;;;;;;;;;cCxHC,uBAAwB;UAEpB;;WAEN,sBAAsB;;;;;;;;cAmBpB,QAAS,gBAAgB,UAAU,iBAAe;UAoB9C,yBAAyB;;WAE/B;;WAEA;;;;;;;;cASE,YAAa,aAAa,UAAU,qBAAmB;UAQnD;WACN,QAAQ,mBAAmB;WAC3B,YAAY,aAAa,UAAU,KAAK,oCAAoC;;;;;;cAO1E,eAAgB,UAAU,iBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-9vAAFHka.d.mts","names":[],"sources":["../src/core/position.ts","../src/inline/types.ts"],"mappings":";;;;UAUiB;WACN;WACA;WACA;;;;;;;;;;UCEM;;WAEN;;WAEA,QAAQ;;WAER,uBAAuB;WACvB,WACP,gBACA,QAAQ,QACR,sCACY;;;UAIC;WACN,MAAM;WACN;;;;;;;;KASC,mBACV,gBACA,eACA,KAAK,kBACF,OAAO,OAAO;;UAGF,2BAA2B;;WAEjC,aAAa;;;;;;KAOZ,eAAe,eAAe,KAAK,uBAAuB,OAAO,OAAO;;;;;;;UAQnE;;WAEN,sBAAsB;;WAEtB,wBAAwB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CiwPj2R8.d.cts","names":[],"sources":["../src/core/position.ts","../src/inline/types.ts"],"mappings":";;;;UAUiB;WACN;WACA;WACA;;;;;;;;;;UCEM;;WAEN;;WAEA,QAAQ;;WAER,uBAAuB;WACvB,WACP,gBACA,QAAQ,QACR,sCACY;;;UAIC;WACN,MAAM;WACN;;;;;;;;KASC,mBACV,gBACA,eACA,KAAK,kBACF,OAAO,OAAO;;UAGF,2BAA2B;;WAEjC,aAAa;;;;;;KAOZ,eAAe,eAAe,KAAK,uBAAuB,OAAO,OAAO;;;;;;;UAQnE;;WAEN,sBAAsB;;WAEtB,wBAAwB"}