Edited at

ルビ振りAPIのXMLパース


ルビ振りAPIのパース

 ヤフーのルビ振りAPIの覚書。ルビ振りマクロを作ったときに、jscriptだったので、javascriptに書き換えてみた。

ヤフーのルビ振りAPI

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

 

サンプルXMLの取得は上の文字をGETリクエストしている。

GETリクエスト

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

Node.jsとYahooテキスト解析APIで振り仮名ジェネレーターを作ってみた

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

add_ruby

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

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

<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>

var oParser = new DOMParser();

var oDOM = oParser.parseFromString(xml, "application/xml");


ルビの指定

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

// 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);

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

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