読者です 読者をやめる 読者になる 読者になる
月 の 上

CLIから青空文庫を閲覧するツール書いた

JavaScript

ao

www.npmjs.com github.com

インストール

npm i -g aozora

使い方

  • aozora : 対話的インターフェイスで作品を探す
  • aozora -r length : ランダムな作品を表示する。 length を指定したら先頭(length)文字だけ表示
  • aozora -a 著者名 : マッチする著者一覧を表示。一人だけの場合は、その人の作品一覧も表示。
  • aozora -w 作品名 : マッチする作品一覧を表示。一件の場合は本文を表示。

オススメ利用法

aozora -r 1000 | pbcopy で長文貼り付けできる

経緯

仕事でインターネット作ってるとテスト用に適当なデータを入力することがある。
「あああああ」とか「sdfafadf」とか。

極稀に、なんかミスってその内容が公開されてしまうことがある。 「ああああ」とかなら良いんだけど、ふざけててあまり宜しくない言葉を使ってたり、未公開情報が含まれてると大変。 でも人間は「ああああ」を200文字300文字も入力できるほど頭が良くないので、適当な長文を調達する手段が欲しい。

無料 長文 合法 といえば青空文庫だ。 調べてみると、青空文庫は作品一覧のcsvファイルをCC BY 2.1ライセンスで公開している。 これを利用すれば、作品タイトルや著者名などから青空文庫作品の検索ができる。

青空文庫の文章を引用すれば、長文に困る事はなくなるのでは? 多少オフェンシブな内容が含まれていても、昔の人による創作物だから許されるのでは? しかもターミナルで古典文学が読めるのでは!!

というわけで作った。

構成

利用したライブラリ
csvパース node-csv
DB Sqlite3 + Sequelize
スクレイピング axios + cheerio
テーブル表示 cli-table2
対話的インターフェイス Inquirer.js

CSVファイルはレポジトリに含めているんだけど、 postinstallでSqliteに突っ込んでる。 list_person_all.csvは構造が難しくて、この程度の規模なら全く正規化せずにLIKEしても大丈夫でしょって思ったけど、著者IDと作品IDで一意じゃなかったりするので、author work card という3つのテーブルに分けた。 card は図書カード(青空文庫における作品ページ)のこと。

テーブル表示が結構大変だった。 npmにはテーブル表示するためのパッケージがいくつもあるんだけど、殆どは日本語を表示すると崩れてしまう。 その中ではcli-table2が一番メンテされてそうで、既にCJK文字サポートのP-R出てたけど放置されてたので、それを引き継いだP-Rだしてマージしてもらった。

対話モードではInquirer.jsを使用。 ほんとはpercolとかpecoみたいなインターフェイスにしたかったけど、ムズそうなので定番で我慢した。

感想

CLIでもMVCっぽくなるんだなあ

まともな規模のCLIツールを作ったのは初めてだったんだけど、なんとなく普段触れているようなWebのMVCっぽい構成になった。 数年前のYAPC AsiaでゆーすけべーさんがWAF入門を教えていた時、最初にCLIツールから作っていたのを思い出した。 当時の僕はMVCという概念についてフンワリとしか知らず、ふーんそうなんだ、位にしか思っていなかったけど、 今回何も考えずにコードを整理していったら、いつも仕事で書いているような構成になっていった。

それほど許されない

小説、普通に差別語とかガンガン出てくるのでテスト用データに使うのには若干注意が必要だった