ページのナビゲーションで自分自身を指すリンクをリンクしないようにする
"proc"オブジェクトを利用します。
こっちの方が簡単です。サイト全体に適用したい場合は全体書き出しを定義した".rb"ファイルの、そうでない場合は、そのページのファイルの"initialize"メソッドでフィルターを追加してやります。
desc.ht_filters << proc { |desc, lines|
pattern = %r!<a\s+([^<>]*?)href="#{File.basename(desc.publish_to)}"([^<>]*?)>([^<>]*)</a>!
replace = '<a \1 \2>\3</a>'
lines.gsub(pattern,replace)
}
"desc"は"initialize()"の引数の方です。スーパークラスは"NavigatablePage"です。
要は、一行ずつループして、自分のアドレスをリンクしてたら、class="this_page"を指定したタグに置き換える処理を書き出し時に追加するコードです。
分からなければ、3行目の"replace"のシングル・コーテーションに囲まれたタグっぽい部分を勝手に変えてください。(リンクをはるはずだった文字列は"\3"に入ります)
eclipseのエディタでRubyファイルを強調表示させる
最初にインストールした状態では"*.rb"にはWindowsの設定がそのまま生きていて、ダブルクリックでは内蔵エディタで開けない上に、単なるテキストファイルとして表示されてしまいます。
プラグインのRuby Development Toolをインストール(解凍してぶち込むだけ)することで、強調表示だけでなくファイルタイプも勝手に設定してくれます。
開発元から"rubyeclipse_{バージョン}.zip"を落としてきて、インストールして再起動すれば、まずOK。
メニューの「ウィンドウ」>「設定」の画面から「Ruby」>「Editor」の「Highlighting」で「Others」以外にBoldを指定。
同じく設定画面の「ワークベンチ」>「ファイルの関連付け」で、"*.rb"に秀丸とかメモ帳とかの外部エディタをデフォルト以外で関連付けておくと便利です。
スクリプトからプロジェクトの各種パスを取得する
独自のデータファイルのパスを取得するときなどに利用
@description.web_project.project_location #=>プロジェクトのパス
@description.web_project.htsources_dir #=>ソースフォルダのパス
@description.web_project.publish_dir #=>公開フォルダのパス
@description.web_project.scripts_dir #=>スクリプトフォルダのパス
通常でも同じですが、特にパスに2バイト文字が含まれる場合は、File.join()を利用しましょう。
例、"{プロジェクトのパス}\mydata\一覧.txt"を得るには
mydata_filename = File.join(@description.web_project.project_location , "mydata" , "一覧.txt")
とする。
Amritaで書き出す(その1)
ちなみに、やってることは本家のクイックスタートと大差ないですので、あしからず。
ベースのHTMLファイルに、
<span id="test">
<font id="name">[ここに名前]</font>
<a id="address" href="@address">[ここにアドレス]</a>
</span>
という風に書いて、書き出しのスクリプトファイルに、
def test
data = {
:name => "名無しの権兵衛",
:address => "http://www.hoge.fuga.com/"
}
end
を定義すれば、書き出されるHTMLファイルには、
<font>名無しの権兵衛</font>
<a href="http://www.hoge.fuga.com/">http://www.hoge.fuga.com/</a>
が出力されます。つまり、一番上のレベルのid内部は、AmritaのAmrita::TemplateTextとして処理されるようです。(ソースを通読していないのでおそらく……(汗))
一つ注意すべきは、Amritaを利用した展開と、単純にRubyでのテキストの書き出しは同じメソッド(def~end)内で両立しないと言うことです。
メソッド内の最後に定義された書き出しのみが実際に書き出されます。
Amritaで書き出す(その2)
こちらが、Amritaの真価といえる配列によるタグのコピーを伴う展開です。
ソースのHTMLファイルに、
<table id="test" border="1">
<tr><th>名前</th><th>アドレス</th></tr>
<tr id="testTable">
<td id="name"></td><td id="mail"></td>
</tr>
</table>
と書き、スクリプトファイルに、
def test
data = {
:testTable => [
{:name => "名無し1" , :mail => "nanasi1@hoge.fuga"},
{:name => "名無し2" , :mail => "nanasi2@hoge.fuga"},
{:name => "名無し3" , :mail => "nanasi3@hoge.fuga"}
]
}
end
とすると、書き出されるHTMLファイルには、
<table border="1">
<tr><th>名前</th><th>アドレス</th></tr>
<tr>
<td>名無し1</td><td>nanasi1@hoge.fuga</td>
</tr><tr>
<td>名無し2</td><td>nanasi2@hoge.fuga</td>
</tr><tr>
<td>名無し3</td><td>nanasi3@hoge.fuga</td>
</tr>
</table>
と出力されます。つまり、渡されたデータが配列だった場合、配列が各要素ごとにタグに順番に展開されます。
HTMLタグを含む文字列をAmritaで書き出したい
Amritaはセキュリティ上デフォルトでタグを変換します。これを抑制したい場合は、与える文字列に「SanitizedString」をくっつけてやります。
具体的には、
:name => Amrita::SanitizedString["名無し<b>1</b>"]
のよう「Amrita::SanitizedString[]」で括るようにしてください。
原理その他詳しいことは本家サイトをご参照下さい。
Scriptなどでid属性を使いたい(Amritaと共存)
Amritaはid属性を読み取って書き換えを行いますが、Scriptで制御する対象をid属性で識別することがあります。
そのまま書いてしまうとAmritaはテンプレートとして解釈してしまいますので、
data.default = true
のように存在しないキーでAmritaがデータから検索をかけたときにtrueを返すようにしてやると、Amritaはテンプレートとして与えられた文字列をそのまま加工せずに吐き出すようになります。
あ、もちろん残しておきたい部分全体を<span>タグで括っておくと良いですよ。
普段使いのエディタが[UTF-8]じゃないから使いづらい
OSがNT系で、エディタがユーザーごとの読み込み設定を分けられる(秀丸など)場合に限りますが、eclipseをショートカットから起動するようにして、[プロパティ]-[ショートカット]に「別ユーザーとして実行」のチェックボックスがあるので、それを有効にすると、
そのショートカットから起動したときに、ユーザ名とパスワードを入力すれば別ユーザーとしてeclipseが起動します。
この状態で、普段通りにエディタで開き、読み込み・書き込みの初期設定を[UTF-8]にしておけば、それ以降の操作では、ファイルを読み込むたび、保存するたびにファイルエンコードを変更しなくてもサクサク使えます。
このやりかた、「Windows Update」など、「IE」を時間を区切ってスクリプト許可したい場合なんかに便利です。
※私が普段使っている秀丸がHTMLの「charset」を参照して文字コードを設定してくれる機能がつきました。
これでめんどくさい事をしなくても万事OKですね!
HTMLでないファイル(zipなど)をサイトで利用するとき
プロジェクトにHTMLファイルのように追加することもできますが、プロジェクトをリビルドする度に出力先のフォルダにコピーされることになり、非常に不便です。
そこで、ビルドは書き出し先と「同期」するわけじゃない=「書き出しは同名のファイルがすでに存在する場合は削除してから書き出されるが、それ以外のファイルが書き出し先にあっても無視される」ことを利用して、
書き出しもと(プロジェクト)には登録せずに、出力先にだけファイルをコピー(空のプロジェクトならそのプロジェクトへのインポート)すれば、
FTPなどを利用するときにタイムスタンプが変化するのはHTMLだけですからわざわざ不要なアーカイブを除く指定をしなくてもOKです。