// CoNLL-U SVG Viewer by Koichi Yasuoka, July 4, 2019. // Nos. 1, 2, 4, 5, 7, 8 and 10 columns are used. "use strict"; var conllusvg=new Object(); conllusvg.main=new Array(); conllusvg.view=function(svg,textid){ var c=conllusvg.main[textid]; if(c==null) c=conllusvg.main[textid]=new Object(); c.svg=svg; c.width=conllusvg.windowWidth(); c.height=25; conllusvg.parse(textid); conllusvg.clearSVG(textid); conllusvg.makeNodes(textid); conllusvg.groupNodes(textid); conllusvg.makeLinks(textid); conllusvg.makeHeight(textid); conllusvg.calculateNodeY(textid); conllusvg.calculateLinkXY(textid); conllusvg.writeNodesSVG(textid); conllusvg.writeLinksSVG(textid); } conllusvg.windowWidth=function(){ if(document.body!=null) return((document.body.clientWidth-600<0)?600:document.body.clientWidth); else return((window.innerWidth-620<0)?600:window.innerWidth-20); } conllusvg.parse=function(textid){ conllusvg.main[textid].textlines=new Array(); if(!conllusvg.parseStrict(textid)) conllusvg.parseLoose(textid); } conllusvg.parseStrict=function(textid){ var tl=conllusvg.main[textid].textlines; var tx=document.getElementById(textid); var s=(tx.value==null)?tx.textContent:tx.value; var state,i,j,k,t,p; state="sep"; i=j=0; for(k=0;k0){ if(c.nodes[i].id-c.nodes[i-1].id!=1){ j++; x=50; } } c.nodes[i].group=j; c.nodes[i].x=x; x+=100; } } conllusvg.makeLinks=function(textid){ var c=conllusvg.main[textid]; var s,t,f,x,y,i,j,k; s=new Array(); c.links=new Array(); c.matrix=new Array(); for(x in c.nodes){ if(c.nodes[x].head=="_") continue; if(c.nodes[x].head==0){ c.links[x]=new Object(); c.links[x].from=parseInt(x); c.links[x].deprel=c.nodes[x].deprel; if(c.matrix[x]==null) c.matrix[x]=new Array(); c.matrix[x][x]=new Object(); c.matrix[x][x].len=0; } else{ t=parseInt(x); f=t-(c.nodes[t].id-c.nodes[t].head); if(c.nodes[f].id==c.nodes[t].head){ j=(t0){ y=s[i]; s[i]=s[j]; s[j]=y; } } } for(i=0;i0){ j=parseInt(y); k=parseInt(x); } else continue; g=c.nodes[j].group; if(c.nodes[k].group==g){ h=0; for(i=j;i=j;i--) c.matrix[i][x].height=h; g=c.nodes[k].group; h=0; for(i=k;i>j;i--){ if(c.nodes[i].group!=g) break; if(h-c.matrix[i-0.5][x].minheight<0) h=c.matrix[i-0.5][x].minheight; } for(i++;i<=k;i++) c.matrix[i][x].height=h; } } for(x in c.links){ y=c.links[x].from; if(x==y) continue; h=c.matrix[x][x].height; for(k in c.matrix[x]){ if(k!=x&&h==c.matrix[x][k].height){ if(c.links[k].from!=x){ h=-1; break; } } } if(h==-1){ for(k in c.matrix[x]){ if(h-c.matrix[x][k].height<0) h=c.matrix[x][k].height; } h++; if(x-y<0){ j=parseInt(x); k=parseInt(y); } else{ j=parseInt(y); k=parseInt(x); } g=c.nodes[x].group; for(i=j;i<=k;i++){ if(c.nodes[i].group==g) c.matrix[i][x].height=h; } } } for(x in c.links){ y=c.links[x].from; if(x==y){ h=0; for(y in c.matrix[x]){ if(h-c.matrix[x][y].height<0) h=c.matrix[x][y].height; } c.matrix[x][x].height=h+1; } } } conllusvg.calculateNodeY=function(textid){ var c=conllusvg.main[textid]; var x,y,g,h; h=new Array(); h[0]=0; for(x in c.nodes){ g=c.nodes[x].group; if(h[g]==null) h[g]=0; for(y in c.matrix[x]){ if(h[g]-c.matrix[x][y].height<0) h[g]=c.matrix[x][y].height; } } y=new Array(); y[0]=h[0]*25+25; for(g=1;g90){ t.setAttribute("transform","scale("+(90/w)+",1)"); t.setAttribute("x",c.nodes[n].x*w/90); } } if(c.nodes[n].form!="_"){ t=document.createElementNS("http://www.w3.org/2000/svg","text"); t.textContent=c.nodes[n].form; t.setAttribute("x",c.nodes[n].x); t.setAttribute("y",c.nodes[n].y+60); t.setAttribute("text-anchor","middle"); t.setAttribute("font-family","sans-serif"); t.setAttribute("font-size",30); t.setAttribute("stroke","none"); g.appendChild(t); w=t.getBBox().width; if(w>90){ t.setAttribute("transform","scale("+(90/w)+",1)"); t.setAttribute("x",c.nodes[n].x*w/90); } } w=c.nodes[n].misc.match(/(Gloss|Translit)=[^|]+/); if(w!=null){ t=document.createElementNS("http://www.w3.org/2000/svg","text"); t.textContent=w[0].slice(w[0].indexOf("=")+1); t.setAttribute("x",c.nodes[n].x); t.setAttribute("y",c.nodes[n].y+75); t.setAttribute("text-anchor","middle"); t.setAttribute("font-family","serif"); t.setAttribute("font-size",12); t.setAttribute("stroke","none"); g.appendChild(t); w=t.getBBox().width; if(w>90){ t.setAttribute("transform","scale("+(90/w)+",1)"); t.setAttribute("x",c.nodes[n].x*w/90); } } } } conllusvg.writeLinksSVG=function(textid){ var c=conllusvg.main[textid]; var n,g; c.svg.setAttribute("width",c.width); c.svg.setAttribute("height",c.height); for(n in c.links){ g=document.createElementNS("http://www.w3.org/2000/svg","g"); g.setAttribute("stroke","black"); g.setAttribute("fill","black"); if(c.links[n].svg!=null) c.svg.removeChild(c.links[n].svg); c.links[n].svg=g; c.svg.appendChild(g); if(c.links[n].type=="root") conllusvg.writeLinksSVGroot(c.links[n]); else if(c.links[n].type=="single") conllusvg.writeLinksSVGsingle(c.links[n]); else if(c.links[n].type=="double") conllusvg.writeLinksSVGdouble(c.links[n]); } } conllusvg.writeLinksSVGroot=function(link){ var t,w; t=document.createElementNS("http://www.w3.org/2000/svg","text"); t.textContent=(link.deprel=="_")?"root":link.deprel; t.setAttribute("x",link.fromX); t.setAttribute("y",link.fromY+5); t.setAttribute("text-anchor","middle"); t.setAttribute("font-family","sans-serif"); t.setAttribute("font-size",15); t.setAttribute("stroke","none"); link.svg.appendChild(t); w=t.getBBox().width; if(w>90){ t.setAttribute("transform","scale("+(90/w)+",1)"); t.setAttribute("x",link.fromX*w/90); } t=document.createElementNS("http://www.w3.org/2000/svg","path"); t.setAttribute("fill","none"); t.setAttribute("stroke-width",1); t.setAttribute("d","M "+link.fromX+" "+(link.fromY+5)+" v "+(link.toY-link.fromY-5)); link.svg.appendChild(t); t=document.createElementNS("http://www.w3.org/2000/svg","path"); t.setAttribute("d","M "+link.toX+" "+link.toY+" l -4 -10 h 8 Z"); link.svg.appendChild(t); } conllusvg.writeLinksSVGsingle=function(link){ var j=(link.fromX