npm xmas!

JavaScript Advent Calendar 2011 (Node.js/WebSocketsコース) : ATNDの25日目です。メリークリスマス!!
…ということでnpm xmasです。
npm はNode.jsのv0.6.3あたりから標準添付されてますね。多くのサブコマンドが用意されていて、npm helpで一覧することができます。

$ npm help

Usage: npm <command>

where <command> is one of:
    adduser, apihelp, author, bin, bugs, c, cache, completion,
    config, deprecate, docs, edit, explore, faq, find, get,
    help, help-search, home, i, info, init, install, la, link,
    list, ll, ln, ls, outdated, owner, pack, prefix, prune,
    publish, r, rb, rebuild, remove, restart, rm, root,
    run-script, s, se, search, set, show, star, start, stop,
    submodule, tag, test, un, uninstall, unlink, unpublish,
    unstar, up, update, version, view, whoami

npm <cmd> -h     quick help on <cmd>
npm -l           display full usage info
npm faq          commonly asked questions
npm help <term>  search for help on <term>
npm help npm     involved overview

Specify configs in the ini-formatted file:
    /Users/sugyan/.npmrc
or on the command line via: npm <command> --key value
Config info can be viewed via: npm help config

npm@1.1.0-beta-4 /Users/sugyan/.nodebrew/node/v0.6.6/lib/node_modules/npm

が、これらがすべてというわけでもなく、隠しコマンド的にnpm xmasとかが使えたりします。

はい。クリスマスツリーが現れました。
npmのgithubレポジトリを見る限り、npm/lib/xmas.jsは去年の12/23に追加されていますね。
https://github.com/isaacs/npm/commits/master/lib/xmas.js
というわけで、一年前の古いネタです。すみません。


ところでこのクリスマスツリー、ロジックのメインの部分*1

;(function T (H) {
  for (var i = 0; i < H; i ++) w(" ")
  w(x+"\033[33m"+s+"\n")
  var M = H * 2 - 1
  for (L = 1; L <= H; L ++) {
    var O = L * 2 - 2
    var S = (M - O) / 2
    for (var i = 0; i < S; i ++) w(" ")
    w(x+"\033[32m"+f)
    for (var i = 0; i < O; i ++) w(
      "\033["+oc[Math.floor(Math.random()*oc.length)]+"m"+
      o[Math.floor(Math.random() * o.length)]
    )
    w(x+"\033[32m"+b+"\n")
  }
  w(" ")
  for (var i = 1; i < H; i ++) w("\033[32m"+l)
  w("| "+x+" |")
  for (var i = 1; i < H; i ++) w("\033[32m"+l)
  if (H > 10) {
    w("\n ")
    for (var i = 1; i < H; i ++) w(" ")
    w("| "+x+" |")
    for (var i = 1; i < H; i ++) w(" ")
  }
})(20)

となっていて、関数Tは引数Hを受け取って可変のサイズを描画できるように作られているのですが、呼び出しが引数に20と固定値を渡していて、結局そのサイズのものしか作れません。ちょっと勿体無いですね。
ということで折角なのでコマンド引数でサイズを指定出来るようにしてみました。
https://github.com/sugyan/npm/commit/ab9fb8f69d4cc7e61dac85ff52d9898862fe89eb
これで、
ちっちゃいツリーや

おっきいツリーも

作れちゃいますね!


npm loves you Happy Xmas, Noders!

*1: ちなみにこの部分をPerlで実装したものを半年ほど前に書きました。(http://d.hatena.ne.jp/sugyan/20110608/1307460864) Ruby版も@さんが作ってくれました。(http://randd.kwappa.net/2011/12/24/404)