Publish Multi Files (ja)

koseki edited this page Sep 13, 2010 · 25 revisions

Sorry, this page is written in Japanese. See Publish Multi FIles

複数のファイルを生成する

0.1.8から、生成するファイル名を動的に変更できるようになりました。また、1つのソース(*.smc)から複数のファイルを生成できるようになりました。

URIテンプレート

デフォルトでは、index.html.smc から index.html が生成されます。URIテンプレートを使うと、このルールを変更できます。

配置

URIテンプレートのファイル名は、

  • /_smc/templates/page.uri.rhtml

のように (テンプレート名).uri.rhtmlとします。

URIテンプレートは通常のテンプレートとペアで使います。上の例ではテンプレート page.rhtml が必要です。

形式

  • URIテンプレートは通常のテンプレートと同じようにレンダリングされます。
  • 1行に1つのURIを書きます。
  • /で始まる場合は、ドキュメントルートからの指定になります。
  • /で始まらない場合は、smcファイルからの相対パスになります。
  • ドキュメントルートの外にファイルを出力することはできません。

例: rubyを使わずにベタにテキストで指定。

/ja/items/index.html
/en/items/index.html

例: 英語版と日本語版のファイルを数字三桁の連番で出力。

<%- items.length.times do |i| -%>
<%= "/ja/items/#{"%03d" % i}.html" %>
<%= "/en/items/#{"%03d" % i}.html" %>
<%- end -%>

例: smcファイルに書かれたfilesの値からファイルを生成。

<%= files.join("\n") %>

例: itemsのnameの値からファイルを生成。

<%= items.map {|item| item['name'] + ".html"}.join("\n")  %>

例: CSVを読み込んで出力。

<%- require 'csv'
@obj["items"] = CSV.read(dirs[0]["path"] + "_smc/data/items.csv")
@obj["items"].each_with_index do |data, i| -%>
item-<%= data[0] %>.html
<%- end -%>

ダウンロードしてパブリッシュできるサンプルが gist: 228019 にあります。

smcオブジェクトに設定される値

URIテンプレートが存在する場合、以下の値がsmcオブジェクトに追加されます。

  • uris … URIテンプレートのレンダリング結果。行で分割した配列。
  • cursor … 現在処理中のURIの位置。urisの先頭が0。

また、uri,pathの値が上書きされます。

アップデート

smc updateは以下の擬似コードのような処理を実行します。

uris = render_uri_template
uris.each_with_index do |uri,cursor|
  next if uri.empty?
  set_uri_and_path(uri)
  render_template
end
  • templateの値からURIテンプレート(template).uri.smcを探す。
  • URIテンプレートが見つかったら、最初に1回だけレンダリング。
  • urisにURIテンプレートの結果を配列で設定。
    • urisは前後ページへのリンクなどに使う。
  • URIテンプレートに書かれたURIを1行ずつ順にsmcオブジェクトに設定。
    • 空行だったらスキップ。
    • uriとpathを設定。
    • uri.smc、path.smcは元のまま。
  • cursorにuris内の現在地(インデックス)を設定。
    • 1行目のURIはcursorが0。2行目は1、3行目は2…
    • cursorの値でどのデータを使うか決める。
  • cursorを増やしながら、URIの行数分テンプレートをレンダリングする。

削除

updateで出力したファイルの一覧は、/_smc/tmp/list.yml に保存されます。出力するファイルが前回のupdateと変わった場合、古いファイルは自動的に削除されます。

あるファイルが前回と異なるsmcファイルから出力された場合は、削除の対象になりません。以前はa.html.smcからa.htmlを生成していたのが、b.html.smcからa.htmlを生成するように修正された場合でも、a.htmlが消えてしまうようなことはありません。

ただし、smc update a.html.smc のように対象を限定してupdateを実行すると、前回a.html.smcが出力していたファイル一覧との比較でファイルを消します。実際にb.html.smcをパブリッシュしない限り、a.htmlが出力されるかどうかを知る方法が無いためです。

出力ファイルが同一でソースが切り替わるような場合は、適当なタイミングで全体をパブリッシュし直すと安心です。

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.