home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ruby164.zip / rbemx164.zip / ruby / bin / rd2.cmd < prev    next >
OS/2 REXX Batch file  |  2001-06-23  |  6KB  |  269 lines

  1. extproc ruby -Sx
  2. #! /usr/bin/env ruby
  3. =begin
  4. = NAME
  5. rd2 - converter from RD to other mark-up language.
  6. = SYNOPSIS
  7.   rd2 [-r <visitor>] [options] <file>
  8.  
  9. = DESCRIPTION
  10. rd2 inputs from ((|<file>|)) and outputs into (({STDOUT})). you can
  11. choose ((|<visitor>|)) to select output format. For example, use
  12. "rd/rd2html-lib.rb" to translate it into HTML, and "rd/rd2man-lib.rb"
  13. to tranlate it into roff with man macros.
  14.  
  15. = OPTIONS
  16. please read output of 
  17.   % rd2 --help
  18. and
  19.   % rd2 -r rd/rd2html-lib.rb --help
  20.  
  21. = FILES
  22.   * ~/.rd2rc - User configration file.
  23.  
  24. = SEE ALSO
  25. ruby(1)
  26. =end
  27.  
  28. require "kconv"
  29. require "optparse"
  30. require "rd/rdfmt"
  31. require "rd/visitor"
  32. require "rd/version"
  33.  
  34. module Kconv
  35.   NAME2CONST = {
  36.     "iso-2022-jp" => Kconv::JIS,
  37.     "euc-jp" => Kconv::EUC,
  38.     "shift_jis" => Kconv::SJIS,
  39.   }
  40.   NAME_ALIAS = {
  41.     'jis' => 'iso-2022-jp',
  42.     'euc' => 'euc-jp',
  43.     'sjis' => 'shift_jis',
  44.     'shift-jis' => 'shift_jis',
  45.   }
  46. end
  47.  
  48. include RD
  49.  
  50. SYSTEM_NAME = "RDtool -- rd2"
  51. SYSTEM_VERSION = "$Version: 0.6.10$" #"
  52. RD2_VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION)
  53.  
  54. # global vars
  55. $Visitor_Class = nil
  56. $Visitor = nil
  57. $RD2_Sub_OptionParser = nil
  58.  
  59. # local vars
  60. include_path = []
  61. with_part = []
  62. output_file = nil
  63. output_index = nil
  64. out_code = nil
  65. from_rdo = nil
  66.  
  67. # user option
  68. $DEFAULT_FORMAT_LIB = "rd/rd2html-lib"
  69. $RC = {}
  70. $RC["filter"] = Hash.new(RD::INCLUDE_FILTER)
  71. begin
  72.   if test(?r, File.expand_path("~/.rd2rc"))
  73.     load "~/.rd2rc"
  74.     #  STDERR << "#{$0}: loading ~/.rd2rc\n"
  75.   else
  76.     load "rd/dot.rd2rc"
  77.     #  STDERR << "#{$0}: loading rd/dot.rd2rc\n"
  78.   end
  79. end
  80.  
  81. # initialize OptionParser
  82. ARGV.options do |q|
  83.   q.banner = "Usage: #{$0} [options] rd-file > output\n"
  84.   q.on_head("global options:")
  85.   
  86.   q.on("-rLIB", "--require=LIB",
  87.        String,
  88.        "choose format library.") do |i|
  89.     # require LIB
  90.     require i
  91.     if $Visitor_Class && !$Visitor
  92.       $Visitor = $Visitor_Class.new()
  93.       if $RD2_Sub_OptionParser    
  94.     require $RD2_Sub_OptionParser
  95.     $RD2_Sub_OptionParser = nil
  96.       end
  97.     end
  98.   end
  99.   
  100.   q.on("-oNAME",
  101.        String,
  102.        "indicate base name of output file") do |i|
  103.     output_file = i
  104.   end
  105.  
  106.   q.on("--out-code=KCODE",
  107.        Kconv::NAME2CONST.keys, Kconv::NAME_ALIAS,
  108.        "character encoding of output.(jis|euc|sjis)") do |out_code|
  109.   end
  110.       
  111.   q.on("--output-index",
  112.        "output method index file (*.rmi)") do |i|
  113.     output_index = true
  114.   end
  115.   
  116.   q.on("-IPATH", "--include-path=PATH",
  117.        String,
  118.        "add PATH to list of include path") do |i|
  119.     # add to include path
  120.     include_path.unshift(i)
  121.   end
  122.   
  123.   # accept "PART:FILTER" and "PART"
  124.   q.on("--with-part=PART",
  125.        /(\w+)(?:\s*:\s*(\w+))?/,
  126.        "include PART with Filter") do |src, part, filter|
  127.     with_part.push([part, filter || part])
  128.     unless include_path.index(RD::RDTree::TMP_DIR)
  129.       include_path.push(RD::RDTree::TMP_DIR)
  130.     end
  131.   end
  132.   
  133.   q.on("--from-rdo",
  134.        "load from *.rdo instead of *.rd") do
  135.     from_rdo = true
  136.   end
  137.  
  138.   q.on("--version",
  139.        "print versions.") do
  140.     STDERR.puts RD2_VERSION
  141.     STDERR.puts Tree::version
  142.     STDERR.puts Visitor::version
  143.     STDERR.puts $Visitor_Class.version if $Visitor_Class
  144.     exit(0)
  145.   end
  146.   
  147.   q.on_tail("--help",
  148.         "print this message") do
  149.     STDERR.print(q.to_s)
  150.     exit(0)
  151.   end
  152. end # OptionParser.new
  153.  
  154. # require format lib implicitly
  155. if /rd2.+/ =~ File.basename($0, ".*").downcase
  156.   visitor_lib = "rd/" + $& + "-lib.rb"
  157.   require visitor_lib
  158.   require $RD2_Sub_OptionParser  if $RD2_Sub_OptionParser
  159.   # make visitor
  160.   $Visitor = $Visitor_Class.new()
  161. end
  162.  
  163. begin
  164.   ARGV.parse!
  165. rescue
  166.   STDERR.print("Error: " + $!.inspect + "\n")
  167.   STDERR.print(ARGV.options.to_s)
  168.   exit(1)
  169. end
  170.  
  171. unless $Visitor_Class
  172.   require $DEFAULT_FORMAT_LIB
  173.   $Visitor = $Visitor_Class.new
  174. end
  175.  
  176. # make tree (but not parsed yet)
  177. if from_rdo
  178.   rdos = []
  179.   ARGV.each do |i|
  180.     rdos.push(File.open(i))
  181.     dirname = File.dirname(i)
  182.     include_path.push(dirname, dirname + "/include")
  183.   end
  184.   tree = RDTree.new_from_rdo(*rdos)
  185.   tree.include_path = include_path
  186. else 
  187.   # input from ARGF
  188.   src = readlines
  189.   
  190.   # set Include_Path
  191.   if ARGF.filename
  192.     dir = File.dirname(ARGF.filename)
  193.   else
  194.     dir = "."
  195.   end
  196.   include_path.push(dir)
  197.   include_path.push(dir + "/include")
  198.   
  199.   tree = RDTree.new(src, include_path, nil)
  200.   
  201.   # filter set tree.filter
  202.   with_part.each do |i|
  203.     tree.filter[i[0]] = $RC["filter"][i[1]]
  204.   end
  205.   
  206.   # parse
  207.   begin
  208.     tree.parse
  209.   rescue Racc::ParseError
  210.     STDERR.puts($!.message)
  211.     exit(10)
  212.   end
  213. end
  214.  
  215. # filter: set visitor.include_suffix
  216. with_part.each do |i|
  217.   $Visitor.include_suffix.push(i[0])
  218. end
  219.  
  220. # file base name setup
  221. $Visitor.filename = output_file if output_file
  222.  
  223. # character encoding
  224. if out_code
  225.   begin
  226.     $Visitor.charcode = out_code
  227.   rescue NameError
  228.   end
  229. end
  230.  
  231. # output  
  232. out = $Visitor.visit(tree)
  233.  
  234. # character encoding convert
  235. out = Kconv.kconv(out, Kconv::NAME2CONST[out_code], Kconv::AUTO) if out_code
  236.  
  237. if output_file
  238.   filename = output_file + "." + $Visitor.type::OUTPUT_SUFFIX
  239.   file = open(filename, "w")
  240.   file.print(out)
  241.   file.close
  242.   STDERR.print("#{$0}: output to #{filename}...\n")
  243. else
  244.   print(out)
  245. end
  246.  
  247. # RMI
  248. if output_index
  249.   if output_file
  250.     require "rd/rd2rmi-lib"
  251.     rmivisitor = RD2RMIVisitor.new
  252.     rmivisitor.filename = output_file
  253.     rmi = rmivisitor.visit(tree)
  254.     filename = output_file + ".rmi"
  255.     file = open(filename, "w")
  256.     file.print(rmi)
  257.     file.close
  258.     STDERR.print("#{$0}: output to #{filename}...\n")
  259.   else
  260.     raise %Q[Error: option "--output-index" must be used with option "-oNAME"]
  261.   end
  262. end
  263.  
  264.  
  265. # filter: remove tmp file
  266. Dir.glob("#{RD::RDTree::TMP_DIR}/rdtmp.#{$$}.*.*").each do |i|
  267.   File.delete(i)
  268. end
  269.