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
  }
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インデックスを生成するときに呼ばれます。

引数としてindexindexesが渡されます。 これは、.accsindex.erbで認識される@indexおよび@indexesと同じものです。