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

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 (76) hide show
  1. package/README.md +45 -31
  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/extensions.cjs +10 -7
  15. package/dist/extensions.cjs.map +1 -1
  16. package/dist/extensions.d.cts +12 -8
  17. package/dist/extensions.d.cts.map +1 -1
  18. package/dist/extensions.d.mts +12 -8
  19. package/dist/extensions.d.mts.map +1 -1
  20. package/dist/extensions.mjs +10 -7
  21. package/dist/extensions.mjs.map +1 -1
  22. package/dist/html.cjs +458 -0
  23. package/dist/html.cjs.map +1 -0
  24. package/dist/html.d.cts +274 -0
  25. package/dist/html.d.cts.map +1 -0
  26. package/dist/html.d.mts +274 -0
  27. package/dist/html.d.mts.map +1 -0
  28. package/dist/html.mjs +447 -0
  29. package/dist/html.mjs.map +1 -0
  30. package/dist/image-url-YcTed8tg.cjs.map +1 -1
  31. package/dist/image-url-eQ6X-oN0.mjs.map +1 -1
  32. package/dist/index-CrIlOW1k.d.mts +78 -0
  33. package/dist/index-CrIlOW1k.d.mts.map +1 -0
  34. package/dist/index-_o1STNhP.d.cts +78 -0
  35. package/dist/index-_o1STNhP.d.cts.map +1 -0
  36. package/dist/index.cjs +188 -35
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +4 -77
  39. package/dist/index.d.mts +4 -77
  40. package/dist/index.mjs +180 -27
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/schema.cjs +1 -0
  43. package/dist/schema.cjs.map +1 -1
  44. package/dist/schema.d.cts +1 -1
  45. package/dist/schema.d.cts.map +1 -1
  46. package/dist/schema.d.mts +1 -1
  47. package/dist/schema.d.mts.map +1 -1
  48. package/dist/schema.mjs +1 -0
  49. package/dist/schema.mjs.map +1 -1
  50. package/dist/{types-CiwPj2R8.d.cts → types-CdiHju1P.d.mts} +15 -12
  51. package/dist/types-CdiHju1P.d.mts.map +1 -0
  52. package/dist/{types-9vAAFHka.d.mts → types-_-ZAyNkz.d.cts} +15 -12
  53. package/dist/types-_-ZAyNkz.d.cts.map +1 -0
  54. package/dist/{types-DmfFumcw.d.cts → types-gWMrsXPX.d.cts} +28 -21
  55. package/dist/{types-DmfFumcw.d.cts.map → types-gWMrsXPX.d.cts.map} +1 -1
  56. package/dist/{types-DmfFumcw.d.mts → types-gWMrsXPX.d.mts} +28 -21
  57. package/dist/{types-DmfFumcw.d.mts.map → types-gWMrsXPX.d.mts.map} +1 -1
  58. package/dist/utils.cjs +1 -1
  59. package/dist/utils.cjs.map +1 -1
  60. package/dist/utils.d.cts +2 -2
  61. package/dist/utils.d.cts.map +1 -1
  62. package/dist/utils.d.mts +2 -2
  63. package/dist/utils.d.mts.map +1 -1
  64. package/dist/utils.mjs +1 -1
  65. package/dist/utils.mjs.map +1 -1
  66. package/package.json +27 -5
  67. package/dist/ast-CIKXwSl5.mjs.map +0 -1
  68. package/dist/ast-uYWtkHwT.cjs.map +0 -1
  69. package/dist/decoration-DODaJKeA.cjs +0 -103
  70. package/dist/decoration-DODaJKeA.cjs.map +0 -1
  71. package/dist/decoration-Dq_5e20j.mjs +0 -68
  72. package/dist/decoration-Dq_5e20j.mjs.map +0 -1
  73. package/dist/index.d.cts.map +0 -1
  74. package/dist/index.d.mts.map +0 -1
  75. package/dist/types-9vAAFHka.d.mts.map +0 -1
  76. package/dist/types-CiwPj2R8.d.cts.map +0 -1
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.3",
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",
@@ -84,10 +100,16 @@
84
100
  },
85
101
  "publishConfig": {
86
102
  "access": "public",
87
- "tag": "beta",
88
103
  "registry": "https://registry.npmjs.org/"
89
104
  },
