@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.
- package/dist/buildContext.js +2 -4
- package/dist/buildContext.js.map +1 -1
- package/dist/buildPptx.d.ts.map +1 -1
- package/dist/buildPptx.js +2 -6
- package/dist/buildPptx.js.map +1 -1
- package/dist/extractSlideMastersAsPptx.js +1 -1
- package/dist/renderPptx/glimpseTextBoxes.js +646 -0
- package/dist/renderPptx/glimpseTextBoxes.js.map +1 -0
- package/dist/renderPptx/nodes/flow.js +95 -90
- package/dist/renderPptx/nodes/flow.js.map +1 -1
- package/dist/renderPptx/nodes/icon.js +33 -24
- package/dist/renderPptx/nodes/icon.js.map +1 -1
- package/dist/renderPptx/nodes/image.js +5 -22
- package/dist/renderPptx/nodes/image.js.map +1 -1
- package/dist/renderPptx/nodes/list.js +96 -111
- package/dist/renderPptx/nodes/list.js.map +1 -1
- package/dist/renderPptx/nodes/matrix.js +92 -70
- package/dist/renderPptx/nodes/matrix.js.map +1 -1
- package/dist/renderPptx/nodes/processArrow.js +68 -35
- package/dist/renderPptx/nodes/processArrow.js.map +1 -1
- package/dist/renderPptx/nodes/pyramid.js +34 -16
- package/dist/renderPptx/nodes/pyramid.js.map +1 -1
- package/dist/renderPptx/nodes/shape.js +63 -37
- package/dist/renderPptx/nodes/shape.js.map +1 -1
- package/dist/renderPptx/nodes/svg.js +2 -5
- package/dist/renderPptx/nodes/svg.js.map +1 -1
- package/dist/renderPptx/nodes/text.js +16 -45
- package/dist/renderPptx/nodes/text.js.map +1 -1
- package/dist/renderPptx/nodes/timeline.js +108 -74
- package/dist/renderPptx/nodes/timeline.js.map +1 -1
- package/dist/renderPptx/nodes/tree.js +78 -79
- package/dist/renderPptx/nodes/tree.js.map +1 -1
- package/dist/renderPptx/renderPptx.js +4 -5
- package/dist/renderPptx/renderPptx.js.map +1 -1
- package/dist/renderPptx/utils/backgroundBorder.js +85 -49
- package/dist/renderPptx/utils/backgroundBorder.js.map +1 -1
- package/dist/renderPptx/utils/glimpsePicture.js +130 -0
- package/dist/renderPptx/utils/glimpsePicture.js.map +1 -0
- package/dist/renderPptx/utils/glimpseShape.js +90 -0
- package/dist/renderPptx/utils/glimpseShape.js.map +1 -0
- package/dist/renderPptx/utils/glimpseTextBox.js +126 -0
- package/dist/renderPptx/utils/glimpseTextBox.js.map +1 -0
- package/dist/renderPptx/utils/straightLine.js +29 -14
- package/dist/renderPptx/utils/straightLine.js.map +1 -1
- package/dist/renderPptx/utils/visualStyle.js +1 -24
- package/dist/renderPptx/utils/visualStyle.js.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +4 -4
- package/dist/renderPptx/glowEffects.js +0 -152
- package/dist/renderPptx/glowEffects.js.map +0 -1
- package/dist/renderPptx/gradientFills.js +0 -167
- package/dist/renderPptx/gradientFills.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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
|
|
21
|
-
|
|
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
|
|
26
|
-
const
|
|
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
|
-
|
|
43
|
-
text,
|
|
44
|
-
|
|
45
|
-
|
|
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:
|
|
52
|
-
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
|
-
|
|
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
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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 {
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
49
|
-
x:
|
|
50
|
-
y:
|
|
51
|
-
w:
|
|
52
|
-
h:
|
|
53
|
-
|
|
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
|
|
62
|
-
x:
|
|
63
|
-
y:
|
|
64
|
-
w:
|
|
65
|
-
h:
|
|
66
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
|
108
|
-
x:
|
|
109
|
-
y:
|
|
110
|
-
w:
|
|
111
|
-
h:
|
|
112
|
-
|
|
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
|
|
119
|
-
x:
|
|
120
|
-
y:
|
|
121
|
-
w:
|
|
122
|
-
h:
|
|
123
|
-
|
|
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
|
|
130
|
-
x:
|
|
131
|
-
y:
|
|
132
|
-
w:
|
|
133
|
-
h:
|
|
134
|
-
|
|
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
|
|
141
|
-
x:
|
|
142
|
-
y:
|
|
143
|
-
w:
|
|
144
|
-
h:
|
|
145
|
-
|
|
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 {
|
|
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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"}
|