require "date" require "rd/rdfmt" require "rd/rd2html-lib" class RD2DiaryVisitor < RD::RD2HTMLVisitor BASE_LEVEL = 2 WDAYS = ["日", "月", "火", "水", "木", "金", "土"] def apply_to_DocumentElement(element, content) result = format("

%d月%d日(%s)

\n", @date.day, @date.month, @date.day, WDAYS[@date.wday]) result.concat(content.join("")) return result end def apply_to_Headline(element, title) anchor = refer(element) %Q[#{title}] + %Q[\n] end private def initialize(year, month, day) super() @date = Date.new(year, month, day) end def prepare_labels(tree, prefix = "label:") super(tree, format("d%d:%s", @date.day, prefix)) end end class RD2DiaryFormatter def get_diary(file) cache = file + ".dat" if File.exist?(cache) && File.mtime(cache) > File.mtime(file) open(cache) do |f| f.flock(File::LOCK_SH) return f.read end else result = format(file) open(cache, "w") do |f| f.flock(File::LOCK_EX) f.write(result) end return result end end private def format(file) year, month, day = file.scan(/(\d\d\d\d)(\d\d)\/(\d\d)/)[0].collect {|i| i.to_i} #/ visitor = RD2DiaryVisitor.new(year, month, day) lines = [] lines.push("=begin\n") open(file) do |f| f.flock(File::LOCK_SH) lines += f.readlines end lines.push("=end\n") tree = RD::RDTree.new(lines) return visitor.visit(tree) end end