"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.segmentGraphemes = exports.parseTextBounds = exports.TextBounds = void 0; var css_line_break_1 = require("css-line-break"); var text_segmentation_1 = require("text-segmentation"); var bounds_1 = require("./bounds"); var features_1 = require("../../core/features"); var TextBounds = /** @class */ (function () { function TextBounds(text, bounds) { this.text = text; this.bounds = bounds; } return TextBounds; }()); exports.TextBounds = TextBounds; var parseTextBounds = function (context, value, styles, node) { var textList = breakText(value, styles); var textBounds = []; var offset = 0; textList.forEach(function (text) { if (styles.textDecorationLine.length || text.trim().length > 0) { if (features_1.FEATURES.SUPPORT_RANGE_BOUNDS) { var clientRects = createRange(node, offset, text.length).getClientRects(); if (clientRects.length > 1) { var subSegments = exports.segmentGraphemes(text); var subOffset_1 = 0; subSegments.forEach(function (subSegment) { textBounds.push(new TextBounds(subSegment, bounds_1.Bounds.fromDOMRectList(context, createRange(node, subOffset_1 + offset, subSegment.length).getClientRects()))); subOffset_1 += subSegment.length; }); } else { textBounds.push(new TextBounds(text, bounds_1.Bounds.fromDOMRectList(context, clientRects))); } } else { var replacementNode = node.splitText(text.length); textBounds.push(new TextBounds(text, getWrapperBounds(context, node))); node = replacementNode; } } else if (!features_1.FEATURES.SUPPORT_RANGE_BOUNDS) { node = node.splitText(text.length); } offset += text.length; }); return textBounds; }; exports.parseTextBounds = parseTextBounds; var getWrapperBounds = function (context, node) { var ownerDocument = node.ownerDocument; if (ownerDocument) { var wrapper = ownerDocument.createElement('html2canvaswrapper'); wrapper.appendChild(node.cloneNode(true)); var parentNode = node.parentNode; if (parentNode) { parentNode.replaceChild(wrapper, node); var bounds = bounds_1.parseBounds(context, wrapper); if (wrapper.firstChild) { parentNode.replaceChild(wrapper.firstChild, wrapper); } return bounds; } } return bounds_1.Bounds.EMPTY; }; var createRange = function (node, offset, length) { var ownerDocument = node.ownerDocument; if (!ownerDocument) { throw new Error('Node has no owner document'); } var range = ownerDocument.createRange(); range.setStart(node, offset); range.setEnd(node, offset + length); return range; }; var segmentGraphemes = function (value) { if (features_1.FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { // eslint-disable-next-line @typescript-eslint/no-explicit-any var segmenter = new Intl.Segmenter(void 0, { granularity: 'grapheme' }); // eslint-disable-next-line @typescript-eslint/no-explicit-any return Array.from(segmenter.segment(value)).map(function (segment) { return segment.segment; }); } return text_segmentation_1.splitGraphemes(value); }; exports.segmentGraphemes = segmentGraphemes; var segmentWords = function (value, styles) { if (features_1.FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { // eslint-disable-next-line @typescript-eslint/no-explicit-any var segmenter = new Intl.Segmenter(void 0, { granularity: 'word' }); // eslint-disable-next-line @typescript-eslint/no-explicit-any return Array.from(segmenter.segment(value)).map(function (segment) { return segment.segment; }); } return breakWords(value, styles); }; var breakText = function (value, styles) { return styles.letterSpacing !== 0 ? exports.segmentGraphemes(value) : segmentWords(value, styles); }; // https://drafts.csswg.org/css-text/#word-separator var wordSeparators = [0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091]; var breakWords = function (str, styles) { var breaker = css_line_break_1.LineBreaker(str, { lineBreak: styles.lineBreak, wordBreak: styles.overflowWrap === "break-word" /* BREAK_WORD */ ? 'break-word' : styles.wordBreak }); var words = []; var bk; var _loop_1 = function () { if (bk.value) { var value = bk.value.slice(); var codePoints = css_line_break_1.toCodePoints(value); var word_1 = ''; codePoints.forEach(function (codePoint) { if (wordSeparators.indexOf(codePoint) === -1) { word_1 += css_line_break_1.fromCodePoint(codePoint); } else { if (word_1.length) { words.push(word_1); } words.push(css_line_break_1.fromCodePoint(codePoint)); word_1 = ''; } }); if (word_1.length) { words.push(word_1); } } }; while (!(bk = breaker.next()).done) { _loop_1(); } return words; }; //# sourceMappingURL=text.js.map