先日、PureDocで自動last-updateを入力するコードをいれたが、これでは生成時に元ドキュメントをいじるため、mtimeが変化してしまう。たとえ、mtimeをチェックするようにしても、「mtimeが変わっているから」変更すると、書き込むほうが遅いためやはり毎回mtimeが変更されupdateされたことになってしまう。

色々試したのだが、結局はlast-updateがメタYAMLにない場合のみ設定する、ということにした。変更した時は手動で削除してくださいね、という仕様。全自動とはならなくなったが、恐らくこれが最も無難な方法だろう。

begin
if docstr =~ /^##--.*$/ && $' =~ /^##--.*$/
yax = $`.each_line.map {|i| i.sub(/^# /, "") }.join
header_meta = YAML.load(yax) || Hash.new

# Set since timestamp if a document generation is first time. (And update Last update time stamp.)
if ! argv_first.empty? and
( ! header_meta.key?("last-update") )
( ! header_meta.key?("since") )

File.open(argv_first, "r+") do |f|
content = f.read

# Set since Time object if since is not set.
if ! header_meta.key?("since")
since = Time.now
header_meta["since"] = since
end

content.sub!(/^##--.*?^##--.*?$/m) do
el = $&.each_line.to_a # Get header texts.

el.insert(1, "# since : #{since.strftime '%Y-%m-%d %H:%M:%S %:z'}\n") if since # Add since if since is not exist.
# Update last update time if last-upadte is not set or last-update is older than mtime.
if ! header_meta.key? "last-update"
el.insert(1, "# last-update : #{File.mtime(argv_first).strftime '%Y-%m-%d %H:%M:%S %:z'}\n") # Add last update timestamp
end
el.to_s
end or next

f.seek(0)
f.truncate(0)
f.write( content )

end

end

DOC.meta = header_meta
end
rescue
DOC.meta = {}
end

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA