Index: lib/bitclust/database.rb =================================================================== --- lib/bitclust/database.rb (revision 431) +++ lib/bitclust/database.rb (working copy) @@ -249,7 +249,7 @@ end def fetch_class(name) - classmap()[name] or + classmap()[classname2id(name)] or raise ClassNotFound, "class not found: #{name.inspect}" end Index: lib/bitclust/rrdparser.rb =================================================================== --- lib/bitclust/rrdparser.rb (revision 431) +++ lib/bitclust/rrdparser.rb (working copy) @@ -62,9 +62,10 @@ include CompileUtils - def RRDParser.parse_stdlib_file(path) - parser = new(Database.dummy) - parser.parse_file(path, libname(path), {"version" => "1.9.0"}) + def RRDParser.parse_stdlib_file(path, params = {}) + db = params.delete('db') || Database.dummy + parser = new(db) + parser.parse_file(path, libname(path), {"version" => "1.9.0"}.update(params)) end def RRDParser.libname(path) @@ -586,6 +587,7 @@ def eval_primary(s) s.skip(/\s+/) if t = s.scan(/\w+/) + #p(@params) unless @params.key?(t) scan_error "unknown preproc variable: #{t.inspect}" end Index: bin/bc-tohtml.rb =================================================================== --- bin/bc-tohtml.rb (revision 431) +++ bin/bc-tohtml.rb (working copy) @@ -22,14 +22,18 @@ require 'optparse' def main + prefix = nil templatedir = srcdir_root() + 'template' target = nil parser = OptionParser.new parser.banner = "Usage: #{File.basename($0, '.*')} rdfile" - parser.on('--target=NAME', 'Compile NAME to HTML.') {|name| + parser.on('-d', '--database=PATH', 'Database prefix.') {|path| + prefix = path + } + parser.on('-n', '--target=NAME', 'Compile NAME to HTML.') {|name| target = name } - parser.on('--templatedir=PATH', 'Template directory') {|path| + parser.on('-t', '--templatedir=PATH', 'Template directory') {|path| templatedir = path } parser.on('--help', 'Prints this message and quit.') { @@ -48,17 +52,44 @@ exit 1 end - lib = BitClust::RRDParser.parse_stdlib_file(ARGV[0]) - entity = lookup(lib, target) + path = ARGV[0] + lib = nil + db = BitClust::Database.new(prefix) + db.transaction do + lib = db.update_by_file path, guess_library_name(path) + end + entry = lookup(lib, target) + raise "#{target} not found in #{path}" if target and not entry manager = BitClust::ScreenManager.new( :baseurl => 'http://example.com/', :templatedir => templatedir) - puts manager.entity_screen(entity).body + puts manager.entry_screen(entry).body end def lookup(lib, key) return lib unless key - raise 'FIXME' + case key + when /\A\w+\Z/ + lib.sorted_classes.find do |klass| + klass.name == key + end + when /\A([\w:]+)(#|\.|::)([a-z_]\w*)\Z/ + class_name, typemark, method_name = $1, $2, $3 + klass = lib.sorted_classes.find do |c| + c.name == class_name + end + klass.find do |m| + m.typemark == typemark and m.name == method_name + end if klass + end end +def guess_library_name(path) + if %r<(\A|/)src/> =~ path + path.sub(%r<.*(\A|/)src/>, '').sub(/\.rd\z/, '') + else + path + end +end + main