stk_sort_by_line.rb: 新簑形式カードを本文の特定行をキーにしてソート

無保証。
スクリプト言語のRubyが必要です。

新簑形式カードのうち、カード本文何行目に何を書くか、というルールを決めてあるものに用います。カード本文内での行番号を指定して、その行に書いてある文字列をキーとしてカードソートします。

使用例:
ruby stk_sort_by_line.rb [引数] < 入力ファイル > 出力ファイル

インストール:
スクリプト一行目のruby実行ファイルへのパスは、お使いの環境に合わせて適切に書きかえて下さい。

具体例でご説明します。例えばToDo(やるべき事項)の優先順位を各々カード本文の一行目に、
+----------------------+
|@                     |
|2004/04/13(00:00:00)  |
|帰宅途中で牛乳を買う。|
|todo:3                |←注目
|                      |
|@                     |
|2004/04/13(22:22:22)  |
|お得意先へ電話入れる。|
|todo:1                |←注目
|                      |
|@                     |
|2004/04/13(11:11:11)  |
|経費清算。            |
|todo:2                |←注目
|                      |
+----------------------+
などと書いてあると仮定します。(このスクリプトのルールではタイトル行を0行目と数えます。)これを仮に、優先順位の高い順にソートさせたいとします。引数にキーにしたいカード内行位置をハイフンに続けて指定します。この場合では、カード本文の1行目をキーにさせたいので、引数"-1"を与えてこのスクリプトへ通すと、
+----------------------+
|@                     |
|2004/04/13(22:22:22)  |
|お得意先へ電話入れる。|
|todo:1                |←注目
|                      |
|@                     |
|2004/04/13(11:11:11)  |
|経費清算。            |
|todo:2                |←注目
|                      |
|@                     |
|2004/04/13(00:00:00)  |
|帰宅途中で牛乳を買う。|
|todo:3                |←注目
|                      |
+----------------------+
などと優先順位の高い順にカードをソートできます。

以下、このスクリプトに指定する引数についてご説明します。(複数の引数を与えるときは各々の引数を半角空白をはさんで下さい。)

-tまたは-timestamp
新簑形式カードのタイムスタンプをキーとして、カードソートします。デフォルトは古い順です。

-数字
カード本文内での行番号を指定して、その行に書いてある文字列をキーとしてカードソートします。カードのタイトル行を0行目と数えます。タイトル行の次行から1行目、2行目、……、と数えていきます。ですので例えば、"-0"と指定すると、カードタイトルをキーにしてカードソートします。

-rまたは-reverse
逆順にソートします。"-t"と併用すると、例えば、タイムスタンプの新しい順にカードソートします。

-n
キーにする文字列を数字として考えようと試みます。(ただし半角数字のみに有効です。全角数字には効果ありません。)例えば、デフォルトでは
・todo:100
・todo:2
という優先順位になります。これは100を文字列と考える為です。引数"-n"を与えると、"100"と"2"を数字と考えようと試みるので、
・todo:2
・todo:100
という優先順位になります。ですから例えば、
+----------------------+
|@                     |
|2004/04/13(00:00:00)  |
|帰宅途中で牛乳を買う。|
|todo:100              |←注目
|                      |
|@                     |
|2004/04/13(22:22:22)  |
|お得意先へ電話入れる。|
|todo:1                |
|                      |
|@                     |
|2004/04/13(11:11:11)  |
|経費清算。            |
|todo:2                |
|                      |
+----------------------+
という新簑形式カードをToDoの優先順にソートしたいならば、引数"-1"と"-n"の両方を与えて下さい。

標準入出力を利用しますので、柔軟な使い方ができます。

1.コマンドラインで使う場合は、出力をファイルへリダイレクトさせるのがよいでしょう。
  使用例: ruby stk_sort_by_line.rb < 入力ファイル > 出力ファイル

2.標準入出力を呼び出せる種類のエディターでは、エディター上から直接使えます。
  模式図:


3.また例えば、
  使用例: ruby stk_sort_by_line.rb < 入力ファイル | less
  などとすれば、ファイル自体を加工することなく、ページャーのLESSでソート結果を見ることが出来ます。ソート結果を常用のエディターで見たい場合は、簡単なバッチファイルやスクリプトを書けば可能かもしれません。

このスクリプトの想定される用途:
・ToDoレベルによるカードソート
・掲示板ログを発言者別にまとめたい場合
その他ばらばらのカードを何らかのルールでまとめたい場合に利用できると考えられます。

既知の不具合:
1.新簑形式カード本文の存在しない行をキーとして指定するとエラー終了します。例えば100行目がないのに100行目をキーにするなどはダメです。

2.引数"-n"を指定すると、指定行の内容を数字として考えようと試みるだけで、結果的に数字として考えることに成功するとは限りません。参考までに、うまくカードソートできない例を示します。
  ダメな例:
    todo:1 ←(全角文字には効果ありません)
    todo:2

3.引数"-n"はあまり複雑なパターンには向きません。ちなみに"-n"指定時は、指定行に含まれる半角数字のみ抜き出して、それらをつなげあわせて数字として考えようと試みます。ですので、例えば、
    todo:100 ←(この行を100と考えようとします)
    todo:1_0_2 ←(この行を102と考えようとします)
  となります。

4.引数"-n"指定時に、キーとする行に半角数字がない場合、 カードソートしません。例えば次のような場合です。
    todo:a
    todo:b

注意:
ここでは説明の為に例えとして、
・お得意先へ電話入れる。
・経費清算。
・帰宅途中で牛乳を買う。
の優先順位といたしましたが、これはあくまでも例えであります。

2004/04/17(06:50:14)