YahooAPIを利用してルビを振る
YahooAPIに文字を送ると平仮名などをつけてXMLで返すAPIがある。XMLであってJSONはないので、クロスドメイン制限があり使いづらい。
YQLを利用してクロスドメイン制限を回避
ルビ振りAPI(Yahoo! API使用)を試すではYQLを利用してクロスドメイン制限を回避している。
このプログラムでは漢字が含まれている文章を開いてひらがなの文章に変えている。このプログラムを少し変えてみる、具体的には
- 漢字にルビをふる
- ルビの種類をHTML、青空文庫、PIXIV、でんでんマークダウンと選ぶ
- 漢字にルビをふるレベルを小学校から一般レベルまでを選択
文字にルビをふる
ルビ振りAPIではXMLなのでクロスドメイン制限を回避するためにYQLを利用している。ただ、GETリクエストしかできず文字数制限が厳しい。
ルビ振りAPIの仕様
「漢字かな交じり文にふりがなを振ること。」をAPIにリクエストすると次のようなXMLを返す。
<?xml version="1.0" encoding="UTF-8"?>
<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>
<SubWord>
<Surface>振</Surface>
<Furigana>ふ</Furigana>
<Roman>hu</Roman>
</SubWord>
<SubWord>
<Surface>る</Surface>
<Furigana>る</Furigana>
<Roman>ru</Roman>
</SubWord>
</SubWordList>
</Word>
<Word>
<Surface>こと</Surface>
</Word>
<Word>
<Surface>。</Surface>
</Word>
</WordList>
</Result>
</ResultSet>
WSHのJScriptでYahooAPIにリクエストを送る
POSTリクエストを可能にするために、ブラウザではなくWSHでJScriptを使って行う。
https://github.com/kyukyunyorituryo/add_ruby
XMLHttpRequest
JScriptでHTTPアクセス - Qiita
XMLのパース
JScriptでDOM(XML)操作 - Qiita
を参考にして作っている。
「漢字」「かんじ」であれば、Surface とFuriganaを連結すればいいが。かな交じりの場合はSubwordの方を見る必要がある。SubwordがあればSubwordの方を見に行く。Subwordの個数は決まっていないので個数の分だけ処理するようにしている。
for (var i = 0; i < elements.length; i++) {
// エレメント取得
var element = elements[i];
// 子取得
var child = element.childNodes;
switch (element.childNodes.length) {
case 1: str += child[0].text; break;
case 3:
if (child[0].text == child[1].text) {
str += child[0].text;
} else {
str += ruby[r][0] + child[0].text + ruby[r][1] + child[1].text + ruby[r][2];
} break;
case 4: var subwords = child[3].childNodes;
for (var j = 0; j < subwords.length; j++) {
var subword = subwords[j];
var subchild = subword.childNodes;
switch (subchild.length) {
case 1: str += subchild[0].text; break;
case 3:
if (subchild[0].text == subchild[1].text) {
str += subchild[0].text;
} else {
str += ruby[r][0] + subchild[0].text + ruby[r][1] + subchild[1].text + ruby[r][2];
}
break;
}
}
break;
}
}