UNPKG

4.7 kBJavaScriptView Raw
1/*!
2 * TextPlugin 3.10.3
3 * https://greensock.com
4 *
5 * @license Copyright 2008-2022, GreenSock. All rights reserved.
6 * Subject to the terms at https://greensock.com/standard-license or for
7 * Club GreenSock members, the agreement issued with that membership.
8 * @author: Jack Doyle, jack@greensock.com
9*/
10
11/* eslint-disable */
12import { emojiSafeSplit, getText, splitInnerHTML } from "./utils/strings.js";
13
14var gsap,
15 _tempDiv,
16 _getGSAP = function _getGSAP() {
17 return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap;
18};
19
20export var TextPlugin = {
21 version: "3.10.3",
22 name: "text",
23 init: function init(target, value, tween) {
24 typeof value !== "object" && (value = {
25 value: value
26 });
27
28 var i = target.nodeName.toUpperCase(),
29 data = this,
30 _value = value,
31 newClass = _value.newClass,
32 oldClass = _value.oldClass,
33 preserveSpaces = _value.preserveSpaces,
34 rtl = _value.rtl,
35 delimiter = data.delimiter = value.delimiter || "",
36 fillChar = data.fillChar = value.fillChar || (value.padSpace ? " " : ""),
37 _short,
38 text,
39 original,
40 j,
41 condensedText,
42 condensedOriginal,
43 aggregate,
44 s;
45
46 data.svg = target.getBBox && (i === "TEXT" || i === "TSPAN");
47
48 if (!("innerHTML" in target) && !data.svg) {
49 return false;
50 }
51
52 data.target = target;
53
54 if (!("value" in value)) {
55 data.text = data.original = [""];
56 return;
57 }
58
59 original = splitInnerHTML(target, delimiter, false, preserveSpaces);
60 _tempDiv || (_tempDiv = document.createElement("div"));
61 _tempDiv.innerHTML = value.value;
62 text = splitInnerHTML(_tempDiv, delimiter);
63 data.from = tween._from;
64
65 if ((data.from || rtl) && !(rtl && data.from)) {
66 // right-to-left or "from()" tweens should invert things (but if it's BOTH .from() and rtl, inverting twice equals not inverting at all :)
67 i = original;
68 original = text;
69 text = i;
70 }
71
72 data.hasClass = !!(newClass || oldClass);
73 data.newClass = rtl ? oldClass : newClass;
74 data.oldClass = rtl ? newClass : oldClass;
75 i = original.length - text.length;
76 _short = i < 0 ? original : text;
77
78 if (i < 0) {
79 i = -i;
80 }
81
82 while (--i > -1) {
83 _short.push(fillChar);
84 }
85
86 if (value.type === "diff") {
87 j = 0;
88 condensedText = [];
89 condensedOriginal = [];
90 aggregate = "";
91
92 for (i = 0; i < text.length; i++) {
93 s = text[i];
94
95 if (s === original[i]) {
96 aggregate += s;
97 } else {
98 condensedText[j] = aggregate + s;
99 condensedOriginal[j++] = aggregate + original[i];
100 aggregate = "";
101 }
102 }
103
104 text = condensedText;
105 original = condensedOriginal;
106
107 if (aggregate) {
108 text.push(aggregate);
109 original.push(aggregate);
110 }
111 }
112
113 value.speed && tween.duration(Math.min(0.05 / value.speed * _short.length, value.maxDuration || 9999));
114 data.rtl = rtl;
115 data.original = original;
116 data.text = text;
117
118 data._props.push("text");
119 },
120 render: function render(ratio, data) {
121 if (ratio > 1) {
122 ratio = 1;
123 } else if (ratio < 0) {
124 ratio = 0;
125 }
126
127 if (data.from) {
128 ratio = 1 - ratio;
129 }
130
131 var text = data.text,
132 hasClass = data.hasClass,
133 newClass = data.newClass,
134 oldClass = data.oldClass,
135 delimiter = data.delimiter,
136 target = data.target,
137 fillChar = data.fillChar,
138 original = data.original,
139 rtl = data.rtl,
140 l = text.length,
141 i = (rtl ? 1 - ratio : ratio) * l + 0.5 | 0,
142 applyNew,
143 applyOld,
144 str;
145
146 if (hasClass && ratio) {
147 applyNew = newClass && i;
148 applyOld = oldClass && i !== l;
149 str = (applyNew ? "<span class='" + newClass + "'>" : "") + text.slice(0, i).join(delimiter) + (applyNew ? "</span>" : "") + (applyOld ? "<span class='" + oldClass + "'>" : "") + delimiter + original.slice(i).join(delimiter) + (applyOld ? "</span>" : "");
150 } else {
151 str = text.slice(0, i).join(delimiter) + delimiter + original.slice(i).join(delimiter);
152 }
153
154 if (data.svg) {
155 //SVG text elements don't have an "innerHTML" in Microsoft browsers.
156 target.textContent = str;
157 } else {
158 target.innerHTML = fillChar === "&nbsp;" && ~str.indexOf(" ") ? str.split(" ").join("&nbsp;&nbsp;") : str;
159 }
160 }
161};
162TextPlugin.splitInnerHTML = splitInnerHTML;
163TextPlugin.emojiSafeSplit = emojiSafeSplit;
164TextPlugin.getText = getText;
165_getGSAP() && gsap.registerPlugin(TextPlugin);
166export { TextPlugin as default };
\No newline at end of file