Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Node製CLIで「BLEACH」の始解・卍解を確認したい!

唐突に「BLEACH」の登場人物の解号・始解・卍解をパッと確認できるやつ欲しい!と思ったので作りました。
「blch」コマンド。 blch - npm
nodeによるcli作成〜公開まで。

TL;DR

npm install -g blchで!

できること

  • 登場人物のリスト表示
  • 指定した人物の解号・斬魄刀・卍解の表示
  • 始解
  • 卍解

*全ての登場人物を網羅していません
*基本的に破面篇までの登場人物を扱いますが、一部卍解は千年血戦篇以降で発現したものも扱っています
*十刃(エスパーダ)の場合は始解・卍解ではなく帰刃を扱います

人物追加・編集・修正はこちらから自由にしていただいて構いません。
https://docs.google.com/spreadsheets/d/1e7Ms9sX2m1xu_4r20AgyIZHFgByRQp1s93ZE2PZlEaM/edit#gid=0
このデータからCSVを作成し、該当するものを整形して表示するという仕組みになっています。
*スプレッドシート更新されたらコマンドも勝手に更新するような仕組みにはなってないです
*CLIを作って公開までをやってみたかっただけなので作りは荒いです(レスポンス速度など考慮してなかったり)

CLI紹介篇

人物リスト表示 - human

キャラクターをリスト表示します。
オプション指定により、護廷十三隊、仮面の軍勢(ヴァイザード)、十刃(エスパーダ)などのリスト表示ができます。
*v1.1.0より完現術者(フルブリンガー)が追加されました。

blch human --gotei13

output.gif

概要表示 - tldr

登場人物の解号・斬魄刀・卍解を表示します。

blch tldr 黒崎一護

output2.gif

非常にお世話になっているtldrコマンドから着想を得ています。
shellコマンドの説明と使用方法を数行で紹介してくれます。
brew install tldrで!
https://github.com/tldr-pages/tldr

始解・卍解 - echo

echoコマンドにより、始解または卍解を行います。

blch echo --shikai 朽木白哉
blch echo --bankai 朽木白哉

output3.gif

コマンド組み合わせ

blch human -a | fzf | xargs blch tldr
# もしくは(*fish記法です)
blch tldr (blch human -a | fzf)

output4.gif

ちなみにログインシェルはfishを使っていますが超おすすめです。
ログインシェルをfishにしてみる - Qiita

help表示

それぞれのコマンドに-hをつけることでヘルプを見ることができます。

❯❯❯ blch hu -h
Usage: blch human|hu [options]

Output human names

Options:
  -a, --all          List all
  -g, --gotei13      List gotei 13
  -e, --espada       List espada
  -v, --visored      List visored
  -k, --karakuracho  List karakuracho
  -f, --fullbringer  List fullbringer
  -h, --help         output usage information

  Examples:

    $ blch human --gotei13
    $ blch hu -g

CLI作成篇

commander

node.jsにおけるCLIの完璧なソリューションです。
と書いてあります。実際使いやすかったです。↓
commander - npm

commanderの使い方をblch humanコマンドを例にとって説明してみます。
Typescriptです。

index.ts

import * as program from 'commander';
=====

// バージョン情報の登録
// blch -V or blch --version でバージョンが確認できる
program
  .version('0.0.1', '-V, --version')

// blch humanコマンドの作成
program
  .command('human') // コマンド名の登録 ここで登録したものを`blch ~`の形で使える
  .alias('hu') // alias登録により、`blch hu`と打つことも可能
  .description('Output human names') // help用
    // optionの登録(省略可能)
  .option("-a, --all", "List all")
  .option("-g, --gotei13", "List gotei 13")
  .option("-e, --espada", "List espada")
  .option("-v, --visored", "List visored")
  .option("-o, --other", "List other")
  .action( async (cmd, options) => {

      /**
        `blch human --gotei13`を実行した場合
        `cmd`に`gotei13`のBooleanパラメータがtrueで追加される
        `gotei13`は上記optionで設定した`--gotei13`の部分に該当する

        `blch human --gotei13 4`を実行した場合
        `blch human --gotei13`を実行した時とcmdの内容は同じ
        optionsは['4']となっている
        つまり`--gotei13 4`で指定したものが文字列として配列に入る

        今回のblchコマンドでは考慮していないが、
        オプションの重ねがけも可能。
        `blch -g -e`とするとcmdの`gotei13`も`espada`もtrueになる
        また、`--gotei13 4 5`とオプションに入れると
        optinosは、`['4', '5']`となる

        以下から`cmd`, `options`の値で条件分岐し出力する処理
      */

      // csvファイルから全リストを取得
    const dataList: Human[] = await files.getHumanDataList()

    let targetCode: GroupCode = 'all'
    if (cmd.gotei13) {
      targetCode = 'gotei13'
    }
    if (cmd.espada) {
      targetCode = 'espada'
    }
    if (cmd.visored) {
      targetCode = 'visored'
    }
    if (cmd.other) {
      targetCode = 'other'
    }
      // オプションから対象を取得
    const humans = findHumansByGroupCode(dataList, targetCode, options)
    if (humans.length === 0) {
      console.log('No matching')
      return
    }
      // ターミナルへ出力
    humans.forEach(human => console.log(human.name))

  })
    // helpの定義
  .on('--help', function() {
    console.log('\n  Examples:')
    console.log()
    console.log('    $ blch human --gotei13')
    console.log('    $ blch hu -g')
    console.log()
  })

// blch humanコマンド以外を作成する場合は同じように追加していく
program
  .command('tldr <target>')
======

// 最後にターミナル引数をparseする処理
program.parse(process.argv)

サクッとコマンド作れて良い。

chalk

chalk - npm
ターミナル出力に色をつけたり太字にしたりできます。

  • chalk未使用 image.png
  • chalk使用 image.png

chalkを使うことで味のある出力になります。

今回この2つくらいしかCLI用のパッケージは使ってないですが、NodeのCLIには他にも使えそうなものは色々あるんだなということを知れました。
こちらはgitのpackage解決周りでバグってビルドできなかったけど参考になりました。
Build a JavaScript Command Line Interface (CLI) with Node.js — SitePoint

CLI公開篇

ほぼこれに沿って行ったので参照のみ貼ります。
npmへの公開は思っていたより簡単でした。
https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2

まとめ

  • nodeでのCLI作成〜公開を行った。意外とすんなりできた。
    • goとかrubyとかrustとかpythonでのCLI作成はどうなんだろう
  • 完全に個人用のCLIだが作るきっかけができ、「BLEACH」に感謝。
    • 網羅できていない部分は申し訳ありません
    • (追記)千年血戦篇アニメめっちゃ楽しみ
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?