@hirokisakabe/pom 8.2.1 → 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 (136) hide show
  1. package/README.md +37 -25
  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/buildContext.js +3 -1
  15. package/dist/buildContext.js.map +1 -1
  16. package/dist/buildPptx.d.ts.map +1 -1
  17. package/dist/buildPptx.js +5 -1
  18. package/dist/buildPptx.js.map +1 -1
  19. package/dist/calcYogaLayout/calcYogaLayout.js +18 -28
  20. package/dist/calcYogaLayout/calcYogaLayout.js.map +1 -1
  21. package/dist/calcYogaLayout/fontLoader.js.map +1 -1
  22. package/dist/calcYogaLayout/measureText.d.ts.map +1 -1
  23. package/dist/calcYogaLayout/measureText.js +9 -2
  24. package/dist/calcYogaLayout/measureText.js.map +1 -1
  25. package/dist/diagnostics.d.ts +1 -1
  26. package/dist/diagnostics.d.ts.map +1 -1
  27. package/dist/diagnostics.js.map +1 -1
  28. package/dist/icons/renderIcon.js.map +1 -1
  29. package/dist/parseMasterPptx.js.map +1 -1
  30. package/dist/parseXml/coercionRules.js +48 -9
  31. package/dist/parseXml/coercionRules.js.map +1 -1
  32. package/dist/parseXml/parseXml.d.ts +8 -3
  33. package/dist/parseXml/parseXml.d.ts.map +1 -1
  34. package/dist/parseXml/parseXml.js +192 -209
  35. package/dist/parseXml/parseXml.js.map +1 -1
  36. package/dist/parseXml/serializeXml.d.ts.map +1 -1
  37. package/dist/parseXml/serializeXml.js +13 -17
  38. package/dist/parseXml/serializeXml.js.map +1 -1
  39. package/dist/registry/definitions/arrow.js +2 -2
  40. package/dist/registry/definitions/arrow.js.map +1 -1
  41. package/dist/registry/definitions/chart.js +2 -2
  42. package/dist/registry/definitions/chart.js.map +1 -1
  43. package/dist/registry/definitions/compositeNodes.js +7 -12
  44. package/dist/registry/definitions/compositeNodes.js.map +1 -1
  45. package/dist/registry/definitions/icon.js +2 -2
  46. package/dist/registry/definitions/icon.js.map +1 -1
  47. package/dist/registry/definitions/image.js +2 -2
  48. package/dist/registry/definitions/image.js.map +1 -1
  49. package/dist/registry/definitions/layer.js +4 -5
  50. package/dist/registry/definitions/layer.js.map +1 -1
  51. package/dist/registry/definitions/line.js +2 -2
  52. package/dist/registry/definitions/line.js.map +1 -1
  53. package/dist/registry/definitions/list.js +3 -4
  54. package/dist/registry/definitions/list.js.map +1 -1
  55. package/dist/registry/definitions/shape.js +2 -2
  56. package/dist/registry/definitions/shape.js.map +1 -1
  57. package/dist/registry/definitions/stack.js +3 -4
  58. package/dist/registry/definitions/stack.js.map +1 -1
  59. package/dist/registry/definitions/svg.js +2 -2
  60. package/dist/registry/definitions/svg.js.map +1 -1
  61. package/dist/registry/definitions/table.js +2 -2
  62. package/dist/registry/definitions/table.js.map +1 -1
  63. package/dist/registry/definitions/text.js +5 -3
  64. package/dist/registry/definitions/text.js.map +1 -1
  65. package/dist/registry/index.js.map +1 -1
  66. package/dist/registry/nodeMetadata.js +208 -0
  67. package/dist/registry/nodeMetadata.js.map +1 -0
  68. package/dist/registry/nodeRegistry.js +3 -0
  69. package/dist/registry/nodeRegistry.js.map +1 -1
  70. package/dist/registry/xmlChildRules.js +55 -0
  71. package/dist/registry/xmlChildRules.js.map +1 -0
  72. package/dist/renderPptx/gradientFills.js +139 -0
  73. package/dist/renderPptx/gradientFills.js.map +1 -0
  74. package/dist/renderPptx/nodes/arrow.js +7 -28
  75. package/dist/renderPptx/nodes/arrow.js.map +1 -1
  76. package/dist/renderPptx/nodes/chart.js +2 -7
  77. package/dist/renderPptx/nodes/chart.js.map +1 -1
  78. package/dist/renderPptx/nodes/flow.js +6 -13
  79. package/dist/renderPptx/nodes/flow.js.map +1 -1
  80. package/dist/renderPptx/nodes/icon.js +4 -2
  81. package/dist/renderPptx/nodes/icon.js.map +1 -1
  82. package/dist/renderPptx/nodes/image.js +5 -13
  83. package/dist/renderPptx/nodes/image.js.map +1 -1
  84. package/dist/renderPptx/nodes/line.js +9 -33
  85. package/dist/renderPptx/nodes/line.js.map +1 -1
  86. package/dist/renderPptx/nodes/list.js +8 -20
  87. package/dist/renderPptx/nodes/list.js.map +1 -1
  88. package/dist/renderPptx/nodes/matrix.js +10 -11
  89. package/dist/renderPptx/nodes/matrix.js.map +1 -1
  90. package/dist/renderPptx/nodes/processArrow.js +9 -16
  91. package/dist/renderPptx/nodes/processArrow.js.map +1 -1
  92. package/dist/renderPptx/nodes/pyramid.js +5 -7
  93. package/dist/renderPptx/nodes/pyramid.js.map +1 -1
  94. package/dist/renderPptx/nodes/shape.js +7 -20
  95. package/dist/renderPptx/nodes/shape.js.map +1 -1
  96. package/dist/renderPptx/nodes/svg.js +2 -5
  97. package/dist/renderPptx/nodes/svg.js.map +1 -1
  98. package/dist/renderPptx/nodes/table.js +2 -5
  99. package/dist/renderPptx/nodes/table.js.map +1 -1
  100. package/dist/renderPptx/nodes/text.js +22 -15
  101. package/dist/renderPptx/nodes/text.js.map +1 -1
  102. package/dist/renderPptx/nodes/timeline.js +20 -22
  103. package/dist/renderPptx/nodes/timeline.js.map +1 -1
  104. package/dist/renderPptx/nodes/tree.js +5 -5
  105. package/dist/renderPptx/nodes/tree.js.map +1 -1
  106. package/dist/renderPptx/renderPptx.js +18 -30
  107. package/dist/renderPptx/renderPptx.js.map +1 -1
  108. package/dist/renderPptx/textOptions.js +34 -9
  109. package/dist/renderPptx/textOptions.js.map +1 -1
  110. package/dist/renderPptx/units.js +11 -1
  111. package/dist/renderPptx/units.js.map +1 -1
  112. package/dist/renderPptx/utils/backgroundBorder.js +107 -59
  113. package/dist/renderPptx/utils/backgroundBorder.js.map +1 -1
  114. package/dist/renderPptx/utils/contentArea.js +26 -9
  115. package/dist/renderPptx/utils/contentArea.js.map +1 -1
  116. package/dist/renderPptx/utils/scaleToFit.js +17 -1
  117. package/dist/renderPptx/utils/scaleToFit.js.map +1 -1
  118. package/dist/renderPptx/utils/straightLine.js +41 -0
  119. package/dist/renderPptx/utils/straightLine.js.map +1 -0
  120. package/dist/renderPptx/utils/visualStyle.js +113 -0
  121. package/dist/renderPptx/utils/visualStyle.js.map +1 -0
  122. package/dist/shared/boxSpacing.js +63 -0
  123. package/dist/shared/boxSpacing.js.map +1 -0
  124. package/dist/shared/gradient.js +103 -0
  125. package/dist/shared/gradient.js.map +1 -0
  126. package/dist/shared/measureImage.js.map +1 -1
  127. package/dist/shared/tableUtils.js.map +1 -1
  128. package/dist/shared/walkTree.js +1 -7
  129. package/dist/shared/walkTree.js.map +1 -1
  130. package/dist/toPositioned/toPositioned.js +1 -1
  131. package/dist/toPositioned/toPositioned.js.map +1 -1
  132. package/dist/types.d.ts +1166 -93
  133. package/dist/types.d.ts.map +1 -1
  134. package/dist/types.js +54 -18
  135. package/dist/types.js.map +1 -1
  136. package/package.json +10 -9
@@ -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,EAAE,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,GAAG;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,GAIW,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;
@@ -11,6 +11,7 @@ const textNodeDef = {
11
11
  const fontFamily = n.fontFamily ?? "Noto Sans JP";
12
12
  const fontWeight = n.bold ? "bold" : "normal";
13
13
  const lineHeight = 1.3;
14
+ const letterSpacingPx = n.letterSpacing;
14
15
  yn.setMeasureFunc((width, widthMode) => {
15
16
  const { widthPx, heightPx } = measureText(text, (() => {
16
17
  switch (widthMode) {
@@ -23,7 +24,8 @@ const textNodeDef = {
23
24
  fontFamily,
24
25
  fontSizePx,
25
26
  lineHeight,
26
- fontWeight
27
+ fontWeight,
28
+ letterSpacingPx
27
29
  }, ctx.textMeasurementMode);
28
30
  return {
29
31
  width: widthPx,
@@ -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\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 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;EAEnB,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,GAIW,GACT;IACE;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