#!/usr/bin/env ruby # # bc-tohtml.rb # # Copyright (c) 2006-2007 Minero Aoki # # This program is free software. # You can distribute/modify this program under the Ruby License. # require 'pathname' def srcdir_root (Pathname.new(__FILE__).realpath.dirname + '..').cleanpath end $LOAD_PATH.unshift srcdir_root() + 'lib' $KCODE = 'UTF-8' unless Object.const_defined?(:Encoding) require 'bitclust' require 'optparse' def main templatedir = srcdir_root() + 'data' + 'bitclust' + 'template.offline' target = nil baseurl = 'file://' + srcdir_root.to_s ver = '1.9.0' db = BitClust::MethodDatabase.dummy({'version' => ver}) parser = OptionParser.new parser.banner = "Usage: #{File.basename($0, '.*')} rdfile" parser.on('--target=NAME', 'Compile NAME to HTML.') {|name| target = name } parser.on('--force', '-f', 'Force to use rd_file template.') {|name| @rd_file = true } parser.on('--ruby_version=VER', '--ruby=VER', 'Set Ruby version') {|v| ver = v } parser.on('--db=DB', '--database=DB', 'Set database path') {|path| db = BitClust::MethodDatabase.new(path) } parser.on('--baseurl=URL', 'Base URL of generated HTML') {|url| baseurl = url } parser.on('--templatedir=PATH', 'Template directory') {|path| templatedir = path } parser.on('--help', 'Prints this message and quit.') { puts parser.help exit 0 } parser.on('--capi', 'C API mode.') { @capi = true } begin parser.parse! rescue OptionParser::ParseError => err $stderr.puts err.message $stderr.puts parser.help exit 1 end if ARGV.size > 1 $stderr.puts "too many arguments (expected 1)" exit 1 end manager = BitClust::ScreenManager.new( :templatedir => templatedir, :base_url => baseurl, :cgi_url => baseurl, :default_encoding => 'utf-8') unless @rd_file begin if @capi lib = BitClust::FunctionReferenceParser.parse_file(ARGV[0], {'version' => ver}) unless target raise NotImplementedError, "generating a C API html without --target=NAME is not implemented yet." end else lib = BitClust::RRDParser.parse_stdlib_file(ARGV[0], {'version' => ver}) end entry = target ? lookup(lib, target) : lib puts manager.entry_screen(entry, {:database => db}).body return rescue BitClust::ParseError => ex $stderr.puts ex.message $stderr.puts ex.backtrace[0], ex.backtrace[1..-1].map{|s| "\tfrom " + s} end end ent = BitClust::DocEntry.new(db, ARGV[0]) ret = BitClust::Preprocessor.read(ARGV[0], {'version' => ver}) ent.source = ret puts manager.doc_screen(ent, {:database => db} ).body return rescue BitClust::WriterError => err $stderr.puts err.message exit 1 end def lookup(lib, key) case when @capi && BitClust::NameUtils.functionname?(key) lib.find {|func| func.name == key} when BitClust::NameUtils.method_spec?(key) spec = BitClust::MethodSpec.parse(key) if spec.constant? begin lib.fetch_class(key) rescue BitClust::UserError lib.fetch_methods(spec) end else lib.fetch_methods(spec) end when BitClust::NameUtils.classname?(key) lib.fetch_class(key) else raise BitClust::InvalidKey, "wrong search key: #{key.inspect}" end end main