Skip to content
editor-kanbun.html 15.4 KiB
Newer Older
<!DOCTYPE html><head><meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>CoNLL-U SVG Editor for 漢文 by 安岡孝一, July 15, 2018.</title>
<script src="conllusvgview.js"></script>
<script src="conllusvgedit.js"></script>
<script src="conllusvgload.js"></script>
<script>
conllusvg.kanbun=new Object();
conllusvg.kanbun.checkURL=function(textid,pushid,statid){
  var h=location.href;
  var i=h.indexOf("#");
  if(i>0&&h.length-i>0){
    h=h.slice(i+1);
    conllusvg.loadRemote(textid,h);
    if(h.indexOf("/api/v4/projects/")<0)
      return;
    if(h.indexOf("/repository/files/")<0)
      return;
    i=h.indexOf("/raw?ref=");
    if(i<0)
      return;
    conllusvg.kanbun.gitlabURL=h.substring(0,i)+"?branch="+h.slice(i+9);
    h=h.substring(0,i);
    conllusvg.kanbun.gitlabFile=h.slice(h.lastIndexOf("/")+1);
    if(pushid==null)
      return;
    i=document.getElementById(pushid);
    i.style.visibility="visible";
    if(statid!=null)
      conllusvg.kanbun.status=document.getElementById(statid);
  }
}
conllusvg.kanbun.mecabUD=function(textid,t){
  var c=conllusvg.main[textid];
  var s="/db-machine/~yasuoka/cgi-bin/ud-kanbun.cgi?";
  if(t.value==null)
    s=s+encodeURIComponent(t.textContent);
  else
    s=s+encodeURIComponent(t.value);
  conllusvg.loadRemote(textid,s,true);
}
conllusvg.kanbun.consultCHISE=function(textid,z){
  var c=conllusvg.main[textid];
  var ix=c.event.index;
  var s="http://www.chise.org/est/view/entry@zh-classical/rep.id=";
  var t=c.nodes[ix].form;
  var i,j;
  for(i=0;i<t.length;i++){
    j=t.charCodeAt(i);
    if(j>=55296&&j<=56319)
      j=(j-55287)*1024+t.charCodeAt(++i);
    s=s+"u"+j.toString(16).toUpperCase();
  }
  window.open(s);
}
conllusvg.kanbun.saveLocal=function(textid){
  var c=conllusvg.main[textid];
  var k,s;
  conllusvg.clearSVG(textid);
  if(conllusvg.kanbun.status!=null)
    conllusvg.kanbun.status.textContent="";
  conllusvg.renum(textid);
  conllusvg.esrap(textid);
  conllusvg.parse(textid);
  conllusvg.makeNodes(textid);
  s="\n";
  for(k=c.nodes.length-1;k>=0;k--){
    if(c.nodes[k].id!=1)
      s=c.nodes[k].form+s;
    else{
      s="# text = "+c.nodes[k].form+s+c.nodes[k].id;
      conllusvg.insertTextline(textid,c.nodes[k].textlineid,1,s);
      s="\n";
    }
  }
  if(conllusvg.kanbun.gitlabFile!=null){
    k=decodeURIComponent(conllusvg.kanbun.gitlabFile);
    if(c.files==null)
      c.files=new Object();
    c.files.filename=k.slice(k.lastIndexOf("/")+1);
  }
  conllusvg.view(c.svg,textid);
  conllusvg.saveLocal(textid);
}
Koichi Yasuoka's avatar
Koichi Yasuoka committed
conllusvg.kanbun.pushGitLab=function(textid){
  var c=conllusvg.main[textid];
  var tx=document.getElementById(textid);
  var i,k,s;
  conllusvg.clearSVG(textid);
  if(conllusvg.kanbun.status!=null)
    conllusvg.kanbun.status.textContent="";
  conllusvg.renum(textid);
  conllusvg.esrap(textid);
  conllusvg.parse(textid);
  conllusvg.makeNodes(textid);
  s="\n";
  for(k=c.nodes.length-1;k>=0;k--){
    if(c.nodes[k].id!=1)
      s=c.nodes[k].form+s;
    else{
      s="# text = "+c.nodes[k].form+s+c.nodes[k].id;
      conllusvg.insertTextline(textid,c.nodes[k].textlineid,1,s);
      s="\n";
    }
  }
  conllusvg.view(c.svg,textid);
  s=conllusvg.kanbun.gitlabURL+"&commit_message=API+editor-kanbun+"+conllusvg.kanbun.gitlabFile+"&content=";
  if(tx.value==null)
    s=s+encodeURIComponent(tx.textContent);
  else
    s=s+encodeURIComponent(tx.value);
  i=document.cookie.indexOf("conllusvg.kanbun.privateToken=");
  k="";
  if(i>=0){
    k=document.cookie.slice(i+30);
    i=k.indexOf(";");
    if(i>=0)
      k=k.substring(0,i);
  }
  if(k=="")
Koichi Yasuoka's avatar
Koichi Yasuoka committed
    k=prompt("GitLab private token:","");
  if(k>"")
    conllusvg.kanbun.privateToken=k;
  else{
    if(conllusvg.kanbun.status==null)
Koichi Yasuoka's avatar
Koichi Yasuoka committed
      alert("push GitLab failed");
Koichi Yasuoka's avatar
Koichi Yasuoka committed
      conllusvg.kanbun.status.textContent="push GitLab failed";
    return;
  }
  conllusvg.kanbun.request=new XMLHttpRequest();
  conllusvg.kanbun.request.addEventListener("load",conllusvg.kanbun.onLoad);
  conllusvg.kanbun.request.open("PUT",s);
  conllusvg.kanbun.request.setRequestHeader("Private-Token",k);
  conllusvg.kanbun.request.send();
}
conllusvg.kanbun.onLoad=function(e){
  if(conllusvg.kanbun.request.status==200){
    if(conllusvg.kanbun.status!=null){
Koichi Yasuoka's avatar
Koichi Yasuoka committed
      conllusvg.kanbun.status.textContent="push GitLab succeeded";
      conllusvg.kanbun.timer=setTimeout("clearTimeout(conllusvg.kanbun.timer);conllusvg.kanbun.status.textContent=''",5000);
    }
    document.cookie="conllusvg.kanbun.privateToken="+conllusvg.kanbun.privateToken+";secure";
  }
  else{
    if(conllusvg.kanbun.status!=null)
Koichi Yasuoka's avatar
Koichi Yasuoka committed
      conllusvg.kanbun.status.textContent="push GitLab failed: status "+conllusvg.kanbun.request.status;
Koichi Yasuoka's avatar
Koichi Yasuoka committed
      alert("push GitLab failed: status "+conllusvg.kanbun.request.status);
    document.cookie="conllusvg.kanbun.privateToken=;max-age=0";
  }
  conllusvg.kanbun.request.removeEventListener("load",conllusvg.kanbun.onLoad);
}
conllusvg.kanbun.connectForm=function(textid,z){
  var c=conllusvg.main[textid];
  var ix=c.event.index;
  var t,i,j;
  i=ix;
  j=ix-1;
  if(ix==0){
    if(c.nodes[1]==null)
      return;
    i=j=1;
  }
  if(c.nodes[i-1].form=="_")
    t=c.nodes[i].form;
  else if(c.nodes[i].form=="_")
    t=c.nodes[i-1].form;
  else
    t=c.nodes[i-1].form+c.nodes[i].form;
  conllusvg.insertTextline(textid,c.nodes[j].textlineid,2,t);
  if(c.nodes[i-1].lemma=="_")
    t=c.nodes[i].lemma;
  else if(c.nodes[i].lemma=="_")
    t=c.nodes[i-1].lemma;
  else
    t=c.nodes[i-1].lemma+c.nodes[i].lemma;
  conllusvg.insertTextline(textid,c.nodes[j].textlineid,3,t);
  conllusvg.deleteNode(textid,z);
}
conllusvg.kanbun.divideForm=function(textid,z){
  var c=conllusvg.main[textid];
  var ix=parseInt(c.event.index);
  var s=c.nodes[ix].form;
  var t=c.nodes[ix].lemma;
  var i,j,k;
  conllusvg.duplicateNode(textid,z);
  if(c.nodes[ix]==null)
    return;
  if(c.nodes[ix].form!=s||c.nodes[ix].lemma!=t)
    return;
  if(c.nodes[ix+1]==null)
    return;
  if(c.nodes[ix+1].form!=s||c.nodes[ix+1].lemma!=t)
    return;
  i=s.charCodeAt(0);
  j=(i>=55296&&i<=56319)?2:1;
  if(s.length>j){
    c.nodes[ix].form=s.substring(0,j);
    conllusvg.insertTextline(textid,c.nodes[ix].textlineid,2,s.substring(0,j));
    c.nodes[ix+1].form=s.slice(j);
    conllusvg.insertTextline(textid,c.nodes[ix+1].textlineid,2,s.slice(j));
    conllusvg.writeNodesSVG(textid);
  }
  i=t.charCodeAt(0);
  j=(i>=55296&&i<=56319)?2:1;
  if(t.length>j){
    c.nodes[ix].lemma=t.substring(0,j);
    conllusvg.insertTextline(textid,c.nodes[ix].textlineid,3,t.substring(0,j));
    c.nodes[ix+1].lemma=t.slice(j);
    conllusvg.insertTextline(textid,c.nodes[ix+1].textlineid,3,t.slice(j));
  }
}
</script>
</head>
<body>
<table noborder><tr><td nowrap>
<input type="text" value="漢文" onchange="conllusvg.kanbun.mecabUD('conllu',this)" />
<input type="button" value="load CoNLL-U" onclick="conllusvg.loadLocal('conllu')" />
<input type="button" value="save CoNLL-U" onclick="conllusvg.kanbun.saveLocal('conllu')" />
Koichi Yasuoka's avatar
Koichi Yasuoka committed
<input type="button" value="push GitLab" id="gitlab" onclick="conllusvg.kanbun.pushGitLab('conllu')" style="visibility:hidden" />
<text id="status" />
</td></tr></table>
<textarea cols="120" rows="10" id="conllu" onchange="conllusvg.reparse('conllu')">
</textarea>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" onload="conllusvg.edit(this,'conllu','deprel','upos','xpos');conllusvg.kanbun.checkURL('conllu','gitlab','status')">
</svg>
<select size=6 id="deprel" style="position:absolute; visibility:hidden">
<option>acl</option>
<option>advcl</option>
<option>advmod</option>
<option>amod</option>
<option>aux</option>
<option>case</option>
<option>cc</option>
<option>ccomp</option>
<option>clf</option>
<option>compound</option>
<option>conj</option>
<option>cop</option>
<option>csubj</option>
<option>csubj:pass</option>
<option>det</option>
<option>discourse</option>
<option>discourse:sp</option>
<option>dislocated</option>
<option>expl</option>
<option>flat</option>
<option>flat:vv</option>
<option>iobj</option>
<option>mark</option>
<option>nmod</option>
<option>nsubj</option>
<option>nsubj:pass</option>
<option>nummod</option>
<option>obj</option>
<option>obl</option>
<option>parataxis</option>
<option>vocative</option>
<option>xcomp</option>
</select>
<select size=6 id="upos" style="position:absolute; visibility:hidden">
<option value="conllusvg.rootLink">root</option>
<option value="conllusvg.kanbun.consultCHISE">訊CHISE</option>
<option value="conllusvg.setUpos">NOUN</option>
<option value="conllusvg.setUpos">PROPN</option>
<option value="conllusvg.setUpos">PRON</option>
<option value="conllusvg.setUpos">NUM</option>
<option value="conllusvg.setUpos">VERB</option>
<option value="conllusvg.setUpos">ADP</option>
<option value="conllusvg.setUpos">ADV</option>
<option value="conllusvg.setUpos">AUX</option>
<option value="conllusvg.setUpos">SCONJ</option>
<option value="conllusvg.setUpos">CCONJ</option>
<option value="conllusvg.setUpos">PART</option>
<option value="conllusvg.setUpos">INTJ</option>
<option value="conllusvg.setUpos">SYM</option>
<option value="conllusvg.setUpos">PUNCT</option>
<option value="conllusvg.deleteNode">削除</option>
<option value="conllusvg.duplicateNode">複製</option>
<option value="conllusvg.kanbun.connectForm">連接</option>
<option value="conllusvg.kanbun.divideForm">分割</option>
</select>
<select size=6 id="xpos" style="position:absolute; visibility:hidden">
<option value="PROPN">n,名詞,人,姓氏</option>
<option value="PROPN">n,名詞,人,名</option>
<option value="PROPN">n,名詞,人,その他の人名</option>
<option value="PROPN">n,名詞,人,複合的人名</option>
<option value="NOUN">n,名詞,人,関係</option>
<option value="NOUN">n,名詞,人,役割</option>
<option value="NOUN">n,名詞,人,人</option>
<option value="NOUN">n,名詞,主体,書物</option>
<option value="PROPN">n,名詞,主体,国名</option>
<option value="NOUN">n,名詞,主体,集団</option>
<option value="NOUN">n,名詞,主体,機関</option>
<option value="NOUN">n,名詞,主体,動物</option>
<option value="NOUN">n,名詞,天象,天文</option>
<option value="NOUN">n,名詞,天象,気象</option>
<option value="NOUN">n,名詞,天象,怪異</option>
<option value="NOUN">n,名詞,行為,*</option>
<option value="NOUN">n,名詞,不可譲,身体</option>
<option value="NOUN">n,名詞,不可譲,疾病</option>
<option value="NOUN">n,名詞,不可譲,属性</option>
<option value="PROPN">n,名詞,固定物,地名</option>
<option value="NOUN">n,名詞,固定物,地形</option>
<option value="NOUN">n,名詞,固定物,樹木</option>
<option value="NOUN">n,名詞,固定物,建造物</option>
<option value="NOUN">n,名詞,固定物,関係</option>
<option value="NOUN">n,名詞,可搬,糧食</option>
<option value="NOUN">n,名詞,可搬,道具</option>
<option value="NOUN">n,名詞,可搬,乗り物</option>
<option value="NOUN">n,名詞,可搬,伝達</option>
<option value="NOUN">n,名詞,可搬,成果物</option>
<option value="NOUN">n,名詞,制度,場</option>
<option value="NOUN">n,名詞,制度,儀礼</option>
<option value="NOUN">n,名詞,外観,人</option>
<option value="NOUN">n,名詞,数量,*</option>
<option value="NOUN">n,名詞,時,*</option>
<option value="NOUN">n,名詞,度量衡,*</option>
<option value="NOUN">n,名詞,思考,*</option>
<option value="NOUN">n,名詞,描写,態度</option>
<option value="NOUN">n,名詞,描写,形質</option>
<option value="PRON">n,代名詞,人称,起格</option>
<option value="PRON">n,代名詞,人称,止格</option>
<option value="PRON">n,代名詞,人称,他</option>
<option value="PRON">n,代名詞,指示,*</option>
<option value="PRON">n,代名詞,疑問,*</option>
<option value="NUM">n,数詞,数字,*</option>
<option value="NUM">n,数詞,数,*</option>
<option value="NUM">n,数詞,干支,*</option>
<option value="VERB">v,動詞,存在,量</option>
<option value="VERB">v,動詞,存在,存在</option>
<option value="VERB">v,動詞,変化,生物</option>
<option value="VERB">v,動詞,変化,制度</option>
<option value="VERB">v,動詞,変化,性質</option>
<option value="VERB">v,動詞,描写,態度</option>
<option value="VERB">v,動詞,描写,量</option>
<option value="VERB">v,動詞,描写,形質</option>
<option value="VERB">v,動詞,描写,境遇</option>
<option value="VERB">v,動詞,行為,役割</option>
<option value="VERB">v,動詞,行為,分類</option>
<option value="VERB">v,動詞,行為,飲食</option>
<option value="VERB">v,動詞,行為,姿勢</option>
<option value="VERB">v,動詞,行為,得失</option>
<option value="VERB">v,動詞,行為,移動</option>
<option value="VERB">v,動詞,行為,設置</option>
<option value="VERB">v,動詞,行為,動作</option>
<option value="VERB">v,動詞,行為,生産</option>
<option value="VERB">v,動詞,行為,儀礼</option>
<option value="VERB">v,動詞,行為,伝達</option>
<option value="VERB">v,動詞,行為,態度</option>
<option value="VERB">v,動詞,行為,交流</option>
<option value="VERB">v,動詞,行為,使役</option>
<option value="ADP">v,前置詞,基盤,*</option>
<option value="ADP">v,前置詞,経由,*</option>
<option value="ADP">v,前置詞,関係,*</option>
<option value="ADP">v,前置詞,源泉,*</option>
<option value="ADP">v,前置詞,処置,*</option>
<option value="ADV">v,副詞,描写,*</option>
<option value="ADV">v,副詞,程度,極度</option>
<option value="ADV">v,副詞,程度,軽度</option>
<option value="ADV">v,副詞,程度,やや高度</option>
<option value="ADV">v,副詞,範囲,総括</option>
<option value="ADV">v,副詞,範囲,限定</option>
<option value="ADV">v,副詞,範囲,共同</option>
<option value="ADV">v,副詞,時相,完了</option>
<option value="ADV">v,副詞,時相,過去</option>
<option value="ADV">v,副詞,時相,現在</option>
<option value="ADV">v,副詞,時相,将来</option>
<option value="ADV">v,副詞,時相,終局</option>
<option value="ADV">v,副詞,時相,緊接</option>
<option value="ADV">v,副詞,時相,継起</option>
<option value="ADV">v,副詞,時相,恒常</option>
<option value="ADV">v,副詞,時相,変化</option>
<option value="ADV">v,副詞,頻度,重複</option>
<option value="ADV">v,副詞,頻度,頻繁</option>
<option value="ADV">v,副詞,頻度,偶発</option>
<option value="ADV">v,副詞,否定,無界</option>
<option value="ADV">v,副詞,否定,体言否定</option>
<option value="ADV">v,副詞,否定,有界</option>
<option value="ADV">v,副詞,否定,禁止</option>
<option value="ADV">v,副詞,判断,確定</option>
<option value="ADV">v,副詞,判断,推定</option>
<option value="ADV">v,副詞,判断,逆接</option>
<option value="ADV">v,副詞,疑問,反語</option>
<option value="ADV">v,副詞,疑問,原因</option>
<option value="ADV">v,副詞,疑問,所在</option>
<option value="AUX">v,助動詞,可能,*</option>
<option value="AUX">v,助動詞,必要,*</option>
<option value="AUX">v,助動詞,願望,*</option>
<option value="AUX">v,助動詞,受動,*</option>
<option value="PART">p,助詞,提示,*</option>
<option value="SCONJ">p,助詞,接続,属格</option>
<option value="PART">p,助詞,接続,体言化</option>
<option value="CCONJ">p,助詞,接続,並列</option>
<option value="PART">p,助詞,句末,*</option>
<option value="PART">p,助詞,句頭,*</option>
<option value="INTJ">p,感嘆詞,*,*</option>
<option value="SYM">s,文字,*,*</option>
<option value="PUNCT">s,記号,一般,*</option>
<option value="PUNCT">s,記号,句点,*</option>
<option value="PUNCT">s,記号,読点,*</option>
<option value="PUNCT">s,記号,括弧開,*</option>
<option value="PUNCT">s,記号,括弧閉,*</option>
<option value="PUNCT">s,記号,空白,*</option>
</select>
</body>