@hirokisakabe/pom 8.3.0 → 8.4.0

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 (120) hide show
  1. package/README.md +35 -23
  2. package/dist/autoFit/autoFit.js +1 -1
  3. package/dist/autoFit/autoFit.js.map +1 -1
  4. package/dist/autoFit/strategies/reduceFontSize.js +16 -14
  5. package/dist/autoFit/strategies/reduceFontSize.js.map +1 -1
  6. package/dist/autoFit/strategies/reduceGapAndPadding.js +13 -20
  7. package/dist/autoFit/strategies/reduceGapAndPadding.js.map +1 -1
  8. package/dist/autoFit/strategies/reduceTableRowHeight.js +8 -2
  9. package/dist/autoFit/strategies/reduceTableRowHeight.js.map +1 -1
  10. package/dist/autoFit/strategies/uniformScale.js +19 -20
  11. package/dist/autoFit/strategies/uniformScale.js.map +1 -1
  12. package/dist/autoFit/strategyResult.js +15 -0
  13. package/dist/autoFit/strategyResult.js.map +1 -0
  14. package/dist/buildPptx.js +1 -1
  15. package/dist/calcYogaLayout/calcYogaLayout.js +16 -27
  16. package/dist/calcYogaLayout/calcYogaLayout.js.map +1 -1
  17. package/dist/diagnostics.d.ts +1 -1
  18. package/dist/diagnostics.d.ts.map +1 -1
  19. package/dist/diagnostics.js.map +1 -1
  20. package/dist/parseXml/coercionRules.js +43 -8
  21. package/dist/parseXml/coercionRules.js.map +1 -1
  22. package/dist/parseXml/parseXml.d.ts +8 -3
  23. package/dist/parseXml/parseXml.d.ts.map +1 -1
  24. package/dist/parseXml/parseXml.js +192 -212
  25. package/dist/parseXml/parseXml.js.map +1 -1
  26. package/dist/parseXml/serializeXml.d.ts.map +1 -1
  27. package/dist/parseXml/serializeXml.js +12 -17
  28. package/dist/parseXml/serializeXml.js.map +1 -1
  29. package/dist/registry/definitions/arrow.js +2 -2
  30. package/dist/registry/definitions/arrow.js.map +1 -1
  31. package/dist/registry/definitions/chart.js +2 -2
  32. package/dist/registry/definitions/chart.js.map +1 -1
  33. package/dist/registry/definitions/compositeNodes.js +7 -12
  34. package/dist/registry/definitions/compositeNodes.js.map +1 -1
  35. package/dist/registry/definitions/icon.js +2 -2
  36. package/dist/registry/definitions/icon.js.map +1 -1
  37. package/dist/registry/definitions/image.js +2 -2
  38. package/dist/registry/definitions/image.js.map +1 -1
  39. package/dist/registry/definitions/layer.js +4 -5
  40. package/dist/registry/definitions/layer.js.map +1 -1
  41. package/dist/registry/definitions/line.js +2 -2
  42. package/dist/registry/definitions/line.js.map +1 -1
  43. package/dist/registry/definitions/list.js +3 -4
  44. package/dist/registry/definitions/list.js.map +1 -1
  45. package/dist/registry/definitions/shape.js +2 -2
  46. package/dist/registry/definitions/shape.js.map +1 -1
  47. package/dist/registry/definitions/stack.js +3 -4
  48. package/dist/registry/definitions/stack.js.map +1 -1
  49. package/dist/registry/definitions/svg.js +2 -2
  50. package/dist/registry/definitions/svg.js.map +1 -1
  51. package/dist/registry/definitions/table.js +2 -2
  52. package/dist/registry/definitions/table.js.map +1 -1
  53. package/dist/registry/definitions/text.js +2 -2
  54. package/dist/registry/definitions/text.js.map +1 -1
  55. package/dist/registry/index.js.map +1 -1
  56. package/dist/registry/nodeMetadata.js +208 -0
  57. package/dist/registry/nodeMetadata.js.map +1 -0
  58. package/dist/registry/nodeRegistry.js +3 -0
  59. package/dist/registry/nodeRegistry.js.map +1 -1
  60. package/dist/registry/xmlChildRules.js +55 -0
  61. package/dist/registry/xmlChildRules.js.map +1 -0
  62. package/dist/renderPptx/nodes/arrow.js +7 -28
  63. package/dist/renderPptx/nodes/arrow.js.map +1 -1
  64. package/dist/renderPptx/nodes/chart.js +2 -7
  65. package/dist/renderPptx/nodes/chart.js.map +1 -1
  66. package/dist/renderPptx/nodes/flow.js +6 -13
  67. package/dist/renderPptx/nodes/flow.js.map +1 -1
  68. package/dist/renderPptx/nodes/icon.js +4 -2
  69. package/dist/renderPptx/nodes/icon.js.map +1 -1
  70. package/dist/renderPptx/nodes/image.js +5 -13
  71. package/dist/renderPptx/nodes/image.js.map +1 -1
  72. package/dist/renderPptx/nodes/line.js +9 -33
  73. package/dist/renderPptx/nodes/line.js.map +1 -1
  74. package/dist/renderPptx/nodes/list.js +8 -20
  75. package/dist/renderPptx/nodes/list.js.map +1 -1
  76. package/dist/renderPptx/nodes/matrix.js +10 -11
  77. package/dist/renderPptx/nodes/matrix.js.map +1 -1
  78. package/dist/renderPptx/nodes/processArrow.js +9 -16
  79. package/dist/renderPptx/nodes/processArrow.js.map +1 -1
  80. package/dist/renderPptx/nodes/pyramid.js +5 -7
  81. package/dist/renderPptx/nodes/pyramid.js.map +1 -1
  82. package/dist/renderPptx/nodes/shape.js +7 -20
  83. package/dist/renderPptx/nodes/shape.js.map +1 -1
  84. package/dist/renderPptx/nodes/svg.js +2 -5
  85. package/dist/renderPptx/nodes/svg.js.map +1 -1
  86. package/dist/renderPptx/nodes/table.js +2 -5
  87. package/dist/renderPptx/nodes/table.js.map +1 -1
  88. package/dist/renderPptx/nodes/text.js +4 -1
  89. package/dist/renderPptx/nodes/text.js.map +1 -1
  90. package/dist/renderPptx/nodes/timeline.js +20 -22
  91. package/dist/renderPptx/nodes/timeline.js.map +1 -1
  92. package/dist/renderPptx/nodes/tree.js +5 -5
  93. package/dist/renderPptx/nodes/tree.js.map +1 -1
  94. package/dist/renderPptx/renderPptx.js +13 -29
  95. package/dist/renderPptx/renderPptx.js.map +1 -1
  96. package/dist/renderPptx/textOptions.js +32 -8
  97. package/dist/renderPptx/textOptions.js.map +1 -1
  98. package/dist/renderPptx/units.js +11 -1
  99. package/dist/renderPptx/units.js.map +1 -1
  100. package/dist/renderPptx/utils/backgroundBorder.js +103 -57
  101. package/dist/renderPptx/utils/backgroundBorder.js.map +1 -1
  102. package/dist/renderPptx/utils/contentArea.js +26 -9
  103. package/dist/renderPptx/utils/contentArea.js.map +1 -1
  104. package/dist/renderPptx/utils/scaleToFit.js +17 -1
  105. package/dist/renderPptx/utils/scaleToFit.js.map +1 -1
  106. package/dist/renderPptx/utils/straightLine.js +41 -0
  107. package/dist/renderPptx/utils/straightLine.js.map +1 -0
  108. package/dist/renderPptx/utils/visualStyle.js +113 -0
  109. package/dist/renderPptx/utils/visualStyle.js.map +1 -0
  110. package/dist/shared/boxSpacing.js +63 -0
  111. package/dist/shared/boxSpacing.js.map +1 -0
  112. package/dist/shared/walkTree.js +1 -7
  113. package/dist/shared/walkTree.js.map +1 -1
  114. package/dist/toPositioned/toPositioned.js +1 -1
  115. package/dist/toPositioned/toPositioned.js.map +1 -1
  116. package/dist/types.d.ts +1127 -95
  117. package/dist/types.d.ts.map +1 -1
  118. package/dist/types.js +47 -17
  119. package/dist/types.js.map +1 -1
  120. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"image.js","names":["n"],"sources":["../../../src/registry/definitions/image.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureImage, getImageData } from \"../../shared/measureImage.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderImageNode } from \"../../renderPptx/nodes/image.ts\";\n\nexport const imageNodeDef: NodeDefinition = {\n type: \"image\",\n category: \"leaf\",\n applyYogaStyle(node: POMNode, yn: YogaNode, _yoga: Yoga, ctx: BuildContext) {\n const n = node as Extract<POMNode, { type: \"image\" }>;\n const src = n.src;\n\n yn.setMeasureFunc(() => {\n const { widthPx, heightPx } = measureImage(\n src,\n ctx.imageSizeCache,\n ctx.diagnostics,\n );\n return { width: widthPx, height: heightPx };\n });\n },\n toPositioned(pom, absoluteX, absoluteY, layout, ctx) {\n const n = pom as Extract<POMNode, { type: \"image\" }>;\n const imageData = getImageData(n.src, ctx.imageDataCache);\n return {\n ...n,\n x: absoluteX,\n y: absoluteY,\n w: layout.width,\n h: layout.height,\n imageData,\n };\n },\n render(node, ctx) {\n renderImageNode(node as Extract<typeof node, { type: \"image\" }>, ctx);\n },\n collectImageSources(node) {\n const n = node as Extract<POMNode, { type: \"image\" }>;\n return [n.src];\n },\n};\n"],"mappings":";;;AAOA,MAAa,eAA+B;CAC1C,MAAM;CACN,UAAU;CACV,eAAe,MAAe,IAAc,OAAa,KAAmB;EAE1E,MAAM,MAAMA,KAAE;EAEd,GAAG,qBAAqB;GACtB,MAAM,EAAE,SAAS,aAAa,aAC5B,KACA,IAAI,gBACJ,IAAI,WACN;GACA,OAAO;IAAE,OAAO;IAAS,QAAQ;GAAS;EAC5C,CAAC;CACH;CACA,aAAa,KAAK,WAAW,WAAW,QAAQ,KAAK;EACnD,MAAM,IAAI;EACV,MAAM,YAAY,aAAa,EAAE,KAAK,IAAI,cAAc;EACxD,OAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,OAAO;GACV,GAAG,OAAO;GACV;EACF;CACF;CACA,OAAO,MAAM,KAAK;EAChB,gBAAgB,MAAiD,GAAG;CACtE;CACA,oBAAoB,MAAM;EAExB,OAAO,CAACA,KAAE,GAAG;CACf;AACF"}
1
+ {"version":3,"file":"image.js","names":["n"],"sources":["../../../src/registry/definitions/image.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureImage, getImageData } from \"../../shared/measureImage.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderImageNode } from \"../../renderPptx/nodes/image.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nexport const imageNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"image\"),\n applyYogaStyle(node: POMNode, yn: YogaNode, _yoga: Yoga, ctx: BuildContext) {\n const n = node as Extract<POMNode, { type: \"image\" }>;\n const src = n.src;\n\n yn.setMeasureFunc(() => {\n const { widthPx, heightPx } = measureImage(\n src,\n ctx.imageSizeCache,\n ctx.diagnostics,\n );\n return { width: widthPx, height: heightPx };\n });\n },\n toPositioned(pom, absoluteX, absoluteY, layout, ctx) {\n const n = pom as Extract<POMNode, { type: \"image\" }>;\n const imageData = getImageData(n.src, ctx.imageDataCache);\n return {\n ...n,\n x: absoluteX,\n y: absoluteY,\n w: layout.width,\n h: layout.height,\n imageData,\n };\n },\n render(node, ctx) {\n renderImageNode(node as Extract<typeof node, { type: \"image\" }>, ctx);\n },\n collectImageSources(node) {\n const n = node as Extract<POMNode, { type: \"image\" }>;\n return [n.src];\n },\n};\n"],"mappings":";;;;AAQA,MAAa,eAA+B;CAC1C,GAAG,gBAAgB,OAAO;CAC1B,eAAe,MAAe,IAAc,OAAa,KAAmB;EAE1E,MAAM,MAAMA,KAAE;EAEd,GAAG,qBAAqB;GACtB,MAAM,EAAE,SAAS,aAAa,aAC5B,KACA,IAAI,gBACJ,IAAI,WACN;GACA,OAAO;IAAE,OAAO;IAAS,QAAQ;GAAS;EAC5C,CAAC;CACH;CACA,aAAa,KAAK,WAAW,WAAW,QAAQ,KAAK;EACnD,MAAM,IAAI;EACV,MAAM,YAAY,aAAa,EAAE,KAAK,IAAI,cAAc;EACxD,OAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,OAAO;GACV,GAAG,OAAO;GACV;EACF;CACF;CACA,OAAO,MAAM,KAAK;EAChB,gBAAgB,MAAiD,GAAG;CACtE;CACA,oBAAoB,MAAM;EAExB,OAAO,CAACA,KAAE,GAAG;CACf;AACF"}
@@ -1,9 +1,8 @@
1
- import { toPositioned } from "../../toPositioned/toPositioned.js";
1
+ import { getNodeMetadata } from "../nodeMetadata.js";
2
2
  //#region src/registry/definitions/layer.ts
3
3
  const layerNodeDef = {
4
- type: "layer",
5
- category: "absolute-child",
6
- async toPositioned(pom, absoluteX, absoluteY, layout, ctx, map) {
4
+ ...getNodeMetadata("layer"),
5
+ async toPositioned(pom, absoluteX, absoluteY, layout, ctx, map, recurse) {
7
6
  const n = pom;
8
7
  return {
9
8
  ...n,
@@ -42,7 +41,7 @@ const layerNodeDef = {
42
41
  };
43
42
  const childLayout = map.get(child);
44
43
  if (!childLayout) throw new Error("Layout result not found in map for layer child");
45
- return await toPositioned(child, ctx, map, absoluteX + childX - childLayout.left, absoluteY + childY - childLayout.top);
44
+ return await recurse(child, ctx, map, absoluteX + childX - childLayout.left, absoluteY + childY - childLayout.top);
46
45
  }))
47
46
  };