90
- "keywords": ["cosense", "scrapbox", "parser", "ast", "syntax", "effect"],
105
+ "keywords": [
106
+ "cosense",
107
+ "scrapbox",
108
+ "parser",
109
+ "ast",
110
+ "syntax",
111
+ "effect"
112
+ ],
91
113
  "repository": {
92
114
  "type": "git",
93
115
  "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,103 +0,0 @@
1
- let effect = require("effect");
2
- //#region src/core/position.ts
3
- const originOfLine = (line, offset) => ({
4
- line,
5
- column: 0,
6
- offset
7
- });
8
- /** Origin を `by` 文字ぶん進める (部分文字列を再帰的に走査するときに使う)。 */
9
- const shiftOrigin = (origin, by) => ({
10
- line: origin.line,
11
- column: origin.column + by,
12
- offset: origin.offset + by
13
- });
14
- const pointAt = (origin, index) => ({
15
- line: origin.line,
16
- column: origin.column + index,
17
- offset: origin.offset + index
18
- });
19
- /** 走査対象の `[start, end)` が占める Position。end は exclusive。 */
20
- const spanAt = (origin, start, end) => ({
21
- start: pointAt(origin, start),
22
- end: pointAt(origin, end)
23
- });
24
- //#endregion
25
- //#region src/inline/bracket-rules/decoration.ts
26
- /** 意味を持つ文字装飾記法の記号。 */
27
- const OFFICIAL_MARKERS = "*/-_";
28
- const MAX_SIZE_LEVEL = 4;
29
- /** 文字クラスの中で特別扱いされる文字を潰す。 */
30
- const escapeForCharClass = (chars) => chars.replace(/[\\\]^-]/g, "\\$&");
31
- /** 出現順を保ったまま重複を落とす。`[*** x]` の markers は `['*']` になる。 */
32
- const uniqueChars = (marks) => [...new Set(marks)];
33
- /**
34
- * `[<記号> 中身]` を文字装飾記法として読む。`markerChars` に含まれる記号だけを受け付ける。
35
- *
36
- * 中身はリンクやアイコンとして再帰的に解釈するが、**装飾の入れ子は不可**。
37
- * そのため子の走査は allowDecoration=false で行う。
38
- * 例: `[* [* 太字]ですね]` の内側は装飾ではなく内部リンクになる。
39
- */
40
- const buildDecorationRule = (markerChars) => {
41
- const pattern = new RegExp(`^([${escapeForCharClass(markerChars)}]+)\\s+([\\s\\S]+)$`);
42
- return (inner, ctx) => {
43
- if (!ctx.allowDecoration) return effect.Option.none();
44
- const match = inner.match(pattern);
45
- if (!match) return effect.Option.none();
46
- const marks = match[1] ?? "";
47
- const value = match[2] ?? "";
48
- const stars = (marks.match(/\*/g) ?? []).length;
49
- const valueOffset = inner.length - value.length;
50
- return effect.Option.some({
51
- type: "decoration",
52
- value,
53
- markers: uniqueChars(marks),
54
- bold: stars > 0,
55
- italic: marks.includes("/"),
56
- strike: marks.includes("-"),
57
- underline: marks.includes("_"),
58
- sizeLevel: Math.min(Math.max(stars - 1, 0), MAX_SIZE_LEVEL),
59
- children: ctx.tokenize(value, shiftOrigin(ctx.innerOrigin, valueOffset), false)
60
- });
61
- };
62
- };
63
- /** `[* 太字]` `[/ 斜体]` `[- 打消し]` `[_ 下線]` とその複合 (`[-/ x]`)。 */
64
- const decorationRule = buildDecorationRule(OFFICIAL_MARKERS);
65
- //#endregion
66
- Object.defineProperty(exports, "OFFICIAL_MARKERS", {
67
- enumerable: true,
68
- get: function() {
69
- return OFFICIAL_MARKERS;
70
- }
71
- });
72
- Object.defineProperty(exports, "buildDecorationRule", {
73
- enumerable: true,
74
- get: function() {
75
- return buildDecorationRule;
76
- }
77
- });
78
- Object.defineProperty(exports, "decorationRule", {
79
- enumerable: true,
80
- get: function() {
81
- return decorationRule;
82
- }
83
- });
84
- Object.defineProperty(exports, "originOfLine", {
85
- enumerable: true,
86
- get: function() {
87
- return originOfLine;
88
- }
89
- });
90
- Object.defineProperty(exports, "shiftOrigin", {
91
- enumerable: true,
92
- get: function() {
93
- return shiftOrigin;
94
- }
95
- });
96
- Object.defineProperty(exports, "spanAt", {
97
- enumerable: true,
98
- get: function() {
99
- return spanAt;
100
- }
101
- });
102
-
103
- //# sourceMappingURL=decoration-DODaJKeA.cjs.map
@@ -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,68 +0,0 @@
1
- import { Option } from "effect";
2
- //#region src/core/position.ts
3
- const originOfLine = (line, offset) => ({
4
- line,
5
- column: 0,
6
- offset
7
- });
8
- /** Origin を `by` 文字ぶん進める (部分文字列を再帰的に走査するときに使う)。 */
9
- const shiftOrigin = (origin, by) => ({
10
- line: origin.line,
11
- column: origin.column + by,
12
- offset: origin.offset + by
13
- });
14
- const pointAt = (origin, index) => ({
15
- line: origin.line,
16
- column: origin.column + index,
17
- offset: origin.offset + index
18
- });
19
- /** 走査対象の `[start, end)` が占める Position。end は exclusive。 */
20
- const spanAt = (origin, start, end) => ({
21
- start: pointAt(origin, start),
22
- end: pointAt(origin, end)
23
- });
24
- //#endregion
25
- //#region src/inline/bracket-rules/decoration.ts
26
- /** 意味を持つ文字装飾記法の記号。 */
27
- const OFFICIAL_MARKERS = "*/-_";
28
- const MAX_SIZE_LEVEL = 4;
29
- /** 文字クラスの中で特別扱いされる文字を潰す。 */
30
- const escapeForCharClass = (chars) => chars.replace(/[\\\]^-]/g, "\\$&");
31
- /** 出現順を保ったまま重複を落とす。`[*** x]` の markers は `['*']` になる。 */
32
- const uniqueChars = (marks) => [...new Set(marks)];
33
- /**
34
- * `[<記号> 中身]` を文字装飾記法として読む。`markerChars` に含まれる記号だけを受け付ける。
35
- *
36
- * 中身はリンクやアイコンとして再帰的に解釈するが、**装飾の入れ子は不可**。
37
- * そのため子の走査は allowDecoration=false で行う。
38
- * 例: `[* [* 太字]ですね]` の内側は装飾ではなく内部リンクになる。
39
- */
40
- const buildDecorationRule = (markerChars) => {
41
- const pattern = new RegExp(`^([${escapeForCharClass(markerChars)}]+)\\s+([\\s\\S]+)$`);
42
- return (inner, ctx) => {
43
- if (!ctx.allowDecoration) return Option.none();
44
- const match = inner.match(pattern);
45
- if (!match) return Option.none();
46
- const marks = match[1] ?? "";
47
- const value = match[2] ?? "";
48
- const stars = (marks.match(/\*/g) ?? []).length;
49
- const valueOffset = inner.length - value.length;
50
- return Option.some({
51
- type: "decoration",
52
- value,
53
- markers: uniqueChars(marks),
54
- bold: stars > 0,
55
- italic: marks.includes("/"),
56
- strike: marks.includes("-"),
57
- underline: marks.includes("_"),
58
- sizeLevel: Math.min(Math.max(stars - 1, 0), MAX_SIZE_LEVEL),
59
- children: ctx.tokenize(value, shiftOrigin(ctx.innerOrigin, valueOffset), false)
60
- });
61
- };
62
- };
63
- /** `[* 太字]` `[/ 斜体]` `[- 打消し]` `[_ 下線]` とその複合 (`[-/ x]`)。 */
64
- const decorationRule = buildDecorationRule(OFFICIAL_MARKERS);
65
- //#endregion
66
- export { shiftOrigin as a, originOfLine as i, buildDecorationRule as n, spanAt as o, decorationRule as r, OFFICIAL_MARKERS as t };
67
-
68
- //# sourceMappingURL=decoration-Dq_5e20j.mjs.map
@@ -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"}