Yahoo apiを利用してルビを振る

# YahooAPIを利用してルビを振る
　YahooAPIに文字を送ると平仮名などをつけてXMLで返すAPIがある。XMLであってJSONはないので、クロスドメイン制限があり使いづらい。

# YQLを利用してクロスドメイン制限を回避
[ルビ振りAPI（Yahoo! API使用）を試す](http://jsdo.it/cx20/yCLO)ではYQLを利用してクロスドメイン制限を回避している。

このプログラムでは漢字が含まれている文章を開いてひらがなの文章に変えている。このプログラムを少し変えてみる、具体的には

- 漢字にルビをふる
- ルビの種類をHTML、青空文庫、PIXIV、でんでんマークダウンと選ぶ
- 漢字にルビをふるレベルを小学校から一般レベルまでを選択

[文字にルビをふる](http://jsdo.it/99nyorituryo/Spyh?lang=ja)
ルビ振りAPIではXMLなのでクロスドメイン制限を回避するためにYQLを利用している。ただ、GETリクエストしかできず文字数制限が厳しい。

# ルビ振りAPIの仕様

https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html

「漢字かな交じり文にふりがなを振ること。」をAPIにリクエストすると次のようなXMLを返す。

```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](http://qiita.com/tnakagawa/items/3bce99d49b1aa3fc9a72)
XMLのパース
[JScriptでDOM(XML)操作 - Qiita](http://qiita.com/tnakagawa/items/4b501c21abcd39f30fbe)
を参考にして作っている。

「漢字」「かんじ」であれば、Surface とFuriganaを連結すればいいが。かな交じりの場合はSubwordの方を見る必要がある。SubwordがあればSubwordの方を見に行く。Subwordの個数は決まっていないので個数の分だけ処理するようにしている。

```js:
    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;
        }
    }
```