48
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"layer.js","names":[],"sources":["../../../src/registry/definitions/layer.ts"],"sourcesContent":["import type { POMNode, PositionedLayerChild } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { toPositioned } from \"../../toPositioned/toPositioned.ts\";\n\nexport const layerNodeDef: NodeDefinition = {\n type: \"layer\",\n category: \"absolute-child\",\n // applyYogaStyle: layer は子を絶対配置するコンテナ。サイズは明示的に指定されることを期待\n async toPositioned(pom, absoluteX, absoluteY, layout, ctx, map) {\n const n = pom as Extract<POMNode, { type: \"layer\" }>;\n // layer の子要素は layer 内の相対座標(child.x, child.y)を持つ\n // layer の絶対座標に加算してスライド上の絶対座標に変換\n return {\n ...n,\n x: absoluteX,\n y: absoluteY,\n w: layout.width,\n h: layout.height,\n children: await Promise.all(\n n.children.map(async (child): Promise<PositionedLayerChild> => {\n const childX = child.x ?? 0;\n const childY = child.y ?? 0;\n\n // line ノードは特別な処理が必要\n // x1, y1, x2, y2 は layer 内の相対座標として扱い、layer の座標を加算\n if (child.type === \"line\") {\n const lineAbsoluteX = absoluteX + childX;\n const lineAbsoluteY = absoluteY + childY;\n const adjustedX1 = child.x1 + lineAbsoluteX;\n const adjustedY1 = child.y1 + lineAbsoluteY;\n const adjustedX2 = child.x2 + lineAbsoluteX;\n const adjustedY2 = child.y2 + lineAbsoluteY;\n\n return {\n ...child,\n x1: adjustedX1,\n y1: adjustedY1,\n x2: adjustedX2,\n y2: adjustedY2,\n x: Math.min(adjustedX1, adjustedX2),\n y: Math.min(adjustedY1, adjustedY2),\n w: Math.abs(adjustedX2 - adjustedX1),\n h: Math.abs(adjustedY2 - adjustedY1),\n };\n }\n\n // arrow ノードは ID 参照で位置を決定するため、座標は 0 で置く\n if (child.type === \"arrow\") {\n return {\n ...child,\n x: absoluteX,\n y: absoluteY,\n w: 0,\n h: 0,\n };\n }\n\n // その他のノードは通常の処理\n const childLayout = map.get(child);\n if (!childLayout) {\n throw new Error(\"Layout result not found in map for layer child\");\n }\n const adjustedParentX = absoluteX + childX - childLayout.left;\n const adjustedParentY = absoluteY + childY - childLayout.top;\n\n return await toPositioned(\n child,\n ctx,\n map,\n adjustedParentX,\n adjustedParentY,\n );\n }),\n ),\n };\n },\n // render: category ベースの子要素再帰で対応\n};\n"],"mappings":";;AAIA,MAAa,eAA+B;CAC1C,MAAM;CACN,UAAU;CAEV,MAAM,aAAa,KAAK,WAAW,WAAW,QAAQ,KAAK,KAAK;EAC9D,MAAM,IAAI;EAGV,OAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,OAAO;GACV,GAAG,OAAO;GACV,UAAU,MAAM,QAAQ,IACtB,EAAE,SAAS,IAAI,OAAO,UAAyC;IAC7D,MAAM,SAAS,MAAM,KAAK;IAC1B,MAAM,SAAS,MAAM,KAAK;IAI1B,IAAI,MAAM,SAAS,QAAQ;KACzB,MAAM,gBAAgB,YAAY;KAClC,MAAM,gBAAgB,YAAY;KAClC,MAAM,aAAa,MAAM,KAAK;KAC9B,MAAM,aAAa,MAAM,KAAK;KAC9B,MAAM,aAAa,MAAM,KAAK;KAC9B,MAAM,aAAa,MAAM,KAAK;KAE9B,OAAO;MACL,GAAG;MACH,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,GAAG,KAAK,IAAI,YAAY,UAAU;MAClC,GAAG,KAAK,IAAI,YAAY,UAAU;MAClC,GAAG,KAAK,IAAI,aAAa,UAAU;MACnC,GAAG,KAAK,IAAI,aAAa,UAAU;KACrC;IACF;IAGA,IAAI,MAAM,SAAS,SACjB,OAAO;KACL,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;IACL;IAIF,MAAM,cAAc,IAAI,IAAI,KAAK;IACjC,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,gDAAgD;IAKlE,OAAO,MAAM,aACX,OACA,KACA,KANsB,YAAY,SAAS,YAAY,MACjC,YAAY,SAAS,YAAY,GAQzD;GACF,CAAC,CACH;EACF;CACF;AAEF"}
1
+ {"version":3,"file":"layer.js","names":[],"sources":["../../../src/registry/definitions/layer.ts"],"sourcesContent":["import { type POMNode, type PositionedLayerChild } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nexport const layerNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"layer\"),\n // applyYogaStyle: layer は子を絶対配置するコンテナ。サイズは明示的に指定されることを期待\n async toPositioned(pom, absoluteX, absoluteY, layout, ctx, map, recurse) {\n const n = pom as Extract<POMNode, { type: \"layer\" }>;\n // layer の子要素は layer 内の相対座標(child.x, child.y)を持つ\n // layer の絶対座標に加算してスライド上の絶対座標に変換\n return {\n ...n,\n x: absoluteX,\n y: absoluteY,\n w: layout.width,\n h: layout.height,\n children: await Promise.all(\n n.children.map(async (child): Promise<PositionedLayerChild> => {\n const childX = child.x ?? 0;\n const childY = child.y ?? 0;\n\n // line ノードは特別な処理が必要\n // x1, y1, x2, y2 は layer 内の相対座標として扱い、layer の座標を加算\n if (child.type === \"line\") {\n const lineAbsoluteX = absoluteX + childX;\n const lineAbsoluteY = absoluteY + childY;\n const adjustedX1 = child.x1 + lineAbsoluteX;\n const adjustedY1 = child.y1 + lineAbsoluteY;\n const adjustedX2 = child.x2 + lineAbsoluteX;\n const adjustedY2 = child.y2 + lineAbsoluteY;\n\n return {\n ...child,\n x1: adjustedX1,\n y1: adjustedY1,\n x2: adjustedX2,\n y2: adjustedY2,\n x: Math.min(adjustedX1, adjustedX2),\n y: Math.min(adjustedY1, adjustedY2),\n w: Math.abs(adjustedX2 - adjustedX1),\n h: Math.abs(adjustedY2 - adjustedY1),\n };\n }\n\n // arrow ノードは ID 参照で位置を決定するため、座標は 0 で置く\n if (child.type === \"arrow\") {\n return {\n ...child,\n x: absoluteX,\n y: absoluteY,\n w: 0,\n h: 0,\n };\n }\n\n // その他のノードは通常の処理\n const childLayout = map.get(child);\n if (!childLayout) {\n throw new Error(\"Layout result not found in map for layer child\");\n }\n const adjustedParentX = absoluteX + childX - childLayout.left;\n const adjustedParentY = absoluteY + childY - childLayout.top;\n\n return await recurse(\n child,\n ctx,\n map,\n adjustedParentX,\n adjustedParentY,\n );\n }),\n ),\n };\n },\n // render: category ベースの子要素再帰で対応\n};\n"],"mappings":";;AAIA,MAAa,eAA+B;CAC1C,GAAG,gBAAgB,OAAO;CAE1B,MAAM,aAAa,KAAK,WAAW,WAAW,QAAQ,KAAK,KAAK,SAAS;EACvE,MAAM,IAAI;EAGV,OAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,OAAO;GACV,GAAG,OAAO;GACV,UAAU,MAAM,QAAQ,IACtB,EAAE,SAAS,IAAI,OAAO,UAAyC;IAC7D,MAAM,SAAS,MAAM,KAAK;IAC1B,MAAM,SAAS,MAAM,KAAK;IAI1B,IAAI,MAAM,SAAS,QAAQ;KACzB,MAAM,gBAAgB,YAAY;KAClC,MAAM,gBAAgB,YAAY;KAClC,MAAM,aAAa,MAAM,KAAK;KAC9B,MAAM,aAAa,MAAM,KAAK;KAC9B,MAAM,aAAa,MAAM,KAAK;KAC9B,MAAM,aAAa,MAAM,KAAK;KAE9B,OAAO;MACL,GAAG;MACH,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,GAAG,KAAK,IAAI,YAAY,UAAU;MAClC,GAAG,KAAK,IAAI,YAAY,UAAU;MAClC,GAAG,KAAK,IAAI,aAAa,UAAU;MACnC,GAAG,KAAK,IAAI,aAAa,UAAU;KACrC;IACF;IAGA,IAAI,MAAM,SAAS,SACjB,OAAO;KACL,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;IACL;IAIF,MAAM,cAAc,IAAI,IAAI,KAAK;IACjC,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,gDAAgD;IAKlE,OAAO,MAAM,QACX,OACA,KACA,KANsB,YAAY,SAAS,YAAY,MACjC,YAAY,SAAS,YAAY,GAQzD;GACF,CAAC,CACH;EACF;CACF;AAEF"}
@@ -1,8 +1,8 @@
1
+ import { getNodeMetadata } from "../nodeMetadata.js";
1
2
  import { renderLineNode } from "../../renderPptx/nodes/line.js";
2
3
  //#region src/registry/definitions/line.ts
