-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsnap-rapineda-text.js
105 lines (85 loc) · 2.89 KB
/
snap-rapineda-text.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Snap.plugin( function( Snap, Element, Paper, global ) {
Element.prototype.text = function(text) {
if (text){
if (this.node.textContent){
this.node.textContent = text;
} else {
this.node.innerText = text;
}
} else {
return this.node.textContent || this.node.innerText;
}
}
});
Snap.plugin(function (Snap, Element, Paper, glob) {
Element.prototype.wrap = function (width, align) {
var svgNS = "http://www.w3.org/2000/svg";
var el = this.node;
align = align || 'left';
//already wrapped, unwrap -> idempotent wrap() function
if (this.select('tspan')){
this.text(this.text());
}
var textContent = this.node.textContent || this.node.innerText;
if (!textContent)
textContent = '';
var words = textContent.split(' ');
this.node.innerHTML = '';
var tspans = [];
//add initial tspan
var tspan = document.createElementNS(svgNS, "tspan");
tspans.push(tspan);
var text = document.createTextNode(words[0]);
tspan.appendChild(text);
el.appendChild(tspan);
var longest = 0;
for(var i=1; i<words.length; i++)
{
//work with tspan until correct length
var len = tspan.textContent.length;
tspan.textContent += " " + words[i];
var clen = tspan.getComputedTextLength();
tspan.setAttributeNS(null,'data-clen',clen);
if (clen > width)
{
//remove that last word, it was too long, and add a space for easily recombining words later
tspan.textContent = tspan.textContent.slice(0, len).trim() + ' ';
var clen = tspan.getComputedTextLength();
tspan.setAttributeNS(null,'data-clen',clen);
if (clen > longest)
longest = clen;
//can't do the following cause tspan is not wrapped in Element
//tspan.text(tspan.text().slice(0,len));
//work on next tspan
tspan = document.createElementNS(svgNS, "tspan");
tspans.push(tspan);
tspan.setAttributeNS(null,"x",this.attr('x'));
tspan.setAttributeNS(null, "dy", "1em");
text = document.createTextNode(words[i]);
tspan.appendChild(text);
el.appendChild(tspan);
var clen = tspan.getComputedTextLength();
tspan.setAttributeNS(null,'data-clen',clen);
if (clen > longest)
longest = clen;
} else if (clen > longest)
longest = clen;
}
//second loop for alignment
if ( align=='center'|| align=='right'){
var offset = function(clen){
if (align=='center'){
return longest/2-clen/2;
} else {
return longest-clen;
}
}
for (var i=0;i<tspans.length;i++){
tspans[i].setAttributeNS(null,'dx',offset(tspans[i].getAttribute('data-clen')));
}
}
//don't think we need this
this.data('longest',longest);
return this;
};
});