前回
bitclust server
コマンドにオプションを追加し、GraphQLの口を作った
https://github.com/hanachin/bitclust/tree/graphql
こう --graphql
オプションを渡すとGraphQLが生える
% bundle exec bitclust server --debug --port=4567 --auto --baseurl=http://localhost:4567/ --graphql
GraphiQL
前回のブランチではGraphQLの口を作った。以下のようなファイルを用意してGraphiQL経由で動作が確認できるようになった、べんり
gist.github.com
RDファイルをJSONに変換する
るりまでは RDCompiler
を利用してRDファイルをHTMLに変換している。
RDCompiler
ではパースとHTMLの出力を同時に行っている。
HTMLを出力せずにJSONに変換するため、以下のようなステップで書き換えを行った。
- 出力を行う部分を分離する
- 出力を行う部分をJSONへの出力で置き換える
- GraphQL経由でJSONへの出力を利用可能にする
結果
今日時点での最新コミットだとDocEntryのRDファイルをパースした結果がJSONで取れるようになった🎉
github.com
以下のようなクエリを投げると
query {
methodDatabase(version: "3.0.0") {
doc(id: "index") {
id,
title,
body
}
}
}
以下のようなレスポンスが返ってくる
{
"data": {
"methodDatabase": {
"doc": {
"id": "index",
"title": "オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル",
"body": [
{
"level": 1,
"name": "ul",
"children": [
{
"level": 1,
"name": "li",
"children": [
"Ruby オフィシャルサイト ",
{
"name": "bracket_link",
"type": "url",
"arg": "https://www.ruby-lang.org/ja/"
}
]
},
{
"level": 1,
"name": "li",
"children": [
"開発版対応リファレンス"
]
},
{
"level": 1,
"name": "li",
"children": [
"原著:まつもとゆきひろ"
]
},
{
"level": 1,
"name": "li",
"children": [
"最新版URL: ",
{
"name": "bracket_link",
"type": "url",
"arg": "https://www.ruby-lang.org/ja/documentation/"
}
]
}
]
},
{
"name": "headline",
"label": "使用上の注意",
"level": 2,
"fragment": null
},
{
"name": "paragraph",
"children": [
"組込みクラスのリファレンスはほぼ揃っています。標準添付ライブラリのリファレンスは一部未完成です。それ以外のドキュメントについては、まだまだ書き直しが必要です。\n"
]
},
{
"name": "headline",
"label": "目次",
"level": 2,
"fragment": null
},
{
"level": 1,
"name": "ul",
"children": [
{
"level": 1,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/intro"
}
]
},
{
"level": 1,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/commands"
}
]
},
{
"level": 1,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/rubycmd"
}
]
},
{
"level": 1,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/envvars"
}
]
}
]
},
{
"name": "headline",
"label": "Ruby 言語仕様",
"level": 3,
"fragment": null
},
{
"name": "paragraph",
"children": [
"Ruby でのオブジェクト:\n"
]
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/object"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/class"
}
]
}
]
},
{
"name": "paragraph",
"children": [
"プロセスの実行:\n"
]
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/eval"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/terminate"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/thread"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/safelevel"
}
]
}
]
},
{
"name": "paragraph",
"children": [
"Ruby の文法:\n"
]
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/lexical"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/program"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/variables"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/literal"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/operator"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/control"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/call"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/def"
}
]
}
]
},
{
"name": "paragraph",
"children": [
"その他:\n"
]
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/m17n"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/regexp"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "spec/lambda_proc"
}
]
}
]
},
{
"name": "headline",
"label": "組み込みライブラリ",
"level": 3,
"fragment": null
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "lib",
"arg": "_builtin"
}
]
}
]
},
{
"name": "headline",
"label": "標準添付ライブラリ",
"level": 3,
"fragment": null
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "lib",
"arg": "/"
}
]
}
]
},
{
"name": "headline",
"label": "C API",
"level": 3,
"fragment": null
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "f",
"arg": "/"
}
]
}
]
},
{
"name": "headline",
"label": "その他",
"level": 3,
"fragment": null
},
{
"level": 2,
"name": "ul",
"children": [
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "news/index"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "pack_template"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "print_format"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "glossary"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "symref"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "marshal_format"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "license"
}
]
},
{
"level": 2,
"name": "li",
"children": [
{
"name": "bracket_link",
"type": "d",
"arg": "help"
}
]
}
]
}
]
}
}
}
}
次試したいこと
ひとまず、ひき続きRDからJSONに変換できる対象を拡大していきたい。
組み込みクラスあたりまでJSONで出せるようになったらフロントエンドの実装をしてみる。
JSONへ変換する試みをしている最中にリスト処理のバグを見つけたので報告した。
github.com
こっちのバグも直しておきたい。(なおGraphQLお試しブランチでは直っている)