-
Notifications
You must be signed in to change notification settings - Fork 1
/
textFlow.min.js
34 lines (34 loc) · 9.76 KB
/
textFlow.min.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
/**
* @fileoverview
*
* ECMAScript <a href="http://www.carto.net/papers/svg/resources/helper_functions.html">helper functions</a>, main purpose is to serve in SVG mapping or other SVG based web applications
*
* This ECMA script library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library (http://www.carto.net/papers/svg/resources/lesser_gpl.txt); if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Please report bugs and send improvements to neumann@karto.baug.ethz.ch
* If you use these scripts, please link to the original (http://www.carto.net/papers/svg/resources/helper_functions.html)
* somewhere in the source-code-comment or the "about" of your project and give credits, thanks!
*
* See <a href="js_docs_out/overview-summary-helper_functions.js.html">documentation</a>.
*
* @author Andreas Neumann a.neumann@carto.net
* @copyright LGPL 2.1 <a href="http://www.gnu.org/copyleft/lesser.txt">Gnu LGPL 2.1</a>
* @credits Bruce Rindahl, numerous people on svgdevelopers@yahoogroups.com
*///global variables necessary to create elements in these namespaces, do not delete them!!!!
/**
* This variable is a shortcut to the full URL of the SVG namespace
* @final
* @type String
*/function toPolarDir(e,t){var n=Math.atan2(t,e);return n}function toPolarDist(e,t){var n=Math.sqrt(e*e+t*t);return n}function toRectX(e,t){var n=t*Math.cos(e);return n}function toRectY(e,t){return y=t*Math.sin(e),y}function DegToRad(e){return e/180*Math.PI}function RadToDeg(e){return e/Math.PI*180}function dd2dms(e){var t=(Math.abs(e)-Math.floor(Math.abs(e)))*60,n=(t-Math.floor(t))*60,t=Math.floor(t);if(e>=0)var r=Math.floor(e);else var r=Math.ceil(e);return{deg:r,min:t,sec:n}}function dms2dd(e,t,n){return e<0?e-t/60-n/3600:e+t/60+n/3600}function log(e,t){return t==null&&(t=Math.E),Math.log(e)/Math.log(t)}function intBilinear(e,t,n,r,i,s,o,u,a){var f=(i-o)/a,l=(s-u)/a,c=(1-f)*(1-l),h=f*(1-l),p=f*l,d=l*(1-f),v=c*n+h*r+p*e+d*t;return v}function leftOfTest(e,t,n,r,i,s){var o=(r-t)*(i-n)-(n-e)*(s-r);if(o<0)var u=1;else var u=0;return u}function distFromLine(e,t,n,r,i,s){var o=i-n,u=s-r,a=(u*(e-n)-o*(t-r))/Math.sqrt(Math.pow(o,2)+Math.pow(u,2));return a}function angleBetwTwoLines(e,t,n,r){var i=Math.acos((e*n+t*r)/(Math.sqrt(Math.pow(e,2)+Math.pow(t,2))*Math.sqrt(Math.pow(n,2)+Math.pow(r,2))));return i}function calcBisectorVector(e,t,n,r){var i=Math.sqrt(Math.pow(e,2)+Math.pow(t,2)),s=Math.sqrt(Math.pow(n,2)+Math.pow(r,2)),o=new Array;return o[0]=e/i+n/s,o[1]=t/i+r/s,o}function calcBisectorAngle(e,t,n,r){var i=Math.sqrt(Math.pow(e,2)+Math.pow(t,2)),s=Math.sqrt(Math.pow(n,2)+Math.pow(r,2)),o=e/i+n/s,u=t/i+r/s,a=toPolarDir(o,u);return a}function intersect2lines(e,t,n,r,i,s,o,u){var a=new Object,f=(u-s)*(n-e)-(o-i)*(r-t);if(f==0)alert("lines are parallel");else var l=((o-i)*(t-s)-(u-s)*(e-i))/f,c=((n-e)*(t-s)-(r-t)*(e-i))/f;return a.x=e+l*(n-e),a.y=t+l*(r-t),a}function formatNumberString(e,t){if(typeof e=="Number")var n=e.toString();else var n=e;var r="",i=n.split("."),s=i[0].length;if(s>3)while(s>0)s>3?r=t+i[0].substr(s-3,3)+r:r=i[0].substr(0,s)+r,s-=3;else r=i[0];return i[1]&&(r=r+"."+i[1]),r}function statusChange(e){document.getElementById("statusText").firstChild.nodeValue="Statusbar: "+e}function scaleObject(e,t){var n=e.currentTarget,r=n.getAttributeNS(null,"x"),i=n.getAttributeNS(null,"y"),s="scale("+t+") translate("+(r*1/t-r)+" "+(i*1/t-i)+")";n.setAttributeNS(null,"transform",s)}function getTransformToRootElement(e){try{var t=e.getTransformToElement(document.documentElement)}catch(n){var t=e.getCTM();while((e=e.parentNode)!=document)t=e.getCTM().multiply(t)}return t}function getTransformToElement(e,t){try{var n=e.getTransformToElement(t)}catch(r){var n=e.getCTM();while((e=e.parentNode)!=t)n=e.getCTM().multiply(n)}return n}function hsv2rgb(e,t,n){var r=new Object;if(t==0)r.red=Math.round(n*255),r.green=Math.round(n*255),r.blue=Math.round(n*255);else{var i=e/60,s=Math.floor(i),o=i-s;s%2==0&&(o=1-o);var u=n*(1-t),a=n*(1-t*o);switch(s){case 0:r.red=n,r.green=a,r.blue=u;break;case 1:r.red=a,r.green=n,r.blue=u;break;case 2:r.red=u,r.green=n,r.blue=a;break;case 3:r.red=u,r.green=a,r.blue=n;break;case 4:r.red=a,r.green=u,r.blue=n;break;case 5:r.red=n,r.green=u,r.blue=a;break;case 6:r.red=n,r.green=a,r.blue=u}r.red=Math.round(r.red*255),r.green=Math.round(r.green*255),r.blue=Math.round(r.blue*255)}return r}function rgb2hsv(e,t,n){var r=new Object;return e/=255,t/=255,n/=255,myMax=Math.max(e,Math.max(t,n)),myMin=Math.min(e,Math.min(t,n)),v=myMax,myMax>0?s=(myMax-myMin)/myMax:s=0,s>0?(myDiff=myMax-myMin,rc=(myMax-e)/myDiff,gc=(myMax-t)/myDiff,bc=(myMax-n)/myDiff,e==myMax&&(h=(bc-gc)/6),t==myMax&&(h=(2+rc-bc)/6),n==myMax&&(h=(4+gc-rc)/6)):h=0,h<0&&(h+=1),r.hue=Math.round(h*360),r.sat=s,r.val=v,r}function arrayPopulate(e,t){var n=new Array;if(e.length!=t.length)alert("error: arrays do not have the same length!");else for(i=0;i<e.length;i++)n[e[i]]=t[i];return n}function getData(e,t,n,r,i,s){this.url=e,this.callBackFunction=t,this.returnFormat=n,this.method=r,this.additionalParams=s,r!="get"&&r!="post"&&alert("Error in network request: parameter 'method' must be 'get' or 'post'"),this.postText=i,this.xmlRequest=null}function serializeNode(e){if(typeof XMLSerializer!="undefined")return(new XMLSerializer).serializeToString(e);if(typeof e.xml!="undefined")return e.xml;if(typeof printNode!="undefined")return printNode(e);if(typeof Packages=="undefined")return alert("Sorry, your SVG viewer does not support the printNode/serialize function."),"";try{var t=new java.io.StringWriter;return Packages.org.apache.batik.dom.util.DOMUtilities.writeNode(e,t),t.toString()}catch(n){return alert("Sorry, your SVG viewer does not support the printNode/serialize function."),""}}function startAnimation(e){document.getElementById(e).beginElement()}function textFlow(e,t,n,r,s,o){var u=new Array,a=!0,f=0,l=0;while(a==1){var c=e.indexOf("-",f);c==-1?a=!1:(u.push(c),f=c+1)}var h=e.split(/[\s-]/),p="",d=0,v=0,m=0,g,y,b=0;for(i=0;i<h.length;i++){var w=h[i];v+=w.length+1;if(m>n||i==0){if(m>n){var E=y.firstChild.nodeValue;E=E.slice(0,E.length-h[i-1].length-2),y.firstChild.nodeValue=E;if(o){var S=E.split(/\s/).length;m=y.getComputedTextLength();var x=(n-m)/(S-1);y.setAttributeNS(null,"word-spacing",x)}}y=document.createElementNS(svgNS,"tspan"),y.setAttributeNS(null,"x",r),y.setAttributeNS(null,"dy",d),g=document.createTextNode(p),y.appendChild(g),t.appendChild(y),checkDashPosition(u,v-1)?p=w+"-":p=w+" ",i!=0&&(p=h[i-1]+" "+p),d=s,l+=d}else checkDashPosition(u,v-1)?p+=w+"-":p+=w+" ";y.firstChild.nodeValue=p,m=y.getComputedTextLength();if(i==h.length-1&&m>n){var E=y.firstChild.nodeValue;y.firstChild.nodeValue=E.slice(0,E.length-h[i].length-1),y=document.createElementNS(svgNS,"tspan"),y.setAttributeNS(null,"x",r),y.setAttributeNS(null,"dy",d),g=document.createTextNode(h[i]),y.appendChild(g),t.appendChild(y)}}return l}function checkDashPosition(e,t){var n=!1;for(var r=0;r<e.length;r++)e[r]==t&&(n=!0);return n}var svgNS="http://www.w3.org/2000/svg",xlinkNS="http://www.w3.org/1999/xlink",cartoNS="http://www.carto.net/attrib",attribNS="http://www.carto.net/attrib",batikNS="http://xml.apache.org/batik/ext";getData.prototype.getData=function(){if(window.getURL)this.method=="get"&&getURL(this.url,this),this.method=="post"&&postURL(this.url,this.postText,this);else if(window.XMLHttpRequest){var e=this;this.xmlRequest=new XMLHttpRequest,this.method=="get"&&(this.returnFormat=="xml"&&this.xmlRequest.overrideMimeType("text/xml"),this.xmlRequest.open("GET",this.url,!0)),this.method=="post"&&this.xmlRequest.open("POST",this.url,!0),this.xmlRequest.onreadystatechange=function(){e.handleEvent()},this.method=="get"&&this.xmlRequest.send(null);if(this.method=="post"){var t=!0;this.postText||(t=!1,alert("Error in network post request: missing parameter 'postText'!")),typeof this.postText!="string"&&(t=!1,alert("Error in network post request: parameter 'postText' has to be of type 'string')")),t&&this.xmlRequest.send(this.postText)}}else alert("your browser/svg viewer neither supports window.getURL nor window.XMLHttpRequest!")},getData.prototype.operationComplete=function(e){if(e.success){if(this.returnFormat=="xml"){var t=parseXML(e.content,document);typeof this.callBackFunction=="function"&&this.callBackFunction(t.firstChild,this.additionalParams),typeof this.callBackFunction=="object"&&this.callBackFunction.receiveData(t.firstChild,this.additionalParams)}this.returnFormat=="json"&&(typeof this.callBackFunction=="function"&&this.callBackFunction(e.content,this.additionalParams),typeof this.callBackFunction=="object"&&this.callBackFunction.receiveData(e.content,this.additionalParams))}else alert("something went wrong with dynamic loading of geometry!")},getData.prototype.handleEvent=function(){if(this.xmlRequest.readyState==4){if(this.returnFormat=="xml"){var e=document.importNode(this.xmlRequest.responseXML.documentElement,!0);typeof this.callBackFunction=="function"&&this.callBackFunction(e,this.additionalParams),typeof this.callBackFunction=="object"&&this.callBackFunction.receiveData(e,this.additionalParams)}this.returnFormat=="json"&&(typeof this.callBackFunction=="function"&&this.callBackFunction(this.xmlRequest.responseText,this.additionalParams),typeof this.callBackFunction=="object"&&this.callBackFunction.receiveData(this.xmlRequest.responseText,this.additionalParams))}};