modern-text 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +64 -36
- package/dist/index.d.cts +27 -16
- package/dist/index.d.mts +27 -16
- package/dist/index.d.ts +27 -16
- package/dist/index.js +4 -4
- package/dist/index.mjs +64 -36
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -79,16 +79,17 @@ function drawPath(options) {
|
|
|
79
79
|
function setupView(ctx, pixelRatio, boundingBox) {
|
|
80
80
|
const { left, top, width, height } = boundingBox;
|
|
81
81
|
const view = ctx.canvas;
|
|
82
|
-
view.dataset.
|
|
82
|
+
view.dataset.viewBox = String(`${left} ${top} ${width} ${height}`);
|
|
83
83
|
view.dataset.pixelRatio = String(pixelRatio);
|
|
84
|
-
const canvasWidth = width + left;
|
|
85
|
-
const canvasHeight = height + top;
|
|
84
|
+
const canvasWidth = width + Math.abs(left);
|
|
85
|
+
const canvasHeight = height + Math.abs(top);
|
|
86
86
|
view.width = Math.max(1, Math.ceil(canvasWidth * pixelRatio));
|
|
87
87
|
view.height = Math.max(1, Math.ceil(canvasHeight * pixelRatio));
|
|
88
88
|
view.style.width = `${canvasWidth}px`;
|
|
89
89
|
view.style.height = `${canvasHeight}px`;
|
|
90
|
-
ctx.clearRect(0, 0,
|
|
90
|
+
ctx.clearRect(0, 0, view.width, view.height);
|
|
91
91
|
ctx.scale(pixelRatio, pixelRatio);
|
|
92
|
+
ctx.translate(-Math.min(0, left), -Math.min(0, top));
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
function uploadColors(ctx, text) {
|
|
@@ -150,7 +151,6 @@ class Character {
|
|
|
150
151
|
__publicField$3(this, "lineBox", new BoundingBox());
|
|
151
152
|
__publicField$3(this, "inlineBox", new BoundingBox());
|
|
152
153
|
__publicField$3(this, "glyphBox");
|
|
153
|
-
__publicField$3(this, "center");
|
|
154
154
|
__publicField$3(this, "underlinePosition", 0);
|
|
155
155
|
__publicField$3(this, "underlineThickness", 0);
|
|
156
156
|
__publicField$3(this, "yStrikeoutPosition", 0);
|
|
@@ -159,6 +159,9 @@ class Character {
|
|
|
159
159
|
__publicField$3(this, "centerDiviation", 0);
|
|
160
160
|
__publicField$3(this, "path", new Path2D());
|
|
161
161
|
}
|
|
162
|
+
get center() {
|
|
163
|
+
return this.glyphBox?.center;
|
|
164
|
+
}
|
|
162
165
|
get computedStyle() {
|
|
163
166
|
return this.parent.computedStyle;
|
|
164
167
|
}
|
|
@@ -288,7 +291,6 @@ class Character {
|
|
|
288
291
|
};
|
|
289
292
|
this.path = path;
|
|
290
293
|
this.glyphBox = this.getGlyphBoundingBox();
|
|
291
|
-
this.center = this.glyphBox?.getCenterPoint();
|
|
292
294
|
return this;
|
|
293
295
|
}
|
|
294
296
|
update() {
|
|
@@ -747,8 +749,8 @@ function getTransformMatrix(a, b, c, isVertical) {
|
|
|
747
749
|
y: c.height / b.width
|
|
748
750
|
};
|
|
749
751
|
}
|
|
750
|
-
const offset = c.
|
|
751
|
-
a.
|
|
752
|
+
const offset = c.center.add(
|
|
753
|
+
a.center.sub(b.center).scale(scale.x, scale.y)
|
|
752
754
|
).sub({
|
|
753
755
|
x: a.width / 2 * scale.x,
|
|
754
756
|
y: a.height / 2 * scale.y
|
|
@@ -1103,8 +1105,11 @@ class Text {
|
|
|
1103
1105
|
__publicField(this, "needsUpdate", true);
|
|
1104
1106
|
__publicField(this, "computedStyle", { ...defaultTextStyles });
|
|
1105
1107
|
__publicField(this, "paragraphs", []);
|
|
1106
|
-
__publicField(this, "
|
|
1108
|
+
__publicField(this, "lineBox", new BoundingBox());
|
|
1109
|
+
__publicField(this, "rawGlyphBox", new BoundingBox());
|
|
1107
1110
|
__publicField(this, "glyphBox", new BoundingBox());
|
|
1111
|
+
__publicField(this, "pathBox", new BoundingBox());
|
|
1112
|
+
__publicField(this, "boundingBox", new BoundingBox());
|
|
1108
1113
|
__publicField(this, "parser", new Parser(this));
|
|
1109
1114
|
__publicField(this, "measurer", new Measurer(this));
|
|
1110
1115
|
__publicField(this, "plugins", /* @__PURE__ */ new Map());
|
|
@@ -1132,22 +1137,36 @@ class Text {
|
|
|
1132
1137
|
this.computedStyle = { ...defaultTextStyles, ...this.style };
|
|
1133
1138
|
const old = {
|
|
1134
1139
|
paragraphs: this.paragraphs,
|
|
1135
|
-
|
|
1136
|
-
|
|
1140
|
+
lineBox: this.lineBox,
|
|
1141
|
+
rawGlyphBox: this.rawGlyphBox,
|
|
1142
|
+
glyphBox: this.glyphBox,
|
|
1143
|
+
pathBox: this.pathBox,
|
|
1144
|
+
boundingBox: this.boundingBox
|
|
1137
1145
|
};
|
|
1138
1146
|
this.paragraphs = this.parser.parse();
|
|
1139
1147
|
const result = this.measurer.measure(dom);
|
|
1140
1148
|
this.paragraphs = result.paragraphs;
|
|
1141
|
-
this.
|
|
1142
|
-
|
|
1143
|
-
|
|
1149
|
+
this.lineBox = result.boundingBox;
|
|
1150
|
+
this.characters.forEach((c) => {
|
|
1151
|
+
c.update();
|
|
1152
|
+
});
|
|
1153
|
+
this.rawGlyphBox = this.getGlyphBox();
|
|
1144
1154
|
const plugins = [...this.plugins.values()];
|
|
1145
1155
|
plugins.sort((a, b) => (a.updateOrder ?? 0) - (b.updateOrder ?? 0)).forEach((plugin) => {
|
|
1146
1156
|
plugin.update?.(this);
|
|
1147
1157
|
});
|
|
1158
|
+
this.glyphBox = this.getGlyphBox();
|
|
1159
|
+
this.updatePathBox().updateBoundingBox();
|
|
1160
|
+
for (const key in old) {
|
|
1161
|
+
result[key] = this[key];
|
|
1162
|
+
this[key] = old[key];
|
|
1163
|
+
}
|
|
1164
|
+
return result;
|
|
1165
|
+
}
|
|
1166
|
+
getGlyphBox() {
|
|
1148
1167
|
const min = Vector2.MAX;
|
|
1149
1168
|
const max = Vector2.MIN;
|
|
1150
|
-
characters.forEach((c) => {
|
|
1169
|
+
this.characters.forEach((c) => {
|
|
1151
1170
|
if (!c.getGlyphMinMax(min, max)) {
|
|
1152
1171
|
const { inlineBox } = c;
|
|
1153
1172
|
const a = new Vector2(inlineBox.left, inlineBox.top);
|
|
@@ -1156,37 +1175,46 @@ class Text {
|
|
|
1156
1175
|
max.max(a, b);
|
|
1157
1176
|
}
|
|
1158
1177
|
});
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1178
|
+
return new BoundingBox(
|
|
1179
|
+
min.x,
|
|
1180
|
+
min.y,
|
|
1181
|
+
max.x - min.x,
|
|
1182
|
+
max.y - min.y
|
|
1183
|
+
);
|
|
1184
|
+
}
|
|
1185
|
+
updatePathBox() {
|
|
1186
|
+
const plugins = [...this.plugins.values()];
|
|
1187
|
+
this.pathBox = BoundingBox.from(
|
|
1165
1188
|
this.glyphBox,
|
|
1166
1189
|
...plugins.map((plugin) => {
|
|
1167
|
-
|
|
1168
|
-
return plugin.getBoundingBox(this);
|
|
1169
|
-
}
|
|
1170
|
-
return getPathsBoundingBox(plugin.paths ?? []);
|
|
1190
|
+
return plugin.getBoundingBox ? plugin.getBoundingBox(this) : getPathsBoundingBox(plugin.paths ?? []);
|
|
1171
1191
|
}).filter(Boolean)
|
|
1172
1192
|
);
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1193
|
+
return this;
|
|
1194
|
+
}
|
|
1195
|
+
updateBoundingBox() {
|
|
1196
|
+
const { lineBox, rawGlyphBox, pathBox } = this;
|
|
1197
|
+
const left = pathBox.left + lineBox.left - rawGlyphBox.left;
|
|
1198
|
+
const top = pathBox.top + lineBox.top - rawGlyphBox.top;
|
|
1199
|
+
const right = pathBox.right + Math.max(0, lineBox.right - rawGlyphBox.right);
|
|
1200
|
+
const bottom = pathBox.bottom + Math.max(0, lineBox.bottom - rawGlyphBox.bottom);
|
|
1201
|
+
this.boundingBox = new BoundingBox(
|
|
1202
|
+
left,
|
|
1203
|
+
top,
|
|
1204
|
+
right - left,
|
|
1205
|
+
bottom - top
|
|
1206
|
+
);
|
|
1207
|
+
return this;
|
|
1180
1208
|
}
|
|
1181
1209
|
requestUpdate() {
|
|
1182
1210
|
this.needsUpdate = true;
|
|
1183
1211
|
return this;
|
|
1184
1212
|
}
|
|
1185
1213
|
update() {
|
|
1186
|
-
const
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1214
|
+
const result = this.measure();
|
|
1215
|
+
for (const key in result) {
|
|
1216
|
+
this[key] = result[key];
|
|
1217
|
+
}
|
|
1190
1218
|
return this;
|
|
1191
1219
|
}
|
|
1192
1220
|
render(options) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "modern-text",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.3",
|
|
5
5
|
"packageManager": "pnpm@9.9.0",
|
|
6
6
|
"description": "Measure and render text in a way that describes the DOM.",
|
|
7
7
|
"author": "wxm",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"modern-font": "^0.2.1",
|
|
61
|
-
"modern-path2d": "^0.2.
|
|
61
|
+
"modern-path2d": "^0.2.5"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@antfu/eslint-config": "^3.7.3",
|