Skip to content
conllusvgload.js 3.93 KiB
Newer Older
Koichi Yasuoka's avatar
Koichi Yasuoka committed
// CoNLL-U SVG Load & Save by Koichi Yasuoka, July 13, 2018.
// "conllusvgview.js" is needed.
conllusvg.onLoadLocal=function(e){
  var textid,c;
  for(textid in conllusvg.main){
    if(conllusvg.main[textid].files==null)
      continue;
    else if(conllusvg.main[textid].files.load==e.currentTarget)
      break;
  }
  c=conllusvg.main[textid];
  c.files.reader.removeEventListener("load",conllusvg.onLoadLocal);
  conllusvg.loadText(textid,c.files.reader.result);
}
conllusvg.onLoadRemote=function(e){
  var textid,c;
  for(textid in conllusvg.main){
    if(conllusvg.main[textid].files==null)
      continue;
    else if(conllusvg.main[textid].files.request==e.currentTarget)
      break;
  }
  c=conllusvg.main[textid];
  c.files.request.removeEventListener("load",conllusvg.onLoadRemote);
  if(c.files.request.status==200)
    conllusvg.loadText(textid,c.files.request.responseText);
}
conllusvg.onChangeInput=function(e){
  var textid;
  for(textid in conllusvg.main){
    if(conllusvg.main[textid].files==null)
      continue;
    else if(conllusvg.main[textid].files.load==e.currentTarget)
      break;
  }
  conllusvg.changeInput(textid);
}
conllusvg.loadLocal=function(textid,append){
  var c=conllusvg.main[textid];
  var g=document.createElement("input");
  g.setAttribute("type","file");
  g.style.position="absolute";
  g.style.opacity=g.style.right=g.style.top=0;
  document.body.appendChild(g);
  g.addEventListener("change",conllusvg.onChangeInput);
  if(c.files==null)
    c.files=new Object();
  c.files.inputBox=g;
  c.files.append=(append==null)?false:append;
  c.files.reader=null;
  c.files.type="loadLocal";
  g.click();
  if(c.files.reader==null){
    if(c.files.inputBox==g){
      g.removeEventListener("change",conllusvg.onChangeInput);
      document.body.removeChild(g);
      c.files.inputBox=null;
    }
  }
}
conllusvg.changeInput=function(textid){
  var c=conllusvg.main[textid];
  c.files.reader=new FileReader();
  c.files.reader.addEventListener("load",conllusvg.onLoadLocal);
  c.files.reader.readAsText(c.files.inputBox.files[0]);
  c.files.filename=c.files.inputBox.files[0].name;
  c.files.inputBox.removeEventListener("change",conllusvg.onChangeInput);
  document.body.removeChild(c.files.inputBox);
  c.files.inputBox=null;
}
conllusvg.loadText=function(textid,t){
  var c=conllusvg.main[textid];
  var tx=document.getElementById(textid);
  var n;
  if(tx.value==null){
    if(c.files.append&&tx.textContent.length>0)
      tx.textContent=tx.textContent+"\n"+t
    else
      tx.textContent=t;
  }
  else if(c.files.append&&tx.value.length>0)
    tx.value=tx.value+"\n"+t;
  else
    tx.value=t;
  for(n in c.nodes){
    if(c.nodes[n].svg!=null)
      c.svg.removeChild(c.nodes[n].svg);
    c.nodes[n].svg=null;
  }
  for(n in c.links){
    if(c.links[n].svg!=null)
      c.svg.removeChild(c.links[n].svg);
    c.links[n].svg=null;
  }
  conllusvg.view(c.svg,textid);
}
conllusvg.loadRemote=function(textid,url,append){
  var c=conllusvg.main[textid];
  var i;
  if(c.files==null)
    c.files=new Object();
  c.files.append=(append==null)?false:append;
  i=url.lastIndexOf("/");
  c.files.filename=(i<0)?url:url.slice(i+1);
  c.files.request=new XMLHttpRequest();
  c.files.request.addEventListener("load",conllusvg.onLoadRemote);
  c.files.request.open("GET",url);
  c.files.request.send();
}
conllusvg.saveLocal=function(textid){
  var c=conllusvg.main[textid];
  var tx=document.getElementById(textid);
  var s,b,f,a;
  if(tx.value==null)
    s=tx.textContent;
  else
    s=tx.value;
  if(s.slice(s.length-1)!="\n")
    s=s+"\n";
  if(c.files==null)
    c.files=new Object();
  f=c.files.filename;
  if(f==null)
    f="conllu.txt";
  b=new Blob([s],{"type":"application/force-download"});
  if(window.navigator.msSaveBlob)
    window.navigator.msSaveBlob(b,f);
  else{
    a=document.createElement("a");
    a.href=window.URL.createObjectURL(b);
    a.target="_blank";
    a.download=f;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  }
}