#! /usr/bin/ruby -w
#================================================================
# myrbdoc
# Document generator for Ruby sources
#================================================================
# main routine
def main
files = []
err = false
destdir = nil
ptitle = "Ruby API"
afile = nil
i = 0
while(i < ARGV.length)
if(files.length < 1 && ARGV[i] =~ /^-/)
if(ARGV[i] == "-d")
destdir = ARGV[i+=1]
elsif(ARGV[i] == "-t")
ptitle = ARGV[i+=1]
elsif(ARGV[i] == "-a")
afile = ARGV[i+=1]
else
usage()
end
else
files.push(ARGV[i])
end
i += 1
end
(files.length > 0) || usage()
(destdir) || (destdir = ".")
(File::directory?(destdir)) || Dir::mkdir(destdir)
files.each() do |file|
makedoc(destdir, ptitle, file)
end
makeindex(destdir, ptitle, afile, files)
return 0
end
# print the usage and exit
def usage
printf(STDERR, "%s: usage: %s: [-d dir] [-t str] [-a file] file ...\n", $0, $0)
exit(1)
end
# generate a document
def makedoc(destdir, ptitle, name)
source = name.gsub(/.*\//, "")
dest = sprintf("%s/%s.html", destdir, source)
File::open(name, "r") do |infile|
File::open(dest, "w") do |outfile|
writehead(outfile, ptitle, source)
while(line = infile.gets())
line.chomp!()
line.gsub!(/^ */, "")
if(line =~ /^\x23\x23/)
group = Array::new()
while(line = infile.gets())
line.chomp!()
line.gsub!(/^ */, "")
(line =~ /^\x23[^@]/) || break
(line.length() > 1) || next
group.push(line)
end
if(group.length() > 1)
printf(outfile, "
\n")
kbd = group[0] =~ /^\x23:/
group.each() do |elem|
elem.gsub!(/^\x23[ :]*/, "")
elem.gsub!(/&/, "&")
elem.gsub!(/, "<")
elem.gsub!(/>/, ">")
elem.gsub!(/\x22/, """)
end
if(kbd)
printf(outfile, "%s \n", group[0])
else
printf(outfile, "%s \n", group[0])
end
group.shift()
if(group.length > 0)
printf(outfile, "\n")
group.each() do |elem|
printf(outfile, "%s\n", elem)
end
printf(outfile, " \n")
end
printf(outfile, " \n")
end
end
end
printf(outfile, " \n")
writetail(outfile)
end
end
end
# generate the index file
def makeindex(destdir, ptitle, afile, files)
dest = sprintf("%s/index.html", destdir)
File::open(dest, "w") do |outfile|
writehead(outfile, ptitle)
if(afile)
File::open(afile, "r") do |infile|
while(line = infile.gets())
line.chomp!()
printf(outfile, "%s\n", line)
end
end
printf(outfile, " \n")
end
printf(outfile, "API \n")
printf(outfile, "\n")
files.each() do |file|
file = file.gsub(/.*\//, "")
printf(outfile, "%s \n", file, file.gsub(/\..*/, ""))
end
printf(outfile, " \n")
printf(outfile, " \n")
writetail(outfile)
end
end
# write header
def writehead(outfile, ptitle, name = nil)
if(name)
title = sprintf("%s (%s)", name.gsub(/\..*/, ""), ptitle)
head = sprintf("API of %s", name.gsub(/\..*/, ""))
navi = ""
else
title = sprintf("INDEX (%s)", ptitle)
head = ptitle
navi = "Ruby Source Documents
"
end
printf(outfile, "%s", <<__MYEOF)
#{title}
#{navi}
#{head}
__MYEOF
end
# write tail
def writetail(outfile)
(sec, min, hour, mday, mon, year) = Time::now.to_a
datestr = sprintf("%04d/%02d/%02d", year, mon, mday)
printf(outfile, "%s", <<__MYEOF)
Generated by #{$0}, #{datestr}.
__MYEOF
end
# execute main
$0.gsub!(/.*\//, "")
exit(main())
# END OF FILE