るりまのRDファイルをJSONに変換する

前回

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に変換するため、以下のようなステップで書き換えを行った。

  1. 出力を行う部分を分離する
  2. 出力を行う部分をJSONへの出力で置き換える
  3. 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お試しブランチでは直っている)

いいなと思ったらKyashでお金を下さい
20191128011151
GitHubスポンサーも受け付けています
https://github.com/sponsors/hanachin/