html2canvas-pro 1.6.6 → 2.0.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.
- package/README.md +1 -0
- package/demo/image-smoothing-demo.html +256 -0
- package/demo/refactoring-test.html +602 -0
- package/dist/html2canvas-pro.esm.js +2846 -1238
- package/dist/html2canvas-pro.esm.js.map +1 -1
- package/dist/html2canvas-pro.js +2849 -1237
- package/dist/html2canvas-pro.js.map +1 -1
- package/dist/html2canvas-pro.min.js +5 -4
- package/dist/lib/__tests__/index.js +8 -2
- package/dist/lib/__tests__/index.js.map +1 -1
- package/dist/lib/config.js +72 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/core/__tests__/cache-storage.js +6 -3
- package/dist/lib/core/__tests__/cache-storage.js.map +1 -1
- package/dist/lib/core/__tests__/cache-storage.test.js +158 -0
- package/dist/lib/core/__tests__/cache-storage.test.js.map +1 -0
- package/dist/lib/core/__tests__/validator.js +296 -0
- package/dist/lib/core/__tests__/validator.js.map +1 -0
- package/dist/lib/core/cache-storage.js +130 -11
- package/dist/lib/core/cache-storage.js.map +1 -1
- package/dist/lib/core/context.js +5 -2
- package/dist/lib/core/context.js.map +1 -1
- package/dist/lib/core/debugger.js +3 -0
- package/dist/lib/core/debugger.js.map +1 -1
- package/dist/lib/core/origin-checker.js +54 -0
- package/dist/lib/core/origin-checker.js.map +1 -0
- package/dist/lib/core/performance-monitor.js +208 -0
- package/dist/lib/core/performance-monitor.js.map +1 -0
- package/dist/lib/core/validator.js +501 -0
- package/dist/lib/core/validator.js.map +1 -0
- package/dist/lib/css/index.js +2 -0
- package/dist/lib/css/index.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/background-tests.js +7 -1
- package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +142 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +1 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js +167 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +1 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +61 -0
- package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +1 -0
- package/dist/lib/css/property-descriptors/image-rendering.js +34 -0
- package/dist/lib/css/property-descriptors/image-rendering.js.map +1 -0
- package/dist/lib/css/types/__tests__/image-tests.js +7 -1
- package/dist/lib/css/types/__tests__/image-tests.js.map +1 -1
- package/dist/lib/css/types/color-math.js +26 -0
- package/dist/lib/css/types/color-math.js.map +1 -0
- package/dist/lib/css/types/color-spaces/srgb.js +6 -6
- package/dist/lib/css/types/color-spaces/srgb.js.map +1 -1
- package/dist/lib/css/types/color-utilities.js +13 -22
- package/dist/lib/css/types/color-utilities.js.map +1 -1
- package/dist/lib/dom/__tests__/dom-normalizer.test.js +113 -0
- package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +1 -0
- package/dist/lib/dom/__tests__/element-container.test.js +109 -0
- package/dist/lib/dom/__tests__/element-container.test.js.map +1 -0
- package/dist/lib/dom/document-cloner.js +152 -11
- package/dist/lib/dom/document-cloner.js.map +1 -1
- package/dist/lib/dom/dom-normalizer.js +80 -0
- package/dist/lib/dom/dom-normalizer.js.map +1 -0
- package/dist/lib/dom/element-container.js +32 -15
- package/dist/lib/dom/element-container.js.map +1 -1
- package/dist/lib/dom/node-parser.js +16 -20
- package/dist/lib/dom/node-parser.js.map +1 -1
- package/dist/lib/dom/node-type-guards.js +44 -0
- package/dist/lib/dom/node-type-guards.js.map +1 -0
- package/dist/lib/dom/replaced-elements/iframe-element-container.js +5 -4
- package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
- package/dist/lib/index.js +148 -41
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/render/canvas/__tests__/background-renderer.test.js +65 -0
- package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/__tests__/border-renderer.test.js +23 -0
- package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +30 -0
- package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/__tests__/text-renderer.test.js +63 -0
- package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +1 -0
- package/dist/lib/render/canvas/background-renderer.js +222 -0
- package/dist/lib/render/canvas/background-renderer.js.map +1 -0
- package/dist/lib/render/canvas/border-renderer.js +185 -0
- package/dist/lib/render/canvas/border-renderer.js.map +1 -0
- package/dist/lib/render/canvas/canvas-renderer.js +61 -689
- package/dist/lib/render/canvas/canvas-renderer.js.map +1 -1
- package/dist/lib/render/canvas/effects-renderer.js +89 -0
- package/dist/lib/render/canvas/effects-renderer.js.map +1 -0
- package/dist/lib/render/canvas/text-renderer.js +508 -0
- package/dist/lib/render/canvas/text-renderer.js.map +1 -0
- package/dist/lib/render/renderer-interface.js +3 -0
- package/dist/lib/render/renderer-interface.js.map +1 -0
- package/dist/types/config.d.ts +54 -0
- package/dist/types/core/__tests__/cache-storage.test.d.ts +1 -0
- package/dist/types/core/__tests__/validator.d.ts +1 -0
- package/dist/types/core/cache-storage.d.ts +42 -1
- package/dist/types/core/context.d.ts +5 -1
- package/dist/types/core/origin-checker.d.ts +33 -0
- package/dist/types/core/performance-monitor.d.ts +131 -0
- package/dist/types/core/validator.d.ts +132 -0
- package/dist/types/css/index.d.ts +2 -0
- package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +1 -0
- package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +1 -0
- package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +1 -0
- package/dist/types/css/property-descriptors/image-rendering.d.ts +8 -0
- package/dist/types/css/types/color-math.d.ts +12 -0
- package/dist/types/css/types/color-utilities.d.ts +2 -3
- package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +1 -0
- package/dist/types/dom/__tests__/element-container.test.d.ts +1 -0
- package/dist/types/dom/document-cloner.d.ts +46 -0
- package/dist/types/dom/dom-normalizer.d.ts +43 -0
- package/dist/types/dom/element-container.d.ts +20 -1
- package/dist/types/dom/node-parser.d.ts +2 -7
- package/dist/types/dom/node-type-guards.d.ts +33 -0
- package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +4 -1
- package/dist/types/index.d.ts +48 -3
- package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +1 -0
- package/dist/types/render/canvas/background-renderer.d.ts +87 -0
- package/dist/types/render/canvas/border-renderer.d.ts +67 -0
- package/dist/types/render/canvas/canvas-renderer.d.ts +19 -23
- package/dist/types/render/canvas/effects-renderer.d.ts +64 -0
- package/dist/types/render/canvas/text-renderer.d.ts +57 -0
- package/dist/types/render/renderer-interface.d.ts +26 -0
- package/package.json +2 -1
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Text Renderer
|
|
4
|
+
*
|
|
5
|
+
* Handles rendering of text content including:
|
|
6
|
+
* - Text with letter spacing
|
|
7
|
+
* - Text decorations (underline, overline, line-through)
|
|
8
|
+
* - Text shadows
|
|
9
|
+
* - Webkit line clamp
|
|
10
|
+
* - Text overflow ellipsis
|
|
11
|
+
* - Paint order (fill/stroke)
|
|
12
|
+
* - Font styles
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.TextRenderer = void 0;
|
|
16
|
+
const text_1 = require("../../css/layout/text");
|
|
17
|
+
const color_utilities_1 = require("../../css/types/color-utilities");
|
|
18
|
+
const parser_1 = require("../../css/syntax/parser");
|
|
19
|
+
// iOS font fix - see https://github.com/niklasvh/html2canvas/pull/2645
|
|
20
|
+
const iOSBrokenFonts = ['-apple-system', 'system-ui'];
|
|
21
|
+
/**
|
|
22
|
+
* Detect iOS version from user agent
|
|
23
|
+
* Returns null if not iOS or version cannot be determined
|
|
24
|
+
*/
|
|
25
|
+
const getIOSVersion = () => {
|
|
26
|
+
if (typeof navigator === 'undefined') {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const userAgent = navigator.userAgent;
|
|
30
|
+
// Check if it's iOS or iPadOS
|
|
31
|
+
// iPadOS 13+ may identify as Macintosh, check for touch support
|
|
32
|
+
const isIOS = /iPhone|iPad|iPod/.test(userAgent);
|
|
33
|
+
const isIPadOS = /Macintosh/.test(userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;
|
|
34
|
+
if (!isIOS && !isIPadOS) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
// Extract version number from various iOS user agent formats:
|
|
38
|
+
// - "iPhone OS 15_0" or "iPhone OS 15_0_1"
|
|
39
|
+
// - "CPU OS 15_0 like Mac OS X"
|
|
40
|
+
// - "CPU iPhone OS 15_0 like Mac OS X"
|
|
41
|
+
// - "Version/15.0" (for iPadOS)
|
|
42
|
+
const patterns = [
|
|
43
|
+
/(?:iPhone|CPU(?:\siPhone)?)\sOS\s(\d+)[\._](\d+)/, // iPhone OS, CPU OS, CPU iPhone OS
|
|
44
|
+
/Version\/(\d+)\.(\d+)/ // Version/15.0 (iPadOS)
|
|
45
|
+
];
|
|
46
|
+
for (const pattern of patterns) {
|
|
47
|
+
const match = userAgent.match(pattern);
|
|
48
|
+
if (match && match[1]) {
|
|
49
|
+
return parseInt(match[1], 10);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
};
|
|
54
|
+
const fixIOSSystemFonts = (fontFamilies) => {
|
|
55
|
+
const iosVersion = getIOSVersion();
|
|
56
|
+
// On iOS 15.0 and 15.1, system fonts have rendering issues
|
|
57
|
+
// Fixed in iOS 17+
|
|
58
|
+
if (iosVersion !== null && iosVersion >= 15 && iosVersion < 17) {
|
|
59
|
+
return fontFamilies.map((fontFamily) => iOSBrokenFonts.indexOf(fontFamily) !== -1
|
|
60
|
+
? `-apple-system, "Helvetica Neue", Arial, sans-serif`
|
|
61
|
+
: fontFamily);
|
|
62
|
+
}
|
|
63
|
+
return fontFamilies;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Text Renderer
|
|
67
|
+
*
|
|
68
|
+
* Specialized renderer for text content.
|
|
69
|
+
* Extracted from CanvasRenderer to improve code organization and maintainability.
|
|
70
|
+
*/
|
|
71
|
+
class TextRenderer {
|
|
72
|
+
constructor(deps) {
|
|
73
|
+
this.ctx = deps.ctx;
|
|
74
|
+
// context stored but not used directly in this renderer
|
|
75
|
+
this.options = deps.options;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Render text with letter spacing
|
|
79
|
+
* Public method used by list rendering
|
|
80
|
+
*/
|
|
81
|
+
renderTextWithLetterSpacing(text, letterSpacing, baseline) {
|
|
82
|
+
if (letterSpacing === 0) {
|
|
83
|
+
// Use alphabetic baseline for consistent text positioning across browsers
|
|
84
|
+
// Issue #129: text.bounds.top + text.bounds.height causes text to render too low
|
|
85
|
+
this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + baseline);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
const letters = (0, text_1.segmentGraphemes)(text.text);
|
|
89
|
+
letters.reduce((left, letter) => {
|
|
90
|
+
this.ctx.fillText(letter, left, text.bounds.top + baseline);
|
|
91
|
+
return left + this.ctx.measureText(letter).width;
|
|
92
|
+
}, text.bounds.left);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Helper method to render text with paint order support
|
|
97
|
+
* Reduces code duplication in line-clamp and normal rendering
|
|
98
|
+
*/
|
|
99
|
+
renderTextBoundWithPaintOrder(textBound, styles, paintOrderLayers) {
|
|
100
|
+
paintOrderLayers.forEach((paintOrderLayer) => {
|
|
101
|
+
switch (paintOrderLayer) {
|
|
102
|
+
case 0 /* PAINT_ORDER_LAYER.FILL */:
|
|
103
|
+
this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
|
|
104
|
+
this.renderTextWithLetterSpacing(textBound, styles.letterSpacing, styles.fontSize.number);
|
|
105
|
+
break;
|
|
106
|
+
case 1 /* PAINT_ORDER_LAYER.STROKE */:
|
|
107
|
+
if (styles.webkitTextStrokeWidth && textBound.text.trim().length) {
|
|
108
|
+
this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
|
|
109
|
+
this.ctx.lineWidth = styles.webkitTextStrokeWidth;
|
|
110
|
+
this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
|
|
111
|
+
this.renderTextWithLetterSpacing(textBound, styles.letterSpacing, styles.fontSize.number);
|
|
112
|
+
}
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
renderTextDecoration(bounds, styles) {
|
|
118
|
+
this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.textDecorationColor || styles.color);
|
|
119
|
+
// Calculate decoration line thickness
|
|
120
|
+
let thickness = 1; // default
|
|
121
|
+
if (typeof styles.textDecorationThickness === 'number') {
|
|
122
|
+
thickness = styles.textDecorationThickness;
|
|
123
|
+
}
|
|
124
|
+
else if (styles.textDecorationThickness === 'from-font') {
|
|
125
|
+
// Use a reasonable default based on font size
|
|
126
|
+
thickness = Math.max(1, Math.floor(styles.fontSize.number * 0.05));
|
|
127
|
+
}
|
|
128
|
+
// 'auto' uses default thickness of 1
|
|
129
|
+
// Calculate underline offset
|
|
130
|
+
let underlineOffset = 0;
|
|
131
|
+
if (typeof styles.textUnderlineOffset === 'number') {
|
|
132
|
+
// It's a pixel value
|
|
133
|
+
underlineOffset = styles.textUnderlineOffset;
|
|
134
|
+
}
|
|
135
|
+
// 'auto' uses default offset of 0
|
|
136
|
+
const decorationStyle = styles.textDecorationStyle;
|
|
137
|
+
styles.textDecorationLine.forEach((textDecorationLine) => {
|
|
138
|
+
let y = 0;
|
|
139
|
+
switch (textDecorationLine) {
|
|
140
|
+
case 1 /* TEXT_DECORATION_LINE.UNDERLINE */:
|
|
141
|
+
y = bounds.top + bounds.height - thickness + underlineOffset;
|
|
142
|
+
break;
|
|
143
|
+
case 2 /* TEXT_DECORATION_LINE.OVERLINE */:
|
|
144
|
+
y = bounds.top;
|
|
145
|
+
break;
|
|
146
|
+
case 3 /* TEXT_DECORATION_LINE.LINE_THROUGH */:
|
|
147
|
+
y = bounds.top + (bounds.height / 2 - thickness / 2);
|
|
148
|
+
break;
|
|
149
|
+
default:
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this.drawDecorationLine(bounds.left, y, bounds.width, thickness, decorationStyle);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
drawDecorationLine(x, y, width, thickness, style) {
|
|
156
|
+
switch (style) {
|
|
157
|
+
case 0 /* TEXT_DECORATION_STYLE.SOLID */:
|
|
158
|
+
// Solid line (default)
|
|
159
|
+
this.ctx.fillRect(x, y, width, thickness);
|
|
160
|
+
break;
|
|
161
|
+
case 1 /* TEXT_DECORATION_STYLE.DOUBLE */:
|
|
162
|
+
// Double line
|
|
163
|
+
const gap = Math.max(1, thickness);
|
|
164
|
+
this.ctx.fillRect(x, y, width, thickness);
|
|
165
|
+
this.ctx.fillRect(x, y + thickness + gap, width, thickness);
|
|
166
|
+
break;
|
|
167
|
+
case 2 /* TEXT_DECORATION_STYLE.DOTTED */:
|
|
168
|
+
// Dotted line
|
|
169
|
+
this.ctx.save();
|
|
170
|
+
this.ctx.beginPath();
|
|
171
|
+
this.ctx.setLineDash([thickness, thickness * 2]);
|
|
172
|
+
this.ctx.lineWidth = thickness;
|
|
173
|
+
this.ctx.strokeStyle = this.ctx.fillStyle;
|
|
174
|
+
this.ctx.moveTo(x, y + thickness / 2);
|
|
175
|
+
this.ctx.lineTo(x + width, y + thickness / 2);
|
|
176
|
+
this.ctx.stroke();
|
|
177
|
+
this.ctx.restore();
|
|
178
|
+
break;
|
|
179
|
+
case 3 /* TEXT_DECORATION_STYLE.DASHED */:
|
|
180
|
+
// Dashed line
|
|
181
|
+
this.ctx.save();
|
|
182
|
+
this.ctx.beginPath();
|
|
183
|
+
this.ctx.setLineDash([thickness * 3, thickness * 2]);
|
|
184
|
+
this.ctx.lineWidth = thickness;
|
|
185
|
+
this.ctx.strokeStyle = this.ctx.fillStyle;
|
|
186
|
+
this.ctx.moveTo(x, y + thickness / 2);
|
|
187
|
+
this.ctx.lineTo(x + width, y + thickness / 2);
|
|
188
|
+
this.ctx.stroke();
|
|
189
|
+
this.ctx.restore();
|
|
190
|
+
break;
|
|
191
|
+
case 4 /* TEXT_DECORATION_STYLE.WAVY */:
|
|
192
|
+
// Wavy line (approximation using quadratic curves)
|
|
193
|
+
this.ctx.save();
|
|
194
|
+
this.ctx.beginPath();
|
|
195
|
+
this.ctx.lineWidth = thickness;
|
|
196
|
+
this.ctx.strokeStyle = this.ctx.fillStyle;
|
|
197
|
+
const amplitude = thickness * 2;
|
|
198
|
+
const wavelength = thickness * 4;
|
|
199
|
+
let currentX = x;
|
|
200
|
+
this.ctx.moveTo(currentX, y + thickness / 2);
|
|
201
|
+
while (currentX < x + width) {
|
|
202
|
+
const nextX = Math.min(currentX + wavelength / 2, x + width);
|
|
203
|
+
this.ctx.quadraticCurveTo(currentX + wavelength / 4, y + thickness / 2 - amplitude, nextX, y + thickness / 2);
|
|
204
|
+
currentX = nextX;
|
|
205
|
+
if (currentX < x + width) {
|
|
206
|
+
const nextX2 = Math.min(currentX + wavelength / 2, x + width);
|
|
207
|
+
this.ctx.quadraticCurveTo(currentX + wavelength / 4, y + thickness / 2 + amplitude, nextX2, y + thickness / 2);
|
|
208
|
+
currentX = nextX2;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
this.ctx.stroke();
|
|
212
|
+
this.ctx.restore();
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
// Fallback to solid
|
|
216
|
+
this.ctx.fillRect(x, y, width, thickness);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Helper method to truncate text and add ellipsis if needed
|
|
220
|
+
truncateTextWithEllipsis(text, maxWidth, letterSpacing) {
|
|
221
|
+
const ellipsis = '...';
|
|
222
|
+
const ellipsisWidth = this.ctx.measureText(ellipsis).width;
|
|
223
|
+
if (letterSpacing === 0) {
|
|
224
|
+
let truncated = text;
|
|
225
|
+
while (this.ctx.measureText(truncated).width + ellipsisWidth > maxWidth && truncated.length > 0) {
|
|
226
|
+
truncated = truncated.slice(0, -1);
|
|
227
|
+
}
|
|
228
|
+
return truncated + ellipsis;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
const letters = (0, text_1.segmentGraphemes)(text);
|
|
232
|
+
let width = ellipsisWidth;
|
|
233
|
+
let result = [];
|
|
234
|
+
for (const letter of letters) {
|
|
235
|
+
const letterWidth = this.ctx.measureText(letter).width + letterSpacing;
|
|
236
|
+
if (width + letterWidth > maxWidth) {
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
result.push(letter);
|
|
240
|
+
width += letterWidth;
|
|
241
|
+
}
|
|
242
|
+
return result.join('') + ellipsis;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create font style array
|
|
247
|
+
* Public method used by list rendering
|
|
248
|
+
*/
|
|
249
|
+
createFontStyle(styles) {
|
|
250
|
+
const fontVariant = styles.fontVariant
|
|
251
|
+
.filter((variant) => variant === 'normal' || variant === 'small-caps')
|
|
252
|
+
.join('');
|
|
253
|
+
const fontFamily = fixIOSSystemFonts(styles.fontFamily).join(', ');
|
|
254
|
+
const fontSize = (0, parser_1.isDimensionToken)(styles.fontSize)
|
|
255
|
+
? `${styles.fontSize.number}${styles.fontSize.unit}`
|
|
256
|
+
: `${styles.fontSize.number}px`;
|
|
257
|
+
return [
|
|
258
|
+
[styles.fontStyle, fontVariant, styles.fontWeight, fontSize, fontFamily].join(' '),
|
|
259
|
+
fontFamily,
|
|
260
|
+
fontSize
|
|
261
|
+
];
|
|
262
|
+
}
|
|
263
|
+
async renderTextNode(text, styles, containerBounds) {
|
|
264
|
+
const [font] = this.createFontStyle(styles);
|
|
265
|
+
this.ctx.font = font;
|
|
266
|
+
this.ctx.direction = styles.direction === 1 /* DIRECTION.RTL */ ? 'rtl' : 'ltr';
|
|
267
|
+
this.ctx.textAlign = 'left';
|
|
268
|
+
this.ctx.textBaseline = 'alphabetic';
|
|
269
|
+
const paintOrder = styles.paintOrder;
|
|
270
|
+
// Calculate line height for text layout detection (used by both line-clamp and ellipsis)
|
|
271
|
+
const lineHeight = styles.fontSize.number * 1.5;
|
|
272
|
+
// Check if we need to apply -webkit-line-clamp
|
|
273
|
+
// This limits text to a specific number of lines with ellipsis
|
|
274
|
+
const shouldApplyLineClamp = styles.webkitLineClamp > 0 &&
|
|
275
|
+
(styles.display & 2 /* DISPLAY.BLOCK */) !== 0 &&
|
|
276
|
+
styles.overflowY === 1 /* OVERFLOW.HIDDEN */ &&
|
|
277
|
+
text.textBounds.length > 0;
|
|
278
|
+
if (shouldApplyLineClamp) {
|
|
279
|
+
// Group text bounds by lines based on their Y position
|
|
280
|
+
const lines = [];
|
|
281
|
+
let currentLine = [];
|
|
282
|
+
let currentLineTop = text.textBounds[0].bounds.top;
|
|
283
|
+
text.textBounds.forEach((tb) => {
|
|
284
|
+
// If this text bound is on a different line, start a new line
|
|
285
|
+
if (Math.abs(tb.bounds.top - currentLineTop) >= lineHeight * 0.5) {
|
|
286
|
+
if (currentLine.length > 0) {
|
|
287
|
+
lines.push(currentLine);
|
|
288
|
+
}
|
|
289
|
+
currentLine = [tb];
|
|
290
|
+
currentLineTop = tb.bounds.top;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
currentLine.push(tb);
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
// Don't forget the last line
|
|
297
|
+
if (currentLine.length > 0) {
|
|
298
|
+
lines.push(currentLine);
|
|
299
|
+
}
|
|
300
|
+
// Only render up to webkitLineClamp lines
|
|
301
|
+
const maxLines = styles.webkitLineClamp;
|
|
302
|
+
if (lines.length > maxLines) {
|
|
303
|
+
// Render only the first (maxLines - 1) complete lines
|
|
304
|
+
for (let i = 0; i < maxLines - 1; i++) {
|
|
305
|
+
lines[i].forEach((textBound) => {
|
|
306
|
+
this.renderTextBoundWithPaintOrder(textBound, styles, paintOrder);
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
// For the last line, truncate with ellipsis
|
|
310
|
+
const lastLine = lines[maxLines - 1];
|
|
311
|
+
if (lastLine && lastLine.length > 0 && containerBounds) {
|
|
312
|
+
const lastLineText = lastLine.map((tb) => tb.text).join('');
|
|
313
|
+
const firstBound = lastLine[0];
|
|
314
|
+
const availableWidth = containerBounds.width - (firstBound.bounds.left - containerBounds.left);
|
|
315
|
+
const truncatedText = this.truncateTextWithEllipsis(lastLineText, availableWidth, styles.letterSpacing);
|
|
316
|
+
paintOrder.forEach((paintOrderLayer) => {
|
|
317
|
+
switch (paintOrderLayer) {
|
|
318
|
+
case 0 /* PAINT_ORDER_LAYER.FILL */:
|
|
319
|
+
this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
|
|
320
|
+
if (styles.letterSpacing === 0) {
|
|
321
|
+
this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
const letters = (0, text_1.segmentGraphemes)(truncatedText);
|
|
325
|
+
letters.reduce((left, letter) => {
|
|
326
|
+
this.ctx.fillText(letter, left, firstBound.bounds.top + styles.fontSize.number);
|
|
327
|
+
return left + this.ctx.measureText(letter).width + styles.letterSpacing;
|
|
328
|
+
}, firstBound.bounds.left);
|
|
329
|
+
}
|
|
330
|
+
break;
|
|
331
|
+
case 1 /* PAINT_ORDER_LAYER.STROKE */:
|
|
332
|
+
if (styles.webkitTextStrokeWidth && truncatedText.trim().length) {
|
|
333
|
+
this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
|
|
334
|
+
this.ctx.lineWidth = styles.webkitTextStrokeWidth;
|
|
335
|
+
this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
|
|
336
|
+
if (styles.letterSpacing === 0) {
|
|
337
|
+
this.ctx.strokeText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
const letters = (0, text_1.segmentGraphemes)(truncatedText);
|
|
341
|
+
letters.reduce((left, letter) => {
|
|
342
|
+
this.ctx.strokeText(letter, left, firstBound.bounds.top + styles.fontSize.number);
|
|
343
|
+
return left + this.ctx.measureText(letter).width + styles.letterSpacing;
|
|
344
|
+
}, firstBound.bounds.left);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
return; // Don't render anything else
|
|
352
|
+
}
|
|
353
|
+
// If lines.length <= maxLines, fall through to normal rendering
|
|
354
|
+
}
|
|
355
|
+
// Check if we need to apply text-overflow: ellipsis
|
|
356
|
+
// Issue #203: Only apply ellipsis for single-line text overflow
|
|
357
|
+
// Multi-line text truncation (like -webkit-line-clamp) should not be affected
|
|
358
|
+
const shouldApplyEllipsis = styles.textOverflow === 1 /* TEXT_OVERFLOW.ELLIPSIS */ &&
|
|
359
|
+
containerBounds &&
|
|
360
|
+
styles.overflowX === 1 /* OVERFLOW.HIDDEN */ &&
|
|
361
|
+
text.textBounds.length > 0;
|
|
362
|
+
// Calculate total text width if ellipsis might be needed
|
|
363
|
+
let needsEllipsis = false;
|
|
364
|
+
let truncatedText = '';
|
|
365
|
+
if (shouldApplyEllipsis) {
|
|
366
|
+
// Check if all text bounds are on approximately the same line (single-line scenario)
|
|
367
|
+
// For multi-line text (like -webkit-line-clamp), textBounds will have different Y positions
|
|
368
|
+
const firstTop = text.textBounds[0].bounds.top;
|
|
369
|
+
const isSingleLine = text.textBounds.every((tb) => Math.abs(tb.bounds.top - firstTop) < lineHeight * 0.5);
|
|
370
|
+
if (isSingleLine) {
|
|
371
|
+
// Measure the full text content
|
|
372
|
+
// Note: text.textBounds may contain whitespace characters from HTML formatting
|
|
373
|
+
// We need to collapse them like the browser does for white-space: nowrap
|
|
374
|
+
let fullText = text.textBounds.map((tb) => tb.text).join('');
|
|
375
|
+
// Collapse whitespace: replace sequences of whitespace (including newlines) with single spaces
|
|
376
|
+
// and trim leading/trailing whitespace
|
|
377
|
+
fullText = fullText.replace(/\s+/g, ' ').trim();
|
|
378
|
+
const fullTextWidth = this.ctx.measureText(fullText).width;
|
|
379
|
+
const availableWidth = containerBounds.width;
|
|
380
|
+
if (fullTextWidth > availableWidth) {
|
|
381
|
+
needsEllipsis = true;
|
|
382
|
+
truncatedText = this.truncateTextWithEllipsis(fullText, availableWidth, styles.letterSpacing);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// If ellipsis is needed, render the truncated text once
|
|
387
|
+
if (needsEllipsis) {
|
|
388
|
+
const firstBound = text.textBounds[0];
|
|
389
|
+
paintOrder.forEach((paintOrderLayer) => {
|
|
390
|
+
switch (paintOrderLayer) {
|
|
391
|
+
case 0 /* PAINT_ORDER_LAYER.FILL */:
|
|
392
|
+
this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
|
|
393
|
+
if (styles.letterSpacing === 0) {
|
|
394
|
+
this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
const letters = (0, text_1.segmentGraphemes)(truncatedText);
|
|
398
|
+
letters.reduce((left, letter) => {
|
|
399
|
+
this.ctx.fillText(letter, left, firstBound.bounds.top + styles.fontSize.number);
|
|
400
|
+
return left + this.ctx.measureText(letter).width + styles.letterSpacing;
|
|
401
|
+
}, firstBound.bounds.left);
|
|
402
|
+
}
|
|
403
|
+
const textShadows = styles.textShadow;
|
|
404
|
+
if (textShadows.length && truncatedText.trim().length) {
|
|
405
|
+
textShadows
|
|
406
|
+
.slice(0)
|
|
407
|
+
.reverse()
|
|
408
|
+
.forEach((textShadow) => {
|
|
409
|
+
this.ctx.shadowColor = (0, color_utilities_1.asString)(textShadow.color);
|
|
410
|
+
this.ctx.shadowOffsetX = textShadow.offsetX.number * this.options.scale;
|
|
411
|
+
this.ctx.shadowOffsetY = textShadow.offsetY.number * this.options.scale;
|
|
412
|
+
this.ctx.shadowBlur = textShadow.blur.number;
|
|
413
|
+
if (styles.letterSpacing === 0) {
|
|
414
|
+
this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
const letters = (0, text_1.segmentGraphemes)(truncatedText);
|
|
418
|
+
letters.reduce((left, letter) => {
|
|
419
|
+
this.ctx.fillText(letter, left, firstBound.bounds.top + styles.fontSize.number);
|
|
420
|
+
return left + this.ctx.measureText(letter).width + styles.letterSpacing;
|
|
421
|
+
}, firstBound.bounds.left);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
this.ctx.shadowColor = '';
|
|
425
|
+
this.ctx.shadowOffsetX = 0;
|
|
426
|
+
this.ctx.shadowOffsetY = 0;
|
|
427
|
+
this.ctx.shadowBlur = 0;
|
|
428
|
+
}
|
|
429
|
+
break;
|
|
430
|
+
case 1 /* PAINT_ORDER_LAYER.STROKE */:
|
|
431
|
+
if (styles.webkitTextStrokeWidth && truncatedText.trim().length) {
|
|
432
|
+
this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
|
|
433
|
+
this.ctx.lineWidth = styles.webkitTextStrokeWidth;
|
|
434
|
+
this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
|
|
435
|
+
if (styles.letterSpacing === 0) {
|
|
436
|
+
this.ctx.strokeText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
const letters = (0, text_1.segmentGraphemes)(truncatedText);
|
|
440
|
+
letters.reduce((left, letter) => {
|
|
441
|
+
this.ctx.strokeText(letter, left, firstBound.bounds.top + styles.fontSize.number);
|
|
442
|
+
return left + this.ctx.measureText(letter).width + styles.letterSpacing;
|
|
443
|
+
}, firstBound.bounds.left);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
// Normal rendering (no ellipsis needed)
|
|
452
|
+
text.textBounds.forEach((text) => {
|
|
453
|
+
paintOrder.forEach((paintOrderLayer) => {
|
|
454
|
+
switch (paintOrderLayer) {
|
|
455
|
+
case 0 /* PAINT_ORDER_LAYER.FILL */:
|
|
456
|
+
this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
|
|
457
|
+
this.renderTextWithLetterSpacing(text, styles.letterSpacing, styles.fontSize.number);
|
|
458
|
+
const textShadows = styles.textShadow;
|
|
459
|
+
if (textShadows.length && text.text.trim().length) {
|
|
460
|
+
textShadows
|
|
461
|
+
.slice(0)
|
|
462
|
+
.reverse()
|
|
463
|
+
.forEach((textShadow) => {
|
|
464
|
+
this.ctx.shadowColor = (0, color_utilities_1.asString)(textShadow.color);
|
|
465
|
+
this.ctx.shadowOffsetX = textShadow.offsetX.number * this.options.scale;
|
|
466
|
+
this.ctx.shadowOffsetY = textShadow.offsetY.number * this.options.scale;
|
|
467
|
+
this.ctx.shadowBlur = textShadow.blur.number;
|
|
468
|
+
this.renderTextWithLetterSpacing(text, styles.letterSpacing, styles.fontSize.number);
|
|
469
|
+
});
|
|
470
|
+
this.ctx.shadowColor = '';
|
|
471
|
+
this.ctx.shadowOffsetX = 0;
|
|
472
|
+
this.ctx.shadowOffsetY = 0;
|
|
473
|
+
this.ctx.shadowBlur = 0;
|
|
474
|
+
}
|
|
475
|
+
if (styles.textDecorationLine.length) {
|
|
476
|
+
this.renderTextDecoration(text.bounds, styles);
|
|
477
|
+
}
|
|
478
|
+
break;
|
|
479
|
+
case 1 /* PAINT_ORDER_LAYER.STROKE */:
|
|
480
|
+
if (styles.webkitTextStrokeWidth && text.text.trim().length) {
|
|
481
|
+
this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
|
|
482
|
+
this.ctx.lineWidth = styles.webkitTextStrokeWidth;
|
|
483
|
+
this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
|
|
484
|
+
// Issue #110: Use baseline (fontSize) for consistent positioning with fill
|
|
485
|
+
// Previously used text.bounds.height which caused stroke to render too low
|
|
486
|
+
const baseline = styles.fontSize.number;
|
|
487
|
+
if (styles.letterSpacing === 0) {
|
|
488
|
+
this.ctx.strokeText(text.text, text.bounds.left, text.bounds.top + baseline);
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
const letters = (0, text_1.segmentGraphemes)(text.text);
|
|
492
|
+
letters.reduce((left, letter) => {
|
|
493
|
+
this.ctx.strokeText(letter, left, text.bounds.top + baseline);
|
|
494
|
+
return left + this.ctx.measureText(letter).width;
|
|
495
|
+
}, text.bounds.left);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
this.ctx.strokeStyle = '';
|
|
499
|
+
this.ctx.lineWidth = 0;
|
|
500
|
+
this.ctx.lineJoin = 'miter';
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
exports.TextRenderer = TextRenderer;
|
|
508
|
+
//# sourceMappingURL=text-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-renderer.js","sourceRoot":"","sources":["../../../../src/render/canvas/text-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-interface.js","sourceRoot":"","sources":["../../../src/render/renderer-interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Cache } from './core/cache-storage';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration options for Html2Canvas
|
|
4
|
+
*
|
|
5
|
+
* This class manages global configuration without using module-level static variables.
|
|
6
|
+
* Each html2canvas invocation can have its own configuration instance.
|
|
7
|
+
*/
|
|
8
|
+
export interface ConfigOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Window object to use for DOM operations
|
|
11
|
+
*/
|
|
12
|
+
window?: Window;
|
|
13
|
+
/**
|
|
14
|
+
* CSP nonce for inline styles
|
|
15
|
+
* See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
|
16
|
+
*/
|
|
17
|
+
cspNonce?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Cache instance to reuse across multiple calls
|
|
20
|
+
* Useful for avoiding redundant image loads
|
|
21
|
+
*/
|
|
22
|
+
cache?: Cache;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Html2Canvas Configuration
|
|
26
|
+
*
|
|
27
|
+
* Manages configuration state for html2canvas rendering.
|
|
28
|
+
* Eliminates the need for global static variables.
|
|
29
|
+
*/
|
|
30
|
+
export declare class Html2CanvasConfig {
|
|
31
|
+
readonly window: Window;
|
|
32
|
+
readonly cspNonce?: string;
|
|
33
|
+
readonly cache?: Cache;
|
|
34
|
+
constructor(options?: ConfigOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Create configuration from an element
|
|
37
|
+
* Extracts window from element's owner document
|
|
38
|
+
*/
|
|
39
|
+
static fromElement(element: HTMLElement, options?: Partial<ConfigOptions>): Html2CanvasConfig;
|
|
40
|
+
/**
|
|
41
|
+
* Clone configuration with override options
|
|
42
|
+
*/
|
|
43
|
+
clone(options?: Partial<ConfigOptions>): Html2CanvasConfig;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Set default configuration
|
|
47
|
+
* @deprecated Pass configuration directly to html2canvas instead
|
|
48
|
+
*/
|
|
49
|
+
export declare function setDefaultConfig(config: Html2CanvasConfig): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get default configuration
|
|
52
|
+
* @deprecated Pass configuration directly to html2canvas instead
|
|
53
|
+
*/
|
|
54
|
+
export declare function getDefaultConfig(): Html2CanvasConfig | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|