Wikipediaのアニメ情報をパース

# 目的
Wikipediaのアニメ記事中の「アニメタイトル」、「監督」、「脚本」、「音楽」、「アニメーション制作」の情報を取得する。

# コード
[Wikipedia.ts](https://github.com/kumo2ji/AnimeInfoClient/blob/master/AnimeInfoClientType/Wikipedia.ts)
getWikiInfo関数の引数に記事タイトルを入れる。
記事タイトルは「[TypeScriptでWikipedia APIから情報取得](http://qiita.com/kumo2ji/items/acc917c6bf613f44c166)」で取得する。
JSONの中身はWiki記法の文字列なので、正規表現で目的の情報を取得する。(タグの削除、```<br>```タグによるリスト化も行っている)
Underscore.jsのおかげで配列、オブジェクトを便利に扱うことができた。

```ts:Wikipedia.ts
namespace utils.Wikipedia {
    const ENDPOINT = 'https://ja.wikipedia.org/w/api.php?'
    const SEARCH_BASE_URL = ENDPOINT + 'action=query&list=search&format=json&srsearch='

    export function getWikiInfo(title: string, success: (info: WikiInfo) => void, fail?: (jqXhr: JQueryXHR) => void) {
        var url = INFO_BASE_URL + encodeURIComponent(title)
        var xhr = $.ajax({
            url: url,
            type: 'GET',
            dataType: 'jsonp',
            jsonpCallback: 'callback'
        })
        xhr.then((json: ContentResponseJson) => {
            var pages = json.query.pages
            var page: PageJson = _.first(_.values(pages))
            var revision = _.first(page.revisions)
            var content = revision['*']
            var tvAnimeInfobox = getTvAnimeInfoboxText(content)
            success({
                pageTitle: page.title,
                title: split(getValue(tvAnimeInfobox, 'タイトル')),
                director: split(getValue(tvAnimeInfobox, '監督')),
                writer: split(getValue(tvAnimeInfobox, '脚本')),
                music: split(getValue(tvAnimeInfobox, '音楽')),
                studio: split(getValue(tvAnimeInfobox, 'アニメーション制作'))
            })
        }, fail)
    }

    function getTvAnimeInfoboxText(input: string): string {
        var regex = /\{\{Infobox animanga\/TVAnime([\s\S]+?)\}\}/
        return regex.exec(input)[1]
    }

    function getValue(text: string, key: string): string {
        var regex = new RegExp('^\\| *' + key + ' *= *(.+?)$', 'm')
        var execArray = regex.exec(text)
        if (_.isEmpty(execArray)) {
            return ''
        } else {
            return removeSquareBracket(execArray[1])
        }
    }

    function removeSquareBracket(input: string) {
        return input.replace(/\[|\]/g, '')
    }

    function removeHtmlTag(input: string) {
        return input.replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g, '')
    }

    function split(input: string): Array<string> {
        var splitted = input.split(/<br ?\/?>/)
        var tagRemoved = _.map(splitted, (value) => {
            return removeHtmlTag(value)
        })
        return _.compact(tagRemoved)
    }

    interface ContentResponseJson {
        query: {
            pages: Object
        }
    }

    interface PageJson {
        pageId: number,
        title: string,
        revisions: Array<{
            '*': string
        }>
    }

    export interface WikiInfo {
        pageTitle: string,
        title: Array<string>,
        director: Array<string>,
        writer: Array<string>,
        music: Array<string>,
        studio: Array<string>
    }
}
```

# サイトに反映
[アニメ情報サーバーにアクセスするWebサイト](http://qiita.com/kumo2ji/items/4f0e074223dbb9bfb7d6)で作成した[Anime Info Client](https://animeinfoclient.appspot.com/wikipedia.html)にWikipedia情報を取得するページを追加した。
![Wikipedia情報.PNG](https://qiita-image-store.s3.amazonaws.com/0/56307/8347c066-d552-a212-e453-56987c70aa6e.png)

# Github
[AnimeInfoClient](https://github.com/kumo2ji/AnimeInfoClient)