この文書は、現在私が設計しているソフトウェアについての概案です。現在のところ架空のプログラムですので、雲をつかむような話ではありますが、ご意見ご感想、ご指摘、あるいはバグ報告(!)など頂けたら大変嬉しいです。
ad-update
任意の外部プログラムを実行した結果を、tsvファイルの任意の列に書き込むツールです。
例えば、語学学習向けのデッキを構築する場合、単語を改行で区切ったテキストファイルから出発して、語
語義
音声
画像
頻度順位
関連語
関連語の語義
... などからなるフィールドを追加して、Ankiのテンプレートでビューに合成して使用することを想定しています。
指定されたdeckname
の0番目の列のデータをソースとして、command
を実行し、結果をcolumn
のデータとして保存します。
deckname
= デッキ名
column
= 出力先の列番号
row
= 出力先の行番号(optional)
--exec
= ここから後ろを実行するコマンドだと認識するフラグ
command
= 外部コマンド
ad-update deckname column [row] --exec command
html
ならばデータをそのままutf-8のテキストデータとして保存し、image
またはaudio
なら、データはdeckname.media
ディレクトリに書き込み、そのファイルを参照するhtml
を保存します。
--output-format
format
= 出力のフォーマット{html, image, audio}(default=html)
ad-update [--output-format format] deckname column --exec command
####必要があれば拡張子を指定できる
出力フォーマットがimage
またはaudio
の場合、拡張子を自動判別しようと試みます。失敗した場合、データは保存されません。拡張子は明示的に指定することができます。
--output-ext
ext
= 出力の拡張子(default=自動検出)
ad-update [--output-format format] [--output-ext ext] deckname column --exec command
デフォルトのソース(列番号0)以外の列をソースとして指定します。語の揺らぎを吸収したり、あるいは語とその関連語からデッキを生成する場合に便利です。
--source
column
= 列番号(default=0)
ad-update [--source column] deckname column --exec command
--yes
= 全ての問い合わせにyesと答えるフラグ
ad-update --yes deckname column --exec command
既にそのセルにデータが存在する場合、デフォルトではデータは上書きされません。このフラグを指定することで、既にデータがセルに存在するかどうかに関わらず、全てのセルにデータを書き込みます。
--overwrite
= セルにデータを上書きするフラグ
ad-update --overwrite deckname column --exec command
外部プログラムは任意のものです。外部プログラムは標準入力からデータを受け取り、処理をして、標準出力にデータを出力する必要があります。
語の頻度順位などをデッキに追加できると便利です。
rank
= grep -Fc -f list | sed -e "s/:.*//"
ad-update deckname column --exec rank some.txt
ある語の関連語が取得できれば、さらに強力なデッキが作成できます。(英和辞典などから取得するよりはこちらのほうが簡単で精度が高そうです)
wordnet
= WordNet(http://ja.wikipedia.org/wiki/WordNet)のデータを検索するプログラム
ad-update deckname column --exec wordnet ... --type syn n
タグA.txt
= 単語を列挙したリスト
タグB.txt
= 単語を列挙したリスト
tags-from-list
= 単語を列挙したリストからタグ情報を返す
ad-update deckname column --exec tags-from-list タグA.txt タグB.txt ...
標準入力に対応しないプログラムにも対応できます。
{{source}}
= ソース
ad-update --source none deckname column --exec command {{source}}
{{dir}}
= デッキが存在するディレクトリ
{{media-dir}}
= デッキの.mediaディレクトリ
ad-update --source none deckname column --exec command {{dir}}
ad-update --source none deckname column --exec command {{media-dir}}
標準入力を無効にしたい場合、複数の外部プログラムを組み合わせて実現できます。複数の外部プログラムについては後述します。
mute
= 何もしないコマンド
ad-update none deckname column --exec mute ^| command
|
によるパイプ(以下ではWindows環境でのエスケープを含めて^|
と表記)をサポートするので、複数の外部プログラムを組み合わせて出力を生成できます。例えば、grep, sed, awk などを使って、既存のCUIツールによる、出力の柔軟な加工が可能になります。
ad-update deckname column --exec command-A ^| command-B
ある語について、なにか特別な処理をしたい場合に便利です。
filter
= grep -F -f list
ad-update deckname column --exec filter some.txt ^| command
ad-update deckname column --exec ebquery ... ^| sed ...
wavからmp3に変換したり。
ad-update --output-format audio deckname column --exec ebquery ... ^| xmllint ... ^| base64 ... ^| ffmpeg ...
画像のクオリティ・サイズを変更したり。
ad-update --output-format image deckname column --exec ebquery ... ^| xmllint ... ^| base64 ... ^| convert ...
command
を実行した結果は保存されず、コンソールに出力されます。
--test
= コマンドを実行した結果を標準出力にバイパスするフラグ
ad-update --test deckname column [row] --exec command
test-equal
= 与えられた値と、入力が一致してしない場合にエラーメッセージを出力する
test-match
= 与えられたパターンに、入力が一致してしない場合にエラーメッセージを出力する
ad-update --test ... --exec ... ^| test-equal value
ad-update --test ... --exec ... ^| test-match pattern
あるいは、エラーを集約しておいて、エラーが無ければテストをパスしたと判断したり?
FOR %I in (errors) DO (IF %~zI EQU 0 ECHO Test Passed!)