@d3plus/text 3.0.0-alpha.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.
@@ -0,0 +1,1806 @@
1
+ /*
2
+ @d3plus/text v3.0.0
3
+ A smart SVG text box with line wrapping and automatic font size scaling.
4
+ Copyright (c) 2025 D3plus - https://d3plus.org
5
+ @license MIT
6
+ */
7
+
8
+ (function (factory) {
9
+ typeof define === 'function' && define.amd ? define(factory) :
10
+ factory();
11
+ })((function () { 'use strict';
12
+
13
+ if (typeof window !== "undefined") {
14
+ (function () {
15
+ try {
16
+ if (typeof SVGElement === 'undefined' || Boolean(SVGElement.prototype.innerHTML)) {
17
+ return;
18
+ }
19
+ } catch (e) {
20
+ return;
21
+ }
22
+
23
+ function serializeNode (node) {
24
+ switch (node.nodeType) {
25
+ case 1:
26
+ return serializeElementNode(node);
27
+ case 3:
28
+ return serializeTextNode(node);
29
+ case 8:
30
+ return serializeCommentNode(node);
31
+ }
32
+ }
33
+
34
+ function serializeTextNode (node) {
35
+ return node.textContent.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
36
+ }
37
+
38
+ function serializeCommentNode (node) {
39
+ return '<!--' + node.nodeValue + '-->'
40
+ }
41
+
42
+ function serializeElementNode (node) {
43
+ var output = '';
44
+
45
+ output += '<' + node.tagName;
46
+
47
+ if (node.hasAttributes()) {
48
+ [].forEach.call(node.attributes, function(attrNode) {
49
+ output += ' ' + attrNode.name + '="' + attrNode.value + '"';
50
+ });
51
+ }
52
+
53
+ output += '>';
54
+
55
+ if (node.hasChildNodes()) {
56
+ [].forEach.call(node.childNodes, function(childNode) {
57
+ output += serializeNode(childNode);
58
+ });
59
+ }
60
+
61
+ output += '</' + node.tagName + '>';
62
+
63
+ return output;
64
+ }
65
+
66
+ Object.defineProperty(SVGElement.prototype, 'innerHTML', {
67
+ get: function () {
68
+ var output = '';
69
+
70
+ [].forEach.call(this.childNodes, function(childNode) {
71
+ output += serializeNode(childNode);
72
+ });
73
+
74
+ return output;
75
+ },
76
+ set: function (markup) {
77
+ while (this.firstChild) {
78
+ this.removeChild(this.firstChild);
79
+ }
80
+
81
+ try {
82
+ var dXML = new DOMParser();
83
+ dXML.async = false;
84
+
85
+ var sXML = '<svg xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\'>' + markup + '</svg>';
86
+ var svgDocElement = dXML.parseFromString(sXML, 'text/xml').documentElement;
87
+
88
+ [].forEach.call(svgDocElement.childNodes, function(childNode) {
89
+ this.appendChild(this.ownerDocument.importNode(childNode, true));
90
+ }.bind(this));
91
+ } catch (e) {
92
+ throw new Error('Error parsing markup string');
93
+ }
94
+ }
95
+ });
96
+
97
+ Object.defineProperty(SVGElement.prototype, 'innerSVG', {
98
+ get: function () {
99
+ return this.innerHTML;
100
+ },
101
+ set: function (markup) {
102
+ this.innerHTML = markup;
103
+ }
104
+ });
105
+
106
+ })();
107
+ }
108
+
109
+ }));
110
+
111
+ (function (global, factory) {
112
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('@d3plus/dom')) :
113
+ typeof define === 'function' && define.amd ? define('@d3plus/text', ['exports', 'd3-array', '@d3plus/dom'], factory) :
114
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3plus = {}, global.d3Array, global.dom));
115
+ })(this, (function (exports, d3Array, dom) { 'use strict';
116
+
117
+ /**
118
+ @const fontFamily
119
+ @desc The default fallback font list used for all text labels as an Array of Strings.
120
+ @returns {Array<string>}
121
+ */ const fontFamily = [
122
+ "Inter",
123
+ "Helvetica Neue",
124
+ "HelveticaNeue",
125
+ "Helvetica",
126
+ "Arial",
127
+ "sans-serif"
128
+ ];
129
+ /**
130
+ @const fontFamilyStringify
131
+ @desc Converts an Array of font-family names into a CSS font-family string.
132
+ @param {String|Array<string>} *family*
133
+ @returns {String}
134
+ */ const fontFamilyStringify = (family)=>(typeof family === "string" ? [
135
+ family
136
+ ] : family).map((d)=>d.match(/^[a-z-_]{1,}$/) ? d : `'${d}'`).join(", ");
137
+
138
+ /**
139
+ @function stringify
140
+ @desc Coerces value into a String.
141
+ @param {String} value
142
+ */ function stringify(value) {
143
+ if (value === void 0) value = "undefined";
144
+ else if (!(typeof value === "string" || value instanceof String)) value = JSON.stringify(value);
145
+ return value;
146
+ }
147
+
148
+ // great unicode list: http://asecuritysite.com/coding/asc2
149
+ const diacritics = [
150
+ [
151
+ /[\300-\305]/g,
152
+ "A"
153
+ ],
154
+ [
155
+ /[\340-\345]/g,
156
+ "a"
157
+ ],
158
+ [
159
+ /[\306]/g,
160
+ "AE"
161
+ ],
162
+ [
163
+ /[\346]/g,
164
+ "ae"
165
+ ],
166
+ [
167
+ /[\337]/g,
168
+ "B"
169
+ ],
170
+ [
171
+ /[\307]/g,
172
+ "C"
173
+ ],
174
+ [
175
+ /[\347]/g,
176
+ "c"
177
+ ],
178
+ [
179
+ /[\320\336\376]/g,
180
+ "D"
181
+ ],
182
+ [
183
+ /[\360]/g,
184
+ "d"
185
+ ],
186
+ [
187
+ /[\310-\313]/g,
188
+ "E"
189
+ ],
190
+ [
191
+ /[\350-\353]/g,
192
+ "e"
193
+ ],
194
+ [
195
+ /[\314-\317]/g,
196
+ "I"
197
+ ],
198
+ [
199
+ /[\354-\357]/g,
200
+ "i"
201
+ ],
202
+ [
203
+ /[\321]/g,
204
+ "N"
205
+ ],
206
+ [
207
+ /[\361]/g,
208
+ "n"
209
+ ],
210
+ [
211
+ /[\u014c\322-\326\330]/g,
212
+ "O"
213
+ ],
214
+ [
215
+ /[\u014d\362-\366\370]/g,
216
+ "o"
217
+ ],
218
+ [
219
+ /[\u016a\331-\334]/g,
220
+ "U"
221
+ ],
222
+ [
223
+ /[\u016b\371-\374]/g,
224
+ "u"
225
+ ],
226
+ [
227
+ /[\327]/g,
228
+ "x"
229
+ ],
230
+ [
231
+ /[\335]/g,
232
+ "Y"
233
+ ],
234
+ [
235
+ /[\375\377]/g,
236
+ "y"
237
+ ]
238
+ ];
239
+ /**
240
+ @function strip
241
+ @desc Removes all non ASCII characters from a string.
242
+ @param {String} value
243
+ @param {String} [spacer = "-"]
244
+ */ function strip(value, spacer = "-") {
245
+ return `${value}`.replace(/[^A-Za-z0-9\-_\u0621-\u064A]/g, (char)=>{
246
+ if (char === " ") return spacer;
247
+ let ret = false;
248
+ for(let d = 0; d < diacritics.length; d++){
249
+ if (new RegExp(diacritics[d][0]).test(char)) {
250
+ ret = diacritics[d][1];
251
+ break;
252
+ }
253
+ }
254
+ return ret || "";
255
+ });
256
+ }
257
+
258
+ // scraped from http://www.fileformat.info/info/unicode/category/Mc/list.htm
259
+ // and http://www.fileformat.info/info/unicode/category/Mn/list.htm
260
+ // JSON.stringify([].slice.call(document.getElementsByClassName("table-list")[0].getElementsByTagName("tr")).filter(function(d){ return d.getElementsByTagName("a").length && d.getElementsByTagName("a")[0].innerHTML.length === 6; }).map(function(d){ return d.getElementsByTagName("a")[0].innerHTML.replace("U", "u").replace("+", ""); }).sort());
261
+ // The following unicode characters combine to form new characters and should never be split from surrounding characters.
262
+ const a = [
263
+ "u0903",
264
+ "u093B",
265
+ "u093E",
266
+ "u093F",
267
+ "u0940",
268
+ "u0949",
269
+ "u094A",
270
+ "u094B",
271
+ "u094C",
272
+ "u094E",
273
+ "u094F",
274
+ "u0982",
275
+ "u0983",
276
+ "u09BE",
277
+ "u09BF",
278
+ "u09C0",
279
+ "u09C7",
280
+ "u09C8",
281
+ "u09CB",
282
+ "u09CC",
283
+ "u09D7",
284
+ "u0A03",
285
+ "u0A3E",
286
+ "u0A3F",
287
+ "u0A40",
288
+ "u0A83",
289
+ "u0ABE",
290
+ "u0ABF",
291
+ "u0AC0",
292
+ "u0AC9",
293
+ "u0ACB",
294
+ "u0ACC",
295
+ "u0B02",
296
+ "u0B03",
297
+ "u0B3E",
298
+ "u0B40",
299
+ "u0B47",
300
+ "u0B48",
301
+ "u0B4B",
302
+ "u0B4C",
303
+ "u0B57",
304
+ "u0BBE",
305
+ "u0BBF",
306
+ "u0BC1",
307
+ "u0BC2",
308
+ "u0BC6",
309
+ "u0BC7",
310
+ "u0BC8",
311
+ "u0BCA",
312
+ "u0BCB",
313
+ "u0BCC",
314
+ "u0BD7",
315
+ "u0C01",
316
+ "u0C02",
317
+ "u0C03",
318
+ "u0C41",
319
+ "u0C42",
320
+ "u0C43",
321
+ "u0C44",
322
+ "u0C82",
323
+ "u0C83",
324
+ "u0CBE",
325
+ "u0CC0",
326
+ "u0CC1",
327
+ "u0CC2",
328
+ "u0CC3",
329
+ "u0CC4",
330
+ "u0CC7",
331
+ "u0CC8",
332
+ "u0CCA",
333
+ "u0CCB",
334
+ "u0CD5",
335
+ "u0CD6",
336
+ "u0D02",
337
+ "u0D03",
338
+ "u0D3E",
339
+ "u0D3F",
340
+ "u0D40",
341
+ "u0D46",
342
+ "u0D47",
343
+ "u0D48",
344
+ "u0D4A",
345
+ "u0D4B",
346
+ "u0D4C",
347
+ "u0D57",
348
+ "u0D82",
349
+ "u0D83",
350
+ "u0DCF",
351
+ "u0DD0",
352
+ "u0DD1",
353
+ "u0DD8",
354
+ "u0DD9",
355
+ "u0DDA",
356
+ "u0DDB",
357
+ "u0DDC",
358
+ "u0DDD",
359
+ "u0DDE",
360
+ "u0DDF",
361
+ "u0DF2",
362
+ "u0DF3",
363
+ "u0F3E",
364
+ "u0F3F",
365
+ "u0F7F",
366
+ "u102B",
367
+ "u102C",
368
+ "u1031",
369
+ "u1038",
370
+ "u103B",
371
+ "u103C",
372
+ "u1056",
373
+ "u1057",
374
+ "u1062",
375
+ "u1063",
376
+ "u1064",
377
+ "u1067",
378
+ "u1068",
379
+ "u1069",
380
+ "u106A",
381
+ "u106B",
382
+ "u106C",
383
+ "u106D",
384
+ "u1083",
385
+ "u1084",
386
+ "u1087",
387
+ "u1088",
388
+ "u1089",
389
+ "u108A",
390
+ "u108B",
391
+ "u108C",
392
+ "u108F",
393
+ "u109A",
394
+ "u109B",
395
+ "u109C",
396
+ "u17B6",
397
+ "u17BE",
398
+ "u17BF",
399
+ "u17C0",
400
+ "u17C1",
401
+ "u17C2",
402
+ "u17C3",
403
+ "u17C4",
404
+ "u17C5",
405
+ "u17C7",
406
+ "u17C8",
407
+ "u1923",
408
+ "u1924",
409
+ "u1925",
410
+ "u1926",
411
+ "u1929",
412
+ "u192A",
413
+ "u192B",
414
+ "u1930",
415
+ "u1931",
416
+ "u1933",
417
+ "u1934",
418
+ "u1935",
419
+ "u1936",
420
+ "u1937",
421
+ "u1938",
422
+ "u1A19",
423
+ "u1A1A",
424
+ "u1A55",
425
+ "u1A57",
426
+ "u1A61",
427
+ "u1A63",
428
+ "u1A64",
429
+ "u1A6D",
430
+ "u1A6E",
431
+ "u1A6F",
432
+ "u1A70",
433
+ "u1A71",
434
+ "u1A72",
435
+ "u1B04",
436
+ "u1B35",
437
+ "u1B3B",
438
+ "u1B3D",
439
+ "u1B3E",
440
+ "u1B3F",
441
+ "u1B40",
442
+ "u1B41",
443
+ "u1B43",
444
+ "u1B44",
445
+ "u1B82",
446
+ "u1BA1",
447
+ "u1BA6",
448
+ "u1BA7",
449
+ "u1BAA",
450
+ "u1BE7",
451
+ "u1BEA",
452
+ "u1BEB",
453
+ "u1BEC",
454
+ "u1BEE",
455
+ "u1BF2",
456
+ "u1BF3",
457
+ "u1C24",
458
+ "u1C25",
459
+ "u1C26",
460
+ "u1C27",
461
+ "u1C28",
462
+ "u1C29",
463
+ "u1C2A",
464
+ "u1C2B",
465
+ "u1C34",
466
+ "u1C35",
467
+ "u1CE1",
468
+ "u1CF2",
469
+ "u1CF3",
470
+ "u302E",
471
+ "u302F",
472
+ "uA823",
473
+ "uA824",
474
+ "uA827",
475
+ "uA880",
476
+ "uA881",
477
+ "uA8B4",
478
+ "uA8B5",
479
+ "uA8B6",
480
+ "uA8B7",
481
+ "uA8B8",
482
+ "uA8B9",
483
+ "uA8BA",
484
+ "uA8BB",
485
+ "uA8BC",
486
+ "uA8BD",
487
+ "uA8BE",
488
+ "uA8BF",
489
+ "uA8C0",
490
+ "uA8C1",
491
+ "uA8C2",
492
+ "uA8C3",
493
+ "uA952",
494
+ "uA953",
495
+ "uA983",
496
+ "uA9B4",
497
+ "uA9B5",
498
+ "uA9BA",
499
+ "uA9BB",
500
+ "uA9BD",
501
+ "uA9BE",
502
+ "uA9BF",
503
+ "uA9C0",
504
+ "uAA2F",
505
+ "uAA30",
506
+ "uAA33",
507
+ "uAA34",
508
+ "uAA4D",
509
+ "uAA7B",
510
+ "uAA7D",
511
+ "uAAEB",
512
+ "uAAEE",
513
+ "uAAEF",
514
+ "uAAF5",
515
+ "uABE3",
516
+ "uABE4",
517
+ "uABE6",
518
+ "uABE7",
519
+ "uABE9",
520
+ "uABEA",
521
+ "uABEC"
522
+ ];
523
+ const b = [
524
+ "u0300",
525
+ "u0301",
526
+ "u0302",
527
+ "u0303",
528
+ "u0304",
529
+ "u0305",
530
+ "u0306",
531
+ "u0307",
532
+ "u0308",
533
+ "u0309",
534
+ "u030A",
535
+ "u030B",
536
+ "u030C",
537
+ "u030D",
538
+ "u030E",
539
+ "u030F",
540
+ "u0310",
541
+ "u0311",
542
+ "u0312",
543
+ "u0313",
544
+ "u0314",
545
+ "u0315",
546
+ "u0316",
547
+ "u0317",
548
+ "u0318",
549
+ "u0319",
550
+ "u031A",
551
+ "u031B",
552
+ "u031C",
553
+ "u031D",
554
+ "u031E",
555
+ "u031F",
556
+ "u0320",
557
+ "u0321",
558
+ "u0322",
559
+ "u0323",
560
+ "u0324",
561
+ "u0325",
562
+ "u0326",
563
+ "u0327",
564
+ "u0328",
565
+ "u0329",
566
+ "u032A",
567
+ "u032B",
568
+ "u032C",
569
+ "u032D",
570
+ "u032E",
571
+ "u032F",
572
+ "u0330",
573
+ "u0331",
574
+ "u0332",
575
+ "u0333",
576
+ "u0334",
577
+ "u0335",
578
+ "u0336",
579
+ "u0337",
580
+ "u0338",
581
+ "u0339",
582
+ "u033A",
583
+ "u033B",
584
+ "u033C",
585
+ "u033D",
586
+ "u033E",
587
+ "u033F",
588
+ "u0340",
589
+ "u0341",
590
+ "u0342",
591
+ "u0343",
592
+ "u0344",
593
+ "u0345",
594
+ "u0346",
595
+ "u0347",
596
+ "u0348",
597
+ "u0349",
598
+ "u034A",
599
+ "u034B",
600
+ "u034C",
601
+ "u034D",
602
+ "u034E",
603
+ "u034F",
604
+ "u0350",
605
+ "u0351",
606
+ "u0352",
607
+ "u0353",
608
+ "u0354",
609
+ "u0355",
610
+ "u0356",
611
+ "u0357",
612
+ "u0358",
613
+ "u0359",
614
+ "u035A",
615
+ "u035B",
616
+ "u035C",
617
+ "u035D",
618
+ "u035E",
619
+ "u035F",
620
+ "u0360",
621
+ "u0361",
622
+ "u0362",
623
+ "u0363",
624
+ "u0364",
625
+ "u0365",
626
+ "u0366",
627
+ "u0367",
628
+ "u0368",
629
+ "u0369",
630
+ "u036A",
631
+ "u036B",
632
+ "u036C",
633
+ "u036D",
634
+ "u036E",
635
+ "u036F",
636
+ "u0483",
637
+ "u0484",
638
+ "u0485",
639
+ "u0486",
640
+ "u0487",
641
+ "u0591",
642
+ "u0592",
643
+ "u0593",
644
+ "u0594",
645
+ "u0595",
646
+ "u0596",
647
+ "u0597",
648
+ "u0598",
649
+ "u0599",
650
+ "u059A",
651
+ "u059B",
652
+ "u059C",
653
+ "u059D",
654
+ "u059E",
655
+ "u059F",
656
+ "u05A0",
657
+ "u05A1",
658
+ "u05A2",
659
+ "u05A3",
660
+ "u05A4",
661
+ "u05A5",
662
+ "u05A6",
663
+ "u05A7",
664
+ "u05A8",
665
+ "u05A9",
666
+ "u05AA",
667
+ "u05AB",
668
+ "u05AC",
669
+ "u05AD",
670
+ "u05AE",
671
+ "u05AF",
672
+ "u05B0",
673
+ "u05B1",
674
+ "u05B2",
675
+ "u05B3",
676
+ "u05B4",
677
+ "u05B5",
678
+ "u05B6",
679
+ "u05B7",
680
+ "u05B8",
681
+ "u05B9",
682
+ "u05BA",
683
+ "u05BB",
684
+ "u05BC",
685
+ "u05BD",
686
+ "u05BF",
687
+ "u05C1",
688
+ "u05C2",
689
+ "u05C4",
690
+ "u05C5",
691
+ "u05C7",
692
+ "u0610",
693
+ "u0611",
694
+ "u0612",
695
+ "u0613",
696
+ "u0614",
697
+ "u0615",
698
+ "u0616",
699
+ "u0617",
700
+ "u0618",
701
+ "u0619",
702
+ "u061A",
703
+ "u064B",
704
+ "u064C",
705
+ "u064D",
706
+ "u064E",
707
+ "u064F",
708
+ "u0650",
709
+ "u0651",
710
+ "u0652",
711
+ "u0653",
712
+ "u0654",
713
+ "u0655",
714
+ "u0656",
715
+ "u0657",
716
+ "u0658",
717
+ "u0659",
718
+ "u065A",
719
+ "u065B",
720
+ "u065C",
721
+ "u065D",
722
+ "u065E",
723
+ "u065F",
724
+ "u0670",
725
+ "u06D6",
726
+ "u06D7",
727
+ "u06D8",
728
+ "u06D9",
729
+ "u06DA",
730
+ "u06DB",
731
+ "u06DC",
732
+ "u06DF",
733
+ "u06E0",
734
+ "u06E1",
735
+ "u06E2",
736
+ "u06E3",
737
+ "u06E4",
738
+ "u06E7",
739
+ "u06E8",
740
+ "u06EA",
741
+ "u06EB",
742
+ "u06EC",
743
+ "u06ED",
744
+ "u0711",
745
+ "u0730",
746
+ "u0731",
747
+ "u0732",
748
+ "u0733",
749
+ "u0734",
750
+ "u0735",
751
+ "u0736",
752
+ "u0737",
753
+ "u0738",
754
+ "u0739",
755
+ "u073A",
756
+ "u073B",
757
+ "u073C",
758
+ "u073D",
759
+ "u073E",
760
+ "u073F",
761
+ "u0740",
762
+ "u0741",
763
+ "u0742",
764
+ "u0743",
765
+ "u0744",
766
+ "u0745",
767
+ "u0746",
768
+ "u0747",
769
+ "u0748",
770
+ "u0749",
771
+ "u074A",
772
+ "u07A6",
773
+ "u07A7",
774
+ "u07A8",
775
+ "u07A9",
776
+ "u07AA",
777
+ "u07AB",
778
+ "u07AC",
779
+ "u07AD",
780
+ "u07AE",
781
+ "u07AF",
782
+ "u07B0",
783
+ "u07EB",
784
+ "u07EC",
785
+ "u07ED",
786
+ "u07EE",
787
+ "u07EF",
788
+ "u07F0",
789
+ "u07F1",
790
+ "u07F2",
791
+ "u07F3",
792
+ "u0816",
793
+ "u0817",
794
+ "u0818",
795
+ "u0819",
796
+ "u081B",
797
+ "u081C",
798
+ "u081D",
799
+ "u081E",
800
+ "u081F",
801
+ "u0820",
802
+ "u0821",
803
+ "u0822",
804
+ "u0823",
805
+ "u0825",
806
+ "u0826",
807
+ "u0827",
808
+ "u0829",
809
+ "u082A",
810
+ "u082B",
811
+ "u082C",
812
+ "u082D",
813
+ "u0859",
814
+ "u085A",
815
+ "u085B",
816
+ "u08E3",
817
+ "u08E4",
818
+ "u08E5",
819
+ "u08E6",
820
+ "u08E7",
821
+ "u08E8",
822
+ "u08E9",
823
+ "u08EA",
824
+ "u08EB",
825
+ "u08EC",
826
+ "u08ED",
827
+ "u08EE",
828
+ "u08EF",
829
+ "u08F0",
830
+ "u08F1",
831
+ "u08F2",
832
+ "u08F3",
833
+ "u08F4",
834
+ "u08F5",
835
+ "u08F6",
836
+ "u08F7",
837
+ "u08F8",
838
+ "u08F9",
839
+ "u08FA",
840
+ "u08FB",
841
+ "u08FC",
842
+ "u08FD",
843
+ "u08FE",
844
+ "u08FF",
845
+ "u0900",
846
+ "u0901",
847
+ "u0902",
848
+ "u093A",
849
+ "u093C",
850
+ "u0941",
851
+ "u0942",
852
+ "u0943",
853
+ "u0944",
854
+ "u0945",
855
+ "u0946",
856
+ "u0947",
857
+ "u0948",
858
+ "u094D",
859
+ "u0951",
860
+ "u0952",
861
+ "u0953",
862
+ "u0954",
863
+ "u0955",
864
+ "u0956",
865
+ "u0957",
866
+ "u0962",
867
+ "u0963",
868
+ "u0981",
869
+ "u09BC",
870
+ "u09C1",
871
+ "u09C2",
872
+ "u09C3",
873
+ "u09C4",
874
+ "u09CD",
875
+ "u09E2",
876
+ "u09E3",
877
+ "u0A01",
878
+ "u0A02",
879
+ "u0A3C",
880
+ "u0A41",
881
+ "u0A42",
882
+ "u0A47",
883
+ "u0A48",
884
+ "u0A4B",
885
+ "u0A4C",
886
+ "u0A4D",
887
+ "u0A51",
888
+ "u0A70",
889
+ "u0A71",
890
+ "u0A75",
891
+ "u0A81",
892
+ "u0A82",
893
+ "u0ABC",
894
+ "u0AC1",
895
+ "u0AC2",
896
+ "u0AC3",
897
+ "u0AC4",
898
+ "u0AC5",
899
+ "u0AC7",
900
+ "u0AC8",
901
+ "u0ACD",
902
+ "u0AE2",
903
+ "u0AE3",
904
+ "u0B01",
905
+ "u0B3C",
906
+ "u0B3F",
907
+ "u0B41",
908
+ "u0B42",
909
+ "u0B43",
910
+ "u0B44",
911
+ "u0B4D",
912
+ "u0B56",
913
+ "u0B62",
914
+ "u0B63",
915
+ "u0B82",
916
+ "u0BC0",
917
+ "u0BCD",
918
+ "u0C00",
919
+ "u0C3E",
920
+ "u0C3F",
921
+ "u0C40",
922
+ "u0C46",
923
+ "u0C47",
924
+ "u0C48",
925
+ "u0C4A",
926
+ "u0C4B",
927
+ "u0C4C",
928
+ "u0C4D",
929
+ "u0C55",
930
+ "u0C56",
931
+ "u0C62",
932
+ "u0C63",
933
+ "u0C81",
934
+ "u0CBC",
935
+ "u0CBF",
936
+ "u0CC6",
937
+ "u0CCC",
938
+ "u0CCD",
939
+ "u0CE2",
940
+ "u0CE3",
941
+ "u0D01",
942
+ "u0D41",
943
+ "u0D42",
944
+ "u0D43",
945
+ "u0D44",
946
+ "u0D4D",
947
+ "u0D62",
948
+ "u0D63",
949
+ "u0DCA",
950
+ "u0DD2",
951
+ "u0DD3",
952
+ "u0DD4",
953
+ "u0DD6",
954
+ "u0E31",
955
+ "u0E34",
956
+ "u0E35",
957
+ "u0E36",
958
+ "u0E37",
959
+ "u0E38",
960
+ "u0E39",
961
+ "u0E3A",
962
+ "u0E47",
963
+ "u0E48",
964
+ "u0E49",
965
+ "u0E4A",
966
+ "u0E4B",
967
+ "u0E4C",
968
+ "u0E4D",
969
+ "u0E4E",
970
+ "u0EB1",
971
+ "u0EB4",
972
+ "u0EB5",
973
+ "u0EB6",
974
+ "u0EB7",
975
+ "u0EB8",
976
+ "u0EB9",
977
+ "u0EBB",
978
+ "u0EBC",
979
+ "u0EC8",
980
+ "u0EC9",
981
+ "u0ECA",
982
+ "u0ECB",
983
+ "u0ECC",
984
+ "u0ECD",
985
+ "u0F18",
986
+ "u0F19",
987
+ "u0F35",
988
+ "u0F37",
989
+ "u0F39",
990
+ "u0F71",
991
+ "u0F72",
992
+ "u0F73",
993
+ "u0F74",
994
+ "u0F75",
995
+ "u0F76",
996
+ "u0F77",
997
+ "u0F78",
998
+ "u0F79",
999
+ "u0F7A",
1000
+ "u0F7B",
1001
+ "u0F7C",
1002
+ "u0F7D",
1003
+ "u0F7E",
1004
+ "u0F80",
1005
+ "u0F81",
1006
+ "u0F82",
1007
+ "u0F83",
1008
+ "u0F84",
1009
+ "u0F86",
1010
+ "u0F87",
1011
+ "u0F8D",
1012
+ "u0F8E",
1013
+ "u0F8F",
1014
+ "u0F90",
1015
+ "u0F91",
1016
+ "u0F92",
1017
+ "u0F93",
1018
+ "u0F94",
1019
+ "u0F95",
1020
+ "u0F96",
1021
+ "u0F97",
1022
+ "u0F99",
1023
+ "u0F9A",
1024
+ "u0F9B",
1025
+ "u0F9C",
1026
+ "u0F9D",
1027
+ "u0F9E",
1028
+ "u0F9F",
1029
+ "u0FA0",
1030
+ "u0FA1",
1031
+ "u0FA2",
1032
+ "u0FA3",
1033
+ "u0FA4",
1034
+ "u0FA5",
1035
+ "u0FA6",
1036
+ "u0FA7",
1037
+ "u0FA8",
1038
+ "u0FA9",
1039
+ "u0FAA",
1040
+ "u0FAB",
1041
+ "u0FAC",
1042
+ "u0FAD",
1043
+ "u0FAE",
1044
+ "u0FAF",
1045
+ "u0FB0",
1046
+ "u0FB1",
1047
+ "u0FB2",
1048
+ "u0FB3",
1049
+ "u0FB4",
1050
+ "u0FB5",
1051
+ "u0FB6",
1052
+ "u0FB7",
1053
+ "u0FB8",
1054
+ "u0FB9",
1055
+ "u0FBA",
1056
+ "u0FBB",
1057
+ "u0FBC",
1058
+ "u0FC6",
1059
+ "u102D",
1060
+ "u102E",
1061
+ "u102F",
1062
+ "u1030",
1063
+ "u1032",
1064
+ "u1033",
1065
+ "u1034",
1066
+ "u1035",
1067
+ "u1036",
1068
+ "u1037",
1069
+ "u1039",
1070
+ "u103A",
1071
+ "u103D",
1072
+ "u103E",
1073
+ "u1058",
1074
+ "u1059",
1075
+ "u105E",
1076
+ "u105F",
1077
+ "u1060",
1078
+ "u1071",
1079
+ "u1072",
1080
+ "u1073",
1081
+ "u1074",
1082
+ "u1082",
1083
+ "u1085",
1084
+ "u1086",
1085
+ "u108D",
1086
+ "u109D",
1087
+ "u135D",
1088
+ "u135E",
1089
+ "u135F",
1090
+ "u1712",
1091
+ "u1713",
1092
+ "u1714",
1093
+ "u1732",
1094
+ "u1733",
1095
+ "u1734",
1096
+ "u1752",
1097
+ "u1753",
1098
+ "u1772",
1099
+ "u1773",
1100
+ "u17B4",
1101
+ "u17B5",
1102
+ "u17B7",
1103
+ "u17B8",
1104
+ "u17B9",
1105
+ "u17BA",
1106
+ "u17BB",
1107
+ "u17BC",
1108
+ "u17BD",
1109
+ "u17C6",
1110
+ "u17C9",
1111
+ "u17CA",
1112
+ "u17CB",
1113
+ "u17CC",
1114
+ "u17CD",
1115
+ "u17CE",
1116
+ "u17CF",
1117
+ "u17D0",
1118
+ "u17D1",
1119
+ "u17D2",
1120
+ "u17D3",
1121
+ "u17DD",
1122
+ "u180B",
1123
+ "u180C",
1124
+ "u180D",
1125
+ "u18A9",
1126
+ "u1920",
1127
+ "u1921",
1128
+ "u1922",
1129
+ "u1927",
1130
+ "u1928",
1131
+ "u1932",
1132
+ "u1939",
1133
+ "u193A",
1134
+ "u193B",
1135
+ "u1A17",
1136
+ "u1A18",
1137
+ "u1A1B",
1138
+ "u1A56",
1139
+ "u1A58",
1140
+ "u1A59",
1141
+ "u1A5A",
1142
+ "u1A5B",
1143
+ "u1A5C",
1144
+ "u1A5D",
1145
+ "u1A5E",
1146
+ "u1A60",
1147
+ "u1A62",
1148
+ "u1A65",
1149
+ "u1A66",
1150
+ "u1A67",
1151
+ "u1A68",
1152
+ "u1A69",
1153
+ "u1A6A",
1154
+ "u1A6B",
1155
+ "u1A6C",
1156
+ "u1A73",
1157
+ "u1A74",
1158
+ "u1A75",
1159
+ "u1A76",
1160
+ "u1A77",
1161
+ "u1A78",
1162
+ "u1A79",
1163
+ "u1A7A",
1164
+ "u1A7B",
1165
+ "u1A7C",
1166
+ "u1A7F",
1167
+ "u1AB0",
1168
+ "u1AB1",
1169
+ "u1AB2",
1170
+ "u1AB3",
1171
+ "u1AB4",
1172
+ "u1AB5",
1173
+ "u1AB6",
1174
+ "u1AB7",
1175
+ "u1AB8",
1176
+ "u1AB9",
1177
+ "u1ABA",
1178
+ "u1ABB",
1179
+ "u1ABC",
1180
+ "u1ABD",
1181
+ "u1B00",
1182
+ "u1B01",
1183
+ "u1B02",
1184
+ "u1B03",
1185
+ "u1B34",
1186
+ "u1B36",
1187
+ "u1B37",
1188
+ "u1B38",
1189
+ "u1B39",
1190
+ "u1B3A",
1191
+ "u1B3C",
1192
+ "u1B42",
1193
+ "u1B6B",
1194
+ "u1B6C",
1195
+ "u1B6D",
1196
+ "u1B6E",
1197
+ "u1B6F",
1198
+ "u1B70",
1199
+ "u1B71",
1200
+ "u1B72",
1201
+ "u1B73",
1202
+ "u1B80",
1203
+ "u1B81",
1204
+ "u1BA2",
1205
+ "u1BA3",
1206
+ "u1BA4",
1207
+ "u1BA5",
1208
+ "u1BA8",
1209
+ "u1BA9",
1210
+ "u1BAB",
1211
+ "u1BAC",
1212
+ "u1BAD",
1213
+ "u1BE6",
1214
+ "u1BE8",
1215
+ "u1BE9",
1216
+ "u1BED",
1217
+ "u1BEF",
1218
+ "u1BF0",
1219
+ "u1BF1",
1220
+ "u1C2C",
1221
+ "u1C2D",
1222
+ "u1C2E",
1223
+ "u1C2F",
1224
+ "u1C30",
1225
+ "u1C31",
1226
+ "u1C32",
1227
+ "u1C33",
1228
+ "u1C36",
1229
+ "u1C37",
1230
+ "u1CD0",
1231
+ "u1CD1",
1232
+ "u1CD2",
1233
+ "u1CD4",
1234
+ "u1CD5",
1235
+ "u1CD6",
1236
+ "u1CD7",
1237
+ "u1CD8",
1238
+ "u1CD9",
1239
+ "u1CDA",
1240
+ "u1CDB",
1241
+ "u1CDC",
1242
+ "u1CDD",
1243
+ "u1CDE",
1244
+ "u1CDF",
1245
+ "u1CE0",
1246
+ "u1CE2",
1247
+ "u1CE3",
1248
+ "u1CE4",
1249
+ "u1CE5",
1250
+ "u1CE6",
1251
+ "u1CE7",
1252
+ "u1CE8",
1253
+ "u1CED",
1254
+ "u1CF4",
1255
+ "u1CF8",
1256
+ "u1CF9",
1257
+ "u1DC0",
1258
+ "u1DC1",
1259
+ "u1DC2",
1260
+ "u1DC3",
1261
+ "u1DC4",
1262
+ "u1DC5",
1263
+ "u1DC6",
1264
+ "u1DC7",
1265
+ "u1DC8",
1266
+ "u1DC9",
1267
+ "u1DCA",
1268
+ "u1DCB",
1269
+ "u1DCC",
1270
+ "u1DCD",
1271
+ "u1DCE",
1272
+ "u1DCF",
1273
+ "u1DD0",
1274
+ "u1DD1",
1275
+ "u1DD2",
1276
+ "u1DD3",
1277
+ "u1DD4",
1278
+ "u1DD5",
1279
+ "u1DD6",
1280
+ "u1DD7",
1281
+ "u1DD8",
1282
+ "u1DD9",
1283
+ "u1DDA",
1284
+ "u1DDB",
1285
+ "u1DDC",
1286
+ "u1DDD",
1287
+ "u1DDE",
1288
+ "u1DDF",
1289
+ "u1DE0",
1290
+ "u1DE1",
1291
+ "u1DE2",
1292
+ "u1DE3",
1293
+ "u1DE4",
1294
+ "u1DE5",
1295
+ "u1DE6",
1296
+ "u1DE7",
1297
+ "u1DE8",
1298
+ "u1DE9",
1299
+ "u1DEA",
1300
+ "u1DEB",
1301
+ "u1DEC",
1302
+ "u1DED",
1303
+ "u1DEE",
1304
+ "u1DEF",
1305
+ "u1DF0",
1306
+ "u1DF1",
1307
+ "u1DF2",
1308
+ "u1DF3",
1309
+ "u1DF4",
1310
+ "u1DF5",
1311
+ "u1DFC",
1312
+ "u1DFD",
1313
+ "u1DFE",
1314
+ "u1DFF",
1315
+ "u20D0",
1316
+ "u20D1",
1317
+ "u20D2",
1318
+ "u20D3",
1319
+ "u20D4",
1320
+ "u20D5",
1321
+ "u20D6",
1322
+ "u20D7",
1323
+ "u20D8",
1324
+ "u20D9",
1325
+ "u20DA",
1326
+ "u20DB",
1327
+ "u20DC",
1328
+ "u20E1",
1329
+ "u20E5",
1330
+ "u20E6",
1331
+ "u20E7",
1332
+ "u20E8",
1333
+ "u20E9",
1334
+ "u20EA",
1335
+ "u20EB",
1336
+ "u20EC",
1337
+ "u20ED",
1338
+ "u20EE",
1339
+ "u20EF",
1340
+ "u20F0",
1341
+ "u2CEF",
1342
+ "u2CF0",
1343
+ "u2CF1",
1344
+ "u2D7F",
1345
+ "u2DE0",
1346
+ "u2DE1",
1347
+ "u2DE2",
1348
+ "u2DE3",
1349
+ "u2DE4",
1350
+ "u2DE5",
1351
+ "u2DE6",
1352
+ "u2DE7",
1353
+ "u2DE8",
1354
+ "u2DE9",
1355
+ "u2DEA",
1356
+ "u2DEB",
1357
+ "u2DEC",
1358
+ "u2DED",
1359
+ "u2DEE",
1360
+ "u2DEF",
1361
+ "u2DF0",
1362
+ "u2DF1",
1363
+ "u2DF2",
1364
+ "u2DF3",
1365
+ "u2DF4",
1366
+ "u2DF5",
1367
+ "u2DF6",
1368
+ "u2DF7",
1369
+ "u2DF8",
1370
+ "u2DF9",
1371
+ "u2DFA",
1372
+ "u2DFB",
1373
+ "u2DFC",
1374
+ "u2DFD",
1375
+ "u2DFE",
1376
+ "u2DFF",
1377
+ "u302A",
1378
+ "u302B",
1379
+ "u302C",
1380
+ "u302D",
1381
+ "u3099",
1382
+ "u309A",
1383
+ "uA66F",
1384
+ "uA674",
1385
+ "uA675",
1386
+ "uA676",
1387
+ "uA677",
1388
+ "uA678",
1389
+ "uA679",
1390
+ "uA67A",
1391
+ "uA67B",
1392
+ "uA67C",
1393
+ "uA67D",
1394
+ "uA69E",
1395
+ "uA69F",
1396
+ "uA6F0",
1397
+ "uA6F1",
1398
+ "uA802",
1399
+ "uA806",
1400
+ "uA80B",
1401
+ "uA825",
1402
+ "uA826",
1403
+ "uA8C4",
1404
+ "uA8E0",
1405
+ "uA8E1",
1406
+ "uA8E2",
1407
+ "uA8E3",
1408
+ "uA8E4",
1409
+ "uA8E5",
1410
+ "uA8E6",
1411
+ "uA8E7",
1412
+ "uA8E8",
1413
+ "uA8E9",
1414
+ "uA8EA",
1415
+ "uA8EB",
1416
+ "uA8EC",
1417
+ "uA8ED",
1418
+ "uA8EE",
1419
+ "uA8EF",
1420
+ "uA8F0",
1421
+ "uA8F1",
1422
+ "uA926",
1423
+ "uA927",
1424
+ "uA928",
1425
+ "uA929",
1426
+ "uA92A",
1427
+ "uA92B",
1428
+ "uA92C",
1429
+ "uA92D",
1430
+ "uA947",
1431
+ "uA948",
1432
+ "uA949",
1433
+ "uA94A",
1434
+ "uA94B",
1435
+ "uA94C",
1436
+ "uA94D",
1437
+ "uA94E",
1438
+ "uA94F",
1439
+ "uA950",
1440
+ "uA951",
1441
+ "uA980",
1442
+ "uA981",
1443
+ "uA982",
1444
+ "uA9B3",
1445
+ "uA9B6",
1446
+ "uA9B7",
1447
+ "uA9B8",
1448
+ "uA9B9",
1449
+ "uA9BC",
1450
+ "uA9E5",
1451
+ "uAA29",
1452
+ "uAA2A",
1453
+ "uAA2B",
1454
+ "uAA2C",
1455
+ "uAA2D",
1456
+ "uAA2E",
1457
+ "uAA31",
1458
+ "uAA32",
1459
+ "uAA35",
1460
+ "uAA36",
1461
+ "uAA43",
1462
+ "uAA4C",
1463
+ "uAA7C",
1464
+ "uAAB0",
1465
+ "uAAB2",
1466
+ "uAAB3",
1467
+ "uAAB4",
1468
+ "uAAB7",
1469
+ "uAAB8",
1470
+ "uAABE",
1471
+ "uAABF",
1472
+ "uAAC1",
1473
+ "uAAEC",
1474
+ "uAAED",
1475
+ "uAAF6",
1476
+ "uABE5",
1477
+ "uABE8",
1478
+ "uABED",
1479
+ "uFB1E",
1480
+ "uFE00",
1481
+ "uFE01",
1482
+ "uFE02",
1483
+ "uFE03",
1484
+ "uFE04",
1485
+ "uFE05",
1486
+ "uFE06",
1487
+ "uFE07",
1488
+ "uFE08",
1489
+ "uFE09",
1490
+ "uFE0A",
1491
+ "uFE0B",
1492
+ "uFE0C",
1493
+ "uFE0D",
1494
+ "uFE0E",
1495
+ "uFE0F",
1496
+ "uFE20",
1497
+ "uFE21",
1498
+ "uFE22",
1499
+ "uFE23",
1500
+ "uFE24",
1501
+ "uFE25",
1502
+ "uFE26",
1503
+ "uFE27",
1504
+ "uFE28",
1505
+ "uFE29",
1506
+ "uFE2A",
1507
+ "uFE2B",
1508
+ "uFE2C",
1509
+ "uFE2D",
1510
+ "uFE2E",
1511
+ "uFE2F"
1512
+ ];
1513
+ var combiningMarks = a.concat(b);
1514
+
1515
+ const splitChars = [
1516
+ "-",
1517
+ ";",
1518
+ ":",
1519
+ "&",
1520
+ "|",
1521
+ "u0E2F",
1522
+ "u0EAF",
1523
+ "u0EC6",
1524
+ "u0ECC",
1525
+ "u104A",
1526
+ "u104B",
1527
+ "u104C",
1528
+ "u104D",
1529
+ "u104E",
1530
+ "u104F",
1531
+ "u2013",
1532
+ "u2014",
1533
+ "u2027",
1534
+ "u3000",
1535
+ "u3001",
1536
+ "u3002",
1537
+ "uFF0C",
1538
+ "uFF5E" // wave dash
1539
+ ];
1540
+ const prefixChars = [
1541
+ "'",
1542
+ "<",
1543
+ "(",
1544
+ "{",
1545
+ "[",
1546
+ "u00AB",
1547
+ "u300A",
1548
+ "u3008" // left angle bracket
1549
+ ];
1550
+ const suffixChars = [
1551
+ "'",
1552
+ ">",
1553
+ ")",
1554
+ "}",
1555
+ "]",
1556
+ ".",
1557
+ "!",
1558
+ "?",
1559
+ "/",
1560
+ "u00BB",
1561
+ "u300B",
1562
+ "u3009" // right angle bracket
1563
+ ].concat(splitChars);
1564
+ const burmeseRange = "\u1000-\u102A\u103F-\u1049\u1050-\u1055";
1565
+ const japaneseRange = "\u3040-\u309f\u30a0-\u30ff\uff00-\uff0b\uff0d-\uff5d\uff5f-\uff9f\u3400-\u4dbf";
1566
+ const chineseRange = "\u3400-\u9FBF";
1567
+ const laoRange = "\u0E81-\u0EAE\u0EB0-\u0EC4\u0EC8-\u0ECB\u0ECD-\u0EDD";
1568
+ const noSpaceRange = burmeseRange + chineseRange + japaneseRange + laoRange;
1569
+ const splitWords = new RegExp(`(\\${splitChars.join("|\\")})*[^\\s|\\${splitChars.join("|\\")}]*(\\${splitChars.join("|\\")})*`, "g");
1570
+ const noSpaceLanguage = new RegExp(`[${noSpaceRange}]`);
1571
+ const splitAllChars = new RegExp(`(\\${prefixChars.join("|\\")})*[${noSpaceRange}](\\${suffixChars.join("|\\")}|\\${combiningMarks.join("|\\")})*|[a-z0-9]+`, "gi");
1572
+ /**
1573
+ @function textSplit
1574
+ @desc Splits a given sentence into an array of words.
1575
+ @param {String} sentence
1576
+ */ function textSplit(sentence) {
1577
+ if (!noSpaceLanguage.test(sentence)) return stringify(sentence).match(splitWords).filter((w)=>w.length);
1578
+ return d3Array.merge(stringify(sentence).match(splitWords).map((d)=>{
1579
+ if (noSpaceLanguage.test(d)) return d.match(splitAllChars);
1580
+ return [
1581
+ d
1582
+ ];
1583
+ }));
1584
+ }
1585
+
1586
+ /**
1587
+ @function trim
1588
+ @desc Cross-browser implementation of [trim](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim).
1589
+ @param {String} str
1590
+ */ function trim(str) {
1591
+ return str.toString().replace(/^\s+|\s+$/g, "");
1592
+ }
1593
+ /**
1594
+ @function trimLeft
1595
+ @desc Cross-browser implementation of [trimLeft](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/TrimLeft).
1596
+ @param {String} str
1597
+ */ function trimLeft(str) {
1598
+ return str.toString().replace(/^\s+/, "");
1599
+ }
1600
+ /**
1601
+ @function trimRight
1602
+ @desc Cross-browser implementation of [trimRight](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/TrimRight).
1603
+ @param {String} str
1604
+ */ function trimRight(str) {
1605
+ return str.toString().replace(/\s+$/, "");
1606
+ }
1607
+
1608
+ /**
1609
+ @function textWrap
1610
+ @desc Based on the defined styles and dimensions, breaks a string into an array of strings for each line of text.
1611
+ */ function textWrap() {
1612
+ let fontFamily = "sans-serif", fontSize = 10, fontWeight = 400, height = 200, lineHeight, maxLines = null, overflow = false, split = textSplit, width = 200;
1613
+ /**
1614
+ The inner return object and wraps the text and returns the line data array.
1615
+ @private
1616
+ */ function textWrap(sentence) {
1617
+ sentence = stringify(sentence);
1618
+ if (lineHeight === void 0) lineHeight = Math.ceil(fontSize * 1.4);
1619
+ const words = split(sentence);
1620
+ const style = {
1621
+ "font-family": fontFamily,
1622
+ "font-size": fontSize,
1623
+ "font-weight": fontWeight,
1624
+ "line-height": lineHeight
1625
+ };
1626
+ let line = 1, textProg = "", truncated = false, widthProg = 0;
1627
+ const lineData = [], sizes = dom.textWidth(words, style), space = dom.textWidth(" ", style);
1628
+ for(let i = 0; i < words.length; i++){
1629
+ let word = words[i];
1630
+ const wordWidth = sizes[words.indexOf(word)];
1631
+ word += sentence.slice(textProg.length + word.length).match("^( |\n)*", "g")[0];
1632
+ if (textProg.slice(-1) === "\n" || widthProg + wordWidth > width) {
1633
+ if (!i && !overflow) {
1634
+ truncated = true;
1635
+ break;
1636
+ }
1637
+ if (lineData.length >= line) lineData[line - 1] = trimRight(lineData[line - 1]);
1638
+ line++;
1639
+ if (lineHeight * line > height || wordWidth > width && !overflow || maxLines && line > maxLines) {
1640
+ truncated = true;
1641
+ break;
1642
+ }
1643
+ widthProg = 0;
1644
+ lineData.push(word);
1645
+ } else if (!i) lineData[0] = word;
1646
+ else lineData[line - 1] += word;
1647
+ textProg += word;
1648
+ widthProg += wordWidth;
1649
+ widthProg += word.match(/[\s]*$/g)[0].length * space;
1650
+ }
1651
+ return {
1652
+ lines: lineData,
1653
+ sentence,
1654
+ truncated,
1655
+ widths: dom.textWidth(lineData, style),
1656
+ words
1657
+ };
1658
+ }
1659
+ /**
1660
+ @memberof textWrap
1661
+ @desc If *value* is specified, sets the font family accessor to the specified function or string and returns this generator. If *value* is not specified, returns the current font family.
1662
+ @param {Function|String} [*value* = "sans-serif"]
1663
+ */ textWrap.fontFamily = function(_) {
1664
+ return arguments.length ? (fontFamily = _, textWrap) : fontFamily;
1665
+ };
1666
+ /**
1667
+ @memberof textWrap
1668
+ @desc If *value* is specified, sets the font size accessor to the specified function or number and returns this generator. If *value* is not specified, returns the current font size.
1669
+ @param {Function|Number} [*value* = 10]
1670
+ */ textWrap.fontSize = function(_) {
1671
+ return arguments.length ? (fontSize = _, textWrap) : fontSize;
1672
+ };
1673
+ /**
1674
+ @memberof textWrap
1675
+ @desc If *value* is specified, sets the font weight accessor to the specified function or number and returns this generator. If *value* is not specified, returns the current font weight.
1676
+ @param {Function|Number|String} [*value* = 400]
1677
+ */ textWrap.fontWeight = function(_) {
1678
+ return arguments.length ? (fontWeight = _, textWrap) : fontWeight;
1679
+ };
1680
+ /**
1681
+ @memberof textWrap
1682
+ @desc If *value* is specified, sets height limit to the specified value and returns this generator. If *value* is not specified, returns the current value.
1683
+ @param {Number} [*value* = 200]
1684
+ */ textWrap.height = function(_) {
1685
+ return arguments.length ? (height = _, textWrap) : height;
1686
+ };
1687
+ /**
1688
+ @memberof textWrap
1689
+ @desc If *value* is specified, sets the line height accessor to the specified function or number and returns this generator. If *value* is not specified, returns the current line height accessor, which is 1.1 times the [font size](#textWrap.fontSize) by default.
1690
+ @param {Function|Number} [*value*]
1691
+ */ textWrap.lineHeight = function(_) {
1692
+ return arguments.length ? (lineHeight = _, textWrap) : lineHeight;
1693
+ };
1694
+ /**
1695
+ @memberof textWrap
1696
+ @desc If *value* is specified, sets the maximum number of lines allowed when wrapping.
1697
+ @param {Function|Number} [*value*]
1698
+ */ textWrap.maxLines = function(_) {
1699
+ return arguments.length ? (maxLines = _, textWrap) : maxLines;
1700
+ };
1701
+ /**
1702
+ @memberof textWrap
1703
+ @desc If *value* is specified, sets the overflow to the specified boolean and returns this generator. If *value* is not specified, returns the current overflow value.
1704
+ @param {Boolean} [*value* = false]
1705
+ */ textWrap.overflow = function(_) {
1706
+ return arguments.length ? (overflow = _, textWrap) : overflow;
1707
+ };
1708
+ /**
1709
+ @memberof textWrap
1710
+ @desc If *value* is specified, sets the word split function to the specified function and returns this generator. If *value* is not specified, returns the current word split function.
1711
+ @param {Function} [*value*] A function that, when passed a string, is expected to return that string split into an array of words to textWrap. The default split function splits strings on the following characters: `-`, `/`, `;`, `:`, `&`
1712
+ */ textWrap.split = function(_) {
1713
+ return arguments.length ? (split = _, textWrap) : split;
1714
+ };
1715
+ /**
1716
+ @memberof textWrap
1717
+ @desc If *value* is specified, sets width limit to the specified value and returns this generator. If *value* is not specified, returns the current value.
1718
+ @param {Number} [*value* = 200]
1719
+ */ textWrap.width = function(_) {
1720
+ return arguments.length ? (width = _, textWrap) : width;
1721
+ };
1722
+ return textWrap;
1723
+ }
1724
+
1725
+ const lowercase = [
1726
+ "a",
1727
+ "an",
1728
+ "and",
1729
+ "as",
1730
+ "at",
1731
+ "but",
1732
+ "by",
1733
+ "for",
1734
+ "from",
1735
+ "if",
1736
+ "in",
1737
+ "into",
1738
+ "near",
1739
+ "nor",
1740
+ "of",
1741
+ "on",
1742
+ "onto",
1743
+ "or",
1744
+ "per",
1745
+ "that",
1746
+ "the",
1747
+ "to",
1748
+ "with",
1749
+ "via",
1750
+ "vs",
1751
+ "vs."
1752
+ ];
1753
+ const uppercase = [
1754
+ "CEO",
1755
+ "CFO",
1756
+ "CNC",
1757
+ "COO",
1758
+ "CPU",
1759
+ "GDP",
1760
+ "HVAC",
1761
+ "ID",
1762
+ "IT",
1763
+ "R&D",
1764
+ "TV",
1765
+ "UI"
1766
+ ];
1767
+ /**
1768
+ @function titleCase
1769
+ @desc Capitalizes the first letter of each word in a phrase/sentence.
1770
+ @param {String} str The string to apply the title case logic.
1771
+ */ function titleCase(str) {
1772
+ if (str === void 0) return "";
1773
+ const smalls = lowercase.map((s)=>s.toLowerCase());
1774
+ let bigs = uppercase.slice();
1775
+ bigs = bigs.concat(bigs.map((b)=>`${b}s`));
1776
+ const biglow = bigs.map((b)=>b.toLowerCase());
1777
+ const split = textSplit(str);
1778
+ return split.map((s, i)=>{
1779
+ if (s) {
1780
+ const lower = s.toLowerCase();
1781
+ const stripped = suffixChars.includes(lower.charAt(lower.length - 1)) ? lower.slice(0, -1) : lower;
1782
+ const bigindex = biglow.indexOf(stripped);
1783
+ if (bigindex >= 0) return bigs[bigindex];
1784
+ else if (smalls.includes(stripped) && i !== 0 && i !== split.length - 1) return lower;
1785
+ else return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();
1786
+ } else return "";
1787
+ }).reduce((ret, s, i)=>{
1788
+ if (i && str.charAt(ret.length) === " ") ret += " ";
1789
+ ret += s;
1790
+ return ret;
1791
+ }, "");
1792
+ }
1793
+
1794
+ exports.fontFamily = fontFamily;
1795
+ exports.fontFamilyStringify = fontFamilyStringify;
1796
+ exports.stringify = stringify;
1797
+ exports.strip = strip;
1798
+ exports.textSplit = textSplit;
1799
+ exports.textWrap = textWrap;
1800
+ exports.titleCase = titleCase;
1801
+ exports.trim = trim;
1802
+ exports.trimLeft = trimLeft;
1803
+ exports.trimRight = trimRight;
1804
+
1805
+ }));
1806
+ //# sourceMappingURL=d3plus-text.js.map