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
.process << ->(v) {
h[v["normalized_docpath"]] = v
db}
.post << ->(v) {
h.delete_if do |dbk, dbv|
dbnot File.exist? dbv["dest_path"]
end
}
end
hookには必ず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
と同じものです。