ルビ振りAPIのXMLパース

#### ルビ振りAPIのパース

　ヤフーのルビ振りAPIの覚書。ルビ振りマクロを作ったときに、jscriptだったので、javascriptに書き換えてみた。
[ヤフーのルビ振りAPI](https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html)
 


「漢字かな交じり文にふりがなを振ること。」

 
サンプルXMLの取得は上の文字をGETリクエストしている。
[GETリクエスト](https://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=dj0zaiZpPVJqcVRmNUk2S0p1SSZzPWNvbnN1bWVyc2VjcmV0Jng9MTc-&grade=1&sentence=%E6%BC%A2%E5%AD%97%E3%81%8B%E3%81%AA%E4%BA%A4%E3%81%98%E3%82%8A%E6%96%87%E3%81%AB%E3%81%B5%E3%82%8A%E3%81%8C%E3%81%AA%E3%82%92%E6%8C%AF%E3%82%8B%E3%81%93%E3%81%A8%E3%80%82)




　Jscript向けに作ったやつをJavaScriptにした。Node.js版にしようと思えばできそうな感じではある。Node.js版は探したらあったけど、少し目的が違っている。書き換えれば良いのだけど、前に作ったのを流用したほうが早そうなので書いてみた。

[Node.jsとYahooテキスト解析APIで振り仮名ジェネレーターを作ってみた](https://qiita.com/takuya0206/items/fef06a84998e9d893305)


JscriptはJavaScriptに近いからそのまま動くかなと思ったが。タグのテキストを取得するのが、textでは動かず、textContentを指定しなければならなかった。childNodesはtextのぶんだけ増えて、lengthで取得すると長さが変わってしまってうまく動かなかった。

[add_ruby](https://github.com/kyukyunyorituryo/add_ruby)


textをtextContentに、childNodesをchildrenに書き換えた。

まずサンプルとして使うXMLをテキストとして読みこむ。 oDOMというなまえでDOMとして扱う。

```xml
<ResultSet xmlns="urn:yahoo:jp:jlp:FuriganaService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:jlp:FuriganaService https://jlp.yahooapis.jp/FuriganaService/V1/furigana.xsd">
<Result>
<WordList>
<Word>
<Surface>漢字</Surface>
<Furigana>かんじ</Furigana>
<Roman>kanzi</Roman>
</Word>
<Word>
<Surface>かな交じり</Surface>
<Furigana>かなまじり</Furigana>
<Roman>kanamaziri</Roman>
<SubWordList>
<SubWord>
<Surface>かな</Surface>
<Furigana>かな</Furigana>
<Roman>kana</Roman>
</SubWord>
<SubWord>
<Surface>交</Surface>
<Furigana>ま</Furigana>
<Roman>ma</Roman>
</SubWord>
<SubWord>
<Surface>じり</Surface>
<Furigana>じり</Furigana>
<Roman>ziri</Roman>
</SubWord>
</SubWordList>
</Word>
<Word>
<Surface>文</Surface>
<Furigana>ぶん</Furigana>
<Roman>bun</Roman>
</Word>
<Word>
<Surface>に</Surface>
</Word>
<Word>
<Surface>ふりがな</Surface>
</Word>
<Word>
<Surface>を</Surface>
</Word>
<Word>
<Surface>振る</Surface>
<Furigana>ふる</Furigana>
<Roman>huru</Roman>
<SubWordList>...</SubWordList>
</Word>
<Word>
<Surface>こと</Surface>
</Word>
<Word>
<Surface>。</Surface>
</Word>
</WordList>
</Result>
</ResultSet>
```

```js
var oParser = new DOMParser();
var oDOM = oParser.parseFromString(xml, "application/xml");
```


### ルビの指定
ここからルビの形式を指定して出力する。

```js
// JavaScript source code
var ruby = [
['｜', '《', '》'],//青空文庫ルビ
['[[rb:', ' > ', ']]'],//pixiv
['{', '}(', ')'],//BCCKS
['{', '|', '}'],//でんでんマークダウン
['<ruby>', '<rt>', '</rt></ruby>'],//HTML5
['\\ruby{', '}{', '}'],//LaTeX
];
r = 2;//ルビの種類
var str = "";
function addruby(ruby, r, dom) { // タグ名がWordのエレメント取得
var root = dom.documentElement;
var elements = root.getElementsByTagName("Word");
// Alert(elements.length);
//
for (var i = 0; i < elements.length; i++) {
// エレメント取得
var element = elements[i];
// 子取得
var child = element.children;
switch (element.children.length) {
case 1: str += child[0].textContent; break;
case 3:
if (child[0].textContent == child[1].textContent) {
str += child[0].textContent;
} else {
str += ruby[r][0] + child[0].textContent + ruby[r][1] + child[1].textContent + ruby[r][2];
} break;
case 4: var subwords = child[3].children;
for (var j = 0; j < subwords.length; j++) {
var subword = subwords[j];
var subchild = subword.children;
switch (subchild.length) {
case 1: str += subchild[0].textContent; break;
case 3:
if (subchild[0].textContent == subchild[1].textContent) {
str += subchild[0].textContent;
} else {
str += ruby[r][0] + subchild[0].textContent + ruby[r][1] + subchild[1].textContent + ruby[r][2];
}
break;

}
}
break;
}
}
return str;
}
str = addruby(ruby, r, oDOM);
```

この結果下のとおり出力される。

{漢字}(かんじ)かな{交}(ま)じり{文}(ぶん)にふりがなを{振}(ふ)ること。