Chienomi

PureDocの自動update timestamp

有用なユーティリティコード

先日、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