@hirokisakabe/pom 9.1.0 → 9.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/buildContext.js +2 -4
  2. package/dist/buildContext.js.map +1 -1
  3. package/dist/buildPptx.d.ts.map +1 -1
  4. package/dist/buildPptx.js +2 -6
  5. package/dist/buildPptx.js.map +1 -1
  6. package/dist/extractSlideMastersAsPptx.js +1 -1
  7. package/dist/renderPptx/glimpseTextBoxes.js +646 -0
  8. package/dist/renderPptx/glimpseTextBoxes.js.map +1 -0
  9. package/dist/renderPptx/nodes/flow.js +95 -90
  10. package/dist/renderPptx/nodes/flow.js.map +1 -1
  11. package/dist/renderPptx/nodes/icon.js +33 -24
  12. package/dist/renderPptx/nodes/icon.js.map +1 -1
  13. package/dist/renderPptx/nodes/image.js +5 -22
  14. package/dist/renderPptx/nodes/image.js.map +1 -1
  15. package/dist/renderPptx/nodes/list.js +96 -111
  16. package/dist/renderPptx/nodes/list.js.map +1 -1
  17. package/dist/renderPptx/nodes/matrix.js +92 -70
  18. package/dist/renderPptx/nodes/matrix.js.map +1 -1
  19. package/dist/renderPptx/nodes/processArrow.js +68 -35
  20. package/dist/renderPptx/nodes/processArrow.js.map +1 -1
  21. package/dist/renderPptx/nodes/pyramid.js +34 -16
  22. package/dist/renderPptx/nodes/pyramid.js.map +1 -1
  23. package/dist/renderPptx/nodes/shape.js +63 -37
  24. package/dist/renderPptx/nodes/shape.js.map +1 -1
  25. package/dist/renderPptx/nodes/svg.js +2 -5
  26. package/dist/renderPptx/nodes/svg.js.map +1 -1
  27. package/dist/renderPptx/nodes/text.js +16 -45
  28. package/dist/renderPptx/nodes/text.js.map +1 -1
  29. package/dist/renderPptx/nodes/timeline.js +108 -74
  30. package/dist/renderPptx/nodes/timeline.js.map +1 -1
  31. package/dist/renderPptx/nodes/tree.js +78 -79
  32. package/dist/renderPptx/nodes/tree.js.map +1 -1
  33. package/dist/renderPptx/renderPptx.js +4 -5
  34. package/dist/renderPptx/renderPptx.js.map +1 -1
  35. package/dist/renderPptx/utils/backgroundBorder.js +85 -49
  36. package/dist/renderPptx/utils/backgroundBorder.js.map +1 -1
  37. package/dist/renderPptx/utils/glimpsePicture.js +130 -0
  38. package/dist/renderPptx/utils/glimpsePicture.js.map +1 -0
  39. package/dist/renderPptx/utils/glimpseShape.js +90 -0
  40. package/dist/renderPptx/utils/glimpseShape.js.map +1 -0
  41. package/dist/renderPptx/utils/glimpseTextBox.js +126 -0
  42. package/dist/renderPptx/utils/glimpseTextBox.js.map +1 -0
  43. package/dist/renderPptx/utils/straightLine.js +29 -14
  44. package/dist/renderPptx/utils/straightLine.js.map +1 -1
  45. package/dist/renderPptx/utils/visualStyle.js +1 -24
  46. package/dist/renderPptx/utils/visualStyle.js.map +1 -1
  47. package/dist/types.js +1 -1
  48. package/package.json +4 -4
  49. package/dist/renderPptx/glowEffects.js +0 -152
  50. package/dist/renderPptx/glowEffects.js.map +0 -1
  51. package/dist/renderPptx/gradientFills.js +0 -167
  52. package/dist/renderPptx/gradientFills.js.map +0 -1
@@ -1,6 +1,6 @@
1
- import { pxToPt } from "../units.js";
2
- import { getContentAreaIn } from "../utils/contentArea.js";
3
- import { convertStrike, convertUnderline, resolveSubSup } from "../textOptions.js";
1
+ import { getContentArea } from "../utils/contentArea.js";
2
+ import { resolveSubSup } from "../textOptions.js";
3
+ import { addGlimpseTextBox, createGlimpseRunProperties, listBulletXmlTransform } from "../utils/glimpseTextBox.js";
4
4
  //#region src/renderPptx/nodes/list.ts
5
5
  function resolveStyle(li, parent) {
6
6
  const subSup = resolveSubSup(li, parent);
@@ -17,136 +17,121 @@ function resolveStyle(li, parent) {
17
17
  fontFamily: li.fontFamily ?? parent.fontFamily ?? "Noto Sans JP"
18
18
  };
19
19
  }
