Hooks機能
概要
Hooksを使うことで、PureBuilder Simplyの処理に追加の挙動を加えることができます。
Hooksを定義するには、ドキュメントルートディレクトリに.pbsimply-hooks.rbを置きます。
このスクリプトでは、PBSimply::Hooks.load_hooksを定義します。
このメソッドにはPBSimply::Hooksオブジェクトが引数として渡されます。
PBSimply::Hooksオブジェクトはタイミングをメソッドとして持っており、それぞれのタイミングオブジェクトの<<メソッドにProcオブジェクトを渡すことで、hookに処理を追加することができます。
#!/bin/ruby
def (PBSimply::Hooks).load_hooks h
h.process << ->(v) {
db[v["normalized_docpath"]] = v
}
h.post << ->(v) {
db.delete_if do |dbk, dbv|
not File.exist? dbv["dest_path"]
end
}
endhookには必ず1つの引数(通常はHash)が渡されますが、その中身はタイミングによって異ります。
タイミングメソッド
PBSimply::Hooks#load_hooksの引数オブジェクトのメソッドを紹介します。
#add {|arg| ... }
ブロックをタイミングオブジェクトに追加します。
#<< proc
Procオブジェクトをタイミングオブジェクトに追加します。
#cmd(*cmdarg)
コマンドをタイミングオブジェクトに追加します。 コマンドは
system(*cmdarg) 形式で実行されます。
preでは環境変数$pbsimply_currentdocで指定されたファイルの内容を更新して反映させることもできます。
#filter(*cmdarg)
コマンドをタイミングオブジェクトに追加します。
IO.popen(cmdarg, "w+")
形式でコマンドを実行します。
コマンドは標準入力からドキュメントの内容が与えられ、ドキュメントの内容はコマンドの出力で置き換えられます。
このコマンドはpreにおいてのみ利用可能なものです。
タイミングオブジェクト
pre
pre {|frontmatter, procdoc| ... }
PBSimply::Hooks#preはドキュメント処理の直前に呼ばれます。
frontmatterはこのタイミングでのfrontmatterが入っています。
preが呼ばれるのはBLESSよりも後の順番です。
procdocには処理中のドキュメントの一時ファイルのパスが入っています。
この時点では、このファイルの中身はソースドキュメントからfrontmatterを除いたものと同じです。
process
process {|frontmatter, procdoc, outpath| ... }
PBSimply::Hooks#processはドキュメントの一連の処理を行い、最後の生成を行った直後に呼ばれます。
frontmatterおよびprocdocは#preと同様ですが、生成前の処理はすべて終わった状態になっています。
outpathは出力予定されたドキュメントのパスです。
delete
delete {|target_file_path, source_file_path| ... }
PBSimply::Hooks#deleteは、ドキュメントが「なくなった」場合に呼ばれます。
これは、ドキュメントがdraftに変更された場合を含みます。
target_file_pathはこのドキュメントが生成される場合の出力ファイルパスです。
このファイルは存在する場合もあれば、存在しないこともあります。
source_file_pathはソースドキュメントのパスです。
存在することもあれば、存在しないこともあります。
post
post {|this_time_processed| ... }
PBsimply::Hooks#postはすべてのドキュメントの生成が終わったタイミングで呼ばれるます。
引数はthis_time_processedです。
これは、Hashの配列で、実際にPureBuilder
Simplyが今回の処理したドキュメントが入っています。
各値の中身はsource(オリジナルのソースファイルのパス),
dest(出力ファイルのパス),
frontmatterです。
accs
accs {|index, indexes| ... }
PBSimply::Hooks#accsはACCSインデックスを生成するときに呼ばれます。
引数としてindexとindexesが渡されます。
これは、.accsindex.erbで認識される@indexおよび@indexesと同じものです。