137 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| "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
 |