3
4
  const lineNodeDef = {
4
- type: "line",
5
- category: "leaf",
5
+ ...getNodeMetadata("line"),
6
6
  applyYogaStyle(_node, yn) {
7
7
  yn.setWidth(0);
8
8
  yn.setHeight(0);
@@ -1 +1 @@
1
- {"version":3,"file":"line.js","names":[],"sources":["../../../src/registry/definitions/line.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { renderLineNode } from \"../../renderPptx/nodes/line.ts\";\n\nexport const lineNodeDef: NodeDefinition = {\n type: \"line\",\n category: \"leaf\",\n applyYogaStyle(_node, yn) {\n // line ノードは絶対座標を使用するため、Yoga レイアウトではサイズ 0 として扱う\n yn.setWidth(0);\n yn.setHeight(0);\n },\n toPositioned(pom, _absoluteX, _absoluteY, _layout) {\n const n = pom as Extract<POMNode, { type: \"line\" }>;\n // line ノードは絶対座標(x1, y1, x2, y2)を持つため、\n // yogaNode の座標ではなく自身の座標からバウンディングボックスを計算\n return {\n ...n,\n x: Math.min(n.x1, n.x2),\n y: Math.min(n.y1, n.y2),\n w: Math.abs(n.x2 - n.x1),\n h: Math.abs(n.y2 - n.y1),\n };\n },\n render(node, ctx) {\n renderLineNode(node as Extract<typeof node, { type: \"line\" }>, ctx);\n },\n};\n"],"mappings":";;AAIA,MAAa,cAA8B;CACzC,MAAM;CACN,UAAU;CACV,eAAe,OAAO,IAAI;EAExB,GAAG,SAAS,CAAC;EACb,GAAG,UAAU,CAAC;CAChB;CACA,aAAa,KAAK,YAAY,YAAY,SAAS;EACjD,MAAM,IAAI;EAGV,OAAO;GACL,GAAG;GACH,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;GACtB,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;GACtB,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;GACvB,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;EACzB;CACF;CACA,OAAO,MAAM,KAAK;EAChB,eAAe,MAAgD,GAAG;CACpE;AACF"}
1
+ {"version":3,"file":"line.js","names":[],"sources":["../../../src/registry/definitions/line.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { renderLineNode } from \"../../renderPptx/nodes/line.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nexport const lineNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"line\"),\n applyYogaStyle(_node, yn) {\n // line ノードは絶対座標を使用するため、Yoga レイアウトではサイズ 0 として扱う\n yn.setWidth(0);\n yn.setHeight(0);\n },\n toPositioned(pom, _absoluteX, _absoluteY, _layout) {\n const n = pom as Extract<POMNode, { type: \"line\" }>;\n // line ノードは絶対座標(x1, y1, x2, y2)を持つため、\n // yogaNode の座標ではなく自身の座標からバウンディングボックスを計算\n return {\n ...n,\n x: Math.min(n.x1, n.x2),\n y: Math.min(n.y1, n.y2),\n w: Math.abs(n.x2 - n.x1),\n h: Math.abs(n.y2 - n.y1),\n };\n },\n render(node, ctx) {\n renderLineNode(node as Extract<typeof node, { type: \"line\" }>, ctx);\n },\n};\n"],"mappings":";;;AAKA,MAAa,cAA8B;CACzC,GAAG,gBAAgB,MAAM;CACzB,eAAe,OAAO,IAAI;EAExB,GAAG,SAAS,CAAC;EACb,GAAG,UAAU,CAAC;CAChB;CACA,aAAa,KAAK,YAAY,YAAY,SAAS;EACjD,MAAM,IAAI;EAGV,OAAO;GACL,GAAG;GACH,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;GACtB,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;GACtB,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;GACvB,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;EACzB;CACF;CACA,OAAO,MAAM,KAAK;EAChB,eAAe,MAAgD,GAAG;CACpE;AACF"}
@@ -1,5 +1,6 @@
1
1
  import { measureFontLineHeightRatio } from "../../calcYogaLayout/fontLoader.js";
2
2
  import { measureText } from "../../calcYogaLayout/measureText.js";
3
+ import { getNodeMetadata } from "../nodeMetadata.js";
3
4
  import { renderOlNode, renderUlNode } from "../../renderPptx/nodes/list.js";
4
5
  //#region src/registry/definitions/list.ts
5
6
  function applyListYogaStyle(node, yn, yoga, ctx) {
@@ -33,16 +34,14 @@ function applyListYogaStyle(node, yn, yoga, ctx) {
33
34
  });
34
35
  }
35
36
  const ulNodeDef = {
36
- type: "ul",
37
- category: "leaf",
37
+ ...getNodeMetadata("ul"),
38
38
  applyYogaStyle: applyListYogaStyle,
39
39
  render(node, ctx) {
40
40
  renderUlNode(node, ctx);
41
41
  }
42
42
  };
43
43
  const olNodeDef = {
44
- type: "ol",
45
- category: "leaf",
44
+ ...getNodeMetadata("ol"),
46
45
  applyYogaStyle: applyListYogaStyle,
47
46
  render(node, ctx) {
48
47
  renderOlNode(node, ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","names":[],"sources":["../../../src/registry/definitions/list.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureText } from \"../../calcYogaLayout/measureText.ts\";\nimport { measureFontLineHeightRatio } from \"../../calcYogaLayout/fontLoader.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderUlNode, renderOlNode } from \"../../renderPptx/nodes/list.ts\";\n\nfunction applyListYogaStyle(\n node: POMNode,\n yn: YogaNode,\n yoga: Yoga,\n ctx: BuildContext,\n) {\n const n = node as Extract<POMNode, { type: \"ul\" | \"ol\" }>;\n const combinedText = n.items.map((item) => item.text).join(\"\\n\");\n const fontSizePx = n.fontSize ?? 24;\n const fontFamily = n.fontFamily ?? \"Noto Sans JP\";\n const fontWeight = n.bold ? \"bold\" : \"normal\";\n const spacingMultiple = n.lineHeight ?? 1.3;\n\n const fontMetricsRatio = measureFontLineHeightRatio(fontWeight);\n const lineHeight = fontMetricsRatio * spacingMultiple;\n\n // バレット/番号のインデント幅(pptxgenjs DEF_BULLET_MARGIN = 27pt = 36px @96dpi)\n const bulletIndentPx = 36;\n\n yn.setMeasureFunc((width, widthMode) => {\n const maxWidthPx = (() => {\n switch (widthMode) {\n case yoga.MEASURE_MODE_UNDEFINED:\n return Number.POSITIVE_INFINITY;\n case yoga.MEASURE_MODE_EXACTLY:\n case yoga.MEASURE_MODE_AT_MOST:\n return width;\n default:\n return Number.POSITIVE_INFINITY;\n }\n })();\n\n const textMaxWidthPx = Math.max(0, maxWidthPx - bulletIndentPx);\n\n const { widthPx, heightPx } = measureText(\n combinedText,\n textMaxWidthPx,\n {\n fontFamily,\n fontSizePx,\n lineHeight,\n fontWeight,\n },\n ctx.textMeasurementMode,\n );\n\n return {\n width: widthPx + bulletIndentPx,\n height: heightPx,\n };\n });\n}\n\nexport const ulNodeDef: NodeDefinition = {\n type: \"ul\",\n category: \"leaf\",\n applyYogaStyle: applyListYogaStyle,\n render(node, ctx) {\n renderUlNode(node as Extract<typeof node, { type: \"ul\" }>, ctx);\n },\n};\n\nexport const olNodeDef: NodeDefinition = {\n type: \"ol\",\n category: \"leaf\",\n applyYogaStyle: applyListYogaStyle,\n render(node, ctx) {\n renderOlNode(node as Extract<typeof node, { type: \"ol\" }>, ctx);\n },\n};\n"],"mappings":";;;;AAQA,SAAS,mBACP,MACA,IACA,MACA,KACA;CACA,MAAM,IAAI;CACV,MAAM,eAAe,EAAE,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI;CAC/D,MAAM,aAAa,EAAE,YAAY;CACjC,MAAM,aAAa,EAAE,cAAc;CACnC,MAAM,aAAa,EAAE,OAAO,SAAS;CACrC,MAAM,kBAAkB,EAAE,cAAc;CAGxC,MAAM,aADmB,2BAA2B,UAClB,IAAI;CAGtC,MAAM,iBAAiB;CAEvB,GAAG,gBAAgB,OAAO,cAAc;EACtC,MAAM,oBAAoB;GACxB,QAAQ,WAAR;IACE,KAAK,KAAK,wBACR,OAAO,OAAO;IAChB,KAAK,KAAK;IACV,KAAK,KAAK,sBACR,OAAO;IACT,SACE,OAAO,OAAO;GAClB;EACF,EAAA,CAAG;EAIH,MAAM,EAAE,SAAS,aAAa,YAC5B,cAHqB,KAAK,IAAI,GAAG,aAAa,cAIjC,GACb;GACE;GACA;GACA;GACA;EACF,GACA,IAAI,mBACN;EAEA,OAAO;GACL,OAAO,UAAU;GACjB,QAAQ;EACV;CACF,CAAC;AACH;AAEA,MAAa,YAA4B;CACvC,MAAM;CACN,UAAU;CACV,gBAAgB;CAChB,OAAO,MAAM,KAAK;EAChB,aAAa,MAA8C,GAAG;CAChE;AACF;AAEA,MAAa,YAA4B;CACvC,MAAM;CACN,UAAU;CACV,gBAAgB;CAChB,OAAO,MAAM,KAAK;EAChB,aAAa,MAA8C,GAAG;CAChE;AACF"}
1
+ {"version":3,"file":"list.js","names":[],"sources":["../../../src/registry/definitions/list.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureText } from \"../../calcYogaLayout/measureText.ts\";\nimport { measureFontLineHeightRatio } from \"../../calcYogaLayout/fontLoader.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderUlNode, renderOlNode } from \"../../renderPptx/nodes/list.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nfunction applyListYogaStyle(\n node: POMNode,\n yn: YogaNode,\n yoga: Yoga,\n ctx: BuildContext,\n) {\n const n = node as Extract<POMNode, { type: \"ul\" | \"ol\" }>;\n const combinedText = n.items.map((item) => item.text).join(\"\\n\");\n const fontSizePx = n.fontSize ?? 24;\n const fontFamily = n.fontFamily ?? \"Noto Sans JP\";\n const fontWeight = n.bold ? \"bold\" : \"normal\";\n const spacingMultiple = n.lineHeight ?? 1.3;\n\n const fontMetricsRatio = measureFontLineHeightRatio(fontWeight);\n const lineHeight = fontMetricsRatio * spacingMultiple;\n\n // バレット/番号のインデント幅(pptxgenjs DEF_BULLET_MARGIN = 27pt = 36px @96dpi)\n const bulletIndentPx = 36;\n\n yn.setMeasureFunc((width, widthMode) => {\n const maxWidthPx = (() => {\n switch (widthMode) {\n case yoga.MEASURE_MODE_UNDEFINED:\n return Number.POSITIVE_INFINITY;\n case yoga.MEASURE_MODE_EXACTLY:\n case yoga.MEASURE_MODE_AT_MOST:\n return width;\n default:\n return Number.POSITIVE_INFINITY;\n }\n })();\n\n const textMaxWidthPx = Math.max(0, maxWidthPx - bulletIndentPx);\n\n const { widthPx, heightPx } = measureText(\n combinedText,\n textMaxWidthPx,\n {\n fontFamily,\n fontSizePx,\n lineHeight,\n fontWeight,\n },\n ctx.textMeasurementMode,\n );\n\n return {\n width: widthPx + bulletIndentPx,\n height: heightPx,\n };\n });\n}\n\nexport const ulNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"ul\"),\n applyYogaStyle: applyListYogaStyle,\n render(node, ctx) {\n renderUlNode(node as Extract<typeof node, { type: \"ul\" }>, ctx);\n },\n};\n\nexport const olNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"ol\"),\n applyYogaStyle: applyListYogaStyle,\n render(node, ctx) {\n renderOlNode(node as Extract<typeof node, { type: \"ol\" }>, ctx);\n },\n};\n"],"mappings":";;;;;AASA,SAAS,mBACP,MACA,IACA,MACA,KACA;CACA,MAAM,IAAI;CACV,MAAM,eAAe,EAAE,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI;CAC/D,MAAM,aAAa,EAAE,YAAY;CACjC,MAAM,aAAa,EAAE,cAAc;CACnC,MAAM,aAAa,EAAE,OAAO,SAAS;CACrC,MAAM,kBAAkB,EAAE,cAAc;CAGxC,MAAM,aADmB,2BAA2B,UAClB,IAAI;CAGtC,MAAM,iBAAiB;CAEvB,GAAG,gBAAgB,OAAO,cAAc;EACtC,MAAM,oBAAoB;GACxB,QAAQ,WAAR;IACE,KAAK,KAAK,wBACR,OAAO,OAAO;IAChB,KAAK,KAAK;IACV,KAAK,KAAK,sBACR,OAAO;IACT,SACE,OAAO,OAAO;GAClB;EACF,EAAA,CAAG;EAIH,MAAM,EAAE,SAAS,aAAa,YAC5B,cAHqB,KAAK,IAAI,GAAG,aAAa,cAIjC,GACb;GACE;GACA;GACA;GACA;EACF,GACA,IAAI,mBACN;EAEA,OAAO;GACL,OAAO,UAAU;GACjB,QAAQ;EACV;CACF,CAAC;AACH;AAEA,MAAa,YAA4B;CACvC,GAAG,gBAAgB,IAAI;CACvB,gBAAgB;CAChB,OAAO,MAAM,KAAK;EAChB,aAAa,MAA8C,GAAG;CAChE;AACF;AAEA,MAAa,YAA4B;CACvC,GAAG,gBAAgB,IAAI;CACvB,gBAAgB;CAChB,OAAO,MAAM,KAAK;EAChB,aAAa,MAA8C,GAAG;CAChE;AACF"}
@@ -1,9 +1,9 @@
1
1
  import { measureText } from "../../calcYogaLayout/measureText.js";
2
+ import { getNodeMetadata } from "../nodeMetadata.js";
2
3
  import { renderShapeNode } from "../../renderPptx/nodes/shape.js";
3
4
  //#region src/registry/definitions/shape.ts
4
5
  const shapeNodeDef = {
5
- type: "shape",
6
- category: "leaf",
6
+ ...getNodeMetadata("shape"),
7
7
  applyYogaStyle(node, yn, yoga, ctx) {
8
8
  const n = node;
9
9
  if (n.text) {
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","names":[],"sources":["../../../src/registry/definitions/shape.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureText } from \"../../calcYogaLayout/measureText.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderShapeNode } from \"../../renderPptx/nodes/shape.ts\";\n\nexport const shapeNodeDef: NodeDefinition = {\n type: \"shape\",\n category: \"leaf\",\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga, ctx: BuildContext) {\n const n = node as Extract<POMNode, { type: \"shape\" }>;\n if (n.text) {\n const text = n.text;\n const fontSizePx = n.fontSize ?? 24;\n const fontFamily = n.fontFamily ?? \"Noto Sans JP\";\n const fontWeight = n.bold ? \"bold\" : \"normal\";\n const lineHeight = n.lineHeight ?? 1.3;\n\n yn.setMeasureFunc((width, widthMode) => {\n const maxWidthPx = (() => {\n switch (widthMode) {\n case yoga.MEASURE_MODE_UNDEFINED:\n return Number.POSITIVE_INFINITY;\n case yoga.MEASURE_MODE_EXACTLY:\n case yoga.MEASURE_MODE_AT_MOST:\n return width;\n default:\n return Number.POSITIVE_INFINITY;\n }\n })();\n\n const { widthPx, heightPx } = measureText(\n text,\n maxWidthPx,\n {\n fontFamily,\n fontSizePx,\n lineHeight,\n fontWeight,\n },\n ctx.textMeasurementMode,\n );\n\n return { width: widthPx, height: heightPx };\n });\n }\n },\n render(node, ctx) {\n renderShapeNode(node as Extract<typeof node, { type: \"shape\" }>, ctx);\n },\n};\n"],"mappings":";;;AAOA,MAAa,eAA+B;CAC1C,MAAM;CACN,UAAU;CACV,eAAe,MAAe,IAAc,MAAY,KAAmB;EACzE,MAAM,IAAI;EACV,IAAI,EAAE,MAAM;GACV,MAAM,OAAO,EAAE;GACf,MAAM,aAAa,EAAE,YAAY;GACjC,MAAM,aAAa,EAAE,cAAc;GACnC,MAAM,aAAa,EAAE,OAAO,SAAS;GACrC,MAAM,aAAa,EAAE,cAAc;GAEnC,GAAG,gBAAgB,OAAO,cAAc;IAatC,MAAM,EAAE,SAAS,aAAa,YAC5B,aAbwB;KACxB,QAAQ,WAAR;MACE,KAAK,KAAK,wBACR,OAAO,OAAO;MAChB,KAAK,KAAK;MACV,KAAK,KAAK,sBACR,OAAO;MACT,SACE,OAAO,OAAO;KAClB;IACF,EAAA,CAIW,GACT;KACE;KACA;KACA;KACA;IACF,GACA,IAAI,mBACN;IAEA,OAAO;KAAE,OAAO;KAAS,QAAQ;IAAS;GAC5C,CAAC;EACH;CACF;CACA,OAAO,MAAM,KAAK;EAChB,gBAAgB,MAAiD,GAAG;CACtE;AACF"}
1
+ {"version":3,"file":"shape.js","names":[],"sources":["../../../src/registry/definitions/shape.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureText } from \"../../calcYogaLayout/measureText.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderShapeNode } from \"../../renderPptx/nodes/shape.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nexport const shapeNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"shape\"),\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga, ctx: BuildContext) {\n const n = node as Extract<POMNode, { type: \"shape\" }>;\n if (n.text) {\n const text = n.text;\n const fontSizePx = n.fontSize ?? 24;\n const fontFamily = n.fontFamily ?? \"Noto Sans JP\";\n const fontWeight = n.bold ? \"bold\" : \"normal\";\n const lineHeight = n.lineHeight ?? 1.3;\n\n yn.setMeasureFunc((width, widthMode) => {\n const maxWidthPx = (() => {\n switch (widthMode) {\n case yoga.MEASURE_MODE_UNDEFINED:\n return Number.POSITIVE_INFINITY;\n case yoga.MEASURE_MODE_EXACTLY:\n case yoga.MEASURE_MODE_AT_MOST:\n return width;\n default:\n return Number.POSITIVE_INFINITY;\n }\n })();\n\n const { widthPx, heightPx } = measureText(\n text,\n maxWidthPx,\n {\n fontFamily,\n fontSizePx,\n lineHeight,\n fontWeight,\n },\n ctx.textMeasurementMode,\n );\n\n return { width: widthPx, height: heightPx };\n });\n }\n },\n render(node, ctx) {\n renderShapeNode(node as Extract<typeof node, { type: \"shape\" }>, ctx);\n },\n};\n"],"mappings":";;;;AAQA,MAAa,eAA+B;CAC1C,GAAG,gBAAgB,OAAO;CAC1B,eAAe,MAAe,IAAc,MAAY,KAAmB;EACzE,MAAM,IAAI;EACV,IAAI,EAAE,MAAM;GACV,MAAM,OAAO,EAAE;GACf,MAAM,aAAa,EAAE,YAAY;GACjC,MAAM,aAAa,EAAE,cAAc;GACnC,MAAM,aAAa,EAAE,OAAO,SAAS;GACrC,MAAM,aAAa,EAAE,cAAc;GAEnC,GAAG,gBAAgB,OAAO,cAAc;IAatC,MAAM,EAAE,SAAS,aAAa,YAC5B,aAbwB;KACxB,QAAQ,WAAR;MACE,KAAK,KAAK,wBACR,OAAO,OAAO;MAChB,KAAK,KAAK;MACV,KAAK,KAAK,sBACR,OAAO;MACT,SACE,OAAO,OAAO;KAClB;IACF,EAAA,CAIW,GACT;KACE;KACA;KACA;KACA;IACF,GACA,IAAI,mBACN;IAEA,OAAO;KAAE,OAAO;KAAS,QAAQ;IAAS;GAC5C,CAAC;EACH;CACF;CACA,OAAO,MAAM,KAAK;EAChB,gBAAgB,MAAiD,GAAG;CACtE;AACF"}
@@ -1,3 +1,4 @@
1
+ import { getNodeMetadata } from "../nodeMetadata.js";
1
2
  //#region src/registry/definitions/stack.ts
2
3
  /**
3
4
  * vstack/hstack 共通の Flex プロパティを適用する
@@ -54,16 +55,14 @@ function applyFlexProperties(node, yn, yoga) {
54
55
  }
55
56
  }
56
57
  const vstackNodeDef = {
57
- type: "vstack",
58
- category: "multi-child",
58
+ ...getNodeMetadata("vstack"),
59
59
  applyYogaStyle(node, yn, yoga) {
60
60
  yn.setFlexDirection(yoga.FLEX_DIRECTION_COLUMN);
61
61
  applyFlexProperties(node, yn, yoga);
62
62
  }
63
63
  };
64
64
  const hstackNodeDef = {
65
- type: "hstack",
66
- category: "multi-child",
65
+ ...getNodeMetadata("hstack"),
67
66
  applyYogaStyle(node, yn, yoga) {
68
67
  yn.setFlexDirection(yoga.FLEX_DIRECTION_ROW);
69
68
  applyFlexProperties(node, yn, yoga);
@@ -1 +1 @@
1
- {"version":3,"file":"stack.js","names":[],"sources":["../../../src/registry/definitions/stack.ts"],"sourcesContent":["import type { POMNode, VStackNode, HStackNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\n\n/**\n * vstack/hstack 共通の Flex プロパティを適用する\n */\nfunction applyFlexProperties(\n node: VStackNode | HStackNode,\n yn: YogaNode,\n yoga: Yoga,\n): void {\n if (node.gap !== undefined) {\n yn.setGap(yoga.GUTTER_ROW, node.gap);\n yn.setGap(yoga.GUTTER_COLUMN, node.gap);\n }\n\n if (node.alignItems !== undefined) {\n switch (node.alignItems) {\n case \"start\":\n yn.setAlignItems(yoga.ALIGN_FLEX_START);\n break;\n case \"center\":\n yn.setAlignItems(yoga.ALIGN_CENTER);\n break;\n case \"end\":\n yn.setAlignItems(yoga.ALIGN_FLEX_END);\n break;\n case \"stretch\":\n yn.setAlignItems(yoga.ALIGN_STRETCH);\n break;\n }\n }\n\n if (node.justifyContent !== undefined) {\n switch (node.justifyContent) {\n case \"start\":\n yn.setJustifyContent(yoga.JUSTIFY_FLEX_START);\n break;\n case \"center\":\n yn.setJustifyContent(yoga.JUSTIFY_CENTER);\n break;\n case \"end\":\n yn.setJustifyContent(yoga.JUSTIFY_FLEX_END);\n break;\n case \"spaceBetween\":\n yn.setJustifyContent(yoga.JUSTIFY_SPACE_BETWEEN);\n break;\n case \"spaceAround\":\n yn.setJustifyContent(yoga.JUSTIFY_SPACE_AROUND);\n break;\n case \"spaceEvenly\":\n yn.setJustifyContent(yoga.JUSTIFY_SPACE_EVENLY);\n break;\n }\n }\n\n if (node.flexWrap !== undefined) {\n switch (node.flexWrap) {\n case \"nowrap\":\n yn.setFlexWrap(yoga.WRAP_NO_WRAP);\n break;\n case \"wrap\":\n yn.setFlexWrap(yoga.WRAP_WRAP);\n break;\n case \"wrapReverse\":\n yn.setFlexWrap(yoga.WRAP_WRAP_REVERSE);\n break;\n }\n }\n}\n\nexport const vstackNodeDef: NodeDefinition = {\n type: \"vstack\",\n category: \"multi-child\",\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga) {\n yn.setFlexDirection(yoga.FLEX_DIRECTION_COLUMN);\n applyFlexProperties(node as VStackNode, yn, yoga);\n },\n // render: category ベースの子要素再帰で対応\n};\n\nexport const hstackNodeDef: NodeDefinition = {\n type: \"hstack\",\n category: \"multi-child\",\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga) {\n yn.setFlexDirection(yoga.FLEX_DIRECTION_ROW);\n applyFlexProperties(node as HStackNode, yn, yoga);\n },\n // render: category ベースの子要素再帰で対応\n};\n"],"mappings":";;;;AAOA,SAAS,oBACP,MACA,IACA,MACM;CACN,IAAI,KAAK,QAAQ,KAAA,GAAW;EAC1B,GAAG,OAAO,KAAK,YAAY,KAAK,GAAG;EACnC,GAAG,OAAO,KAAK,eAAe,KAAK,GAAG;CACxC;CAEA,IAAI,KAAK,eAAe,KAAA,GACtB,QAAQ,KAAK,YAAb;EACE,KAAK;GACH,GAAG,cAAc,KAAK,gBAAgB;GACtC;EACF,KAAK;GACH,GAAG,cAAc,KAAK,YAAY;GAClC;EACF,KAAK;GACH,GAAG,cAAc,KAAK,cAAc;GACpC;EACF,KAAK;GACH,GAAG,cAAc,KAAK,aAAa;GACnC;CACJ;CAGF,IAAI,KAAK,mBAAmB,KAAA,GAC1B,QAAQ,KAAK,gBAAb;EACE,KAAK;GACH,GAAG,kBAAkB,KAAK,kBAAkB;GAC5C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,cAAc;GACxC;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,gBAAgB;GAC1C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,qBAAqB;GAC/C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,oBAAoB;GAC9C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,oBAAoB;GAC9C;CACJ;CAGF,IAAI,KAAK,aAAa,KAAA,GACpB,QAAQ,KAAK,UAAb;EACE,KAAK;GACH,GAAG,YAAY,KAAK,YAAY;GAChC;EACF,KAAK;GACH,GAAG,YAAY,KAAK,SAAS;GAC7B;EACF,KAAK;GACH,GAAG,YAAY,KAAK,iBAAiB;GACrC;CACJ;AAEJ;AAEA,MAAa,gBAAgC;CAC3C,MAAM;CACN,UAAU;CACV,eAAe,MAAe,IAAc,MAAY;EACtD,GAAG,iBAAiB,KAAK,qBAAqB;EAC9C,oBAAoB,MAAoB,IAAI,IAAI;CAClD;AAEF;AAEA,MAAa,gBAAgC;CAC3C,MAAM;CACN,UAAU;CACV,eAAe,MAAe,IAAc,MAAY;EACtD,GAAG,iBAAiB,KAAK,kBAAkB;EAC3C,oBAAoB,MAAoB,IAAI,IAAI;CAClD;AAEF"}
1
+ {"version":3,"file":"stack.js","names":[],"sources":["../../../src/registry/definitions/stack.ts"],"sourcesContent":["import { type HStackNode, type POMNode, type VStackNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\n/**\n * vstack/hstack 共通の Flex プロパティを適用する\n */\nfunction applyFlexProperties(\n node: VStackNode | HStackNode,\n yn: YogaNode,\n yoga: Yoga,\n): void {\n if (node.gap !== undefined) {\n yn.setGap(yoga.GUTTER_ROW, node.gap);\n yn.setGap(yoga.GUTTER_COLUMN, node.gap);\n }\n\n if (node.alignItems !== undefined) {\n switch (node.alignItems) {\n case \"start\":\n yn.setAlignItems(yoga.ALIGN_FLEX_START);\n break;\n case \"center\":\n yn.setAlignItems(yoga.ALIGN_CENTER);\n break;\n case \"end\":\n yn.setAlignItems(yoga.ALIGN_FLEX_END);\n break;\n case \"stretch\":\n yn.setAlignItems(yoga.ALIGN_STRETCH);\n break;\n }\n }\n\n if (node.justifyContent !== undefined) {\n switch (node.justifyContent) {\n case \"start\":\n yn.setJustifyContent(yoga.JUSTIFY_FLEX_START);\n break;\n case \"center\":\n yn.setJustifyContent(yoga.JUSTIFY_CENTER);\n break;\n case \"end\":\n yn.setJustifyContent(yoga.JUSTIFY_FLEX_END);\n break;\n case \"spaceBetween\":\n yn.setJustifyContent(yoga.JUSTIFY_SPACE_BETWEEN);\n break;\n case \"spaceAround\":\n yn.setJustifyContent(yoga.JUSTIFY_SPACE_AROUND);\n break;\n case \"spaceEvenly\":\n yn.setJustifyContent(yoga.JUSTIFY_SPACE_EVENLY);\n break;\n }\n }\n\n if (node.flexWrap !== undefined) {\n switch (node.flexWrap) {\n case \"nowrap\":\n yn.setFlexWrap(yoga.WRAP_NO_WRAP);\n break;\n case \"wrap\":\n yn.setFlexWrap(yoga.WRAP_WRAP);\n break;\n case \"wrapReverse\":\n yn.setFlexWrap(yoga.WRAP_WRAP_REVERSE);\n break;\n }\n }\n}\n\nexport const vstackNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"vstack\"),\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga) {\n yn.setFlexDirection(yoga.FLEX_DIRECTION_COLUMN);\n applyFlexProperties(node as VStackNode, yn, yoga);\n },\n // render: category ベースの子要素再帰で対応\n};\n\nexport const hstackNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"hstack\"),\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga) {\n yn.setFlexDirection(yoga.FLEX_DIRECTION_ROW);\n applyFlexProperties(node as HStackNode, yn, yoga);\n },\n // render: category ベースの子要素再帰で対応\n};\n"],"mappings":";;;;;AAQA,SAAS,oBACP,MACA,IACA,MACM;CACN,IAAI,KAAK,QAAQ,KAAA,GAAW;EAC1B,GAAG,OAAO,KAAK,YAAY,KAAK,GAAG;EACnC,GAAG,OAAO,KAAK,eAAe,KAAK,GAAG;CACxC;CAEA,IAAI,KAAK,eAAe,KAAA,GACtB,QAAQ,KAAK,YAAb;EACE,KAAK;GACH,GAAG,cAAc,KAAK,gBAAgB;GACtC;EACF,KAAK;GACH,GAAG,cAAc,KAAK,YAAY;GAClC;EACF,KAAK;GACH,GAAG,cAAc,KAAK,cAAc;GACpC;EACF,KAAK;GACH,GAAG,cAAc,KAAK,aAAa;GACnC;CACJ;CAGF,IAAI,KAAK,mBAAmB,KAAA,GAC1B,QAAQ,KAAK,gBAAb;EACE,KAAK;GACH,GAAG,kBAAkB,KAAK,kBAAkB;GAC5C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,cAAc;GACxC;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,gBAAgB;GAC1C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,qBAAqB;GAC/C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,oBAAoB;GAC9C;EACF,KAAK;GACH,GAAG,kBAAkB,KAAK,oBAAoB;GAC9C;CACJ;CAGF,IAAI,KAAK,aAAa,KAAA,GACpB,QAAQ,KAAK,UAAb;EACE,KAAK;GACH,GAAG,YAAY,KAAK,YAAY;GAChC;EACF,KAAK;GACH,GAAG,YAAY,KAAK,SAAS;GAC7B;EACF,KAAK;GACH,GAAG,YAAY,KAAK,iBAAiB;GACrC;CACJ;AAEJ;AAEA,MAAa,gBAAgC;CAC3C,GAAG,gBAAgB,QAAQ;CAC3B,eAAe,MAAe,IAAc,MAAY;EACtD,GAAG,iBAAiB,KAAK,qBAAqB;EAC9C,oBAAoB,MAAoB,IAAI,IAAI;CAClD;AAEF;AAEA,MAAa,gBAAgC;CAC3C,GAAG,gBAAgB,QAAQ;CAC3B,eAAe,MAAe,IAAc,MAAY;EACtD,GAAG,iBAAiB,KAAK,kBAAkB;EAC3C,oBAAoB,MAAoB,IAAI,IAAI;CAClD;AAEF"}
@@ -1,10 +1,10 @@
1
+ import { getNodeMetadata } from "../nodeMetadata.js";
1
2
  import { rasterizeSvgContent } from "../../icons/renderIcon.js";
2
3
  import "../../icons/index.js";
3
4
  import { renderSvgNode } from "../../renderPptx/nodes/svg.js";
4
5
  //#region src/registry/definitions/svg.ts
5
6
  const svgNodeDef = {
6
- type: "svg",
7
- category: "leaf",
7
+ ...getNodeMetadata("svg"),
8
8
  applyYogaStyle(node, yn) {
9
9
  const n = node;
10
10
  const width = n.w ?? 24;
@@ -1 +1 @@
1
- {"version":3,"file":"svg.js","names":[],"sources":["../../../src/registry/definitions/svg.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { rasterizeSvgContent } from \"../../icons/index.ts\";\nimport { renderSvgNode } from \"../../renderPptx/nodes/svg.ts\";\n\nexport const svgNodeDef: NodeDefinition = {\n type: \"svg\",\n category: \"leaf\",\n applyYogaStyle(node, yn) {\n const n = node as Extract<POMNode, { type: \"svg\" }>;\n const width = n.w ?? 24;\n const height = n.h ?? 24;\n yn.setMeasureFunc(() => ({ width, height }));\n },\n async toPositioned(pom, absoluteX, absoluteY, layout, ctx) {\n const n = pom as Extract<POMNode, { type: \"svg\" }>;\n const rasterWidth = Math.ceil(layout.width);\n const rasterHeight = Math.ceil(layout.height);\n const iconImageData = await rasterizeSvgContent(\n n.svgContent,\n rasterWidth,\n n.color,\n ctx.iconRasterCache,\n rasterHeight,\n );\n\n return {\n ...n,\n x: absoluteX,\n y: absoluteY,\n w: layout.width,\n h: layout.height,\n iconImageData,\n };\n },\n render(node, ctx) {\n renderSvgNode(node as Extract<typeof node, { type: \"svg\" }>, ctx);\n },\n};\n"],"mappings":";;;;AAKA,MAAa,aAA6B;CACxC,MAAM;CACN,UAAU;CACV,eAAe,MAAM,IAAI;EACvB,MAAM,IAAI;EACV,MAAM,QAAQ,EAAE,KAAK;EACrB,MAAM,SAAS,EAAE,KAAK;EACtB,GAAG,sBAAsB;GAAE;GAAO;EAAO,EAAE;CAC7C;CACA,MAAM,aAAa,KAAK,WAAW,WAAW,QAAQ,KAAK;EACzD,MAAM,IAAI;EACV,MAAM,cAAc,KAAK,KAAK,OAAO,KAAK;EAC1C,MAAM,eAAe,KAAK,KAAK,OAAO,MAAM;EAC5C,MAAM,gBAAgB,MAAM,oBAC1B,EAAE,YACF,aACA,EAAE,OACF,IAAI,iBACJ,YACF;EAEA,OAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,OAAO;GACV,GAAG,OAAO;GACV;EACF;CACF;CACA,OAAO,MAAM,KAAK;EAChB,cAAc,MAA+C,GAAG;CAClE;AACF"}
1
+ {"version":3,"file":"svg.js","names":[],"sources":["../../../src/registry/definitions/svg.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { rasterizeSvgContent } from \"../../icons/index.ts\";\nimport { renderSvgNode } from \"../../renderPptx/nodes/svg.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nexport const svgNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"svg\"),\n applyYogaStyle(node, yn) {\n const n = node as Extract<POMNode, { type: \"svg\" }>;\n const width = n.w ?? 24;\n const height = n.h ?? 24;\n yn.setMeasureFunc(() => ({ width, height }));\n },\n async toPositioned(pom, absoluteX, absoluteY, layout, ctx) {\n const n = pom as Extract<POMNode, { type: \"svg\" }>;\n const rasterWidth = Math.ceil(layout.width);\n const rasterHeight = Math.ceil(layout.height);\n const iconImageData = await rasterizeSvgContent(\n n.svgContent,\n rasterWidth,\n n.color,\n ctx.iconRasterCache,\n rasterHeight,\n );\n\n return {\n ...n,\n x: absoluteX,\n y: absoluteY,\n w: layout.width,\n h: layout.height,\n iconImageData,\n };\n },\n render(node, ctx) {\n renderSvgNode(node as Extract<typeof node, { type: \"svg\" }>, ctx);\n },\n};\n"],"mappings":";;;;;AAMA,MAAa,aAA6B;CACxC,GAAG,gBAAgB,KAAK;CACxB,eAAe,MAAM,IAAI;EACvB,MAAM,IAAI;EACV,MAAM,QAAQ,EAAE,KAAK;EACrB,MAAM,SAAS,EAAE,KAAK;EACtB,GAAG,sBAAsB;GAAE;GAAO;EAAO,EAAE;CAC7C;CACA,MAAM,aAAa,KAAK,WAAW,WAAW,QAAQ,KAAK;EACzD,MAAM,IAAI;EACV,MAAM,cAAc,KAAK,KAAK,OAAO,KAAK;EAC1C,MAAM,eAAe,KAAK,KAAK,OAAO,MAAM;EAC5C,MAAM,gBAAgB,MAAM,oBAC1B,EAAE,YACF,aACA,EAAE,OACF,IAAI,iBACJ,YACF;EAEA,OAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG,OAAO;GACV,GAAG,OAAO;GACV;EACF;CACF;CACA,OAAO,MAAM,KAAK;EAChB,cAAc,MAA+C,GAAG;CAClE;AACF"}
@@ -1,9 +1,9 @@
1
+ import { getNodeMetadata } from "../nodeMetadata.js";
1
2
  import { calcTableIntrinsicSize } from "../../shared/tableUtils.js";
2
3
  import { renderTableNode } from "../../renderPptx/nodes/table.js";
3
4
  //#region src/registry/definitions/table.ts
4
5
  const tableNodeDef = {
5
- type: "table",
6
- category: "leaf",
6
+ ...getNodeMetadata("table"),
7
7
  applyYogaStyle(node, yn) {
8
8
  const n = node;
9
9
  yn.setMeasureFunc(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","names":[],"sources":["../../../src/registry/definitions/table.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { calcTableIntrinsicSize } from \"../../shared/tableUtils.ts\";\nimport { renderTableNode } from \"../../renderPptx/nodes/table.ts\";\n\nexport const tableNodeDef: NodeDefinition = {\n type: \"table\",\n category: \"leaf\",\n applyYogaStyle(node, yn) {\n const n = node as Extract<POMNode, { type: \"table\" }>;\n yn.setMeasureFunc(() => {\n const { width, height } = calcTableIntrinsicSize(n);\n return { width, height };\n });\n },\n render(node, ctx) {\n renderTableNode(node as Extract<typeof node, { type: \"table\" }>, ctx);\n },\n};\n"],"mappings":";;;AAKA,MAAa,eAA+B;CAC1C,MAAM;CACN,UAAU;CACV,eAAe,MAAM,IAAI;EACvB,MAAM,IAAI;EACV,GAAG,qBAAqB;GACtB,MAAM,EAAE,OAAO,WAAW,uBAAuB,CAAC;GAClD,OAAO;IAAE;IAAO;GAAO;EACzB,CAAC;CACH;CACA,OAAO,MAAM,KAAK;EAChB,gBAAgB,MAAiD,GAAG;CACtE;AACF"}
1
+ {"version":3,"file":"table.js","names":[],"sources":["../../../src/registry/definitions/table.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition } from \"../types.ts\";\nimport { calcTableIntrinsicSize } from \"../../shared/tableUtils.ts\";\nimport { renderTableNode } from \"../../renderPptx/nodes/table.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nexport const tableNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"table\"),\n applyYogaStyle(node, yn) {\n const n = node as Extract<POMNode, { type: \"table\" }>;\n yn.setMeasureFunc(() => {\n const { width, height } = calcTableIntrinsicSize(n);\n return { width, height };\n });\n },\n render(node, ctx) {\n renderTableNode(node as Extract<typeof node, { type: \"table\" }>, ctx);\n },\n};\n"],"mappings":";;;;AAMA,MAAa,eAA+B;CAC1C,GAAG,gBAAgB,OAAO;CAC1B,eAAe,MAAM,IAAI;EACvB,MAAM,IAAI;EACV,GAAG,qBAAqB;GACtB,MAAM,EAAE,OAAO,WAAW,uBAAuB,CAAC;GAClD,OAAO;IAAE;IAAO;GAAO;EACzB,CAAC;CACH;CACA,OAAO,MAAM,KAAK;EAChB,gBAAgB,MAAiD,GAAG;CACtE;AACF"}
@@ -1,9 +1,9 @@
1
1
  import { measureText } from "../../calcYogaLayout/measureText.js";
2
2
  import { renderTextNode } from "../../renderPptx/nodes/text.js";
3
+ import { getNodeMetadata } from "../nodeMetadata.js";
3
4
  //#region src/registry/definitions/text.ts
4
5
  const textNodeDef = {
5
- type: "text",
6
- category: "leaf",
6
+ ...getNodeMetadata("text"),
7
7
  applyYogaStyle(node, yn, yoga, ctx) {
8
8
  const n = node;
9
9
  const text = n.text;
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","names":[],"sources":["../../../src/registry/definitions/text.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureText } from \"../../calcYogaLayout/measureText.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderTextNode } from \"../../renderPptx/nodes/text.ts\";\n\nexport const textNodeDef: NodeDefinition = {\n type: \"text\",\n category: \"leaf\",\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga, ctx: BuildContext) {\n const n = node as Extract<POMNode, { type: \"text\" }>;\n const text = n.text;\n const fontSizePx = n.fontSize ?? 24;\n const fontFamily = n.fontFamily ?? \"Noto Sans JP\";\n const fontWeight = n.bold ? \"bold\" : \"normal\";\n const lineHeight = 1.3;\n const letterSpacingPx = n.letterSpacing;\n\n yn.setMeasureFunc((width, widthMode) => {\n const maxWidthPx = (() => {\n switch (widthMode) {\n case yoga.MEASURE_MODE_UNDEFINED:\n return Number.POSITIVE_INFINITY;\n case yoga.MEASURE_MODE_EXACTLY:\n case yoga.MEASURE_MODE_AT_MOST:\n return width;\n default:\n return Number.POSITIVE_INFINITY;\n }\n })();\n\n const { widthPx, heightPx } = measureText(\n text,\n maxWidthPx,\n {\n fontFamily,\n fontSizePx,\n lineHeight,\n fontWeight,\n letterSpacingPx,\n },\n ctx.textMeasurementMode,\n );\n\n return { width: widthPx, height: heightPx };\n });\n },\n render(node, ctx) {\n renderTextNode(node as Extract<typeof node, { type: \"text\" }>, ctx);\n },\n};\n"],"mappings":";;;AAOA,MAAa,cAA8B;CACzC,MAAM;CACN,UAAU;CACV,eAAe,MAAe,IAAc,MAAY,KAAmB;EACzE,MAAM,IAAI;EACV,MAAM,OAAO,EAAE;EACf,MAAM,aAAa,EAAE,YAAY;EACjC,MAAM,aAAa,EAAE,cAAc;EACnC,MAAM,aAAa,EAAE,OAAO,SAAS;EACrC,MAAM,aAAa;EACnB,MAAM,kBAAkB,EAAE;EAE1B,GAAG,gBAAgB,OAAO,cAAc;GAatC,MAAM,EAAE,SAAS,aAAa,YAC5B,aAbwB;IACxB,QAAQ,WAAR;KACE,KAAK,KAAK,wBACR,OAAO,OAAO;KAChB,KAAK,KAAK;KACV,KAAK,KAAK,sBACR,OAAO;KACT,SACE,OAAO,OAAO;IAClB;GACF,EAAA,CAIW,GACT;IACE;IACA;IACA;IACA;IACA;GACF,GACA,IAAI,mBACN;GAEA,OAAO;IAAE,OAAO;IAAS,QAAQ;GAAS;EAC5C,CAAC;CACH;CACA,OAAO,MAAM,KAAK;EAChB,eAAe,MAAgD,GAAG;CACpE;AACF"}
1
+ {"version":3,"file":"text.js","names":[],"sources":["../../../src/registry/definitions/text.ts"],"sourcesContent":["import type { POMNode } from \"../../types.ts\";\nimport type { NodeDefinition, Yoga } from \"../types.ts\";\nimport type { Node as YogaNode } from \"yoga-layout\";\nimport { measureText } from \"../../calcYogaLayout/measureText.ts\";\nimport type { BuildContext } from \"../../buildContext.ts\";\nimport { renderTextNode } from \"../../renderPptx/nodes/text.ts\";\nimport { getNodeMetadata } from \"../nodeMetadata.ts\";\n\nexport const textNodeDef: NodeDefinition = {\n ...getNodeMetadata(\"text\"),\n applyYogaStyle(node: POMNode, yn: YogaNode, yoga: Yoga, ctx: BuildContext) {\n const n = node as Extract<POMNode, { type: \"text\" }>;\n const text = n.text;\n const fontSizePx = n.fontSize ?? 24;\n const fontFamily = n.fontFamily ?? \"Noto Sans JP\";\n const fontWeight = n.bold ? \"bold\" : \"normal\";\n const lineHeight = 1.3;\n const letterSpacingPx = n.letterSpacing;\n\n yn.setMeasureFunc((width, widthMode) => {\n const maxWidthPx = (() => {\n switch (widthMode) {\n case yoga.MEASURE_MODE_UNDEFINED:\n return Number.POSITIVE_INFINITY;\n case yoga.MEASURE_MODE_EXACTLY:\n case yoga.MEASURE_MODE_AT_MOST:\n return width;\n default:\n return Number.POSITIVE_INFINITY;\n }\n })();\n\n const { widthPx, heightPx } = measureText(\n text,\n maxWidthPx,\n {\n fontFamily,\n fontSizePx,\n lineHeight,\n fontWeight,\n letterSpacingPx,\n },\n ctx.textMeasurementMode,\n );\n\n return { width: widthPx, height: heightPx };\n });\n },\n render(node, ctx) {\n renderTextNode(node as Extract<typeof node, { type: \"text\" }>, ctx);\n },\n};\n"],"mappings":";;;;AAQA,MAAa,cAA8B;CACzC,GAAG,gBAAgB,MAAM;CACzB,eAAe,MAAe,IAAc,MAAY,KAAmB;EACzE,MAAM,IAAI;EACV,MAAM,OAAO,EAAE;EACf,MAAM,aAAa,EAAE,YAAY;EACjC,MAAM,aAAa,EAAE,cAAc;EACnC,MAAM,aAAa,EAAE,OAAO,SAAS;EACrC,MAAM,aAAa;EACnB,MAAM,kBAAkB,EAAE;EAE1B,GAAG,gBAAgB,OAAO,cAAc;GAatC,MAAM,EAAE,SAAS,aAAa,YAC5B,aAbwB;IACxB,QAAQ,WAAR;KACE,KAAK,KAAK,wBACR,OAAO,OAAO;KAChB,KAAK,KAAK;KACV,KAAK,KAAK,sBACR,OAAO;KACT,SACE,OAAO,OAAO;IAClB;GACF,EAAA,CAIW,GACT;IACE;IACA;IACA;IACA;IACA;GACF,GACA,IAAI,mBACN;GAEA,OAAO;IAAE,OAAO;IAAS,QAAQ;GAAS;EAC5C,CAAC;CACH;CACA,OAAO,MAAM,KAAK;EAChB,eAAe,MAAgD,GAAG;CACpE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/registry/index.ts"],"sourcesContent":["import { registerNode } from \"./nodeRegistry.ts\";\nimport { textNodeDef } from \"./definitions/text.ts\";\nimport { ulNodeDef, olNodeDef } from \"./definitions/list.ts\";\nimport { imageNodeDef } from \"./definitions/image.ts\";\nimport { tableNodeDef } from \"./definitions/table.ts\";\nimport { shapeNodeDef } from \"./definitions/shape.ts\";\nimport { chartNodeDef } from \"./definitions/chart.ts\";\nimport { iconNodeDef } from \"./definitions/icon.ts\";\nimport { lineNodeDef } from \"./definitions/line.ts\";\nimport { arrowNodeDef } from \"./definitions/arrow.ts\";\nimport {\n timelineNodeDef,\n matrixNodeDef,\n treeNodeDef,\n flowNodeDef,\n processArrowNodeDef,\n pyramidNodeDef,\n} from \"./definitions/compositeNodes.ts\";\nimport { vstackNodeDef, hstackNodeDef } from \"./definitions/stack.ts\";\nimport { layerNodeDef } from \"./definitions/layer.ts\";\nimport { svgNodeDef } from \"./definitions/svg.ts\";\n\n// 全ノード定義を登録\nregisterNode(textNodeDef);\nregisterNode(ulNodeDef);\nregisterNode(olNodeDef);\nregisterNode(imageNodeDef);\nregisterNode(tableNodeDef);\nregisterNode(shapeNodeDef);\nregisterNode(chartNodeDef);\nregisterNode(iconNodeDef);\nregisterNode(lineNodeDef);\nregisterNode(arrowNodeDef);\nregisterNode(timelineNodeDef);\nregisterNode(matrixNodeDef);\nregisterNode(treeNodeDef);\nregisterNode(flowNodeDef);\nregisterNode(processArrowNodeDef);\nregisterNode(pyramidNodeDef);\nregisterNode(vstackNodeDef);\nregisterNode(hstackNodeDef);\nregisterNode(layerNodeDef);\nregisterNode(svgNodeDef);\n\nexport { getNodeDef } from \"./nodeRegistry.ts\";\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,aAAa,WAAW;AACxB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,YAAY;AACzB,aAAa,YAAY;AACzB,aAAa,YAAY;AACzB,aAAa,YAAY;AACzB,aAAa,WAAW;AACxB,aAAa,WAAW;AACxB,aAAa,YAAY;AACzB,aAAa,eAAe;AAC5B,aAAa,aAAa;AAC1B,aAAa,WAAW;AACxB,aAAa,WAAW;AACxB,aAAa,mBAAmB;AAChC,aAAa,cAAc;AAC3B,aAAa,aAAa;AAC1B,aAAa,aAAa;AAC1B,aAAa,YAAY;AACzB,aAAa,UAAU"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/registry/index.ts"],"sourcesContent":["import { registerNode } from \"./nodeRegistry.ts\";\nimport { textNodeDef } from \"./definitions/text.ts\";\nimport { ulNodeDef, olNodeDef } from \"./definitions/list.ts\";\nimport { imageNodeDef } from \"./definitions/image.ts\";\nimport { tableNodeDef } from \"./definitions/table.ts\";\nimport { shapeNodeDef } from \"./definitions/shape.ts\";\nimport { chartNodeDef } from \"./definitions/chart.ts\";\nimport { iconNodeDef } from \"./definitions/icon.ts\";\nimport { lineNodeDef } from \"./definitions/line.ts\";\nimport { arrowNodeDef } from \"./definitions/arrow.ts\";\nimport {\n timelineNodeDef,\n matrixNodeDef,\n treeNodeDef,\n flowNodeDef,\n processArrowNodeDef,\n pyramidNodeDef,\n} from \"./definitions/compositeNodes.ts\";\nimport { vstackNodeDef, hstackNodeDef } from \"./definitions/stack.ts\";\nimport { layerNodeDef } from \"./definitions/layer.ts\";\nimport { svgNodeDef } from \"./definitions/svg.ts\";\n\n// 全ノード定義を登録\nregisterNode(textNodeDef);\nregisterNode(ulNodeDef);\nregisterNode(olNodeDef);\nregisterNode(imageNodeDef);\nregisterNode(tableNodeDef);\nregisterNode(shapeNodeDef);\nregisterNode(chartNodeDef);\nregisterNode(iconNodeDef);\nregisterNode(lineNodeDef);\nregisterNode(arrowNodeDef);\nregisterNode(timelineNodeDef);\nregisterNode(matrixNodeDef);\nregisterNode(treeNodeDef);\nregisterNode(flowNodeDef);\nregisterNode(processArrowNodeDef);\nregisterNode(pyramidNodeDef);\nregisterNode(vstackNodeDef);\nregisterNode(hstackNodeDef);\nregisterNode(layerNodeDef);\nregisterNode(svgNodeDef);\n\nexport {\n getAllNodeDefs,\n getNodeDef,\n getNodeDefByTag,\n getTagName,\n} from \"./nodeRegistry.ts\";\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,aAAa,WAAW;AACxB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,YAAY;AACzB,aAAa,YAAY;AACzB,aAAa,YAAY;AACzB,aAAa,YAAY;AACzB,aAAa,WAAW;AACxB,aAAa,WAAW;AACxB,aAAa,YAAY;AACzB,aAAa,eAAe;AAC5B,aAAa,aAAa;AAC1B,aAAa,WAAW;AACxB,aAAa,WAAW;AACxB,aAAa,mBAAmB;AAChC,aAAa,cAAc;AAC3B,aAAa,aAAa;AAC1B,aAAa,aAAa;AAC1B,aAAa,YAAY;AACzB,aAAa,UAAU"}
@@ -0,0 +1,208 @@
1
+ import { arrowNodeSchema, chartNodeSchema, flowNodeSchema, hStackNodeSchema, iconNodeSchema, imageNodeSchema, layerNodeSchema, lineNodeSchema, matrixNodeSchema, olNodeSchema, processArrowNodeSchema, pyramidNodeSchema, shapeNodeSchema, svgNodeSchema, tableNodeSchema, textNodeSchema, timelineNodeSchema, treeNodeSchema, ulNodeSchema, vStackNodeSchema } from "../types.js";
2
+ //#region src/registry/nodeMetadata.ts
3
+ const none = { kind: "none" };
4
+ const pomChildren = { kind: "pom-children" };
5
+ function leaf(type, tagName, schema, options = {}) {
6
+ return {
7
+ type,
8
+ tagName,
9
+ category: "leaf",
10
+ schema,
11
+ childPolicy: none,
12
+ ...options
13
+ };
14
+ }
15
+ function container(type, tagName, category, schema) {
16
+ return {
17
+ type,
18
+ tagName,
19
+ category,
20
+ schema,
21
+ childPolicy: pomChildren
22
+ };
23
+ }
24
+ const NODE_METADATA = [
25
+ leaf("text", "Text", textNodeSchema, {
26
+ defaults: {
27
+ fontSize: 24,
28
+ fontFamily: "Noto Sans JP",
29
+ lineHeight: 1.3
30
+ },
31
+ childPolicy: { kind: "custom" },
32
+ xmlChildRule: { kind: "inline-runs" },
33
+ textContentProperty: "text",
34
+ supportsInlineRuns: true
35
+ }),
36
+ leaf("ul", "Ul", ulNodeSchema, {
37
+ defaults: {
38
+ fontSize: 24,
39
+ fontFamily: "Noto Sans JP",
40
+ lineHeight: 1.3
41
+ },
42
+ childPolicy: {
43
+ kind: "custom",
44
+ optionalProperties: ["items"]
45
+ },
46
+ xmlChildRule: {
47
+ kind: "repeated",
48
+ childTag: "Li",
49
+ property: "items",
50
+ allowsItemText: true
51
+ }
52
+ }),
53
+ leaf("ol", "Ol", olNodeSchema, {
54
+ defaults: {
55
+ fontSize: 24,
56
+ fontFamily: "Noto Sans JP",
57
+ lineHeight: 1.3
58
+ },
59
+ childPolicy: {
60
+ kind: "custom",
61
+ optionalProperties: ["items"]
62
+ },
63
+ xmlChildRule: {
64
+ kind: "repeated",
65
+ childTag: "Li",
66
+ property: "items",
67
+ allowsItemText: true
68
+ }
69
+ }),
70
+ leaf("image", "Image", imageNodeSchema),
71
+ leaf("table", "Table", tableNodeSchema, {
72
+ childPolicy: {
73
+ kind: "custom",
74
+ optionalProperties: ["columns", "rows"]
75
+ },
76
+ xmlChildRule: {
77
+ kind: "node-specific",
78
+ expectedTags: ["Col", "Tr"]
79
+ }
80
+ }),
81
+ container("vstack", "VStack", "multi-child", vStackNodeSchema),
82
+ container("hstack", "HStack", "multi-child", hStackNodeSchema),
83
+ leaf("shape", "Shape", shapeNodeSchema, {
84
+ defaults: {
85
+ fontSize: 24,
86
+ fontFamily: "Noto Sans JP",
87
+ lineHeight: 1.3
88
+ },
89
+ textContentProperty: "text",
90
+ supportsInlineRuns: true
91
+ }),
92
+ leaf("chart", "Chart", chartNodeSchema, {
93
+ childPolicy: {
94
+ kind: "custom",
95
+ optionalProperties: ["data"]
96
+ },
97
+ xmlChildRule: {
98
+ kind: "node-specific",
99
+ expectedTags: ["ChartSeries"]
100
+ }
101
+ }),
102
+ leaf("timeline", "Timeline", timelineNodeSchema, {
103
+ childPolicy: {
104
+ kind: "custom",
105
+ optionalProperties: ["items"]
106
+ },
107
+ xmlChildRule: {
108
+ kind: "repeated",
109
+ childTag: "TimelineItem",
110
+ property: "items"
111
+ }
112
+ }),
113
+ leaf("matrix", "Matrix", matrixNodeSchema, {
114
+ childPolicy: {
115
+ kind: "custom",
116
+ optionalProperties: [
117
+ "axes",
118
+ "items",
119
+ "quadrants"
120
+ ]
121
+ },
122
+ xmlChildRule: {
123
+ kind: "node-specific",
124
+ expectedTags: [
125
+ "MatrixAxes",
126
+ "MatrixQuadrants",
127
+ "MatrixItem"
128
+ ]
129
+ }
130
+ }),
131
+ leaf("tree", "Tree", treeNodeSchema, {
132
+ childPolicy: {
133
+ kind: "custom",
134
+ optionalProperties: ["data"]
135
+ },
136
+ xmlChildRule: {
137
+ kind: "node-specific",
138
+ expectedTags: ["TreeItem"]
139
+ }
140
+ }),
141
+ leaf("flow", "Flow", flowNodeSchema, {
142
+ childPolicy: {
143
+ kind: "custom",
144
+ optionalProperties: ["nodes", "connections"]
145
+ },
146
+ xmlChildRule: {
147
+ kind: "node-specific",
148
+ expectedTags: ["FlowNode", "FlowConnection"]
149
+ }
150
+ }),
151
+ leaf("processArrow", "ProcessArrow", processArrowNodeSchema, {
152
+ childPolicy: {
153
+ kind: "custom",
154
+ optionalProperties: ["steps"]
155
+ },
156
+ xmlChildRule: {
157
+ kind: "repeated",
158
+ childTag: "ProcessArrowStep",
159
+ property: "steps"
160
+ }
161
+ }),
162
+ leaf("pyramid", "Pyramid", pyramidNodeSchema, {
163
+ childPolicy: {
164
+ kind: "custom",
165
+ optionalProperties: ["levels"]
166
+ },
167
+ xmlChildRule: {
168
+ kind: "repeated",
169
+ childTag: "PyramidLevel",
170
+ property: "levels"
171
+ }
172
+ }),
173
+ leaf("line", "Line", lineNodeSchema),
174
+ leaf("arrow", "Arrow", arrowNodeSchema),
175
+ container("layer", "Layer", "absolute-child", layerNodeSchema),
176
+ leaf("icon", "Icon", iconNodeSchema, { defaults: {
177
+ size: 24,
178
+ color: "#000000"
179
+ } }),
180
+ leaf("svg", "Svg", svgNodeSchema, {
181
+ defaults: {
182
+ w: 24,
183
+ h: 24
184
+ },
185
+ childPolicy: {
186
+ kind: "custom",
187
+ optionalProperties: ["svgContent"]
188
+ },
189
+ xmlChildRule: {
190
+ kind: "node-specific",
191
+ expectedTags: ["svg"]
192
+ }
193
+ })
194
+ ];
195
+ const metadataByType = new Map(NODE_METADATA.map((metadata) => [metadata.type, metadata]));
196
+ const metadataByTag = new Map(NODE_METADATA.map((metadata) => [metadata.tagName, metadata]));
197
+ function getNodeMetadata(type) {
198
+ const metadata = metadataByType.get(type);
199
+ if (!metadata) throw new Error(`Unknown node type: ${type}`);
200
+ return metadata;
201
+ }
202
+ function getNodeMetadataByTag(tagName) {
203
+ return metadataByTag.get(tagName);
204
+ }
205
+ //#endregion
206
+ export { NODE_METADATA, getNodeMetadata, getNodeMetadataByTag };
207
+
208
+ //# sourceMappingURL=nodeMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeMetadata.js","names":[],"sources":["../../src/registry/nodeMetadata.ts"],"sourcesContent":["import {\n arrowNodeSchema,\n chartNodeSchema,\n flowNodeSchema,\n hStackNodeSchema,\n iconNodeSchema,\n imageNodeSchema,\n layerNodeSchema,\n lineNodeSchema,\n matrixNodeSchema,\n olNodeSchema,\n processArrowNodeSchema,\n pyramidNodeSchema,\n shapeNodeSchema,\n svgNodeSchema,\n tableNodeSchema,\n textNodeSchema,\n timelineNodeSchema,\n treeNodeSchema,\n ulNodeSchema,\n vStackNodeSchema,\n type POMNode,\n} from \"../types.ts\";\nimport type { ChildPolicy, NodeCategory, NodeDefinition } from \"./types.ts\";\n\nexport type NodeMetadata = Pick<\n NodeDefinition,\n | \"type\"\n | \"tagName\"\n | \"category\"\n | \"schema\"\n | \"defaults\"\n | \"childPolicy\"\n | \"xmlChildRule\"\n | \"textContentProperty\"\n | \"supportsInlineRuns\"\n>;\n\nconst none: ChildPolicy = { kind: \"none\" };\nconst pomChildren: ChildPolicy = { kind: \"pom-children\" };\n\nfunction leaf(\n type: POMNode[\"type\"],\n tagName: string,\n schema: NodeDefinition[\"schema\"],\n options: Partial<\n Pick<\n NodeMetadata,\n | \"defaults\"\n | \"childPolicy\"\n | \"xmlChildRule\"\n | \"textContentProperty\"\n | \"supportsInlineRuns\"\n >\n > = {},\n): NodeMetadata {\n return {\n type,\n tagName,\n category: \"leaf\",\n schema,\n childPolicy: none,\n ...options,\n };\n}\n\nfunction container(\n type: POMNode[\"type\"],\n tagName: string,\n category: Extract<NodeCategory, \"multi-child\" | \"absolute-child\">,\n schema: NodeDefinition[\"schema\"],\n): NodeMetadata {\n return {\n type,\n tagName,\n category,\n schema,\n childPolicy: pomChildren,\n };\n}\n\nexport const NODE_METADATA = [\n leaf(\"text\", \"Text\", textNodeSchema, {\n defaults: {\n fontSize: 24,\n fontFamily: \"Noto Sans JP\",\n lineHeight: 1.3,\n },\n childPolicy: { kind: \"custom\" },\n xmlChildRule: { kind: \"inline-runs\" },\n textContentProperty: \"text\",\n supportsInlineRuns: true,\n }),\n leaf(\"ul\", \"Ul\", ulNodeSchema, {\n defaults: {\n fontSize: 24,\n fontFamily: \"Noto Sans JP\",\n lineHeight: 1.3,\n },\n childPolicy: { kind: \"custom\", optionalProperties: [\"items\"] },\n xmlChildRule: {\n kind: \"repeated\",\n childTag: \"Li\",\n property: \"items\",\n allowsItemText: true,\n },\n }),\n leaf(\"ol\", \"Ol\", olNodeSchema, {\n defaults: {\n fontSize: 24,\n fontFamily: \"Noto Sans JP\",\n lineHeight: 1.3,\n },\n childPolicy: { kind: \"custom\", optionalProperties: [\"items\"] },\n xmlChildRule: {\n kind: \"repeated\",\n childTag: \"Li\",\n property: \"items\",\n allowsItemText: true,\n },\n }),\n leaf(\"image\", \"Image\", imageNodeSchema),\n leaf(\"table\", \"Table\", tableNodeSchema, {\n childPolicy: {\n kind: \"custom\",\n optionalProperties: [\"columns\", \"rows\"],\n },\n xmlChildRule: { kind: \"node-specific\", expectedTags: [\"Col\", \"Tr\"] },\n }),\n container(\"vstack\", \"VStack\", \"multi-child\", vStackNodeSchema),\n container(\"hstack\", \"HStack\", \"multi-child\", hStackNodeSchema),\n leaf(\"shape\", \"Shape\", shapeNodeSchema, {\n defaults: {\n fontSize: 24,\n fontFamily: \"Noto Sans JP\",\n lineHeight: 1.3,\n },\n textContentProperty: \"text\",\n supportsInlineRuns: true,\n }),\n leaf(\"chart\", \"Chart\", chartNodeSchema, {\n childPolicy: { kind: \"custom\", optionalProperties: [\"data\"] },\n xmlChildRule: { kind: \"node-specific\", expectedTags: [\"ChartSeries\"] },\n }),\n leaf(\"timeline\", \"Timeline\", timelineNodeSchema, {\n childPolicy: { kind: \"custom\", optionalProperties: [\"items\"] },\n xmlChildRule: {\n kind: \"repeated\",\n childTag: \"TimelineItem\",\n property: \"items\",\n },\n }),\n leaf(\"matrix\", \"Matrix\", matrixNodeSchema, {\n childPolicy: {\n kind: \"custom\",\n optionalProperties: [\"axes\", \"items\", \"quadrants\"],\n },\n xmlChildRule: {\n kind: \"node-specific\",\n expectedTags: [\"MatrixAxes\", \"MatrixQuadrants\", \"MatrixItem\"],\n },\n }),\n leaf(\"tree\", \"Tree\", treeNodeSchema, {\n childPolicy: { kind: \"custom\", optionalProperties: [\"data\"] },\n xmlChildRule: { kind: \"node-specific\", expectedTags: [\"TreeItem\"] },\n }),\n leaf(\"flow\", \"Flow\", flowNodeSchema, {\n childPolicy: {\n kind: \"custom\",\n optionalProperties: [\"nodes\", \"connections\"],\n },\n xmlChildRule: {\n kind: \"node-specific\",\n expectedTags: [\"FlowNode\", \"FlowConnection\"],\n },\n }),\n leaf(\"processArrow\", \"ProcessArrow\", processArrowNodeSchema, {\n childPolicy: { kind: \"custom\", optionalProperties: [\"steps\"] },\n xmlChildRule: {\n kind: \"repeated\",\n childTag: \"ProcessArrowStep\",\n property: \"steps\",\n },\n }),\n leaf(\"pyramid\", \"Pyramid\", pyramidNodeSchema, {\n childPolicy: { kind: \"custom\", optionalProperties: [\"levels\"] },\n xmlChildRule: {\n kind: \"repeated\",\n childTag: \"PyramidLevel\",\n property: \"levels\",\n },\n }),\n leaf(\"line\", \"Line\", lineNodeSchema),\n leaf(\"arrow\", \"Arrow\", arrowNodeSchema),\n container(\"layer\", \"Layer\", \"absolute-child\", layerNodeSchema),\n leaf(\"icon\", \"Icon\", iconNodeSchema, {\n defaults: {\n size: 24,\n color: \"#000000\",\n },\n }),\n leaf(\"svg\", \"Svg\", svgNodeSchema, {\n defaults: {\n w: 24,\n h: 24,\n },\n childPolicy: {\n kind: \"custom\",\n optionalProperties: [\"svgContent\"],\n },\n xmlChildRule: { kind: \"node-specific\", expectedTags: [\"svg\"] },\n }),\n] as const satisfies readonly NodeMetadata[];\n\nconst metadataByType = new Map<POMNode[\"type\"], NodeMetadata>(\n NODE_METADATA.map((metadata) => [metadata.type, metadata]),\n);\nconst metadataByTag = new Map<string, NodeMetadata>(\n NODE_METADATA.map((metadata) => [metadata.tagName, metadata]),\n);\n\nexport function getNodeMetadata(type: POMNode[\"type\"]): NodeMetadata {\n const metadata = metadataByType.get(type);\n if (!metadata) throw new Error(`Unknown node type: ${type}`);\n return metadata;\n}\n\nexport function getNodeMetadataByTag(\n tagName: string,\n): NodeMetadata | undefined {\n return metadataByTag.get(tagName);\n}\n"],"mappings":";;AAsCA,MAAM,OAAoB,EAAE,MAAM,OAAO;AACzC,MAAM,cAA2B,EAAE,MAAM,eAAe;AAExD,SAAS,KACP,MACA,SACA,QACA,UASI,CAAC,GACS;CACd,OAAO;EACL;EACA;EACA,UAAU;EACV;EACA,aAAa;EACb,GAAG;CACL;AACF;AAEA,SAAS,UACP,MACA,SACA,UACA,QACc;CACd,OAAO;EACL;EACA;EACA;EACA;EACA,aAAa;CACf;AACF;AAEA,MAAa,gBAAgB;CAC3B,KAAK,QAAQ,QAAQ,gBAAgB;EACnC,UAAU;GACR,UAAU;GACV,YAAY;GACZ,YAAY;EACd;EACA,aAAa,EAAE,MAAM,SAAS;EAC9B,cAAc,EAAE,MAAM,cAAc;EACpC,qBAAqB;EACrB,oBAAoB;CACtB,CAAC;CACD,KAAK,MAAM,MAAM,cAAc;EAC7B,UAAU;GACR,UAAU;GACV,YAAY;GACZ,YAAY;EACd;EACA,aAAa;GAAE,MAAM;GAAU,oBAAoB,CAAC,OAAO;EAAE;EAC7D,cAAc;GACZ,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;EAClB;CACF,CAAC;CACD,KAAK,MAAM,MAAM,cAAc;EAC7B,UAAU;GACR,UAAU;GACV,YAAY;GACZ,YAAY;EACd;EACA,aAAa;GAAE,MAAM;GAAU,oBAAoB,CAAC,OAAO;EAAE;EAC7D,cAAc;GACZ,MAAM;GACN,UAAU;GACV,UAAU;GACV,gBAAgB;EAClB;CACF,CAAC;CACD,KAAK,SAAS,SAAS,eAAe;CACtC,KAAK,SAAS,SAAS,iBAAiB;EACtC,aAAa;GACX,MAAM;GACN,oBAAoB,CAAC,WAAW,MAAM;EACxC;EACA,cAAc;GAAE,MAAM;GAAiB,cAAc,CAAC,OAAO,IAAI;EAAE;CACrE,CAAC;CACD,UAAU,UAAU,UAAU,eAAe,gBAAgB;CAC7D,UAAU,UAAU,UAAU,eAAe,gBAAgB;CAC7D,KAAK,SAAS,SAAS,iBAAiB;EACtC,UAAU;GACR,UAAU;GACV,YAAY;GACZ,YAAY;EACd;EACA,qBAAqB;EACrB,oBAAoB;CACtB,CAAC;CACD,KAAK,SAAS,SAAS,iBAAiB;EACtC,aAAa;GAAE,MAAM;GAAU,oBAAoB,CAAC,MAAM;EAAE;EAC5D,cAAc;GAAE,MAAM;GAAiB,cAAc,CAAC,aAAa;EAAE;CACvE,CAAC;CACD,KAAK,YAAY,YAAY,oBAAoB;EAC/C,aAAa;GAAE,MAAM;GAAU,oBAAoB,CAAC,OAAO;EAAE;EAC7D,cAAc;GACZ,MAAM;GACN,UAAU;GACV,UAAU;EACZ;CACF,CAAC;CACD,KAAK,UAAU,UAAU,kBAAkB;EACzC,aAAa;GACX,MAAM;GACN,oBAAoB;IAAC;IAAQ;IAAS;GAAW;EACnD;EACA,cAAc;GACZ,MAAM;GACN,cAAc;IAAC;IAAc;IAAmB;GAAY;EAC9D;CACF,CAAC;CACD,KAAK,QAAQ,QAAQ,gBAAgB;EACnC,aAAa;GAAE,MAAM;GAAU,oBAAoB,CAAC,MAAM;EAAE;EAC5D,cAAc;GAAE,MAAM;GAAiB,cAAc,CAAC,UAAU;EAAE;CACpE,CAAC;CACD,KAAK,QAAQ,QAAQ,gBAAgB;EACnC,aAAa;GACX,MAAM;GACN,oBAAoB,CAAC,SAAS,aAAa;EAC7C;EACA,cAAc;GACZ,MAAM;GACN,cAAc,CAAC,YAAY,gBAAgB;EAC7C;CACF,CAAC;CACD,KAAK,gBAAgB,gBAAgB,wBAAwB;EAC3D,aAAa;GAAE,MAAM;GAAU,oBAAoB,CAAC,OAAO;EAAE;EAC7D,cAAc;GACZ,MAAM;GACN,UAAU;GACV,UAAU;EACZ;CACF,CAAC;CACD,KAAK,WAAW,WAAW,mBAAmB;EAC5C,aAAa;GAAE,MAAM;GAAU,oBAAoB,CAAC,QAAQ;EAAE;EAC9D,cAAc;GACZ,MAAM;GACN,UAAU;GACV,UAAU;EACZ;CACF,CAAC;CACD,KAAK,QAAQ,QAAQ,cAAc;CACnC,KAAK,SAAS,SAAS,eAAe;CACtC,UAAU,SAAS,SAAS,kBAAkB,eAAe;CAC7D,KAAK,QAAQ,QAAQ,gBAAgB,EACnC,UAAU;EACR,MAAM;EACN,OAAO;CACT,EACF,CAAC;CACD,KAAK,OAAO,OAAO,eAAe;EAChC,UAAU;GACR,GAAG;GACH,GAAG;EACL;EACA,aAAa;GACX,MAAM;GACN,oBAAoB,CAAC,YAAY;EACnC;EACA,cAAc;GAAE,MAAM;GAAiB,cAAc,CAAC,KAAK;EAAE;CAC/D,CAAC;AACH;AAEA,MAAM,iBAAiB,IAAI,IACzB,cAAc,KAAK,aAAa,CAAC,SAAS,MAAM,QAAQ,CAAC,CAC3D;AACA,MAAM,gBAAgB,IAAI,IACxB,cAAc,KAAK,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC,CAC9D;AAEA,SAAgB,gBAAgB,MAAqC;CACnE,MAAM,WAAW,eAAe,IAAI,IAAI;CACxC,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,sBAAsB,MAAM;CAC3D,OAAO;AACT;AAEA,SAAgB,qBACd,SAC0B;CAC1B,OAAO,cAAc,IAAI,OAAO;AAClC"}
@@ -1,8 +1,11 @@
1
1
  //#region src/registry/nodeRegistry.ts
2
2
  const registry = /* @__PURE__ */ new Map();
3
+ const tagToType = /* @__PURE__ */ new Map();
3
4
  function registerNode(def) {
4
5
  if (registry.has(def.type)) throw new Error(`Duplicate node registration: ${def.type}`);
6
+ if (tagToType.has(def.tagName)) throw new Error(`Duplicate node tag registration: ${def.tagName}`);
5
7
  registry.set(def.type, def);
8
+ tagToType.set(def.tagName, def.type);
6
9
  }
7
10
  function getNodeDef(type) {
8
11
  const def = registry.get(type);
@@ -1 +1 @@
1
- {"version":3,"file":"nodeRegistry.js","names":[],"sources":["../../src/registry/nodeRegistry.ts"],"sourcesContent":["import type { POMNode } from \"../types.ts\";\nimport type { NodeDefinition } from \"./types.ts\";\n\ntype NodeType = POMNode[\"type\"];\n\nconst registry = new Map<NodeType, NodeDefinition>();\n\nexport function registerNode(def: NodeDefinition): void {\n if (registry.has(def.type)) {\n throw new Error(`Duplicate node registration: ${def.type}`);\n }\n registry.set(def.type, def);\n}\n\nexport function getNodeDef(type: NodeType): NodeDefinition {\n const def = registry.get(type);\n if (!def) throw new Error(`Unknown node type: ${type}`);\n return def;\n}\n"],"mappings":";AAKA,MAAM,2BAAW,IAAI,IAA8B;AAEnD,SAAgB,aAAa,KAA2B;CACtD,IAAI,SAAS,IAAI,IAAI,IAAI,GACvB,MAAM,IAAI,MAAM,gCAAgC,IAAI,MAAM;CAE5D,SAAS,IAAI,IAAI,MAAM,GAAG;AAC5B;AAEA,SAAgB,WAAW,MAAgC;CACzD,MAAM,MAAM,SAAS,IAAI,IAAI;CAC7B,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,sBAAsB,MAAM;CACtD,OAAO;AACT"}
1
+ {"version":3,"file":"nodeRegistry.js","names":[],"sources":["../../src/registry/nodeRegistry.ts"],"sourcesContent":["import type { POMNode } from \"../types.ts\";\nimport type { NodeDefinition } from \"./types.ts\";\n\ntype NodeType = POMNode[\"type\"];\n\nconst registry = new Map<NodeType, NodeDefinition>();\nconst tagToType = new Map<string, NodeType>();\n\nexport function registerNode(def: NodeDefinition): void {\n if (registry.has(def.type)) {\n throw new Error(`Duplicate node registration: ${def.type}`);\n }\n if (tagToType.has(def.tagName)) {\n throw new Error(`Duplicate node tag registration: ${def.tagName}`);\n }\n registry.set(def.type, def);\n tagToType.set(def.tagName, def.type);\n}\n\nexport function getNodeDef(type: NodeType): NodeDefinition {\n const def = registry.get(type);\n if (!def) throw new Error(`Unknown node type: ${type}`);\n return def;\n}\n\nexport function getNodeDefByTag(tagName: string): NodeDefinition | undefined {\n const type = tagToType.get(tagName);\n return type ? getNodeDef(type) : undefined;\n}\n\nexport function getTagName(type: NodeType): string {\n return getNodeDef(type).tagName;\n}\n\nexport function getAllNodeDefs(): NodeDefinition[] {\n return [...registry.values()];\n}\n"],"mappings":";AAKA,MAAM,2BAAW,IAAI,IAA8B;AACnD,MAAM,4BAAY,IAAI,IAAsB;AAE5C,SAAgB,aAAa,KAA2B;CACtD,IAAI,SAAS,IAAI,IAAI,IAAI,GACvB,MAAM,IAAI,MAAM,gCAAgC,IAAI,MAAM;CAE5D,IAAI,UAAU,IAAI,IAAI,OAAO,GAC3B,MAAM,IAAI,MAAM,oCAAoC,IAAI,SAAS;CAEnE,SAAS,IAAI,IAAI,MAAM,GAAG;CAC1B,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI;AACrC;AAEA,SAAgB,WAAW,MAAgC;CACzD,MAAM,MAAM,SAAS,IAAI,IAAI;CAC7B,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,sBAAsB,MAAM;CACtD,OAAO;AACT"}
@@ -0,0 +1,55 @@
1
+ //#region src/registry/xmlChildRules.ts
2
+ /**
3
+ * boolean 装飾タグ ↔ TextRun property の対応。
4
+ * 配列の順序は serialize 時のネスト順(先頭が最も外側)。
5
+ */
6
+ const INLINE_BOOLEAN_FORMATS = [
7
+ {
8
+ tag: "B",
9
+ property: "bold"
10
+ },
11
+ {
12
+ tag: "I",
13
+ property: "italic"
14
+ },
15
+ {
16
+ tag: "U",
17
+ property: "underline"
18
+ },
19
+ {
20
+ tag: "S",
21
+ property: "strike"
22
+ }
23
+ ];
24
+ /** ハイライトタグ。color 属性 → TextRun.highlight(省略時は既定色) */
25
+ const INLINE_MARK_TAG = "Mark";
26
+ /** Mark の color 属性省略時に適用される既定のハイライト色 */
27
+ const MARK_DEFAULT_HIGHLIGHT_COLOR = "FFFF00";
28
+ /** 文字スタイルタグ。color / fontFamily / letterSpacing 属性 → TextRun の同名 property */
29
+ const INLINE_SPAN_TAG = "Span";
30
+ /** インライン装飾として許容されるタグの一覧(エラーメッセージの列挙順) */
31
+ const INLINE_FORMAT_TAG_LIST = [
32
+ "B",
33
+ "I",
34
+ "A",
35
+ "U",
36
+ "S",
37
+ "Mark",
38
+ "Span"
39
+ ];
40
+ /** インライン装飾タグの集合(child element 判定用) */
41
+ const INLINE_FORMAT_TAGS = new Set(INLINE_FORMAT_TAG_LIST);
42
+ /**
43
+ * unknown child エラーメッセージ用に期待タグ一覧を整形する。
44
+ * 例: ["A"] → "<A>" / ["A","B"] → "<A> or <B>" / ["A","B","C"] → "<A>, <B>, or <C>"
45
+ */
46
+ function formatExpectedTags(tags) {
47
+ const wrapped = tags.map((tag) => `<${tag}>`);
48
+ if (wrapped.length === 1) return wrapped[0];
49
+ if (wrapped.length === 2) return `${wrapped[0]} or ${wrapped[1]}`;
50
+ return `${wrapped.slice(0, -1).join(", ")}, or ${wrapped[wrapped.length - 1]}`;
51
+ }
52
+ //#endregion
53
+ export { INLINE_BOOLEAN_FORMATS, INLINE_FORMAT_TAGS, INLINE_FORMAT_TAG_LIST, INLINE_MARK_TAG, INLINE_SPAN_TAG, MARK_DEFAULT_HIGHLIGHT_COLOR, formatExpectedTags };
54
+
55
+ //# sourceMappingURL=xmlChildRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlChildRules.js","names":[],"sources":["../../src/registry/xmlChildRules.ts"],"sourcesContent":["/**\n * parseXml / serializeXml が共有する XML child handling のルール定義。\n *\n * - インライン装飾タグ (B/I/A/U/S/Mark/Span) と TextRun property の対応\n * - ノードごとの XML child element 受け入れルール (XmlChildRule)\n *\n * parse 側 (parseXml.ts) と serialize 側 (serializeXml.ts) の双方がこの\n * モジュールを参照することで、タグ名・対応 property・許容 child のズレを防ぐ。\n * 依存方向は parseXml / serializeXml → registry の一方向に保つ(このモジュール\n * からは parseXml / serializeXml を import しない)。\n */\n\n// ===== インライン装飾 (B/I/A/U/S/Mark/Span) =====\n\n/** Text / Shape / Li / Td 内のインライン装飾を表すテキスト run */\nexport interface TextRun {\n text: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n highlight?: string;\n color?: string;\n href?: string;\n fontFamily?: string;\n letterSpacing?: number;\n}\n\n/**\n * boolean 装飾タグ ↔ TextRun property の対応。\n * 配列の順序は serialize 時のネスト順(先頭が最も外側)。\n */\nexport const INLINE_BOOLEAN_FORMATS: readonly {\n readonly tag: string;\n readonly property: \"bold\" | \"italic\" | \"underline\" | \"strike\";\n}[] = [\n { tag: \"B\", property: \"bold\" },\n { tag: \"I\", property: \"italic\" },\n { tag: \"U\", property: \"underline\" },\n { tag: \"S\", property: \"strike\" },\n];\n\n/** ハイパーリンクタグ。href 属性 → TextRun.href */\nexport const INLINE_LINK_TAG = \"A\";\n\n/** ハイライトタグ。color 属性 → TextRun.highlight(省略時は既定色) */\nexport const INLINE_MARK_TAG = \"Mark\";\n\n/** Mark の color 属性省略時に適用される既定のハイライト色 */\nexport const MARK_DEFAULT_HIGHLIGHT_COLOR = \"FFFF00\";\n\n/** 文字スタイルタグ。color / fontFamily / letterSpacing 属性 → TextRun の同名 property */\nexport const INLINE_SPAN_TAG = \"Span\";\n\n/** インライン装飾として許容されるタグの一覧(エラーメッセージの列挙順) */\nexport const INLINE_FORMAT_TAG_LIST: readonly string[] = [\n \"B\",\n \"I\",\n \"A\",\n \"U\",\n \"S\",\n \"Mark\",\n \"Span\",\n];\n\n/** インライン装飾タグの集合(child element 判定用) */\nexport const INLINE_FORMAT_TAGS: ReadonlySet<string> = new Set(\n INLINE_FORMAT_TAG_LIST,\n);\n\n// ===== XML child element 受け入れルール =====\n\n/**\n * インライン装飾タグ (B/I/A/U/S/Mark/Span) のみを child として受け付け、\n * runs / text property へ変換するルール(Text 用)\n */\nexport interface InlineRunsChildRule {\n kind: \"inline-runs\";\n}\n\n/** 単一種類の child tag の繰り返しを受け取り、配列 property へ変換するルール */\nexport interface RepeatedChildRule {\n kind: \"repeated\";\n /** 受け付ける child tag 名 */\n childTag: string;\n /** 変換結果を格納する property 名 */\n property: string;\n /** 各 item が text content / インライン装飾タグを受け付けるか(Li 用) */\n allowsItemText?: boolean;\n}\n\n/**\n * parseXml 側の専用 converter で処理する複雑な child 構造\n * (ネスト構造や複数 property への振り分けを伴うもの)\n */\nexport interface NodeSpecificChildRule {\n kind: \"node-specific\";\n /** 直下で受け付ける child tag 名の一覧(unknown child エラーメッセージに使用) */\n expectedTags: readonly string[];\n}\n\nexport type XmlChildRule =\n | InlineRunsChildRule\n | RepeatedChildRule\n | NodeSpecificChildRule;\n\n/**\n * unknown child エラーメッセージ用に期待タグ一覧を整形する。\n * 例: [\"A\"] → \"<A>\" / [\"A\",\"B\"] → \"<A> or <B>\" / [\"A\",\"B\",\"C\"] → \"<A>, <B>, or <C>\"\n */\nexport function formatExpectedTags(tags: readonly string[]): string {\n const wrapped = tags.map((tag) => `<${tag}>`);\n if (wrapped.length === 1) return wrapped[0];\n if (wrapped.length === 2) return `${wrapped[0]} or ${wrapped[1]}`;\n return `${wrapped.slice(0, -1).join(\", \")}, or ${wrapped[wrapped.length - 1]}`;\n}\n"],"mappings":";;;;;AAgCA,MAAa,yBAGP;CACJ;EAAE,KAAK;EAAK,UAAU;CAAO;CAC7B;EAAE,KAAK;EAAK,UAAU;CAAS;CAC/B;EAAE,KAAK;EAAK,UAAU;CAAY;CAClC;EAAE,KAAK;EAAK,UAAU;CAAS;AACjC;;AAMA,MAAa,kBAAkB;;AAG/B,MAAa,+BAA+B;;AAG5C,MAAa,kBAAkB;;AAG/B,MAAa,yBAA4C;CACvD;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,qBAA0C,IAAI,IACzD,sBACF;;;;;AA0CA,SAAgB,mBAAmB,MAAiC;CAClE,MAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,IAAI,EAAE;CAC5C,IAAI,QAAQ,WAAW,GAAG,OAAO,QAAQ;CACzC,IAAI,QAAQ,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,QAAQ;CAC7D,OAAO,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,QAAQ,QAAQ,SAAS;AAC5E"}