1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ルビ振りAPIのXMLパース

Last updated at Posted at 2019-06-24

ルビ振り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);

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?