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("
\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