備考
この方式は止めました。以降は rst版 で。
タイ式楽譜のhtmlファイルを生成するpythonスクリプト。
上記のファイルがあるディレクトリで:
> python scorethai.py page-sample.yaml
と実行するとsample1.htmlとsample2.htmlが生成される。
入力ファイルは全てYAML形式なので以下の点に注意。
実行する命令は順番に意味があるので、シーケンスで記述する。 このスクリプトでは単純に、トップのシーケンスは全て実行シーケンスと見なし、その要素のマッピングキーを命令と見なす。
page-sample.yaml サンプル:
# 基本フォーマットをロード。 - load: format.yaml # 楽譜ファイルをロード。このファイルにはポンラン楽団のスタンダード曲の譜面が2曲入っている。 - load: song-sample.yaml # ページ用データをセットして。 - data: title: sample 1, simple score thai css: scorethai-simple.css output: sample1.html # ページ出力。ここでは1ページ目に2曲出力。 - page: - LaiPongLang - LaiToeiKhong # 次の楽譜ファイルをロード。後は同様。 - load: song-khaen.yaml - data: title: sample 2, Khaen solo css: scorethai-khaendiao.css output: sample2.html - page: MaengPhuTomDok-20060704
- load: ファイル名 - load: [ファイル名,... ] - load: - ファイル名 - ...
ファイル名で示されるファイルを読み込む。ファイル名のシーケンスならそれらを順番に読む。 インクルードのようなもの。
- data: { 変数名: 値,... } - data: 変数名: 値 ...
後のpage命令でページ出力をするときに使うパラメータ変数の設定。 書式指定次第でどのような変数も使用可能。 以下のtitleとcssは、サンプルの書式format.yaml(後述)内で %(title)s や %(css)s として参照している。 変数名は書式に追加すれば増やせるが、dataでセットしてないとエラーで止まる。
これは書式指定ではなくスクリプト自身が使用する。 この変数はページの出力が終わったらクリアされる。
- page: 楽譜ID - page: [ 楽譜ID,... ] - page: - 楽譜ID ...
指定した楽譜IDの楽譜を上記outputで指定したファイルに出力する。 楽譜IDが複数ならシーケンスで指定する。楽譜IDは!song(後述)の記述のid:で指定したもの。
出力データをタグ付けする為のタグの定義。
format: { 変数名: [ 開始タグ, 終了タグ ],... }
定義必須の変数名は以下のもの。
例えばformat.yamlサンプルの最初:
format: page: - | <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> [省略...] <title>%(title)s</title> <link rel="stylesheet" type="text/css" href="%(css)s" /> </head> <body lang="ja" xml:lang="ja" dir="ltr"> - | </body> </html>
ページ出力時にこの二つのデータで囲まれる。 ここで %(title)s は実行シーケンスのdata命令でセットされた titleの値に、 %(css)s はcssの値にに、それぞれ置き換えられる。
楽譜データは!song型のマルチドキュメントで指定。 !song型はスクリプト内でYAMLオブジェクトクラスとして定義してある。
--- !song id: 楽譜ID title: 楽譜のタイトル columns: 小節の一行内の列数 body: [ 楽譜の本体,... ]
song-sample.yaml サンプルの一曲目。出力結果は sample1.html:
--- !song id: LaiPongLang title: ลายโปงลาง columns: 8 body: - | [- - - ม, - ซ - ล, - ซ - ล, - - - ล, - - - ร, - ด - ล, - ซ - ล, - - - ล, - - - ด, - ร - ม, - ร - ม, - - - ม, - - - ล, - ซ - ม, - ร - ม, - - - ม, - - - ม, - ซ - ล, - ซ - ล, - - - ล, - - - ร, - ด - ล, - ซ - ล, - - - ล, - - - ซ, - ม - ล, - ซ - ม, - - - ม, - - - ด, - ร - ซ, - ร - ม, - - - ม, - - - ซ, - ม - ล, - ซ - ม, - - - ม, - - - ด, - ร - ซ, - ร - ม, - - - ม, - ม - ร, - ด - ล, - ซ - ล, - - - ล, - ม - ร, - ด - ล, - ซ - ล**, - - - -], - text: ending - | ** ม ม ซ ร, ด ล ซ ล, - - - -
body: [ 小節,... ]
2ページ目の楽譜データはケーンの独奏を採譜したもので細かい指定が増えている。 通常のタイ式楽譜とは違い、一行12小節で、小節の一拍目を一桁目に書いている。
song-khaen.yamlの一部。出力結果は sample2.html:
--- !song id: MaengPhuTomDok-20060704 title: แมงภู่ตอมดอก columns: 12 body: - text: 20060704 at มหาสารคาม - text: key Dm (ล=D, ด=F) / drone ซ=C - text: intro - | *ซ-,s<รล่~ -,- ม,ร>s - / ล ด,ร ด,ล ด,ร ล,e<ด ล,ด ล>e,e<ร ด,ร ด>e,ล ซ,- -,/ ซ -,ล~ -,- ด, s<รล่~ >s-, - -/ - text: inter - | (ด) ล, ด ร, ด ล, ด ร, / e<|ล ด, ล ด>e, ล ร, ด ร, e<|ล ด, ล ด>e, ล ร, ด ร./ ล~ -,ล ร,ด ล,ด ร, ล ด,ร ด,ล ร,ด ร,/ e<|ด ล,ด ร,|ด ล,ด ร.>e,e<ด ล, ด ล>e, e<|ด ล, ด ร.>e,s<มซ่ ร / ซ่ -, ซ่ ล่, ซ่ ม, ซ่ ล่, e<|ด่ ล่, ร่ ล่, |ด่ ล่, ร่ ล่.>e,/ ด่ ล่, ซ่ ม, ล่ ม, ซ่ ร, ม ร>s, ด ล, ด ร, ด ล,/ ด ร, ล ด, - -, ล ร, ด ร, ล ด, - -, ล ร, / ด ร, ล ด, ร ด, ล ร, ด ร, ล ด, ล~ -, ร -, ล ด, / - text: theme - | ร -, ร ด, ล ซ, ล ด, ร -, ม ร, ด ร, ล ด, / ร -, ด ล, ด ร, ล ด, ร ซ, ม ร, ด ร, ล ด, / ร -, - -, ด ร, ล ด, ร -, - -, ด ร, ล ด, / ร ซ, ม ร, ด ร, ล ด, ล~ -, ล ร, ด ล, ด ร, / ล -, ร ด, ล ร, ด ร, ล~ -, ล ร, ด ล, ด ร, / - text: inter [略...]
音符の属性は楽譜本体の任意の範囲の音符を囲んで属性付けするもの。
x< で属性xをオン、>x で属性xをオフ。xは任意の一文字。
このサンプルではformat.yamlに以下の属性を定義してある。
# 音符の属性とそれに対応するタグを定義 # { 属性文字 : [ 開始タグ, 終了タグ ] } s: [ '<span class="s">', '</span>' ] # シングルノートを表す属性 e: [ '<span class="e">', '</span>' ] # 強調 u: [ '<span class="u">', '</span>' ] # アンダーライン # 記号用のタグ。*に続く文字列。 mark: [ '<span class="mark">', '</span>' ]
例:上記楽譜本体の一行目:
*ซ-,s<รล่~ -,- ม,ร>s - /
これらの属性の範囲が複数小節にまたがった場合、小節の境目で終了タグが出力されるが、 次の小節で再び継続するように開始タグが挿入される。 念のためにスクリプトは属性のオン・オフが対応しない場合は警告を表示する。 未定義の属性の指定があるとエラーとなる。
上記の例の *ซ- は * に続く部分が記号の指定。 このサンプルでは「ここから先、ドローンとしてซの音を出しっぱなし」という意味で使っていて、 スタイルシートで上付きの極小サイズの表示になる。
太字 はリテラル。inputは入力データブロックの意味。
[] はシーケンス、 {} はマッピングのこと。
input ::= song_def | format_def | [ cmd, ... ] cmd ::= cmd_load | cmd_data | cmd_page song_def ::= --- !song id: song_id title: string columns: positive_number body: [ string | text_def,... ] format_def ::= format: { format_key : [ open_tag, close_tag ] } cmd_load ::= load: filename | [ filename,... ] cmd_data ::= data: { data_key : data_value } cmd_page ::= page: song_id | [ song_id,... ] text_def ::= text: string song_id, format_key, open_tag, close_tag, filename, data_key, data_value ::= string