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
							 |