20
- function buildListTextItems(items, parent, bullet) {
21
- const textItems = [];
20
+ function paragraphProperties(parent) {
21
+ return { align: parent.textAlign ?? "left" };
22
+ }
23
+ function toRunStyle(style) {
24
+ return {
25
+ fontSize: style.fontSize,
26
+ fontFace: style.fontFamily,
27
+ color: style.color,
28
+ bold: style.bold,
29
+ italic: style.italic,
30
+ underline: style.underline,
31
+ strike: style.strike,
32
+ subscript: style.subscript,
33
+ superscript: style.superscript,
34
+ highlight: style.highlight
35
+ };
36
+ }
37
+ function buildListParagraphs(items, parent) {
38
+ const paragraphs = [];
39
+ const hyperlinks = [];
22
40
  for (let i = 0; i < items.length; i++) {
23
41
  const li = items[i];
24
42
  const style = resolveStyle(li, parent);
25
- const isLast = i === items.length - 1;
26
- const baseOptions = {
27
- fontSize: pxToPt(style.fontSize),
28
- fontFace: style.fontFamily,
29
- color: style.color,
30
- underline: convertUnderline(style.underline),
31
- strike: convertStrike(style.strike),
32
- subscript: style.subscript,
33
- superscript: style.superscript,
34
- highlight: style.highlight
35
- };
36
- if (li.runs && li.runs.length > 0) for (let j = 0; j < li.runs.length; j++) {
37
- const run = li.runs[j];
38
- const isLastRun = j === li.runs.length - 1;
39
- let text = run.text;
40
- if (isLastRun && !isLast) text += "\n";
43
+ const runs = [];
44
+ if (li.runs && li.runs.length > 0) for (const run of li.runs) {
41
45
  const runSubSup = resolveSubSup(run, style);
42
- textItems.push({
43
- text,
44
- options: {
45
- ...baseOptions,
46
- fontSize: pxToPt(run.fontSize ?? style.fontSize),
46
+ runs.push({
47
+ text: run.text,
48
+ properties: createGlimpseRunProperties({
49
+ fontSize: run.fontSize ?? style.fontSize,
47
50
  fontFace: run.fontFamily ?? style.fontFamily,
48
51
  color: run.color ?? style.color,
49
52
  bold: run.bold ?? style.bold,
50
53
  italic: run.italic ?? style.italic,
51
- underline: convertUnderline(run.underline ?? style.underline),
52
- strike: convertStrike(run.strike ?? style.strike),
54
+ underline: run.underline ?? style.underline,
55
+ strike: run.strike ?? style.strike,
53
56
  subscript: runSubSup.subscript,
54
57
  superscript: runSubSup.superscript,
55
- highlight: run.highlight ?? style.highlight,
56
- bullet: j === 0 ? bullet : false,
57
- ...run.href ? { hyperlink: { url: run.href } } : {}
58
- }
58
+ highlight: run.highlight ?? style.highlight
59
+ })
59
60
  });
61
+ hyperlinks.push(run.text ? run.href : void 0);
60
62
  }
61
- else textItems.push({
62
- text: isLast ? li.text : li.text + "\n",
63
- options: {
64
- ...baseOptions,
65
- bold: style.bold,
66
- italic: style.italic,
67
- bullet
68
- }
63
+ else {
64
+ runs.push({
65
+ text: li.text,
66
+ properties: createGlimpseRunProperties(toRunStyle(style))
67
+ });
68
+ hyperlinks.push(void 0);
69
+ }
70
+ paragraphs.push({
71
+ properties: paragraphProperties(parent),
72
+ runs
69
73
  });
70
74
  }
71
- return textItems;
72
- }
73
- function hasItemStyleOverride(items) {
74
- return items.some((li) => li.fontSize !== void 0 || li.color !== void 0 || li.bold !== void 0 || li.italic !== void 0 || li.underline !== void 0 || li.strike !== void 0 || li.subscript !== void 0 || li.superscript !== void 0 || li.highlight !== void 0 || li.fontFamily !== void 0 || li.runs !== void 0);
75
+ return {
76
+ paragraphs,
77
+ hyperlinks
78
+ };
75
79
  }
76
80
  function renderUlNode(node, ctx) {
77
81
  const fontSizePx = node.fontSize ?? 24;
78
82
  const fontFamily = node.fontFamily ?? "Noto Sans JP";
79
- const lineHeight = node.lineHeight ?? 1.3;
80
- const contentIn = getContentAreaIn(node);
81
- if (hasItemStyleOverride(node.items)) {
82
- const textItems = buildListTextItems(node.items, node, true);
83
- ctx.slide.addText(textItems, {
84
- ...contentIn,
85
- align: node.textAlign ?? "left",
86
- valign: "top",
87
- margin: 0,
88
- lineSpacingMultiple: lineHeight
89
- });
90
- } else {
91
- const text = node.items.map((li) => li.text).join("\n");
92
- ctx.slide.addText(text, {
93
- ...contentIn,
94
- fontSize: pxToPt(fontSizePx),
95
- fontFace: fontFamily,
96
- align: node.textAlign ?? "left",
97
- valign: "top",
98
- margin: 0,
99
- lineSpacingMultiple: lineHeight,
100
- color: node.color,
101
- bold: node.bold,
102
- italic: node.italic,
103
- underline: convertUnderline(node.underline),
104
- strike: convertStrike(node.strike),
105
- subscript: node.subscript,
106
- superscript: node.superscript,
107
- highlight: node.highlight,
108
- bullet: true
109
- });
110
- }
83
+ const content = getContentArea(node);
84
+ const { paragraphs, hyperlinks } = buildListParagraphs(node.items, node);
85
+ addGlimpseTextBox(ctx, content, {
86
+ fontSize: fontSizePx,
87
+ fontFace: fontFamily,
88
+ align: node.textAlign ?? "left",
89
+ valign: "top",
90
+ margin: 0,
91
+ color: node.color,
92
+ bold: node.bold,
93
+ italic: node.italic,
94
+ underline: node.underline,
95
+ strike: node.strike,
96
+ subscript: node.subscript,
97
+ superscript: node.superscript,
98
+ highlight: node.highlight,
99
+ paragraphs,
100
+ hyperlinks,
101
+ xmlTransform: listBulletXmlTransform({
102
+ kind: "bullet",
103
+ lineHeight: node.lineHeight
104
+ })
105
+ });
111
106
  }
112
107
  function renderOlNode(node, ctx) {
113
108
  const fontSizePx = node.fontSize ?? 24;
114
109
  const fontFamily = node.fontFamily ?? "Noto Sans JP";
115
- const lineHeight = node.lineHeight ?? 1.3;
116
- const contentIn = getContentAreaIn(node);
117
- const bulletOptions = { type: "number" };
118
- if (node.numberType !== void 0) bulletOptions.numberType = node.numberType;
119
- if (node.numberStartAt !== void 0) bulletOptions.numberStartAt = node.numberStartAt;
120
- if (hasItemStyleOverride(node.items)) {
121
- const textItems = buildListTextItems(node.items, node, bulletOptions);
122
- ctx.slide.addText(textItems, {
123
- ...contentIn,
124
- align: node.textAlign ?? "left",
125
- valign: "top",
126
- margin: 0,
127
- lineSpacingMultiple: lineHeight
128
- });
129
- } else {
130
- const text = node.items.map((li) => li.text).join("\n");
131
- ctx.slide.addText(text, {
132
- ...contentIn,
133
- fontSize: pxToPt(fontSizePx),
134
- fontFace: fontFamily,
135
- align: node.textAlign ?? "left",
136
- valign: "top",
137
- margin: 0,
138
- lineSpacingMultiple: lineHeight,
139
- color: node.color,
140
- bold: node.bold,
141
- italic: node.italic,
142
- underline: convertUnderline(node.underline),
143
- strike: convertStrike(node.strike),
144
- subscript: node.subscript,
145
- superscript: node.superscript,
146
- highlight: node.highlight,
147
- bullet: bulletOptions
148
- });
149
- }
110
+ const content = getContentArea(node);
111
+ const { paragraphs, hyperlinks } = buildListParagraphs(node.items, node);
112
+ addGlimpseTextBox(ctx, content, {
113
+ fontSize: fontSizePx,
114
+ fontFace: fontFamily,
115
+ align: node.textAlign ?? "left",
116
+ valign: "top",
117
+ margin: 0,
118
+ color: node.color,
119
+ bold: node.bold,
120
+ italic: node.italic,
121
+ underline: node.underline,
122
+ strike: node.strike,
123
+ subscript: node.subscript,
124
+ superscript: node.superscript,
125
+ highlight: node.highlight,
126
+ paragraphs,
127
+ hyperlinks,
128
+ xmlTransform: listBulletXmlTransform({
129
+ kind: "number",
130
+ scheme: node.numberType,
131
+ startAt: node.numberStartAt,
132
+ lineHeight: node.lineHeight
133
+ })
134
+ });
150
135
  }
151
136
  //#endregion
152
137
  export { renderOlNode, renderUlNode };
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","names":[],"sources":["../../../src/renderPptx/nodes/list.ts"],"sourcesContent":["import type { PositionedNode, LiNode } from \"../../types.ts\";\nimport type { RenderContext } from \"../types.ts\";\nimport { pxToPt } from \"../units.ts\";\nimport {\n convertUnderline,\n convertStrike,\n resolveSubSup,\n} from \"../textOptions.ts\";\nimport { getContentAreaIn } from \"../utils/contentArea.ts\";\n\ntype UlPositionedNode = Extract<PositionedNode, { type: \"ul\" }>;\ntype OlPositionedNode = Extract<PositionedNode, { type: \"ol\" }>;\n\nfunction resolveStyle(li: LiNode, parent: UlPositionedNode | OlPositionedNode) {\n const subSup = resolveSubSup(li, parent);\n return {\n fontSize: li.fontSize ?? parent.fontSize ?? 24,\n color: li.color ?? parent.color,\n bold: li.bold ?? parent.bold,\n italic: li.italic ?? parent.italic,\n underline: li.underline ?? parent.underline,\n strike: li.strike ?? parent.strike,\n subscript: subSup.subscript,\n superscript: subSup.superscript,\n highlight: li.highlight ?? parent.highlight,\n fontFamily: li.fontFamily ?? parent.fontFamily ?? \"Noto Sans JP\",\n };\n}\n\nfunction buildListTextItems(\n items: LiNode[],\n parent: UlPositionedNode | OlPositionedNode,\n bullet: boolean | Record<string, unknown>,\n) {\n const textItems: { text: string; options: Record<string, unknown> }[] = [];\n for (let i = 0; i < items.length; i++) {\n const li = items[i];\n const style = resolveStyle(li, parent);\n const isLast = i === items.length - 1;\n const baseOptions = {\n fontSize: pxToPt(style.fontSize),\n fontFace: style.fontFamily,\n color: style.color,\n underline: convertUnderline(style.underline),\n strike: convertStrike(style.strike),\n subscript: style.subscript,\n superscript: style.superscript,\n highlight: style.highlight,\n };\n\n if (li.runs && li.runs.length > 0) {\n for (let j = 0; j < li.runs.length; j++) {\n const run = li.runs[j];\n const isLastRun = j === li.runs.length - 1;\n let text = run.text;\n if (isLastRun && !isLast) text += \"\\n\";\n const runSubSup = resolveSubSup(run, style);\n textItems.push({\n text,\n options: {\n ...baseOptions,\n fontSize: pxToPt(run.fontSize ?? style.fontSize),\n fontFace: run.fontFamily ?? style.fontFamily,\n color: run.color ?? style.color,\n bold: run.bold ?? style.bold,\n italic: run.italic ?? style.italic,\n underline: convertUnderline(run.underline ?? style.underline),\n strike: convertStrike(run.strike ?? style.strike),\n subscript: runSubSup.subscript,\n superscript: runSubSup.superscript,\n highlight: run.highlight ?? style.highlight,\n bullet: j === 0 ? bullet : false,\n ...(run.href ? { hyperlink: { url: run.href } } : {}),\n },\n });\n }\n } else {\n textItems.push({\n text: isLast ? li.text : li.text + \"\\n\",\n options: {\n ...baseOptions,\n bold: style.bold,\n italic: style.italic,\n bullet,\n },\n });\n }\n }\n return textItems;\n}\n\nfunction hasItemStyleOverride(items: LiNode[]): boolean {\n return items.some(\n (li) =>\n li.fontSize !== undefined ||\n li.color !== undefined ||\n li.bold !== undefined ||\n li.italic !== undefined ||\n li.underline !== undefined ||\n li.strike !== undefined ||\n li.subscript !== undefined ||\n li.superscript !== undefined ||\n li.highlight !== undefined ||\n li.fontFamily !== undefined ||\n li.runs !== undefined,\n );\n}\n\nexport function renderUlNode(node: UlPositionedNode, ctx: RenderContext): void {\n const fontSizePx = node.fontSize ?? 24;\n const fontFamily = node.fontFamily ?? \"Noto Sans JP\";\n const lineHeight = node.lineHeight ?? 1.3;\n const contentIn = getContentAreaIn(node);\n\n if (hasItemStyleOverride(node.items)) {\n // Li に個別スタイルがある場合は配列形式を使用\n const textItems = buildListTextItems(node.items, node, true);\n\n ctx.slide.addText(textItems, {\n ...contentIn,\n align: node.textAlign ?? \"left\",\n valign: \"top\" as const,\n margin: 0,\n lineSpacingMultiple: lineHeight,\n });\n } else {\n // Li にスタイルオーバーライドがない場合は単一文字列形式を使用\n const text = node.items.map((li) => li.text).join(\"\\n\");\n\n ctx.slide.addText(text, {\n ...contentIn,\n fontSize: pxToPt(fontSizePx),\n fontFace: fontFamily,\n align: node.textAlign ?? \"left\",\n valign: \"top\" as const,\n margin: 0,\n lineSpacingMultiple: lineHeight,\n color: node.color,\n bold: node.bold,\n italic: node.italic,\n underline: convertUnderline(node.underline),\n strike: convertStrike(node.strike),\n subscript: node.subscript,\n superscript: node.superscript,\n highlight: node.highlight,\n bullet: true,\n });\n }\n}\n\nexport function renderOlNode(node: OlPositionedNode, ctx: RenderContext): void {\n const fontSizePx = node.fontSize ?? 24;\n const fontFamily = node.fontFamily ?? \"Noto Sans JP\";\n const lineHeight = node.lineHeight ?? 1.3;\n const contentIn = getContentAreaIn(node);\n\n const bulletOptions: Record<string, unknown> = { type: \"number\" };\n if (node.numberType !== undefined) {\n bulletOptions.numberType = node.numberType;\n }\n if (node.numberStartAt !== undefined) {\n bulletOptions.numberStartAt = node.numberStartAt;\n }\n\n if (hasItemStyleOverride(node.items)) {\n const textItems = buildListTextItems(node.items, node, bulletOptions);\n\n ctx.slide.addText(textItems, {\n ...contentIn,\n align: node.textAlign ?? \"left\",\n valign: \"top\" as const,\n margin: 0,\n lineSpacingMultiple: lineHeight,\n });\n } else {\n const text = node.items.map((li) => li.text).join(\"\\n\");\n\n ctx.slide.addText(text, {\n ...contentIn,\n fontSize: pxToPt(fontSizePx),\n fontFace: fontFamily,\n align: node.textAlign ?? \"left\",\n valign: \"top\" as const,\n margin: 0,\n lineSpacingMultiple: lineHeight,\n color: node.color,\n bold: node.bold,\n italic: node.italic,\n underline: convertUnderline(node.underline),\n strike: convertStrike(node.strike),\n subscript: node.subscript,\n superscript: node.superscript,\n highlight: node.highlight,\n bullet: bulletOptions,\n });\n }\n}\n"],"mappings":";;;;AAaA,SAAS,aAAa,IAAY,QAA6C;CAC7E,MAAM,SAAS,cAAc,IAAI,MAAM;CACvC,OAAO;EACL,UAAU,GAAG,YAAY,OAAO,YAAY;EAC5C,OAAO,GAAG,SAAS,OAAO;EAC1B,MAAM,GAAG,QAAQ,OAAO;EACxB,QAAQ,GAAG,UAAU,OAAO;EAC5B,WAAW,GAAG,aAAa,OAAO;EAClC,QAAQ,GAAG,UAAU,OAAO;EAC5B,WAAW,OAAO;EAClB,aAAa,OAAO;EACpB,WAAW,GAAG,aAAa,OAAO;EAClC,YAAY,GAAG,cAAc,OAAO,cAAc;CACpD;AACF;AAEA,SAAS,mBACP,OACA,QACA,QACA;CACA,MAAM,YAAkE,CAAC;CACzE,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,KAAK,MAAM;EACjB,MAAM,QAAQ,aAAa,IAAI,MAAM;EACrC,MAAM,SAAS,MAAM,MAAM,SAAS;EACpC,MAAM,cAAc;GAClB,UAAU,OAAO,MAAM,QAAQ;GAC/B,UAAU,MAAM;GAChB,OAAO,MAAM;GACb,WAAW,iBAAiB,MAAM,SAAS;GAC3C,QAAQ,cAAc,MAAM,MAAM;GAClC,WAAW,MAAM;GACjB,aAAa,MAAM;GACnB,WAAW,MAAM;EACnB;EAEA,IAAI,GAAG,QAAQ,GAAG,KAAK,SAAS,GAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,KAAK;GACvC,MAAM,MAAM,GAAG,KAAK;GACpB,MAAM,YAAY,MAAM,GAAG,KAAK,SAAS;GACzC,IAAI,OAAO,IAAI;GACf,IAAI,aAAa,CAAC,QAAQ,QAAQ;GAClC,MAAM,YAAY,cAAc,KAAK,KAAK;GAC1C,UAAU,KAAK;IACb;IACA,SAAS;KACP,GAAG;KACH,UAAU,OAAO,IAAI,YAAY,MAAM,QAAQ;KAC/C,UAAU,IAAI,cAAc,MAAM;KAClC,OAAO,IAAI,SAAS,MAAM;KAC1B,MAAM,IAAI,QAAQ,MAAM;KACxB,QAAQ,IAAI,UAAU,MAAM;KAC5B,WAAW,iBAAiB,IAAI,aAAa,MAAM,SAAS;KAC5D,QAAQ,cAAc,IAAI,UAAU,MAAM,MAAM;KAChD,WAAW,UAAU;KACrB,aAAa,UAAU;KACvB,WAAW,IAAI,aAAa,MAAM;KAClC,QAAQ,MAAM,IAAI,SAAS;KAC3B,GAAI,IAAI,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,KAAK,EAAE,IAAI,CAAC;IACrD;GACF,CAAC;EACH;OAEA,UAAU,KAAK;GACb,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO;GACnC,SAAS;IACP,GAAG;IACH,MAAM,MAAM;IACZ,QAAQ,MAAM;IACd;GACF;EACF,CAAC;CAEL;CACA,OAAO;AACT;AAEA,SAAS,qBAAqB,OAA0B;CACtD,OAAO,MAAM,MACV,OACC,GAAG,aAAa,KAAA,KAChB,GAAG,UAAU,KAAA,KACb,GAAG,SAAS,KAAA,KACZ,GAAG,WAAW,KAAA,KACd,GAAG,cAAc,KAAA,KACjB,GAAG,WAAW,KAAA,KACd,GAAG,cAAc,KAAA,KACjB,GAAG,gBAAgB,KAAA,KACnB,GAAG,cAAc,KAAA,KACjB,GAAG,eAAe,KAAA,KAClB,GAAG,SAAS,KAAA,CAChB;AACF;AAEA,SAAgB,aAAa,MAAwB,KAA0B;CAC7E,MAAM,aAAa,KAAK,YAAY;CACpC,MAAM,aAAa,KAAK,cAAc;CACtC,MAAM,aAAa,KAAK,cAAc;CACtC,MAAM,YAAY,iBAAiB,IAAI;CAEvC,IAAI,qBAAqB,KAAK,KAAK,GAAG;EAEpC,MAAM,YAAY,mBAAmB,KAAK,OAAO,MAAM,IAAI;EAE3D,IAAI,MAAM,QAAQ,WAAW;GAC3B,GAAG;GACH,OAAO,KAAK,aAAa;GACzB,QAAQ;GACR,QAAQ;GACR,qBAAqB;EACvB,CAAC;CACH,OAAO;EAEL,MAAM,OAAO,KAAK,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI;EAEtD,IAAI,MAAM,QAAQ,MAAM;GACtB,GAAG;GACH,UAAU,OAAO,UAAU;GAC3B,UAAU;GACV,OAAO,KAAK,aAAa;GACzB,QAAQ;GACR,QAAQ;GACR,qBAAqB;GACrB,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,QAAQ,KAAK;GACb,WAAW,iBAAiB,KAAK,SAAS;GAC1C,QAAQ,cAAc,KAAK,MAAM;GACjC,WAAW,KAAK;GAChB,aAAa,KAAK;GAClB,WAAW,KAAK;GAChB,QAAQ;EACV,CAAC;CACH;AACF;AAEA,SAAgB,aAAa,MAAwB,KAA0B;CAC7E,MAAM,aAAa,KAAK,YAAY;CACpC,MAAM,aAAa,KAAK,cAAc;CACtC,MAAM,aAAa,KAAK,cAAc;CACtC,MAAM,YAAY,iBAAiB,IAAI;CAEvC,MAAM,gBAAyC,EAAE,MAAM,SAAS;CAChE,IAAI,KAAK,eAAe,KAAA,GACtB,cAAc,aAAa,KAAK;CAElC,IAAI,KAAK,kBAAkB,KAAA,GACzB,cAAc,gBAAgB,KAAK;CAGrC,IAAI,qBAAqB,KAAK,KAAK,GAAG;EACpC,MAAM,YAAY,mBAAmB,KAAK,OAAO,MAAM,aAAa;EAEpE,IAAI,MAAM,QAAQ,WAAW;GAC3B,GAAG;GACH,OAAO,KAAK,aAAa;GACzB,QAAQ;GACR,QAAQ;GACR,qBAAqB;EACvB,CAAC;CACH,OAAO;EACL,MAAM,OAAO,KAAK,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI;EAEtD,IAAI,MAAM,QAAQ,MAAM;GACtB,GAAG;GACH,UAAU,OAAO,UAAU;GAC3B,UAAU;GACV,OAAO,KAAK,aAAa;GACzB,QAAQ;GACR,QAAQ;GACR,qBAAqB;GACrB,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,QAAQ,KAAK;GACb,WAAW,iBAAiB,KAAK,SAAS;GAC1C,QAAQ,cAAc,KAAK,MAAM;GACjC,WAAW,KAAK;GAChB,aAAa,KAAK;GAClB,WAAW,KAAK;GAChB,QAAQ;EACV,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"list.js","names":[],"sources":["../../../src/renderPptx/nodes/list.ts"],"sourcesContent":["import type { PositionedNode, LiNode } from \"../../types.ts\";\nimport type { RenderContext } from \"../types.ts\";\nimport { resolveSubSup } from \"../textOptions.ts\";\nimport { getContentArea } from \"../utils/contentArea.ts\";\nimport {\n addGlimpseTextBox,\n createGlimpseRunProperties,\n listBulletXmlTransform,\n type GlimpseTextRunStyle,\n} from \"../utils/glimpseTextBox.ts\";\nimport {\n type AddTextBoxParagraphInput,\n type AddTextBoxRunInput,\n} from \"@pptx-glimpse/document\";\n\ntype UlPositionedNode = Extract<PositionedNode, { type: \"ul\" }>;\ntype OlPositionedNode = Extract<PositionedNode, { type: \"ol\" }>;\n\nfunction resolveStyle(li: LiNode, parent: UlPositionedNode | OlPositionedNode) {\n const subSup = resolveSubSup(li, parent);\n return {\n fontSize: li.fontSize ?? parent.fontSize ?? 24,\n color: li.color ?? parent.color,\n bold: li.bold ?? parent.bold,\n italic: li.italic ?? parent.italic,\n underline: li.underline ?? parent.underline,\n strike: li.strike ?? parent.strike,\n subscript: subSup.subscript,\n superscript: subSup.superscript,\n highlight: li.highlight ?? parent.highlight,\n fontFamily: li.fontFamily ?? parent.fontFamily ?? \"Noto Sans JP\",\n };\n}\n\nfunction paragraphProperties(parent: UlPositionedNode | OlPositionedNode) {\n return {\n align: parent.textAlign ?? \"left\",\n };\n}\n\nfunction toRunStyle(\n style: ReturnType<typeof resolveStyle>,\n): GlimpseTextRunStyle {\n return {\n fontSize: style.fontSize,\n fontFace: style.fontFamily,\n color: style.color,\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n strike: style.strike,\n subscript: style.subscript,\n superscript: style.superscript,\n highlight: style.highlight,\n };\n}\n\nfunction buildListParagraphs(\n items: LiNode[],\n parent: UlPositionedNode | OlPositionedNode,\n): {\n paragraphs: AddTextBoxParagraphInput[];\n hyperlinks: (string | undefined)[];\n} {\n const paragraphs: AddTextBoxParagraphInput[] = [];\n const hyperlinks: (string | undefined)[] = [];\n for (let i = 0; i < items.length; i++) {\n const li = items[i];\n const style = resolveStyle(li, parent);\n const runs: AddTextBoxRunInput[] = [];\n if (li.runs && li.runs.length > 0) {\n for (const run of li.runs) {\n const runSubSup = resolveSubSup(run, style);\n runs.push({\n text: run.text,\n properties: createGlimpseRunProperties({\n fontSize: run.fontSize ?? style.fontSize,\n fontFace: run.fontFamily ?? style.fontFamily,\n color: run.color ?? style.color,\n bold: run.bold ?? style.bold,\n italic: run.italic ?? style.italic,\n underline: run.underline ?? style.underline,\n strike: run.strike ?? style.strike,\n subscript: runSubSup.subscript,\n superscript: runSubSup.superscript,\n highlight: run.highlight ?? style.highlight,\n }),\n });\n hyperlinks.push(run.text ? run.href : undefined);\n }\n } else {\n runs.push({\n text: li.text,\n properties: createGlimpseRunProperties(toRunStyle(style)),\n });\n hyperlinks.push(undefined);\n }\n paragraphs.push({\n properties: paragraphProperties(parent),\n runs,\n });\n }\n return { paragraphs, hyperlinks };\n}\n\nexport function renderUlNode(node: UlPositionedNode, ctx: RenderContext): void {\n const fontSizePx = node.fontSize ?? 24;\n const fontFamily = node.fontFamily ?? \"Noto Sans JP\";\n const content = getContentArea(node);\n\n const { paragraphs, hyperlinks } = buildListParagraphs(node.items, node);\n addGlimpseTextBox(ctx, content, {\n fontSize: fontSizePx,\n fontFace: fontFamily,\n align: node.textAlign ?? \"left\",\n valign: \"top\",\n margin: 0,\n color: node.color,\n bold: node.bold,\n italic: node.italic,\n underline: node.underline,\n strike: node.strike,\n subscript: node.subscript,\n superscript: node.superscript,\n highlight: node.highlight,\n paragraphs,\n hyperlinks,\n xmlTransform: listBulletXmlTransform({\n kind: \"bullet\",\n lineHeight: node.lineHeight,\n }),\n });\n}\n\nexport function renderOlNode(node: OlPositionedNode, ctx: RenderContext): void {\n const fontSizePx = node.fontSize ?? 24;\n const fontFamily = node.fontFamily ?? \"Noto Sans JP\";\n const content = getContentArea(node);\n\n const { paragraphs, hyperlinks } = buildListParagraphs(node.items, node);\n addGlimpseTextBox(ctx, content, {\n fontSize: fontSizePx,\n fontFace: fontFamily,\n align: node.textAlign ?? \"left\",\n valign: \"top\",\n margin: 0,\n color: node.color,\n bold: node.bold,\n italic: node.italic,\n underline: node.underline,\n strike: node.strike,\n subscript: node.subscript,\n superscript: node.superscript,\n highlight: node.highlight,\n paragraphs,\n hyperlinks,\n xmlTransform: listBulletXmlTransform({\n kind: \"number\",\n scheme: node.numberType,\n startAt: node.numberStartAt,\n lineHeight: node.lineHeight,\n }),\n });\n}\n"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import { pxToIn, pxToPt } from "../units.js";
2
- import { stripHash } from "../utils/visualStyle.js";
1
+ import { addGlimpseTextBox } from "../utils/glimpseTextBox.js";
2
+ import { addGlimpseShape, createShapeBoundsInput, noShapeOutline, solidShapeFill } from "../utils/glimpseShape.js";
3
+ import { addStraightLine } from "../utils/straightLine.js";
3
4
  import { measureMatrix } from "../../calcYogaLayout/measureCompositeNodes.js";
5
+ import { stripHash } from "../utils/visualStyle.js";
4
6
  import { resolveScaledContentArea } from "../utils/scaleToFit.js";
5
7
  //#region src/renderPptx/nodes/matrix.ts
6
8
  function renderMatrixNode(node, ctx) {
@@ -23,34 +25,34 @@ function renderMatrixNode(node, ctx) {
23
25
  const areaH = content.h - axisMargin * 2;
24
26
  const centerX = areaX + areaW / 2;
25
27
  const centerY = areaY + areaH / 2;
26
- ctx.slide.addShape(ctx.pptx.ShapeType.line, {
27
- x: pxToIn(areaX),
28
- y: pxToIn(centerY),
29
- w: pxToIn(areaW),
30
- h: 0,
31
- line: {
32
- color: axisColor,
33
- width: pxToPt(lineWidth)
34
- }
28
+ addStraightLine(ctx, {
29
+ x1: areaX,
30
+ y1: centerY,
31
+ x2: areaX + areaW,
32
+ y2: centerY
33
+ }, {
34
+ color: axisColor,
35
+ lineWidth
35
36
  });
36
- ctx.slide.addShape(ctx.pptx.ShapeType.line, {
37
- x: pxToIn(centerX),
38
- y: pxToIn(areaY),
39
- w: 0,
40
- h: pxToIn(areaH),
41
- line: {
42
- color: axisColor,
43
- width: pxToPt(lineWidth)
44
- }
37
+ addStraightLine(ctx, {
38
+ x1: centerX,
39
+ y1: areaY,
40
+ x2: centerX,
41
+ y2: areaY + areaH
42
+ }, {
43
+ color: axisColor,
44
+ lineWidth
45
45
  });
46
46
  const axisLabelW = 120 * scaleFactor;
47
47
  const axisLabelH = 24 * scaleFactor;
48
- ctx.slide.addText(axes.x, {
49
- x: pxToIn(centerX - axisLabelW / 2),
50
- y: pxToIn(areaY + areaH + 8 * scaleFactor),
51
- w: pxToIn(axisLabelW),
52
- h: pxToIn(axisLabelH),
53
- fontSize: pxToPt(12 * scaleFactor),
48
+ addGlimpseTextBox(ctx, {
49
+ x: centerX - axisLabelW / 2,
50
+ y: areaY + areaH + 8 * scaleFactor,
51
+ w: axisLabelW,
52
+ h: axisLabelH
53
+ }, {
54
+ text: axes.x,
55
+ fontSize: 12 * scaleFactor,
54
56
  fontFace: "Noto Sans JP",
55
57
  color: axisLabelColor,
56
58
  align: "center",
@@ -58,12 +60,14 @@ function renderMatrixNode(node, ctx) {
58
60
  });
59
61
  const yLabelW = 100 * scaleFactor;
60
62
  const yLabelH = 20 * scaleFactor;
61
- ctx.slide.addText(axes.y, {
62
- x: pxToIn(content.x + axisMargin / 2 - yLabelW / 2),
63
- y: pxToIn(centerY - yLabelH / 2),
64
- w: pxToIn(yLabelW),
65
- h: pxToIn(yLabelH),
66
- fontSize: pxToPt(12 * scaleFactor),
63
+ addGlimpseTextBox(ctx, {
64
+ x: content.x + axisMargin / 2 - yLabelW / 2,
65
+ y: centerY - yLabelH / 2,
66
+ w: yLabelW,
67
+ h: yLabelH
68
+ }, {
69
+ text: axes.y,
70
+ fontSize: 12 * scaleFactor,
67
71
  fontFace: "Noto Sans JP",
68
72
  color: axisLabelColor,
69
73
  align: "center",
@@ -77,20 +81,30 @@ function renderMatrixNode(node, ctx) {
77
81
  const itemX = areaX + item.x * areaW;
78
82
  const itemY = areaY + (1 - item.y) * areaH;
79
83
  const itemColor = item.color ?? defaultItemColor;
80
- ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {
81
- x: pxToIn(itemX - itemSize / 2),
82
- y: pxToIn(itemY - itemSize / 2),
83
- w: pxToIn(itemSize),
84
- h: pxToIn(itemSize),
85
- fill: { color: itemColor },
86
- line: { type: "none" }
87
- });
88
- ctx.slide.addText(item.label, {
89
- x: pxToIn(itemX - itemLabelW / 2),
90
- y: pxToIn(itemY - itemSize / 2 - 20 * scaleFactor),
91
- w: pxToIn(itemLabelW),
92
- h: pxToIn(itemLabelH),
93
- fontSize: pxToPt(11 * scaleFactor),
84
+ addGlimpseShape(ctx, {
85
+ preset: "ellipse",
86
+ ...createShapeBoundsInput({
87
+ x: itemX - itemSize / 2,
88
+ y: itemY - itemSize / 2,
89
+ w: itemSize,
90
+ h: itemSize
91
+ }),
92
+ fill: solidShapeFill(itemColor),
93
+ outline: noShapeOutline()
94
+ }, {
95
+ x: itemX - itemSize / 2,
96
+ y: itemY - itemSize / 2,
97
+ w: itemSize,
98
+ h: itemSize
99
+ }, { fillColor: itemColor });
100
+ addGlimpseTextBox(ctx, {
101
+ x: itemX - itemLabelW / 2,
102
+ y: itemY - itemSize / 2 - 20 * scaleFactor,
103
+ w: itemLabelW,
104
+ h: itemLabelH
105
+ }, {
106
+ text: item.label,
107
+ fontSize: 11 * scaleFactor,
94
108
  fontFace: "Noto Sans JP",
95
109
  color: stripHash(item.textColor) ?? itemLabelColor,
96
110
  bold: true,
@@ -104,45 +118,53 @@ function renderQuadrantLabels(ctx, quadrants, areaX, areaY, areaW, areaH, center
104
118
  const quadrantInset = 10 * scaleFactor;
105
119
  const quadrantW = areaW / 2 - 20 * scaleFactor;
106
120
  const quadrantH = 48 * scaleFactor;
107
- ctx.slide.addText(quadrants.topLeft, {
108
- x: pxToIn(areaX + quadrantInset),
109
- y: pxToIn(areaY + quadrantInset),
110
- w: pxToIn(quadrantW),
111
- h: pxToIn(quadrantH),
112
- fontSize: pxToPt(quadrantFontSize),
121
+ addGlimpseTextBox(ctx, {
122
+ x: areaX + quadrantInset,
123
+ y: areaY + quadrantInset,
124
+ w: quadrantW,
125
+ h: quadrantH
126
+ }, {
127
+ text: quadrants.topLeft,
128
+ fontSize: quadrantFontSize,
113
129
  fontFace: "Noto Sans JP",
114
130
  color: quadrantColor,
115
131
  align: "left",
116
132
  valign: "top"
117
133
  });
118
- ctx.slide.addText(quadrants.topRight, {
119
- x: pxToIn(centerX + quadrantInset),
120
- y: pxToIn(areaY + quadrantInset),
121
- w: pxToIn(quadrantW),
122
- h: pxToIn(quadrantH),
123
- fontSize: pxToPt(quadrantFontSize),
134
+ addGlimpseTextBox(ctx, {
135
+ x: centerX + quadrantInset,
136
+ y: areaY + quadrantInset,
137
+ w: quadrantW,
138
+ h: quadrantH
139
+ }, {
140
+ text: quadrants.topRight,
141
+ fontSize: quadrantFontSize,
124
142
  fontFace: "Noto Sans JP",
125
143
  color: quadrantColor,
126
144
  align: "right",
127
145
  valign: "top"
128
146
  });
129
- ctx.slide.addText(quadrants.bottomLeft, {
130
- x: pxToIn(areaX + quadrantInset),
131
- y: pxToIn(centerY + areaH / 2 - quadrantH - quadrantInset),
132
- w: pxToIn(quadrantW),
133
- h: pxToIn(quadrantH),
134
- fontSize: pxToPt(quadrantFontSize),
147
+ addGlimpseTextBox(ctx, {
148
+ x: areaX + quadrantInset,
149
+ y: centerY + areaH / 2 - quadrantH - quadrantInset,
150
+ w: quadrantW,
151
+ h: quadrantH
152
+ }, {
153
+ text: quadrants.bottomLeft,
154
+ fontSize: quadrantFontSize,
135
155
  fontFace: "Noto Sans JP",
136
156
  color: quadrantColor,
137
157
  align: "left",
138
158
  valign: "bottom"
139
159
  });
140
- ctx.slide.addText(quadrants.bottomRight, {
141
- x: pxToIn(centerX + quadrantInset),
142
- y: pxToIn(centerY + areaH / 2 - quadrantH - quadrantInset),
143
- w: pxToIn(quadrantW),
144
- h: pxToIn(quadrantH),
145
- fontSize: pxToPt(quadrantFontSize),
160
+ addGlimpseTextBox(ctx, {
161
+ x: centerX + quadrantInset,
162
+ y: centerY + areaH / 2 - quadrantH - quadrantInset,
163
+ w: quadrantW,
164
+ h: quadrantH
165
+ }, {
166
+ text: quadrants.bottomRight,
167
+ fontSize: quadrantFontSize,
146
168
  fontFace: "Noto Sans JP",
147
169
  color: quadrantColor,
148
170
  align: "right",
@@ -1 +1 @@
1
- {"version":3,"file":"matrix.js","names":[],"sources":["../../../src/renderPptx/nodes/matrix.ts"],"sourcesContent":["import type { PositionedNode } from \"../../types.ts\";\nimport type { RenderContext } from \"../types.ts\";\nimport { stripHash } from \"../utils/visualStyle.ts\";\nimport { pxToIn, pxToPt } from \"../units.ts\";\nimport { measureMatrix } from \"../../calcYogaLayout/measureCompositeNodes.ts\";\nimport { resolveScaledContentArea } from \"../utils/scaleToFit.ts\";\n\ntype MatrixPositionedNode = Extract<PositionedNode, { type: \"matrix\" }>;\n\nexport function renderMatrixNode(\n node: MatrixPositionedNode,\n ctx: RenderContext,\n): void {\n const items = node.items;\n const axes = node.axes;\n const quadrants = node.quadrants;\n\n const defaultItemColor = \"1D4ED8\"; // blue\n const baseItemSize = 24; // px\n const baseLineWidth = 2; // px\n const axisColor = \"E2E8F0\";\n const axisLabelColor = stripHash(node.axisLabelColor) ?? \"64748B\";\n const itemLabelColor = stripHash(node.itemLabelColor) ?? \"1E293B\";\n\n // スケール係数を計算(コンテンツ領域基準)\n const { content, scaleFactor } = resolveScaledContentArea(\n node,\n measureMatrix(node),\n ctx,\n );\n\n const itemSize = baseItemSize * scaleFactor;\n const lineWidth = baseLineWidth * scaleFactor;\n\n // マトリクスの描画領域(軸ラベル用の余白を考慮)\n const axisMargin = 60 * scaleFactor; // 軸ラベル用の余白\n const areaX = content.x + axisMargin;\n const areaY = content.y + axisMargin;\n const areaW = content.w - axisMargin * 2;\n const areaH = content.h - axisMargin * 2;\n\n // 中心座標\n const centerX = areaX + areaW / 2;\n const centerY = areaY + areaH / 2;\n\n // === 1. 十字線(軸線)を描画 ===\n // 横線(X軸)\n ctx.slide.addShape(ctx.pptx.ShapeType.line, {\n x: pxToIn(areaX),\n y: pxToIn(centerY),\n w: pxToIn(areaW),\n h: 0,\n line: { color: axisColor, width: pxToPt(lineWidth) },\n });\n\n // 縦線(Y軸)\n ctx.slide.addShape(ctx.pptx.ShapeType.line, {\n x: pxToIn(centerX),\n y: pxToIn(areaY),\n w: 0,\n h: pxToIn(areaH),\n line: { color: axisColor, width: pxToPt(lineWidth) },\n });\n\n // === 2. 軸ラベルを描画 ===\n const axisLabelW = 120 * scaleFactor;\n const axisLabelH = 24 * scaleFactor;\n\n // X軸ラベル(下部中央)\n ctx.slide.addText(axes.x, {\n x: pxToIn(centerX - axisLabelW / 2),\n y: pxToIn(areaY + areaH + 8 * scaleFactor),\n w: pxToIn(axisLabelW),\n h: pxToIn(axisLabelH),\n fontSize: pxToPt(12 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: axisLabelColor,\n align: \"center\",\n valign: \"top\",\n });\n\n // Y軸ラベル(左部中央)270° 回転で下から上読み。w が視覚的な高さになるため CJK 5 文字以上も収まる幅を確保\n const yLabelW = 100 * scaleFactor;\n const yLabelH = 20 * scaleFactor;\n ctx.slide.addText(axes.y, {\n x: pxToIn(content.x + axisMargin / 2 - yLabelW / 2),\n y: pxToIn(centerY - yLabelH / 2),\n w: pxToIn(yLabelW),\n h: pxToIn(yLabelH),\n fontSize: pxToPt(12 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: axisLabelColor,\n align: \"center\",\n valign: \"middle\",\n rotate: 270,\n });\n\n // === 3. 象限ラベルを描画 ===\n if (quadrants) {\n renderQuadrantLabels(\n ctx,\n quadrants,\n areaX,\n areaY,\n areaW,\n areaH,\n centerX,\n centerY,\n scaleFactor,\n stripHash(node.quadrantLabelColor) ?? \"94A3B8\",\n );\n }\n\n // === 4. アイテムをプロット ===\n const itemLabelW = 100 * scaleFactor;\n const itemLabelH = 18 * scaleFactor;\n\n for (const item of items) {\n // 座標変換: (0,0)=左下, (1,1)=右上\n // x: 0 -> areaX, 1 -> areaX + areaW\n // y: 0 -> areaY + areaH, 1 -> areaY (反転)\n const itemX = areaX + item.x * areaW;\n const itemY = areaY + (1 - item.y) * areaH; // Y軸反転\n const itemColor = item.color ?? defaultItemColor;\n\n // 円を描画\n ctx.slide.addShape(ctx.pptx.ShapeType.ellipse, {\n x: pxToIn(itemX - itemSize / 2),\n y: pxToIn(itemY - itemSize / 2),\n w: pxToIn(itemSize),\n h: pxToIn(itemSize),\n fill: { color: itemColor },\n line: { type: \"none\" as const },\n });\n\n // ラベルを描画(円の上)\n ctx.slide.addText(item.label, {\n x: pxToIn(itemX - itemLabelW / 2),\n y: pxToIn(itemY - itemSize / 2 - 20 * scaleFactor),\n w: pxToIn(itemLabelW),\n h: pxToIn(itemLabelH),\n fontSize: pxToPt(11 * scaleFactor),\n fontFace: \"Noto Sans JP\",\n color: stripHash(item.textColor) ?? itemLabelColor,\n bold: true,\n align: \"center\",\n valign: \"bottom\",\n });\n }\n}\n\nfunction renderQuadrantLabels(\n ctx: RenderContext,\n quadrants: NonNullable<MatrixPositionedNode[\"quadrants\"]>,\n areaX: number,\n areaY: number,\n areaW: number,\n areaH: number,\n centerX: number,\n centerY: number,\n scaleFactor: number,\n quadrantColor: string,\n): void {\n const quadrantFontSize = 11 * scaleFactor;\n const quadrantInset = 10 * scaleFactor;\n const quadrantW = areaW / 2 - 20 * scaleFactor;\n const quadrantH = 48 * scaleFactor;\n\n // 左上\n ctx.slide.addText(quadrants.topLeft, {\n x: pxToIn(areaX + quadrantInset),\n y: pxToIn(areaY + quadrantInset),\n w: pxToIn(quadrantW),\n h: pxToIn(quadrantH),\n fontSize: pxToPt(quadrantFontSize),\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"left\",\n valign: \"top\",\n });\n\n // 右上\n ctx.slide.addText(quadrants.topRight, {\n x: pxToIn(centerX + quadrantInset),\n y: pxToIn(areaY + quadrantInset),\n w: pxToIn(quadrantW),\n h: pxToIn(quadrantH),\n fontSize: pxToPt(quadrantFontSize),\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"right\",\n valign: \"top\",\n });\n\n // 左下\n ctx.slide.addText(quadrants.bottomLeft, {\n x: pxToIn(areaX + quadrantInset),\n y: pxToIn(centerY + areaH / 2 - quadrantH - quadrantInset),\n w: pxToIn(quadrantW),\n h: pxToIn(quadrantH),\n fontSize: pxToPt(quadrantFontSize),\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"left\",\n valign: \"bottom\",\n });\n\n // 右下\n ctx.slide.addText(quadrants.bottomRight, {\n x: pxToIn(centerX + quadrantInset),\n y: pxToIn(centerY + areaH / 2 - quadrantH - quadrantInset),\n w: pxToIn(quadrantW),\n h: pxToIn(quadrantH),\n fontSize: pxToPt(quadrantFontSize),\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"right\",\n valign: \"bottom\",\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"matrix.js","names":[],"sources":["../../../src/renderPptx/nodes/matrix.ts"],"sourcesContent":["import type { PositionedNode } from \"../../types.ts\";\nimport type { RenderContext } from \"../types.ts\";\nimport { stripHash } from \"../utils/visualStyle.ts\";\nimport { measureMatrix } from \"../../calcYogaLayout/measureCompositeNodes.ts\";\nimport { resolveScaledContentArea } from \"../utils/scaleToFit.ts\";\nimport { addStraightLine } from \"../utils/straightLine.ts\";\nimport {\n addGlimpseShape,\n createShapeBoundsInput,\n noShapeOutline,\n solidShapeFill,\n} from \"../utils/glimpseShape.ts\";\nimport { addGlimpseTextBox } from \"../utils/glimpseTextBox.ts\";\n\ntype MatrixPositionedNode = Extract<PositionedNode, { type: \"matrix\" }>;\n\nexport function renderMatrixNode(\n node: MatrixPositionedNode,\n ctx: RenderContext,\n): void {\n const items = node.items;\n const axes = node.axes;\n const quadrants = node.quadrants;\n\n const defaultItemColor = \"1D4ED8\"; // blue\n const baseItemSize = 24; // px\n const baseLineWidth = 2; // px\n const axisColor = \"E2E8F0\";\n const axisLabelColor = stripHash(node.axisLabelColor) ?? \"64748B\";\n const itemLabelColor = stripHash(node.itemLabelColor) ?? \"1E293B\";\n\n // スケール係数を計算(コンテンツ領域基準)\n const { content, scaleFactor } = resolveScaledContentArea(\n node,\n measureMatrix(node),\n ctx,\n );\n\n const itemSize = baseItemSize * scaleFactor;\n const lineWidth = baseLineWidth * scaleFactor;\n\n // マトリクスの描画領域(軸ラベル用の余白を考慮)\n const axisMargin = 60 * scaleFactor; // 軸ラベル用の余白\n const areaX = content.x + axisMargin;\n const areaY = content.y + axisMargin;\n const areaW = content.w - axisMargin * 2;\n const areaH = content.h - axisMargin * 2;\n\n // 中心座標\n const centerX = areaX + areaW / 2;\n const centerY = areaY + areaH / 2;\n\n // === 1. 十字線(軸線)を描画 ===\n // 横線(X軸)\n addStraightLine(\n ctx,\n { x1: areaX, y1: centerY, x2: areaX + areaW, y2: centerY },\n { color: axisColor, lineWidth },\n );\n\n // 縦線(Y軸)\n addStraightLine(\n ctx,\n { x1: centerX, y1: areaY, x2: centerX, y2: areaY + areaH },\n { color: axisColor, lineWidth },\n );\n\n // === 2. 軸ラベルを描画 ===\n const axisLabelW = 120 * scaleFactor;\n const axisLabelH = 24 * scaleFactor;\n\n // X軸ラベル(下部中央)\n addGlimpseTextBox(\n ctx,\n {\n x: centerX - axisLabelW / 2,\n y: areaY + areaH + 8 * scaleFactor,\n w: axisLabelW,\n h: axisLabelH,\n },\n {\n text: axes.x,\n fontSize: 12 * scaleFactor,\n fontFace: \"Noto Sans JP\",\n color: axisLabelColor,\n align: \"center\",\n valign: \"top\",\n },\n );\n\n // Y軸ラベル(左部中央)270° 回転で下から上読み。w が視覚的な高さになるため CJK 5 文字以上も収まる幅を確保\n const yLabelW = 100 * scaleFactor;\n const yLabelH = 20 * scaleFactor;\n addGlimpseTextBox(\n ctx,\n {\n x: content.x + axisMargin / 2 - yLabelW / 2,\n y: centerY - yLabelH / 2,\n w: yLabelW,\n h: yLabelH,\n },\n {\n text: axes.y,\n fontSize: 12 * scaleFactor,\n fontFace: \"Noto Sans JP\",\n color: axisLabelColor,\n align: \"center\",\n valign: \"middle\",\n rotate: 270,\n },\n );\n\n // === 3. 象限ラベルを描画 ===\n if (quadrants) {\n renderQuadrantLabels(\n ctx,\n quadrants,\n areaX,\n areaY,\n areaW,\n areaH,\n centerX,\n centerY,\n scaleFactor,\n stripHash(node.quadrantLabelColor) ?? \"94A3B8\",\n );\n }\n\n // === 4. アイテムをプロット ===\n const itemLabelW = 100 * scaleFactor;\n const itemLabelH = 18 * scaleFactor;\n\n for (const item of items) {\n // 座標変換: (0,0)=左下, (1,1)=右上\n // x: 0 -> areaX, 1 -> areaX + areaW\n // y: 0 -> areaY + areaH, 1 -> areaY (反転)\n const itemX = areaX + item.x * areaW;\n const itemY = areaY + (1 - item.y) * areaH; // Y軸反転\n const itemColor = item.color ?? defaultItemColor;\n\n // 円を描画\n addGlimpseShape(\n ctx,\n {\n preset: \"ellipse\",\n ...createShapeBoundsInput({\n x: itemX - itemSize / 2,\n y: itemY - itemSize / 2,\n w: itemSize,\n h: itemSize,\n }),\n fill: solidShapeFill(itemColor),\n outline: noShapeOutline(),\n },\n {\n x: itemX - itemSize / 2,\n y: itemY - itemSize / 2,\n w: itemSize,\n h: itemSize,\n },\n { fillColor: itemColor },\n );\n\n // ラベルを描画(円の上)\n addGlimpseTextBox(\n ctx,\n {\n x: itemX - itemLabelW / 2,\n y: itemY - itemSize / 2 - 20 * scaleFactor,\n w: itemLabelW,\n h: itemLabelH,\n },\n {\n text: item.label,\n fontSize: 11 * scaleFactor,\n fontFace: \"Noto Sans JP\",\n color: stripHash(item.textColor) ?? itemLabelColor,\n bold: true,\n align: \"center\",\n valign: \"bottom\",\n },\n );\n }\n}\n\nfunction renderQuadrantLabels(\n ctx: RenderContext,\n quadrants: NonNullable<MatrixPositionedNode[\"quadrants\"]>,\n areaX: number,\n areaY: number,\n areaW: number,\n areaH: number,\n centerX: number,\n centerY: number,\n scaleFactor: number,\n quadrantColor: string,\n): void {\n const quadrantFontSize = 11 * scaleFactor;\n const quadrantInset = 10 * scaleFactor;\n const quadrantW = areaW / 2 - 20 * scaleFactor;\n const quadrantH = 48 * scaleFactor;\n\n // 左上\n addGlimpseTextBox(\n ctx,\n {\n x: areaX + quadrantInset,\n y: areaY + quadrantInset,\n w: quadrantW,\n h: quadrantH,\n },\n {\n text: quadrants.topLeft,\n fontSize: quadrantFontSize,\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"left\",\n valign: \"top\",\n },\n );\n\n // 右上\n addGlimpseTextBox(\n ctx,\n {\n x: centerX + quadrantInset,\n y: areaY + quadrantInset,\n w: quadrantW,\n h: quadrantH,\n },\n {\n text: quadrants.topRight,\n fontSize: quadrantFontSize,\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"right\",\n valign: \"top\",\n },\n );\n\n // 左下\n addGlimpseTextBox(\n ctx,\n {\n x: areaX + quadrantInset,\n y: centerY + areaH / 2 - quadrantH - quadrantInset,\n w: quadrantW,\n h: quadrantH,\n },\n {\n text: quadrants.bottomLeft,\n fontSize: quadrantFontSize,\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"left\",\n valign: \"bottom\",\n },\n );\n\n // 右下\n addGlimpseTextBox(\n ctx,\n {\n x: centerX + quadrantInset,\n y: centerY + areaH / 2 - quadrantH - quadrantInset,\n w: quadrantW,\n h: quadrantH,\n },\n {\n text: quadrants.bottomRight,\n fontSize: quadrantFontSize,\n fontFace: \"Noto Sans JP\",\n color: quadrantColor,\n align: \"right\",\n valign: \"bottom\",\n },\n );\n}\n"],"mappings":"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"}