#!/usr/bin/env ruby =begin = NAME rd2 - converter from RD to other mark-up language. = SYNOPSIS rd2 [-r ] [options] = DESCRIPTION rd2 inputs from ((||)) and outputs into (({STDOUT})). you can choose ((||)) to select output format. For example, use "rd/rd2html-lib.rb" to translate it into HTML, and "rd/rd2man-lib.rb" to tranlate it into roff with man macros. = OPTIONS please read output of % rd2 --help and % rd2 -r rd/rd2html-lib.rb --help = FILES * ~/.rd2rc - User configration file. = SEE ALSO ruby(1) =end require 'kconv' require 'optparse' ### begin rd/rdfmt ### begin rd/tree ### begin rd/rdblockparser.tab # # DO NOT MODIFY!!!! # This file is automatically generated by racc 1.4.3 # from racc grammer file "rd/rdblockparser.ry". # require 'racc/parser' ### begin rd/rdinlineparser.tab.rb # # DO NOT MODIFY!!!! # This file is automatically generated by racc 1.4.3 # from racc grammer file "rd/rdinlineparser.ry". # #require 'racc/parser' ### begin rd/parser-util module RD module ParserUtility def add_children_to_element(parent, *children) # parent.add_children_under_document_struct(children, # tree.document_struct) parent.add_children_without_document_struct(children) end def tree raise NotImplementedError, "Subclass Responsibility" end end end ### end rd/parser-util require 'forwardable' require 'strscan' module RD class RDInlineParser < Racc::Parser module_eval <<'..end rd/rdinlineparser.ry modeval..id6001d2694b', 'rd/rdinlineparser.ry', 292 include ParserUtility extend Forwardable EM_OPEN = '((*' EM_OPEN_RE = /\A#{Regexp.quote(EM_OPEN)}/ EM_CLOSE = '*))' EM_CLOSE_RE = /\A#{Regexp.quote(EM_CLOSE)}/ CODE_OPEN = '(({' CODE_OPEN_RE = /\A#{Regexp.quote(CODE_OPEN)}/ CODE_CLOSE = '}))' CODE_CLOSE_RE = /\A#{Regexp.quote(CODE_CLOSE)}/ VAR_OPEN = '((|' VAR_OPEN_RE = /\A#{Regexp.quote(VAR_OPEN)}/ VAR_CLOSE = '|))' VAR_CLOSE_RE = /\A#{Regexp.quote(VAR_CLOSE)}/ KBD_OPEN = '((%' KBD_OPEN_RE = /\A#{Regexp.quote(KBD_OPEN)}/ KBD_CLOSE = '%))' KBD_CLOSE_RE = /\A#{Regexp.quote(KBD_CLOSE)}/ INDEX_OPEN = '((:' INDEX_OPEN_RE = /\A#{Regexp.quote(INDEX_OPEN)}/ INDEX_CLOSE = ':))' INDEX_CLOSE_RE = /\A#{Regexp.quote(INDEX_CLOSE)}/ REF_OPEN = '((<' REF_OPEN_RE = /\A#{Regexp.quote(REF_OPEN)}/ REF_CLOSE = '>))' REF_CLOSE_RE = /\A#{Regexp.quote(REF_CLOSE)}/ FOOTNOTE_OPEN = '((-' FOOTNOTE_OPEN_RE = /\A#{Regexp.quote(FOOTNOTE_OPEN)}/ FOOTNOTE_CLOSE = '-))' FOOTNOTE_CLOSE_RE = /\A#{Regexp.quote(FOOTNOTE_CLOSE)}/ VERB_OPEN = "(('" VERB_OPEN_RE = /\A#{Regexp.quote(VERB_OPEN)}/ VERB_CLOSE = "'))" VERB_CLOSE_RE = /\A#{Regexp.quote(VERB_CLOSE)}/ BAR = "|" BAR_RE = /\A#{Regexp.quote(BAR)}/ QUOTE = '"' QUOTE_RE = /\A#{Regexp.quote(QUOTE)}/ SLASH = "/" SLASH_RE = /\A#{Regexp.quote(SLASH)}/ BACK_SLASH = "\\" BACK_SLASH_RE = /\A#{Regexp.quote(BACK_SLASH)}/ URL = "URL:" URL_RE = /\A#{Regexp.quote(URL)}/ # Workaround for Regexp option change of Ruby 1.5.x other_re_mode = Regexp::EXTENDED if RUBY_VERSION > "1.5" other_re_mode |= Regexp::MULTILINE else other_re_mode |= Regexp::POSIXLINE end OTHER_RE = Regexp.new( "\\A.+?(?=#{Regexp.quote(EM_OPEN)}|#{Regexp.quote(EM_CLOSE)}| #{Regexp.quote(CODE_OPEN)}|#{Regexp.quote(CODE_CLOSE)}| #{Regexp.quote(VAR_OPEN)}|#{Regexp.quote(VAR_CLOSE)}| #{Regexp.quote(KBD_OPEN)}|#{Regexp.quote(KBD_CLOSE)}| #{Regexp.quote(INDEX_OPEN)}|#{Regexp.quote(INDEX_CLOSE)}| #{Regexp.quote(REF_OPEN)}|#{Regexp.quote(REF_CLOSE)}| #{Regexp.quote(FOOTNOTE_OPEN)}|#{Regexp.quote(FOOTNOTE_CLOSE)}| #{Regexp.quote(VERB_OPEN)}|#{Regexp.quote(VERB_CLOSE)}| #{Regexp.quote(BAR)}| #{Regexp.quote(QUOTE)}| #{Regexp.quote(SLASH)}| #{Regexp.quote(BACK_SLASH)}| #{Regexp.quote(URL)})", other_re_mode) def initialize(bp) @blockp = bp end def_delegator(:@blockp, :tree) def parse(src) @src = StringScanner.new(src) @pre = "" @yydebug = true do_parse end def next_token return [false, false] if @src.empty? # p @src.rest if @yydebug if ret = @src.scan(EM_OPEN_RE) @pre << ret [:EM_OPEN, ret] elsif ret = @src.scan(EM_CLOSE_RE) @pre << ret [:EM_CLOSE, ret] elsif ret = @src.scan(CODE_OPEN_RE) @pre << ret [:CODE_OPEN, ret] elsif ret = @src.scan(CODE_CLOSE_RE) @pre << ret [:CODE_CLOSE, ret] elsif ret = @src.scan(VAR_OPEN_RE) @pre << ret [:VAR_OPEN, ret] elsif ret = @src.scan(VAR_CLOSE_RE) @pre << ret [:VAR_CLOSE, ret] elsif ret = @src.scan(KBD_OPEN_RE) @pre << ret [:KBD_OPEN, ret] elsif ret = @src.scan(KBD_CLOSE_RE) @pre << ret [:KBD_CLOSE, ret] elsif ret = @src.scan(INDEX_OPEN_RE) @pre << ret [:INDEX_OPEN, ret] elsif ret = @src.scan(INDEX_CLOSE_RE) @pre << ret [:INDEX_CLOSE, ret] elsif ret = @src.scan(REF_OPEN_RE) @pre << ret [:REF_OPEN, ret] elsif ret = @src.scan(REF_CLOSE_RE) @pre << ret [:REF_CLOSE, ret] elsif ret = @src.scan(FOOTNOTE_OPEN_RE) @pre << ret [:FOOTNOTE_OPEN, ret] elsif ret = @src.scan(FOOTNOTE_CLOSE_RE) @pre << ret [:FOOTNOTE_CLOSE, ret] elsif ret = @src.scan(VERB_OPEN_RE) @pre << ret [:VERB_OPEN, ret] elsif ret = @src.scan(VERB_CLOSE_RE) @pre << ret [:VERB_CLOSE, ret] elsif ret = @src.scan(BAR_RE) @pre << ret [:BAR, ret] elsif ret = @src.scan(QUOTE_RE) @pre << ret [:QUOTE, ret] elsif ret = @src.scan(SLASH_RE) @pre << ret [:SLASH, ret] elsif ret = @src.scan(BACK_SLASH_RE) @pre << ret [:BACK_SLASH, ret] elsif ret = @src.scan(URL_RE) @pre << ret [:URL, ret] elsif ret = @src.scan(OTHER_RE) @pre << ret [:OTHER, ret] else ret = @src.rest @pre << ret @src.clear [:OTHER, ret] end end def make_reference_from_label(label) # Reference.new_from_label_under_document_struct(label, tree.document_struct) Reference.new_from_label_without_document_struct(label) end def on_error(et, ev, values) lines_of_rest = @src.rest.to_a.length prev_words = prev_words_on_error(ev) at = 4 + prev_words.length message = <<-MSG RD syntax error: line #{@blockp.line_index - lines_of_rest}: ...#{prev_words} #{(ev||'')} #{next_words_on_error()} ... MSG message << " " * at + "^" * (ev ? ev.length : 0) + "\n" raise ParseError, message end def prev_words_on_error(ev) pre = @pre if ev and /#{Regexp.quote(ev)}$/ =~ pre pre = $` end last_line(pre) end def last_line(src) if n = src.rindex("\n") src[(n+1) .. -1] else src end end private :last_line def next_words_on_error if n = @src.rest.index("\n") @src.rest[0 .. (n-1)] else @src.rest end end ..end rd/rdinlineparser.ry modeval..id6001d2694b ##### racc 1.4.3 generates ### racc_reduce_table = [ 0, 0, :racc_error, 1, 27, :_reduce_none, 2, 28, :_reduce_2, 1, 28, :_reduce_3, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 1, 29, :_reduce_none, 3, 30, :_reduce_13, 3, 31, :_reduce_14, 3, 32, :_reduce_15, 3, 33, :_reduce_16, 3, 34, :_reduce_17, 4, 35, :_reduce_18, 3, 35, :_reduce_19, 2, 40, :_reduce_20, 2, 40, :_reduce_21, 1, 40, :_reduce_22, 1, 40, :_reduce_23, 2, 41, :_reduce_24, 2, 41, :_reduce_25, 1, 41, :_reduce_26, 1, 41, :_reduce_27, 2, 39, :_reduce_none, 4, 39, :_reduce_29, 4, 39, :_reduce_30, 2, 43, :_reduce_none, 4, 43, :_reduce_32, 1, 44, :_reduce_33, 3, 44, :_reduce_34, 1, 45, :_reduce_none, 3, 45, :_reduce_36, 3, 45, :_reduce_37, 2, 46, :_reduce_38, 2, 46, :_reduce_39, 1, 46, :_reduce_40, 1, 46, :_reduce_41, 1, 47, :_reduce_none, 2, 51, :_reduce_43, 1, 51, :_reduce_44, 2, 53, :_reduce_45, 1, 53, :_reduce_46, 1, 50, :_reduce_none, 1, 50, :_reduce_none, 1, 50, :_reduce_none, 1, 50, :_reduce_none, 1, 50, :_reduce_none, 1, 50, :_reduce_none, 1, 54, :_reduce_none, 1, 54, :_reduce_none, 1, 55, :_reduce_none, 1, 55, :_reduce_none, 1, 56, :_reduce_57, 1, 52, :_reduce_58, 1, 57, :_reduce_59, 2, 58, :_reduce_60, 1, 58, :_reduce_none, 2, 49, :_reduce_62, 1, 49, :_reduce_none, 2, 48, :_reduce_64, 1, 48, :_reduce_none, 1, 60, :_reduce_none, 1, 60, :_reduce_none, 1, 60, :_reduce_none, 1, 60, :_reduce_none, 1, 60, :_reduce_none, 1, 62, :_reduce_none, 1, 62, :_reduce_none, 1, 59, :_reduce_none, 1, 59, :_reduce_none, 1, 61, :_reduce_none, 1, 61, :_reduce_none, 1, 61, :_reduce_none, 2, 42, :_reduce_78, 1, 42, :_reduce_none, 1, 63, :_reduce_none, 2, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 1, 63, :_reduce_none, 3, 36, :_reduce_101, 3, 37, :_reduce_102, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 2, 66, :_reduce_109, 1, 66, :_reduce_none, 1, 38, :_reduce_111, 1, 67, :_reduce_none, 2, 67, :_reduce_113, 2, 67, :_reduce_114, 2, 67, :_reduce_115, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 1, 68, :_reduce_none, 2, 64, :_reduce_136, 1, 64, :_reduce_none ] racc_reduce_n = 138 racc_shift_n = 179 racc_action_table = [ 129, 131, 133, 135, 137, 139, 141, 144, 123, 91, 126, 128, 130, 132, 134, 136, 138, 142, 145, 124, 94, 125, 127, 129, 131, 133, 135, 137, 139, 141, 144, 123, 163, 126, 128, 130, 132, 134, 136, 138, 142, 145, 124, 93, 125, 127, 129, 131, 133, 135, 137, 139, 141, 144, 123, 167, 126, 128, 130, 132, 134, 136, 138, 142, 145, 124, 92, 125, 127, 129, 131, 133, 135, 137, 139, 141, 144, 123, 111, 126, 128, 130, 132, 134, 136, 138, 142, 145, 124, 90, 125, 127, 38, 40, 42, 44, 45, 48, 49, 52, 30, 171, 35, 37, 39, 41, 43, 46, 47, 50, 53, 31, 33, 34, 88, 38, 40, 42, 86, 45, 48, 49, 52, 30, 154, 35, 37, 39, 41, 43, 46, 47, 50, 53, 31, 33, 34, 85, 7, 9, 12, 15, 18, 20, 23, 26, 172, 173, 5, 111, 10, 89, 16, 56, 21, 152, 27, 176, 153, 4, 7, 9, 12, 15, 18, 20, 23, 26, 173, 147, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 7, 9, 12, 15, 18, 20, 23, 26, nil, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, 65, nil, 4, 69, 72, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 7, 9, 12, 15, 18, 20, 23, 26, nil, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 7, 9, 12, 15, 18, 20, 23, 26, nil, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 7, 9, 12, 15, 18, 20, 23, 26, nil, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 7, 9, 12, 15, 18, 20, 23, 26, nil, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, 107, nil, 4, 69, 105, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 7, 9, 12, 15, 18, 20, 23, 26, nil, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, 107, nil, 4, 69, 105, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 38, 40, 42, 44, 45, 48, 49, 52, 30, nil, 35, 37, 39, 41, 43, 46, 47, 50, 53, 31, 33, 34, 107, nil, nil, 69, 105, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, 150, 27, nil, 69, 4, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, 107, nil, 4, 69, 105, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 98, 100, 69, 105, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 98, 100, 69, 105, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, nil, nil, 4, 98, 100, 69, 105, 73, 77, 79, 60, nil, 5, nil, 10, nil, 16, nil, 21, nil, 27, 118, nil, 4, 69, 120, 73, 77, 79, 60, 107, nil, nil, 69, 105, 73, 77, 79, 60, 165, nil, nil, 69, nil, 73, 77, 79, 60, 155, 98, 100, 69, 105, 73, 77, 79, 60, 177, 98, 100, 69, 105, 73, 77, 79, 60, 107, nil, nil, 69, 105, 73, 77, 79, 60, 174, 98, 100, 69, 105, 73, 77, 79, 60, 178, 98, 100, 69, 105, 73, 77, 79, 60, 98, 100, 69, 105, 73, 77, 79, 60, 98, 100, 69, 105, 73, 77, 79, 60, 98, 100, 69, 105, 73, 77, 79, 60, 7, 9, 12, 15, 18, 20 ] racc_action_check = [ 162, 162, 162, 162, 162, 162, 162, 162, 162, 56, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 64, 162, 162, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 59, 120, 120, 143, 143, 143, 143, 143, 143, 143, 143, 143, 135, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 57, 143, 143, 72, 72, 72, 72, 72, 72, 72, 72, 72, 119, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 55, 72, 72, 51, 51, 51, 51, 51, 51, 51, 51, 51, 154, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 44, 44, 44, 44, 44, 44, 44, 44, 44, 97, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 26, 26, 26, 26, 26, 26, 26, 26, 155, 155, 26, 68, 26, 54, 26, 14, 26, 82, 26, 169, 83, 26, 17, 17, 17, 17, 17, 17, 17, 17, 174, 76, 17, nil, 17, nil, 17, nil, 17, nil, 17, nil, nil, 17, 21, 21, 21, 21, 21, 21, 21, 21, nil, nil, 21, nil, 21, nil, 21, nil, 21, nil, 21, 23, nil, 21, 23, 23, 23, 23, 23, 23, nil, 23, nil, 23, nil, 23, nil, 23, nil, 23, nil, nil, 23, 16, 16, 16, 16, 16, 16, 16, 16, nil, nil, 16, nil, 16, nil, 16, nil, 16, nil, 16, nil, nil, 16, 27, 27, 27, 27, 27, 27, 27, 27, nil, nil, 27, nil, 27, nil, 27, nil, 27, nil, 27, nil, nil, 27, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, 0, nil, 0, nil, 0, nil, 0, nil, 0, nil, nil, 0, 10, 10, 10, 10, 10, 10, 10, 10, nil, nil, 10, nil, 10, nil, 10, nil, 10, nil, 10, 75, nil, 10, 75, 75, 75, 75, 75, 75, nil, 75, nil, 75, nil, 75, nil, 75, nil, 75, nil, nil, 75, 5, 5, 5, 5, 5, 5, 5, 5, nil, nil, 5, nil, 5, nil, 5, nil, 5, nil, 5, 146, nil, 5, 146, 146, 146, 146, 146, 146, nil, 146, nil, 146, nil, 146, nil, 146, nil, 146, nil, nil, 146, 4, 4, 4, 4, 4, 4, 4, 4, 4, nil, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 70, nil, nil, 70, 70, 70, 70, 70, 70, nil, 70, nil, 70, nil, 70, nil, 70, 81, 70, nil, 81, 70, 81, 81, 81, 81, nil, 81, nil, 81, nil, 81, nil, 81, nil, 81, 115, nil, 81, 115, 115, 115, 115, 115, 115, nil, 115, nil, 115, nil, 115, nil, 115, nil, 115, nil, nil, 115, 150, 150, 150, 150, 150, 150, 150, 150, nil, 150, nil, 150, nil, 150, nil, 150, nil, 150, nil, nil, 150, 65, 65, 65, 65, 65, 65, 65, 65, nil, 65, nil, 65, nil, 65, nil, 65, nil, 65, nil, nil, 65, 106, 106, 106, 106, 106, 106, 106, 106, nil, 106, nil, 106, nil, 106, nil, 106, nil, 106, 71, nil, 106, 71, 71, 71, 71, 71, 71, 67, nil, nil, 67, 67, 67, 67, 67, 67, 122, nil, nil, 122, nil, 122, 122, 122, 122, 99, 99, 99, 99, 99, 99, 99, 99, 99, 170, 170, 170, 170, 170, 170, 170, 170, 170, 113, nil, nil, 113, 113, 113, 113, 113, 113, 161, 161, 161, 161, 161, 161, 161, 161, 161, 175, 175, 175, 175, 175, 175, 175, 175, 175, 118, 118, 118, 118, 118, 118, 118, 118, 158, 158, 158, 158, 158, 158, 158, 158, 165, 165, 165, 165, 165, 165, 165, 165, 1, 1, 1, 1, 1, 1 ] racc_action_pointer = [ 264, 604, nil, nil, 368, 327, nil, nil, nil, nil, 286, nil, nil, nil, 153, nil, 220, 157, nil, nil, nil, 179, nil, 198, nil, nil, 135, 242, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 112, nil, nil, nil, nil, nil, nil, 89, nil, nil, 137, 73, 9, 48, nil, 23, nil, nil, nil, nil, 16, 468, nil, 517, 144, nil, 390, 508, 66, nil, nil, 305, 146, nil, nil, nil, nil, 407, 144, 136, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 121, nil, 535, nil, nil, nil, nil, nil, nil, 489, nil, nil, nil, nil, nil, nil, 553, nil, 426, nil, nil, 579, 73, 20, 9, 526, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 49, nil, nil, nil, nil, nil, nil, nil, 43, nil, nil, 346, nil, nil, nil, 447, nil, nil, nil, 97, 142, nil, nil, 587, nil, nil, 562, -3, nil, nil, 595, nil, nil, nil, 154, 544, nil, nil, nil, 163, 571, nil, nil, nil ] racc_action_default = [ -138, -111, -7, -8, -138, -138, -9, -104, -10, -105, -138, -11, -106, -12, -138, -107, -138, -1, -108, -3, -103, -138, -4, -138, -5, -110, -138, -138, -6, -109, -133, -129, -137, -131, -134, -120, -112, -121, -117, -122, -118, -123, -119, -124, -138, -135, -125, -126, -116, -130, -127, -138, -132, -128, -138, -138, -138, -138, -2, -138, -70, -50, -51, -26, -35, -138, -52, -63, -58, -67, -41, -138, -138, -66, -47, -40, -138, -68, -48, -69, -49, -27, -138, -138, -113, -114, -115, -136, -102, -13, -14, 179, -15, -16, -28, -46, -56, -138, -76, -59, -77, -71, -65, -55, -75, -72, -42, -74, -62, -61, -73, -31, -54, -57, -53, -38, -44, -22, -138, -33, -138, -138, -23, -98, -95, -99, -86, -100, -87, -85, -88, -84, -89, -83, -90, -138, -91, -82, -92, -80, -79, -96, -93, -24, -97, -94, -39, -19, -25, -35, -138, -58, -101, -17, -36, -37, -64, -45, -59, -60, -43, -138, -20, -18, -21, -138, -33, -81, -78, -138, -59, -29, -30, -32, -34, -138, -36, -37, -34 ] racc_goto_table = [ 70, 68, 99, 97, 67, 110, 156, 32, 110, 64, 117, 63, 81, 110, 160, 143, 168, 115, 159, 121, 108, 157, 146, 159, 71, 76, 51, 29, 58, 84, nil, nil, nil, nil, nil, 168, nil, nil, nil, nil, nil, nil, 103, 158, nil, 160, 110, nil, nil, 119, nil, 110, 67, 110, 87, 161, nil, nil, 70, 151, 122, 164, 67, 162, nil, 156, nil, 149, 156, 148, 14, nil, nil, nil, nil, 54, nil, 156, nil, nil, 55, nil, 156, 103, 110, nil, 57, 170, 169, 28, nil, 59, nil, nil, 28, nil, 82, 83, nil, 28, 166, nil, 175, 67, 24, 28, 28, 22, nil, 24, 28, nil, 22, nil, 24, 28, 28, 22, nil, nil, 24, 24, nil, 22, 22, 24, nil, 103, 22, nil, 24, 24, 11, 22, 22, 2, nil, 11, nil, nil, 2, nil, 11, nil, nil, 2, nil, nil, 11, 11, 3, 2, 2, 11, nil, 3, 2, nil, 11, 11, 3, 2, 2, nil, nil, nil, 3, 3, nil, nil, nil, 3, nil, nil, nil, nil, 3, 3 ] racc_goto_check = [ 24, 23, 22, 21, 34, 36, 35, 41, 36, 20, 18, 19, 17, 36, 28, 16, 37, 25, 33, 14, 32, 29, 25, 33, 13, 15, 38, 39, 3, 42, nil, nil, nil, nil, nil, 37, nil, nil, nil, nil, nil, nil, 24, 22, nil, 28, 36, nil, nil, 23, nil, 36, 34, 36, 41, 22, nil, nil, 24, 23, 17, 18, 34, 16, nil, 35, nil, 20, 35, 19, 1, nil, nil, nil, nil, 1, nil, 35, nil, nil, 1, nil, 35, 24, 36, nil, 1, 22, 21, 6, nil, 1, nil, nil, 6, nil, 1, 1, nil, 6, 23, nil, 22, 34, 5, 6, 6, 4, nil, 5, 6, nil, 4, nil, 5, 6, 6, 4, nil, nil, 5, 5, nil, 4, 4, 5, nil, 24, 4, nil, 5, 5, 11, 4, 4, 7, nil, 11, nil, nil, 7, nil, 11, nil, nil, 7, nil, nil, 11, 11, 8, 7, 7, 11, nil, 8, 7, nil, 11, 11, 8, 7, 7, nil, nil, nil, 8, 8, nil, nil, nil, 8, nil, nil, nil, nil, 8, 8 ] racc_goto_pointer = [ nil, 70, nil, 11, 107, 104, 89, 135, 150, nil, nil, 132, nil, 1, -52, 2, -57, -11, -61, -12, -14, -62, -63, -22, -23, -53, nil, nil, -101, -85, nil, nil, -47, -90, -19, -93, -62, -127, 22, 26, nil, 3, -15 ] racc_goto_default = [ nil, nil, 17, 19, 74, 78, 80, 61, 62, 6, 8, 66, 13, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 114, nil, 75, 106, 116, 95, 112, 96, 113, 109, 101, 102, 104, 140, nil, 25, 1, nil, 36 ] racc_token_table = { false => 0, Object.new => 1, :EX_LOW => 2, :QUOTE => 3, :BAR => 4, :SLASH => 5, :BACK_SLASH => 6, :URL => 7, :OTHER => 8, :REF_OPEN => 9, :FOOTNOTE_OPEN => 10, :FOOTNOTE_CLOSE => 11, :EX_HIGH => 12, :EM_OPEN => 13, :EM_CLOSE => 14, :CODE_OPEN => 15, :CODE_CLOSE => 16, :VAR_OPEN => 17, :VAR_CLOSE => 18, :KBD_OPEN => 19, :KBD_CLOSE => 20, :INDEX_OPEN => 21, :INDEX_CLOSE => 22, :REF_CLOSE => 23, :VERB_OPEN => 24, :VERB_CLOSE => 25 } racc_use_result_var = true racc_nt_base = 26 Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ '$end', 'error', 'EX_LOW', 'QUOTE', 'BAR', 'SLASH', 'BACK_SLASH', 'URL', 'OTHER', 'REF_OPEN', 'FOOTNOTE_OPEN', 'FOOTNOTE_CLOSE', 'EX_HIGH', 'EM_OPEN', 'EM_CLOSE', 'CODE_OPEN', 'CODE_CLOSE', 'VAR_OPEN', 'VAR_CLOSE', 'KBD_OPEN', 'KBD_CLOSE', 'INDEX_OPEN', 'INDEX_CLOSE', 'REF_CLOSE', 'VERB_OPEN', 'VERB_CLOSE', '$start', 'content', 'elements', 'element', 'emphasis', 'code', 'var', 'keyboard', 'index', 'reference', 'footnote', 'verb', 'normal_str_ele', 'substitute', 'ref_label', 'ref_label2', 'ref_url_strings', 'filename', 'element_label', 'element_label2', 'ref_subst_content', 'ref_subst_content_q', 'ref_subst_strings_q', 'ref_subst_strings_first', 'ref_subst_ele2', 'ref_subst_eles', 'ref_subst_str_ele_first', 'ref_subst_eles_q', 'ref_subst_ele', 'ref_subst_ele_q', 'ref_subst_str_ele', 'ref_subst_str_ele_q', 'ref_subst_strings', 'ref_subst_string3', 'ref_subst_string', 'ref_subst_string_q', 'ref_subst_string2', 'ref_url_string', 'verb_strings', 'normal_string', 'normal_strings', 'verb_string', 'verb_normal_string'] Racc_debug_parser = false ##### racc system variables end ##### # reduce 0 omitted # reduce 1 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 23 def _reduce_2( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 24 def _reduce_3( val, _values, result ) result = val result end .,., # reduce 4 omitted # reduce 5 omitted # reduce 6 omitted # reduce 7 omitted # reduce 8 omitted # reduce 9 omitted # reduce 10 omitted # reduce 11 omitted # reduce 12 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 38 def _reduce_13( val, _values, result ) result = Emphasis.new add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 43 def _reduce_14( val, _values, result ) result = Code.new add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 48 def _reduce_15( val, _values, result ) result = Var.new add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 53 def _reduce_16( val, _values, result ) result = Keyboard.new add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 58 def _reduce_17( val, _values, result ) result = Index.new add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 67 def _reduce_18( val, _values, result ) result = Reference.new(val[2]) add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 72 def _reduce_19( val, _values, result ) result = make_reference_from_label(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 76 def _reduce_20( val, _values, result ) result = Reference::URL.new(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 78 def _reduce_21( val, _values, result ) result = Reference::TemporaryLabel.new(val[1], val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 81 def _reduce_22( val, _values, result ) result = Reference::TemporaryLabel.new(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 82 def _reduce_23( val, _values, result ) result = Reference::TemporaryLabel.new([], val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 84 def _reduce_24( val, _values, result ) result = Reference::URL.new(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 86 def _reduce_25( val, _values, result ) result = Reference::TemporaryLabel.new(val[1], val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 89 def _reduce_26( val, _values, result ) result = Reference::TemporaryLabel.new(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 90 def _reduce_27( val, _values, result ) result = Reference::TemporaryLabel.new([], val[0]) result end .,., # reduce 28 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 95 def _reduce_29( val, _values, result ) result = val[1] result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 97 def _reduce_30( val, _values, result ) result = [StringElement.new(val[1])] result end .,., # reduce 31 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 102 def _reduce_32( val, _values, result ) result = val[1] result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 107 def _reduce_33( val, _values, result ) result = [StringElement.new(val[0])] result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 109 def _reduce_34( val, _values, result ) result = [StringElement.new(val[1])] result end .,., # reduce 35 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 115 def _reduce_36( val, _values, result ) result = val[1] result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 117 def _reduce_37( val, _values, result ) result = [StringElement.new(val[1])] result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 121 def _reduce_38( val, _values, result ) result = val[1].unshift(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 123 def _reduce_39( val, _values, result ) result = val[1].unshift(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 125 def _reduce_40( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 126 def _reduce_41( val, _values, result ) result = val result end .,., # reduce 42 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 131 def _reduce_43( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 132 def _reduce_44( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 135 def _reduce_45( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 136 def _reduce_46( val, _values, result ) result = val result end .,., # reduce 47 omitted # reduce 48 omitted # reduce 49 omitted # reduce 50 omitted # reduce 51 omitted # reduce 52 omitted # reduce 53 omitted # reduce 54 omitted # reduce 55 omitted # reduce 56 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 153 def _reduce_57( val, _values, result ) result = StringElement.new(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 156 def _reduce_58( val, _values, result ) result = StringElement.new(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 159 def _reduce_59( val, _values, result ) result = StringElement.new(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 163 def _reduce_60( val, _values, result ) result << val[1] result end .,., # reduce 61 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 169 def _reduce_62( val, _values, result ) result << val[1] result end .,., # reduce 63 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 173 def _reduce_64( val, _values, result ) result << val[1] result end .,., # reduce 65 omitted # reduce 66 omitted # reduce 67 omitted # reduce 68 omitted # reduce 69 omitted # reduce 70 omitted # reduce 71 omitted # reduce 72 omitted # reduce 73 omitted # reduce 74 omitted # reduce 75 omitted # reduce 76 omitted # reduce 77 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 196 def _reduce_78( val, _values, result ) result << val[1] result end .,., # reduce 79 omitted # reduce 80 omitted # reduce 81 omitted # reduce 82 omitted # reduce 83 omitted # reduce 84 omitted # reduce 85 omitted # reduce 86 omitted # reduce 87 omitted # reduce 88 omitted # reduce 89 omitted # reduce 90 omitted # reduce 91 omitted # reduce 92 omitted # reduce 93 omitted # reduce 94 omitted # reduce 95 omitted # reduce 96 omitted # reduce 97 omitted # reduce 98 omitted # reduce 99 omitted # reduce 100 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 227 def _reduce_101( val, _values, result ) result = Footnote.new add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 232 def _reduce_102( val, _values, result ) result = Verb.new(val[1]) result end .,., # reduce 103 omitted # reduce 104 omitted # reduce 105 omitted # reduce 106 omitted # reduce 107 omitted # reduce 108 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 246 def _reduce_109( val, _values, result ) result << val[1] result end .,., # reduce 110 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 251 def _reduce_111( val, _values, result ) result = StringElement.new(val[0]) result end .,., # reduce 112 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 256 def _reduce_113( val, _values, result ) result = val[1] result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 257 def _reduce_114( val, _values, result ) result = val[1] result end .,., module_eval <<'.,.,', 'rd/rdinlineparser.ry', 258 def _reduce_115( val, _values, result ) result = val[1] result end .,., # reduce 116 omitted # reduce 117 omitted # reduce 118 omitted # reduce 119 omitted # reduce 120 omitted # reduce 121 omitted # reduce 122 omitted # reduce 123 omitted # reduce 124 omitted # reduce 125 omitted # reduce 126 omitted # reduce 127 omitted # reduce 128 omitted # reduce 129 omitted # reduce 130 omitted # reduce 131 omitted # reduce 132 omitted # reduce 133 omitted # reduce 134 omitted # reduce 135 omitted module_eval <<'.,.,', 'rd/rdinlineparser.ry', 283 def _reduce_136( val, _values, result ) result << val[1] result end .,., # reduce 137 omitted def _reduce_none( val, _values, result ) result end end # class RDInlineParser end # end of module RD ### end rd/rdinlineparser.tab.rb #require "rd/parser-util" module RD class RDParser < Racc::Parser module_eval <<'..end rd/rdblockparser.ry modeval..id4c0029b218', 'rd/rdblockparser.ry', 231 include ParserUtility TMPFILE = ["rdtmp", $$, 0] attr_reader :tree def initialize @inline_parser = RDInlineParser.new(self) end def parse(src, tree) @src = src @src.push(false) # RDtree @tree = tree # @i: index(line no.) of src @i = 0 # stack for current indentation @indent_stack = [] # how indented. @current_indent = @indent_stack.join("") # RDParser for tmp src @subparser = nil # which part is in now @in_part = nil @part_content = [] @in_verbatim = false @yydebug = true do_parse end def next_token # preprocessing # if it is not in RD part # => method while @in_part != "rd" line = @src[@i] @i += 1 # next line case line # src end when false return [false, false] # RD part begin when /^=begin\s*(?:\bRD\b.*)?\s*$/ if @in_part # if in non-RD part @part_content.push(line) else @in_part = "rd" return [:WHITELINE, "=begin\n"] # <= for textblockand end # non-RD part begin when /^=begin\s+(\w+)/ part = $1 if @in_part # if in non-RD part @part_content.push(line) else @in_part = part if @tree.filter[part] # if filter exists # p "BEGIN_PART: #{@in_part}" # DEBUG end # non-RD part end when /^=end/ if @in_part # if in non-RD part # p "END_PART: #{@in_part}" # DEBUG # make Part-in object part = RD::Part.new(@part_content.join(""), @tree, "r") @part_content.clear # call filter, part_out is output(Part object) part_out = @tree.filter[@in_part].call(part) if @tree.filter[@in_part].mode == :rd # if output is RD formated subtree = parse_subtree(part_out.to_a) else # if output is target formated basename = TMPFILE.join('.') TMPFILE[-1] += 1 tmpfile = open(@tree.tmp_dir + "/" + basename + ".#{@in_part}", "w") tmpfile.print(part_out) tmpfile.close subtree = parse_subtree(["=begin\n", "<<< #{basename}\n", "=end\n"]) end @in_part = nil return [:SUBTREE, subtree] end else if @in_part # if in non-RD part @part_content.push(line) end end end @current_indent = @indent_stack.join("") line = @src[@i] case line when false if_current_indent_equal("") do [false, false] end when /^=end/ if_current_indent_equal("") do @in_part = nil [:WHITELINE, "=end"] # MUST CHANGE?? end when /^\s*$/ @i += 1 # next line return [:WHITELINE, ':WHITELINE'] when /^\#/ # comment line @i += 1 # next line self.next_token() when /^(={1,4})(?!=)\s*(?=\S)/, /^(\+{1,2})(?!\+)\s*(?=\S)/ rest = $' # ' rest.strip! mark = $1 if_current_indent_equal("") do return [:HEADLINE, [Headline.mark_to_level(mark), rest]] end when /^<<<\s*(\S+)/ file = $1 if_current_indent_equal("") do suffix = file[-3 .. -1] if suffix == ".rd" or suffix == ".rb" subtree = parse_subtree(get_included(file)) [:SUBTREE, subtree] else [:INCLUDE, file] end end when /^(\s*)\*(\s*)/ rest = $' # ' newIndent = $2 if_current_indent_equal($1) do if @in_verbatim [:STRINGLINE, line] else @indent_stack.push("\s" << newIndent) [:ITEMLISTLINE, rest] end end when /^(\s*)(\(\d+\))(\s*)/ rest = $' # ' mark = $2 newIndent = $3 if_current_indent_equal($1) do if @in_verbatim [:STRINGLINE, line] else @indent_stack.push("\s" * mark.size << newIndent) [:ENUMLISTLINE, rest] end end when /^(\s*):(\s*)/ rest = $' # ' newIndent = $2 if_current_indent_equal($1) do if @in_verbatim [:STRINGLINE, line] else @indent_stack.push("\s" <<$2) [:DESCLISTLINE, rest] end end when /^(\s*)---(?!-|\s*$)/ indent = $1 rest = $' /\s*/ === rest term = $' new_indent = $& if_current_indent_equal(indent) do if @in_verbatim [:STRINGLINE, line] else @indent_stack.push("\s\s\s" + new_indent) [:METHODLISTLINE, term] end end when /^(\s*)/ if_current_indent_equal($1) do [:STRINGLINE, line] end else raise "[BUG] parsing error may occured." end end =begin private --- RDParser#if_current_indent_equal(indent) if (({@current_indent == ((|indent|))})) then yield block, otherwise process indentation. =end # always @current_indent = @indent_stack.join("") def if_current_indent_equal(indent) indent = indent.sub(/\t/, "\s" * 8) if @current_indent == indent @i += 1 # next line yield elsif indent.index(@current_indent) == 0 @indent_stack.push(indent[@current_indent.size .. -1]) [:INDENT, ":INDENT"] else @indent_stack.pop [:DEDENT, ":DEDENT"] end end private :if_current_indent_equal def cut_off(src) ret = [] whiteline_buf = [] line = src.shift /^\s*/ =~ line indent = Regexp.quote($&) ret.push($') # ' while line = src.shift if /^(\s*)$/ =~ line whiteline_buf.push(line) elsif /^#{indent}/ =~ line unless whiteline_buf.empty? ret.concat(whiteline_buf) whiteline_buf.clear end ret.push($') # ' else raise "[BUG]: probably Parser Error while cutting off.\n" end end ret end private :cut_off def set_term_to_element(parent, term) # parent.set_term_under_document_struct(term, @tree.document_struct) parent.set_term_without_document_struct(term) end private :set_term_to_element def on_error( et, ev, _values ) line = @src[@i] prv, cur, nxt = format_line_num(@i, @i+1, @i+2) raise ParseError, <|#{@src[@i].chomp} #{nxt} |#{@src[@i+1].chomp} Msg end def line_index @i end def parse_subtree(src) @subparser = RD::RDParser.new() unless @subparser @subparser.parse(src, @tree) end private :parse_subtree def get_included(file) included = "" @tree.include_path.each do |dir| file_name = dir + "/" + file if test(?e, file_name) included = IO.readlines(file_name) break end end included end private :get_included def format_line_num(*args) width = args.collect{|i| i.to_s.length }.max args.collect{|i| sprintf("%#{width}d", i) } end private :format_line_num ..end rd/rdblockparser.ry modeval..id4c0029b218 ##### racc 1.4.3 generates ### racc_reduce_table = [ 0, 0, :racc_error, 1, 15, :_reduce_1, 0, 15, :_reduce_2, 2, 16, :_reduce_3, 1, 16, :_reduce_none, 1, 17, :_reduce_5, 1, 17, :_reduce_6, 1, 17, :_reduce_none, 1, 17, :_reduce_8, 1, 17, :_reduce_9, 1, 17, :_reduce_10, 1, 17, :_reduce_11, 1, 21, :_reduce_12, 1, 22, :_reduce_13, 1, 18, :_reduce_14, 2, 23, :_reduce_15, 1, 23, :_reduce_16, 3, 19, :_reduce_17, 1, 25, :_reduce_18, 2, 24, :_reduce_19, 4, 24, :_reduce_20, 2, 24, :_reduce_21, 1, 24, :_reduce_22, 1, 26, :_reduce_none, 1, 26, :_reduce_none, 1, 26, :_reduce_none, 1, 26, :_reduce_none, 1, 20, :_reduce_none, 3, 20, :_reduce_28, 4, 20, :_reduce_29, 2, 31, :_reduce_30, 1, 31, :_reduce_31, 1, 27, :_reduce_32, 2, 32, :_reduce_33, 1, 32, :_reduce_34, 3, 33, :_reduce_35, 1, 28, :_reduce_36, 2, 36, :_reduce_37, 1, 36, :_reduce_38, 3, 37, :_reduce_39, 1, 29, :_reduce_40, 2, 39, :_reduce_41, 1, 39, :_reduce_42, 3, 40, :_reduce_43, 1, 30, :_reduce_44, 2, 42, :_reduce_45, 1, 42, :_reduce_46, 3, 43, :_reduce_47, 3, 41, :_reduce_48, 2, 41, :_reduce_49, 4, 41, :_reduce_50, 1, 41, :_reduce_51, 2, 45, :_reduce_52, 1, 45, :_reduce_none, 1, 46, :_reduce_54, 1, 46, :_reduce_55, 1, 46, :_reduce_none, 1, 46, :_reduce_57, 1, 44, :_reduce_none, 0, 44, :_reduce_none, 2, 47, :_reduce_none, 1, 47, :_reduce_none, 2, 34, :_reduce_62, 1, 34, :_reduce_63, 2, 38, :_reduce_64, 1, 38, :_reduce_65, 2, 35, :_reduce_66, 2, 35, :_reduce_67, 2, 35, :_reduce_68, 1, 35, :_reduce_69, 1, 35, :_reduce_none, 1, 35, :_reduce_71, 0, 35, :_reduce_72 ] racc_reduce_n = 73 racc_shift_n = 89 racc_action_table = [ 7, 9, 13, 17, 23, 63, 80, 43, 43, 5, 88, 7, 9, 13, 17, 41, 7, 9, 13, 17, 41, 72, 7, 9, 13, 17, 23, 63, 75, 50, 50, 5, 7, 9, 13, 17, 23, 63, 79, 50, 81, 5, 7, 9, 13, 17, 23, 63, 47, 23, 9, 5, 7, 9, 13, 17, 23, 63, 41, 13, 84, 5, 7, 9, 13, 17, 23, 63, 23, 43, 17, 5, 7, 9, 13, 17, 23, 26, 30, 34, 2, 5, 7, 9, 13, 17, 59, 37, 7, nil, nil, 5, 7, 9, 13, 17, nil, 37, nil, nil, nil, 5, 7, 9, 13, 17, 23, 26, 30, 34, 2, 5, 7, 9, 13, 17, 23, 63, nil, nil, nil, 5, 7, 9, 13, 17, 23, 63, nil, nil, nil, 5, 7, 9, 13, 17, 23, 63, nil, nil, nil, 5, 7, 9, 13, 17, 23, 63, 70, 71, nil, 5, 23, 68, 69, 70, 71, 76, 70, 71, 68, 87, nil, 68, 7, 9, 13, 17 ] racc_action_check = [ 85, 85, 85, 85, 85, 85, 52, 44, 46, 85, 85, 42, 42, 42, 42, 42, 5, 5, 5, 5, 5, 42, 60, 60, 60, 60, 60, 60, 47, 17, 50, 60, 77, 77, 77, 77, 77, 77, 51, 13, 54, 77, 76, 76, 76, 76, 76, 76, 12, 9, 8, 76, 67, 67, 67, 67, 67, 67, 68, 18, 74, 67, 66, 66, 66, 66, 66, 66, 7, 6, 28, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 36, 4, 33, nil, nil, 4, 14, 14, 14, 14, nil, 14, nil, nil, nil, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 37, 37, 37, 37, 37, 37, nil, nil, nil, 37, 39, 39, 39, 39, 39, 39, nil, nil, nil, 39, 38, 38, 38, 38, 38, 38, nil, nil, nil, 38, 86, 86, 86, 86, 86, 86, 40, 40, nil, 86, 48, 40, 40, 83, 83, 48, 73, 73, 83, 83, nil, 73, 29, 29, 29, 29 ] racc_action_pointer = [ 69, nil, nil, nil, 79, 13, 62, 61, 46, 42, nil, nil, 48, 31, 89, nil, 99, 21, 54, nil, nil, nil, nil, nil, nil, nil, nil, nil, 64, 161, nil, nil, nil, 85, nil, nil, 73, 109, 129, 119, 141, nil, 8, nil, 0, nil, 1, 28, 145, nil, 22, 25, -7, nil, 27, nil, nil, nil, nil, nil, 19, nil, nil, nil, nil, nil, 59, 49, 51, nil, nil, nil, nil, 151, 47, nil, 39, 29, nil, nil, nil, nil, nil, 148, nil, -3, 139, nil, nil ] racc_action_default = [ -2, -34, -13, -9, -72, -73, -14, -63, -36, -65, -38, -31, -73, -59, -72, -23, -1, -59, -40, -24, -4, -42, -25, -16, -5, -26, -10, -6, -44, -27, -11, -7, -46, -32, -12, -8, -73, -71, -69, -70, -73, -22, -73, -15, -62, -37, -64, -73, -51, -58, -61, -73, -73, -3, -73, -41, -45, -30, -33, -35, -68, -53, -54, -57, -55, -56, -66, -67, -73, -17, -19, -21, -28, -18, -73, 89, -73, -49, -60, -43, -39, -47, -52, -73, -29, -73, -48, -20, -50 ] racc_goto_table = [ 40, 24, 60, 66, 67, 82, 27, 20, 57, 36, 38, 82, 82, 44, 51, 46, 42, 24, 54, 52, 38, 57, 27, 53, 31, 58, 45, 55, 39, 74, 82, 82, 56, 12, 16, 78, nil, 73, 39, nil, 31, 85, 86, nil, nil, nil, nil, nil, nil, 77, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 83 ] racc_goto_check = [ 10, 4, 31, 31, 31, 32, 5, 3, 12, 21, 5, 32, 32, 9, 27, 9, 17, 4, 27, 21, 5, 12, 5, 3, 6, 19, 23, 26, 6, 11, 32, 32, 29, 1, 2, 33, nil, 10, 6, nil, 6, 31, 31, nil, nil, nil, nil, nil, nil, 4, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 10 ] racc_goto_pointer = [ nil, 33, 34, 7, 1, 6, 24, nil, nil, 6, -5, -13, -21, nil, nil, nil, nil, 11, nil, -8, nil, 5, nil, 18, nil, nil, 9, 1, nil, 4, nil, -35, -55, -15 ] racc_goto_default = [ nil, nil, nil, nil, 62, 64, 65, 35, 3, 6, nil, nil, 11, 15, 19, 22, 25, 29, 33, 1, 4, nil, 8, 10, 14, 18, 21, nil, 28, 32, 48, nil, 61, 49 ] racc_token_table = { false => 0, Object.new => 1, :DUMMY => 2, :ITEMLISTLINE => 3, :ENUMLISTLINE => 4, :DESCLISTLINE => 5, :METHODLISTLINE => 6, :STRINGLINE => 7, :WHITELINE => 8, :SUBTREE => 9, :HEADLINE => 10, :INCLUDE => 11, :INDENT => 12, :DEDENT => 13 } racc_use_result_var = true racc_nt_base = 14 Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ '$end', 'error', 'DUMMY', 'ITEMLISTLINE', 'ENUMLISTLINE', 'DESCLISTLINE', 'METHODLISTLINE', 'STRINGLINE', 'WHITELINE', 'SUBTREE', 'HEADLINE', 'INCLUDE', 'INDENT', 'DEDENT', '$start', 'document', 'blocks', 'block', 'textblock', 'verbatim', 'lists', 'headline', 'include', 'textblockcontent', 'verbatimcontent', 'verbatim_after_lists', 'list', 'itemlist', 'enumlist', 'desclist', 'methodlist', 'lists2', 'itemlistitems', 'itemlistitem', 'first_textblock_in_itemlist', 'other_blocks_in_list', 'enumlistitems', 'enumlistitem', 'first_textblock_in_enumlist', 'desclistitems', 'desclistitem', 'description_part', 'methodlistitems', 'methodlistitem', 'whitelines', 'blocks_in_list', 'block_in_list', 'whitelines2'] Racc_debug_parser = false ##### racc system variables end ##### # reduce 0 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 12 def _reduce_1( val, _values, result ) result = DocumentElement.new add_children_to_element(result, *val[0]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 16 def _reduce_2( val, _values, result ) raise ParseError, "Error: file empty." result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 20 def _reduce_3( val, _values, result ) result.concat(val[1]) result end .,., # reduce 4 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 23 def _reduce_5( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 24 def _reduce_6( val, _values, result ) result = val result end .,., # reduce 7 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 26 def _reduce_8( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 27 def _reduce_9( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 28 def _reduce_10( val, _values, result ) result = [] result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 29 def _reduce_11( val, _values, result ) result = val[0].blocks result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 32 def _reduce_12( val, _values, result ) # val[0] is like [level, title] title = @inline_parser.parse(val[0][1]) result = Headline.new(val[0][0]) add_children_to_element(result, *title) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 38 def _reduce_13( val, _values, result ) result = Include.new(val[0]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 42 def _reduce_14( val, _values, result ) # val[0] is Array of String content = cut_off(val[0]).join("") contents = @inline_parser.parse(content) result = TextBlock.new() add_children_to_element(result, *contents) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 50 def _reduce_15( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 51 def _reduce_16( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 55 def _reduce_17( val, _values, result ) # val[1] is Array of String content = cut_off(val[1]) result = Verbatim.new(content) # imform to lexer. @in_verbatim = false result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 62 def _reduce_18( val, _values, result ) # val[0] is Array of String content = cut_off(val[0]) result = Verbatim.new(content) # imform to lexer. @in_verbatim = false result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 69 def _reduce_19( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 71 def _reduce_20( val, _values, result ) result.concat(val[2]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 73 def _reduce_21( val, _values, result ) result.push("\n") result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 74 def _reduce_22( val, _values, result ) result = val # imform to lexer. @in_verbatim = true result end .,., # reduce 23 omitted # reduce 24 omitted # reduce 25 omitted # reduce 26 omitted # reduce 27 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 85 def _reduce_28( val, _values, result ) result = val[1] result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 87 def _reduce_29( val, _values, result ) result = val[1].push(val[2]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 90 def _reduce_30( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 91 def _reduce_31( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 95 def _reduce_32( val, _values, result ) result = ItemList.new add_children_to_element(result, *val[0]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 100 def _reduce_33( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 101 def _reduce_34( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 105 def _reduce_35( val, _values, result ) result = ItemListItem.new add_children_to_element(result, val[0], *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 111 def _reduce_36( val, _values, result ) result = EnumList.new add_children_to_element(result, *val[0]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 116 def _reduce_37( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 117 def _reduce_38( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 121 def _reduce_39( val, _values, result ) result = EnumListItem.new add_children_to_element(result, val[0], *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 127 def _reduce_40( val, _values, result ) result = DescList.new add_children_to_element(result, *val[0]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 132 def _reduce_41( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 133 def _reduce_42( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 137 def _reduce_43( val, _values, result ) term = DescListItem::Term.new term_contents = @inline_parser.parse(val[0].strip) add_children_to_element(term, *term_contents) result = DescListItem.new set_term_to_element(result, term) add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 148 def _reduce_44( val, _values, result ) result = MethodList.new add_children_to_element(result, *val[0]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 153 def _reduce_45( val, _values, result ) result.push(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 154 def _reduce_46( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 158 def _reduce_47( val, _values, result ) term = MethodListItem::Term.new(val[0].strip) result = MethodListItem.new set_term_to_element(result, term) add_children_to_element(result, *val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 166 def _reduce_48( val, _values, result ) result = [val[1]].concat(val[2]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 167 def _reduce_49( val, _values, result ) result = [val[1]] result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 169 def _reduce_50( val, _values, result ) result = val[2] result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 170 def _reduce_51( val, _values, result ) result = [] result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 173 def _reduce_52( val, _values, result ) result.concat(val[1]) result end .,., # reduce 53 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 176 def _reduce_54( val, _values, result ) result = val result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 177 def _reduce_55( val, _values, result ) result = val result end .,., # reduce 56 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 179 def _reduce_57( val, _values, result ) result = [] result end .,., # reduce 58 omitted # reduce 59 omitted # reduce 60 omitted # reduce 61 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 190 def _reduce_62( val, _values, result ) content = cut_off([val[0]].concat(val[1])).join("") contents = @inline_parser.parse(content) result = TextBlock.new() add_children_to_element(result, *contents) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 197 def _reduce_63( val, _values, result ) content = cut_off([val[0]]).join("") contents = @inline_parser.parse(content) result = TextBlock.new() add_children_to_element(result, *contents) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 205 def _reduce_64( val, _values, result ) content = cut_off([val[0]].concat(val[1])).join("") contents = @inline_parser.parse(content) result = TextBlock.new() add_children_to_element(result, *contents) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 212 def _reduce_65( val, _values, result ) content = cut_off([val[0]]).join("") contents = @inline_parser.parse(content) result = TextBlock.new() add_children_to_element(result, *contents) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 219 def _reduce_66( val, _values, result ) result = [val[0]].concat(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 220 def _reduce_67( val, _values, result ) result.concat(val[1]) result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 221 def _reduce_68( val, _values, result ) result = val[1] result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 222 def _reduce_69( val, _values, result ) result = val result end .,., # reduce 70 omitted module_eval <<'.,.,', 'rd/rdblockparser.ry', 224 def _reduce_71( val, _values, result ) result = [] result end .,., module_eval <<'.,.,', 'rd/rdblockparser.ry', 225 def _reduce_72( val, _values, result ) result = [] result end .,., def _reduce_none( val, _values, result ) result end end # class RDParser end # end of module RD ### end rd/rdblockparser.tab ### begin rd/filter =begin = filter.rb Definition of Filter structure. =end module RD class Filter attr(:mode, true) def initialize(mode = :target, &block) @mode = mode @block = block end # inn, out: RD::Part def call(inn) out = RD::Part.new("", nil, "w") result = @block.call(inn, out) if out.empty? result else out.to_s end end module FileInclude def find_file(file, part) for dir in part.tree.include_path begin return open(dir + "/" + file) rescue next end end nil end module_function :find_file end # Filter::Include end # Filter # Build-in Filter # Simple inclusion INCLUDE_FILTER = Filter.new(:target) do |inn, out| inn.each do |line| out.print(line) end end # Simple RD inclusion RD_FILTER = Filter.new(:rd) do |inn, out| out.print("=begin\n") inn.each do |line| out.print(line) end out.print("\n=end\n") end # Eval ruby script # "out.print" to output. EVAL_FILTER = Filter.new(:target) do |inn, out| begin eval(inn.to_s) rescue out.print "!!Error occured when eval!!\n" end end # RD::Part is a pseudo IO class class Part attr(:tree) attr(:lineno, true) attr(:pos, true) def initialize(content = "", tree = nil, mode = "r") @content = content if mode == "r" @content.freeze end @tree = tree @pos = 0 @lineno = 0 @unget = nil end def each_line(rs = $/) while line = gets yield(line) end end alias each each_line def each_byte while char = getc yield(char) end end def eof? @pos == @content.size end alias eof eof? def get_char(ex) ret = nil if @unget ret = @unget else unless eof? ret = @content[@pos] @pos += 1 else raise EOFError if ex end end ret end private :get_char def getc get_char(nil) end def readchar get_char(true) end def ungetc(char) @ungetc = char nil end def get_line(ex, rs) ret = nil unless eof? new_pos = @content.index(rs, @pos) if new_pos ret = @content[@pos .. new_pos] @pos = new_pos + 1 @lineno += 1 else ret = @content[@pos .. @content.size - 1] @pos = @content.size @lineno += 1 end else raise EOFError if ex end $_ = ret end private :get_line def gets(rs = $/) get_line(nil, rs) end def readline(rs = $/) get_line(true, $/) end def read(length = @content.size - @pos) ret = "" length.times do ret << getc end ret end def readlines(rs = $/) ret = [] each_line(rs) do |line| ret.push(line) end ret end def rewind @pos = 0 end def seek(offset, whence) case whence when 0 @pos = offset when 1 @pos += offset when 2 @pos += @content.size - 1 else raise Errno::EINVAL end end alias tell pos def << (arg) begin @content << arg.to_s self rescue raise IOError end end def print(*args) begin args.each do |i| @content << i.to_s end nil rescue raise IOError end end def printf(format, *args) str = sprintf(format, *args) begin @content << str nil rescue raise IOError end end def putc(char) self.printf("%c", char) char end def puts(*args) args.flatten.each do |i| self.print(i, "\n") end end def write(str) @content << str.to_s str.to_s.size end def empty? @content.empty? end def to_s @content end end end =begin == script info. filter structure. $Id: filter.rb,v 1.7 2001/03/19 15:20:08 toshirok Exp $ == changes :0.6.3 * add (({RD::RD_FILTER})). :0.6.0 * Part have reference to RDTree. * module (({RD::Filter::FileInclude})) :0.5.4 * add. =end ### end rd/filter ### begin rd/document-struct module RD # DocumentStructure defines and restricts structure of document tree. # it consists of ElementRelationship class DocumentStructure def initialize @relationships = [] end def add_relationships(*relations) @relationships += relations end def define_relationship(parent, child) add_relationships(ElementRelationship.new(parent, child)) end def each_relationship @relationships.each do |i| yield(i) end end def is_valid?(parent, child) each_relationship do |i| return true if i.match?(parent, child) end false end end # ElementRelationship is knowledge about parent-children relationship # between Elements. class ElementRelationship attr_reader(:parent, :child) def initialize(parent, child) @parent = parent @child = child end def match?(parent, child) parent.is_a? @parent and child.is_a? @child end end end ### end rd/document-struct ### begin rd/version module RD class Version attr_reader :name attr_reader :major, :minor, :patch_level def Version.new_from_version_string(name, version_str) major, minor, patch_level, *dummy = analyze_version_string(version_str) return Version.new(name, major, minor, patch_level) end def initialize(name, major, minor, patch_level) @name = name @major = major @minor = minor @patch_level = patch_level end def Version.analyze_version_string(version_str) version_str = clean_up_version_string(version_str) version_str.split(/\./).collect{|i| i.to_i } end def to_s result = sprintf("%s %d", @name, @major) result += sprintf(".%d", @minor) if @minor result += sprintf(".%d", @patch_level) if @patch_level result end def Version.clean_up_version_string(version_str) if /^\$Version:?\s*(.*)\$/ === version_str $1 else version_str end end end end ### end rd/version module RD # document tree class Tree include Enumerable SYSTEM_NAME = "RDtool Framework -- Document Tree" SYSTEM_VERSION = "$Version: 0.6.13$" #" VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION) def Tree.version VERSION end TMP_DIR = "/tmp" def Tree.tmp_dir TMP_DIR end attr_reader :root attr_reader :document_struct attr_accessor :include_paths alias include_path include_paths alias include_path= include_paths= attr_reader :filters alias filter filters attr_accessor :tmp_dir def Tree.new_with_document_struct(document_struct, include_paths = []) Tree.new(document_struct, nil, include_paths) end def initialize(document_struct, src_str = nil, include_paths = []) @src = src_str @document_struct = document_struct @include_paths = include_paths @filters = Hash.new() @tmp_dir = TMP_DIR end def parse parser = RDParser.new set_root(parser.parse(@src.to_a, self)) end def set_root(element) raise ArgumentError, "#{element.class} can't be root." unless @document_struct.is_valid?(self, element) @root = element element.parent = self end alias root= set_root def make_root(&block) child = DocumentElement.new set_root(child) child.build(&block) if block_given? child end def check_valid each_element do |i| raise RuntimeError, "mismatched document structure, #{i.parent} <-/- #{i}." unless @document_struct.is_valid?(i.parent, i) end true end def accept(visitor) @root.accept(visitor) end def each_element(&block) return nil unless @root @root.each(&block) end alias each each_element def tree self end def Tree.new_from_rdo(*rdos) # rdos: IOs tree = Tree.new("", [], nil) tree_content = [] rdos.each do |i| subtree = Marshal.load(i) tree_content.concat(subtree.root.blocks) end tree.root = DocumentElement.new(tree_content) tree end end end ### end rd/tree ### begin rd/rd-struct #require 'rd/document-struct' #require 'rd/tree' ### begin rd/element module RD # abstruct class of node of document tree class Element include Enumerable attr_accessor :parent def tree raise RuntimeError, "#{self} doesn't have a parent." unless @parent @parent.tree end def inspect c = children.collect{|i| indent2(i.inspect)}.join("\n") "<#{self.class.name}>" + (c.empty? ? "" : "\n") + c end end # Element # element which don't have children. module TerminalElement def children [] end def each_element yield(self) end alias each each_element end # element which have children. module NonterminalElement def children raise NotImplimentedError, "need #{self}#children." end def each_child children.each do |i| yield(i) end end def each_element(&block) yield(self) children.each do |i| i.each_element(&block) end end alias each each_element def add_child(child) add_child_under_document_struct(child, tree.document_struct) end def add_child_under_document_struct(child, document_struct) if document_struct.is_valid?(self, child) push_to_children(child) else raise ArgumentError, "mismatched document structure, #{self} <-/- #{child}." end return self end def add_children(children) add_children_under_document_struct(children, tree.document_struct) end def add_children_under_document_struct(children, document_struct) children.each do |i| add_child_under_document_struct(i, document_struct) end return self end def add_children_without_document_struct(new_children) new_children.each do |i| push_to_children(i) end return self end def push_to_children(child) children.push(child) child.parent = self end attr_accessor :temporary_document_structure def build(document_struct = tree.document_struct, &block) under_temporary_document_structure(document_struct) do self.instance_eval(&block) end self end def make_child(child_class, *args_of_new, &block) child = child_class.new(*args_of_new) if self.temporary_document_structure self.add_child_under_document_struct(child, self.temporary_document_structure) child.build(self.temporary_document_structure, &block) if block_given? else self.add_child(child) child.build(&block) if block_given? end child end alias new make_child private :new # NonterminalElement#new, not NonterminalElement.new def under_temporary_document_structure(document_struct) begin self.temporary_document_structure = document_struct yield ensure self.temporary_document_structure = nil end end def indent2(str) str.collect{|i| " " + i }.join("") end private :indent2 end # root node of document tree class DocumentElement < Element include NonterminalElement attr_reader :blocks def initialize() @blocks = [] end def accept(visitor) visitor.visit_DocumentElement(self) end alias each_block each_child def children @blocks end end end ### end rd/element ### begin rd/block-element #require 'rd/element' ### begin rd/labeled-element module RD # interface module LabeledElement def to_label @label ||= calculate_label end alias label to_label def calculate_label raise "[BUG] must override." end end end ### end rd/labeled-element module RD # Block-level Element of document tree. abstruct class. class BlockElement < Element end class Headline < BlockElement include NonterminalElement include LabeledElement MARK2LEVEL = { "=" => 1, "==" => 2, "===" => 3, "====" => 4, "+" => 5, "++" => 6 } attr_accessor :level attr_reader :title def initialize(level_num) @level = level_num @title = [] end def accept(visitor) visitor.visit_Headline(self) end def calculate_label ret = "" @title.each do |i| ret << i.to_label end ret end private :calculate_label def Headline.mark_to_level(mark_str) MARK2LEVEL[mark_str] or raise ArgumentError, "#{mark_str} is irregular for Headline mark." end def children @title end end class Include < BlockElement include TerminalElement attr_accessor :filename def initialize(filename) @filename = filename end def accept(visitor) visitor.visit_Include(self) end end # Include class TextBlock < BlockElement include NonterminalElement attr_accessor :content def initialize() @content = [] end def accept(visitor) visitor.visit_TextBlock(self) end def children @content end end class Verbatim < BlockElement include TerminalElement attr_reader :content def initialize(content_strings = []) @content = content_strings # Array of String end def accept(visitor) visitor.visit_Verbatim(self) end def each_line @content.each do |i| yield(i) end end end end ### end rd/block-element ### begin rd/list #require 'rd/block-element' #require 'rd/element' module RD class List < BlockElement include NonterminalElement attr_reader :items def initialize @items = [] end alias each_item each_child def children @items end end class ListItem < BlockElement include NonterminalElement attr_reader :content def initialize @content = [] end alias each_block each_child def children @content end end class ItemList < List def accept(visitor) visitor.visit_ItemList(self) end end class ItemListItem < ListItem def accept(visitor) visitor.visit_ItemListItem(self) end end class EnumList < List def accept(visitor) visitor.visit_EnumList(self) end end class EnumListItem < ListItem def accept(visitor) visitor.visit_EnumListItem(self) end end end # RD ### end rd/list ### begin rd/desclist #require 'rd/element' #require 'rd/list' ### begin rd/complex-list-item module RD # abstruct class for ListItem which have term part additionaly. # (i.e. DescListItem and MethodListItem) module ComplexListItem def set_term(term) set_term_under_document_struct(term, tree.document_struct) end alias term= set_term def set_term_under_document_struct(term, document_struct) raise ArgumentError unless document_struct.is_valid?(self, term) assign_term(term) end def set_term_without_document_struct(term) assign_term(term) end def assign_term(term) @term = term term.parent = self end def make_term(*args_of_new, &block) child = self.class::Term.new(*args_of_new) set_term(child) child.build(&block) if block_given? child end def each_element(&block) yield(self) @term.each_element(&block) @description.each do |i| i.each_element(&block) end end alias each each_element def each_block_in_description @description.each do |i| yield(i) end end alias each_block each_block_in_description def children @description end def to_label @term.to_label end alias label to_label def inspect t = indent2(term.inspect) if term c = children.collect{|i| indent2(i.inspect)}.join("\n") "<#{self.class.name}>" + (term ? "\n" : "") + t.to_s + (c.empty? ? "" : "\n") + c end end # ComplexListItem end # RD ### end rd/complex-list-item #require 'rd/labeled-element' module RD class DescList < List def accept(visitor) visitor.visit_DescList(self) end end class DescListItem < ListItem include ComplexListItem attr_reader :term attr_reader :description def initialize @term = nil @description = [] @label = nil end def accept(visitor) visitor.visit_DescListItem(self) end class Term < Element include NonterminalElement include LabeledElement def initialize @content = [] end def calculate_label ret = "" children.each do |i| ret.concat(i.to_label) end ret end private :calculate_label def accept(visitor) visitor.visit_DescListItemTerm(self) end def children @content end end end # DescListItem end # RD ### end rd/desclist ### begin rd/methodlist #require 'rd/element' #require 'rd/list' #require 'rd/complex-list-item' #require 'rd/labeled-element' module RD class MethodList < List def accept(visitor) visitor.visit_MethodList(self) end end class MethodListItem < ListItem include ComplexListItem attr_reader :term attr_reader :description def initialize @term = nil @description = [] end def accept(visitor) visitor.visit_MethodListItem(self) end def children @description end class Term < Element include TerminalElement include LabeledElement attr_reader :content def initialize(content = "") @content = content end def each_element yield(self) end alias each each_element def accept(visitor) visitor.visit_MethodListItemTerm(self) end def calculate_label @content.sub(/\s*(?:\(|\{).*$/, "") end private :calculate_label end end end # RD ### end rd/methodlist ### begin rd/inline-element #require 'rd/element' module RD # Inline-level Element of document tree class InlineElement < Element end # abstruct class. class TerminalInline < InlineElement include TerminalElement attr_accessor :content def initialize(content) @content = content end end # abstract class. class NonterminalInline < InlineElement include NonterminalElement attr_reader :content def initialize @content = [] end def children @content end def to_label ret = "" children.each do |i| ret << i.to_label end ret.strip end end # NonterminalInline class StringElement < TerminalInline def accept(visitor) visitor.visit_StringElement(self) end def to_label @content end end class Verb < TerminalInline def accept(visitor) visitor.visit_Verb(self) end def to_label @content.strip end end class Emphasis < NonterminalInline def accept(visitor) visitor.visit_Emphasis(self) end end class Code < NonterminalInline def accept(visitor) visitor.visit_Code(self) end end class Var < NonterminalInline def accept(visitor) visitor.visit_Var(self) end end class Keyboard < NonterminalInline def accept(visitor) visitor.visit_Keyboard(self) end end class Index < NonterminalInline def accept(visitor) visitor.visit_Index(self) end end class Footnote < NonterminalInline def accept(visitor) visitor.visit_Footnote(self) end end class Reference < NonterminalInline attr_accessor :label # Reference::Label alias set_label label= def initialize(label) @content = [] @label = label.renew_label end def Reference.new_from_label(label) ref = Reference.new(label) ref.add_children(label.to_reference_content) return ref end def Reference.new_from_label_under_document_struct(label, struct) ref = Reference.new(label) ref.add_children_under_document_struct(label.to_reference_content, struct) return ref end def Reference.new_from_label_without_document_struct(label) ref = Reference.new(label) ref.add_children_without_document_struct(label.to_reference_content) return ref end def accept(visitor) visitor.visit_Reference(self) end def result_of_apply_method_of(visitor, children) label.result_of_apply_method_of(visitor, self, children) end def to_label @label.to_label end # abstruct class. Label for Reference class Label def extract_label raise NotImplementedError, "[BUG] must be overridden." end def to_reference_content raise NotImplementedError, "[BUG] must be overridden." end def result_of_apply_method_of(visitor) raise NotImplementedError, "[BUG] must be overridden." end end class URL < Label attr_accessor :url def initialize(url_str) @url = url_str end def to_label "" end def result_of_apply_method_of(visitor, reference, children) visitor.apply_to_Reference_with_URL(reference, children) end def to_reference_content [StringElement.new("")] end def renew_label self end end # URL class RDLabel < Label attr_accessor :element_label attr_accessor :filename def initialize(element_label, filename = nil) @element_label = element_label @filename = filename end def result_of_apply_method_of(visitor, reference, children) visitor.apply_to_Reference_with_RDLabel(reference, children) end def to_reference_content [] end def renew_label self end alias to_label element_label end # RDLabel # for initialization. Parameter Object(?) class TemporaryLabel < Label attr_accessor :element_label attr_accessor :filename def initialize(element_label = [], filename = nil) @element_label = element_label @filename = filename end def to_reference_content self.element_label end def renew_label RDLabel.new(extract_label(self.element_label), self.filename) end def extract_label(elements) ret = "" elements.each do |i| ret << i.to_label end ret.strip end private :extract_label end end # Reference end ### end rd/inline-element # definition of RD document structure. module RD # interface. can be component of ListItem. module ListItemComposable end # interface. can be component of Headline and Reference. module LabelComposable end # interface. can include Inline module InlineIncludable end class DocumentStructure RD = DocumentStructure.new RD.define_relationship(Tree, DocumentElement) RD.define_relationship(DocumentElement, BlockElement) RD.define_relationship(Headline, LabelComposable) RD.define_relationship(TextBlock, InlineElement) RD.define_relationship(ItemList, ItemListItem) RD.define_relationship(EnumList, EnumListItem) RD.define_relationship(DescList, DescListItem) RD.define_relationship(MethodList, MethodListItem) RD.define_relationship(ListItem, ListItemComposable) RD.define_relationship(DescListItem, DescListItem::Term) RD.define_relationship(DescListItem::Term, LabelComposable) RD.define_relationship(MethodListItem, MethodListItem::Term) RD.define_relationship(InlineIncludable, InlineElement) RD.define_relationship(Reference, LabelComposable) end class TextBlock include ListItemComposable end class Verbatim include ListItemComposable end class ItemList include ListItemComposable end class EnumList include ListItemComposable end class DescList include ListItemComposable end class StringElement include LabelComposable end class Emphasis include LabelComposable include InlineIncludable end class Code include LabelComposable include InlineIncludable end class Var include LabelComposable include InlineIncludable end class Keyboard include LabelComposable include InlineIncludable end class Index include LabelComposable include InlineIncludable end class Footnote include InlineIncludable end class Verb include LabelComposable end end ### end rd/rd-struct module RD # for backward-compatibility. class RDTree < Tree def initialize(src_str, include_paths = [], do_parse = true) super(DocumentStructure::RD, src_str, include_paths) parse() if do_parse end end RDElement = Element end ### end rd/rdfmt ### begin rd/visitor #require "rd/version" module RD class Visitor SYSTEM_NAME = "RDtool Framework -- Visitor" SYSTEM_VERSION = "$Version: 0.6.13$" #" VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION) def Visitor.version VERSION end def visit(tree) tree.accept(self) end def visit_children(element) ret = [] element.each_child do |i| ret.push(i.accept(self)) end ret end def Visitor.define_visit_Nonterminal(element_type) eval <<-END_OF_EVAL def visit_#{element_type.id2name}(element) apply_to_#{element_type.id2name}(element, visit_children(element)) end END_OF_EVAL end def Visitor.define_visit_Terminal(element_type) eval <<-END_OF_EVAL def visit_#{element_type.id2name}(element) apply_to_#{element_type.id2name}(element) end END_OF_EVAL end define_visit_Terminal(:Include) define_visit_Terminal(:Verbatim) define_visit_Terminal(:MethodListItemTerm) define_visit_Nonterminal(:DocumentElement) define_visit_Nonterminal(:Headline) define_visit_Nonterminal(:TextBlock) define_visit_Nonterminal(:ItemList) define_visit_Nonterminal(:EnumList) define_visit_Nonterminal(:DescList) define_visit_Nonterminal(:MethodList) define_visit_Nonterminal(:ItemListItem) define_visit_Nonterminal(:EnumListItem) def visit_DescListItem(element) term = element.term.accept(self) apply_to_DescListItem(element, term, visit_children(element)) end define_visit_Nonterminal(:DescListItemTerm) def visit_MethodListItem(element) term = element.term.accept(self) apply_to_MethodListItem(element, term, visit_children(element)) end define_visit_Terminal(:StringElement) define_visit_Terminal(:Verb) define_visit_Nonterminal(:Emphasis) define_visit_Nonterminal(:Code) define_visit_Nonterminal(:Var) define_visit_Nonterminal(:Keyboard) define_visit_Nonterminal(:Index) define_visit_Nonterminal(:Footnote) def visit_Reference(element) children = visit_children(element) begin element.result_of_apply_method_of(self, children) rescue NameError apply_to_Reference(element, children) end end end end ### end rd/visitor #require "rd/version" module Kconv NAME2CONST = { "iso-2022-jp" => Kconv::JIS, "euc-jp" => Kconv::EUC, "shift_jis" => Kconv::SJIS, } NAME_ALIAS = { 'jis' => 'iso-2022-jp', 'euc' => 'euc-jp', 'sjis' => 'shift_jis', 'shift-jis' => 'shift_jis', } end include RD SYSTEM_NAME = "RDtool -- rd2" SYSTEM_VERSION = "$Version: 0.6.13$" #" RD2_VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION) # global vars $Visitor_Class = nil $Visitor = nil $RD2_Sub_OptionParser = nil # local vars include_path = [] with_part = [] output_file = nil output_index = nil out_code = nil from_rdo = nil # user option $DEFAULT_FORMAT_LIB = "rd/rd2html-lib" $RC = {} $RC["filter"] = Hash.new(RD::INCLUDE_FILTER) if test(?r, File.expand_path("~/.rd2rc")) begin load "~/.rd2rc" rescue load "rd/dot.rd2rc" end # STDERR << "#{$0}: loading ~/.rd2rc\n" else #load "rd/dot.rd2rc" ### begin dot.rd2rc =begin = dot.rd2rc default dot file for "rd2". =end # define relation between types of part and Filter to set $RD["filter"] # RD::INCLUDE_FILTER is used if type doesn't set. # $RC["filter"]["((|type|))"] = ((|Filter|)) $RC["filter"]["include"] = RD::INCLUDE_FILTER $RC["filter"]["rd"] = RD::RD_FILTER $RC["filter"]["eval"] = RD::EVAL_FILTER =begin == script info. default dot file for "rd2". $Id: dot.rd2rc,v 1.2 2000/06/09 15:48:42 toshirok Exp $ == changes :0.5.4 * add. =end ### end dot.rd2rc # STDERR << "#{$0}: loading rd/dot.rd2rc\n" end # initialize OptionParser ARGV.options do |q| q.banner = "Usage: #{$0} [options] rd-file > output\n" q.on_head("global options:") q.on("-rLIB", "--require=LIB", String, "choose format library.") do |i| # require LIB require i if $Visitor_Class && !$Visitor $Visitor = $Visitor_Class.new() if $RD2_Sub_OptionParser require $RD2_Sub_OptionParser $RD2_Sub_OptionParser = nil end end end q.on("-oNAME", String, "indicate base name of output file") do |i| output_file = i end q.on("--out-code=KCODE", Kconv::NAME2CONST.keys, Kconv::NAME_ALIAS, "character encoding of output.(jis|euc|sjis)") do |out_code| end q.on("--output-index", "output method index file (*.rmi)") do |i| output_index = true end q.on("-IPATH", "--include-path=PATH", String, "add PATH to list of include path") do |i| # add to include path include_path.unshift(i) end # accept "PART:FILTER" and "PART" q.on("--with-part=PART", /(\w+)(?:\s*:\s*(\w+))?/, "include PART with Filter") do |src, part, filter| with_part.push([part, filter || part]) unless include_path.index(RD::RDTree.tmp_dir) include_path.push(RD::RDTree.tmp_dir) end end q.on("--from-rdo", "load from *.rdo instead of *.rd") do from_rdo = true end q.on("--version", "print versions.") do STDERR.puts RD2_VERSION STDERR.puts Tree::version STDERR.puts Visitor::version STDERR.puts $Visitor_Class.version if $Visitor_Class exit(0) end q.on_tail("--help", "print this message") do STDERR.print(q.to_s) exit(0) end end # OptionParser.new ### begin rd/rd2html-lib =begin = rd2html-lib.rb =end require 'cgi' ### begin rd/rdvisitor ### begin rd/output-format-visitor #require 'rd/visitor' #require 'rd/rd-struct' ### begin rd/search-file module RD module SearchFile def search_file(base, include_path, suffixes) include_path.each do |dir| suffixes.each do |suffix| file = dir + "/" + base + "." + suffix return file if File.exist? file end end nil end end end ### end rd/search-file module RD class OutputFormatVisitor < Visitor include SearchFile # must-have constants OUTPUT_SUFFIX = "" INCLUDE_SUFFIX = [] attr_accessor :include_suffix attr_accessor :filename def initialize super @include_suffix = self.class::INCLUDE_SUFFIX.clone @filename = nil end def apply_to_Include(element) fname = search_file(element.filename, element.tree.include_paths, @include_suffix) File.readlines(fname).join("") if fname end end end # RD ### end rd/output-format-visitor ### begin rd/reference-resolver ### begin rd/rbl-suite ### begin rd/rbl-file #require 'rd/search-file' module RD class RBLFile include SearchFile SUFFIX = "rbl" attr_reader :labels attr_reader :filename def initialize(filename) @filename = RBLFile.basename(filename) @labels = [] end def RBLFile.create_rbl_file(filename, resolver) file = File.open(RBLFile.rbl_file_path(filename), "w") file.print(RBLFile.labels_to_string(resolver)) file.close end def RBLFile.rbl_file_path(filename) basename(filename) + "." + SUFFIX end def RBLFile.basename(path) if /\.(rd|rb)$/ === path $` else path end end def RBLFile.labels_to_string(resolver) (resolver.collect do |i| i.to_label + " => " + resolver.get_anchor(i) end).join("\n") end def load_rbl_file(search_paths) f = search_file(@filename, search_paths, [SUFFIX]) raise "RBLFile not found." unless f src = File.readlines(f).join("") @labels = string_to_labels(src) end def string_to_labels(src) src.collect do |i| parse_line(i) end end def parse_line(src) col = src.rindex("=>") raise "RBL file parse error." unless col label = src[0 .. col - 1].strip anchor = src[col + 2 .. -1].strip [label, anchor] end def refer(label) label = @labels.find{|i| i[0] == label} return nil unless label label[1] end end end ### end rd/rbl-file module RD class RBLSuite attr_reader :rbl_files def initialize(search_paths) @search_paths = search_paths @rbl_files = [] end def refer(label, filename) rbl = get_rbl_file(filename) [rbl.filename, rbl.refer(label)] end def get_rbl_file(filename) rbl = @rbl_files.find{|i| i.filename == RBLFile.basename(filename)} if rbl rbl else add_rbl_file(filename) end end def add_rbl_file(filename) rbl = RBLFile.new(filename) begin rbl.load_rbl_file(@search_paths) rescue RuntimeError ensure @rbl_files.push(rbl) end rbl end end end ### end rd/rbl-suite #require 'rd/labeled-element' #require 'forwardable' module RD class ReferenceResolver extend Forwardable include Enumerable attr_reader :labels attr_reader :label_prefix attr_reader :rbl_suite def initialize(tree, prefix = "label:") init_labels(tree) @label_prefix = prefix @rbl_suite = RBLSuite.new(tree.include_path) end def init_labels(tree) @labels = {} ary = (tree.find_all do |i| i.is_a? LabeledElement end) num = 0 ary.each do |i| push_to_labels(i.to_label, [i, num]) num += 1 end end private :init_labels def push_to_labels(key, value) if labels[key] labels[key].push(value) else labels[key] = [value] end end private :push_to_labels def each_label tmp = [] labels.each_value do |i| i.each do |j| tmp.push(j) end end tmp.sort{|i,j| i[1] <=> j[1]}.each do |i| yield(i[0]) end end alias each each_label def referent_of_label(label) label = label.label if label.is_a? Reference if label.filename refer_external_file(label) else anchor = refer(label) return nil unless anchor [nil, anchor] end end def refer(label) matched = labels[label2str(label)] return nil unless matched num2anchor(matched[0][1]) end def refer_element(label) labels.fetch(label2str(label), []).collect{|i| i[0] } end def refer_external_file(label) label = label.label if label.is_a? Reference rbl_suite.refer(label.element_label, label.filename) end def get_label_num(element) entry = labels[element.to_label].find{|i| i[0] == element } return nil unless entry entry[1] end def get_anchor(element) if num = get_label_num(element) num2anchor(num) end end def num2anchor(num) label_prefix + num.to_s end private :num2anchor def label2str(label) case label when String label when Element, Reference::RDLabel label.to_label else raise ArgumentError, "can't extract Label from #{label}." end end def make_rbl_file(filename) RBLFile.create_rbl_file(filename, self) end end end ### end rd/reference-resolver #require 'rd/rbl-file' #require 'forwardable' module RD # for Backward compatibility class RDVisitor < OutputFormatVisitor extend Forwardable def apply_to_DescListItemTerm(element, contents) contents end def apply_to_MethodListItemTerm(element) apply_to_String(element.content) end def_delegator(:@reference_resolver, :labels, :__labels__) def_delegator(:@reference_resolver, :label_prefix, :__label_prefix__) def_delegator(:@reference_resolver, :rbl_suite) def prepare_labels(tree, prefix = "label:") @reference_resolver = ReferenceResolver.new(tree, prefix) end def_delegator(:@reference_resolver, :refer) def_delegator(:@reference_resolver, :get_anchor) def_delegator(:@reference_resolver, :make_rbl_file) def refer_external(label) label = @reference_resolver.refer_external_file(label) return nil unless label label[1] end end module AutoLabel def parse_rmi(src) labels = {} $method_index = [] eval(src) $method_index.each do |c, k, m, f, l| labels[c + k + m] = l end labels end private :parse_rmi end # AutoLabel =begin == module RD::MethodParse this module provide several functions for MehotList. =end module MethodParse def analize_method(method) klass = nil args = nil kind = nil if /[^{(\s]+/ =~ method method = $& args = $' # ' end if /^(.*)(#|::|\.)/ =~ method klass = $1 kind = str2kind($2) method = $' # ' end if klass == "function" and kind == :instance_method kind = :function end [klass, kind, method, args] end module_function :analize_method def str2kind(str) case str when '#' :instance_method when '.' :class_method when '::' :constant end end module_function :str2kind def kind2str(int) case int when :instance_method, :function '#' when :class_method '.' when :constant '::' end end module_function :kind2str KIND2NUM = {:constant => 0, :class_method => 1, :instance_method => 2, :function => 2} def kind2num(str) KIND2NUM[str] end module_function :kind2num def make_mindex_label(element) klass, kind, method = analize_method(element.label) case kind when :class_method klass + "_S_" + tr_method(method) when :instance_method klass + "_" + tr_method(method) when :constant klass + "_" + method when :function "function_" + tr_method(method) else element.label end end module_function :make_mindex_label def tr_method(method) case method when "[]" "ref_" when "[]=" "set_" when "+" "plus_" when "+@" "uplus_" when "-" "minus_" when "-@" "uminus_" when "*" "mul_" when "/" "div_" when "%" "mod_" when "**" "power_" when "~" "inv_" when "==" "eq_" when "===" "eqq_" when "=~" "match_" when "&" "and_" when "|" "or_" when "<<" "lshift_" when ">>" "rshift_" when "<=>" "cmp_" when "<" "lt_" when "<=" "le_" when ">" "gt_" when ">=" "ge_" when "^" "xor_" when "`" "backquote_" when /!$/ $` + "_bang" # ` when /\?$/ $` + "_p" # ` when /=$/ $` + "_eq" # ` else method end end module_function :tr_method def make_method_index(tree) indexes = [] tree.each do |i| if i.is_a?(MethodListItem) klass, kind, method, args = analize_method(i.term.content) indexes.push([klass, kind2num(kind), method, kind]) if kind end end indexes.uniq! indexes.sort.each {|i| i[1] = i.pop} end module_function :make_method_index end # MethodParse end # RD =begin == script info. abstruct class for visitor of RDTree. $Id: rdvisitor.rb,v 1.46 2003/02/18 16:20:25 tosh Exp $ =end ### end rd/rdvisitor #require "rd/version" module RD class RD2HTMLVisitor < RDVisitor include MethodParse SYSTEM_NAME = "RDtool -- RD2HTMLVisitor" SYSTEM_VERSION = "$Version: 0.6.13$" #" VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION) def self.version VERSION end # must-have constants OUTPUT_SUFFIX = "html" INCLUDE_SUFFIX = ["html"] METACHAR = { "<" => "<", ">" => ">", "&" => "&" } attr(:css, true) attr(:charset, true) alias charcode charset alias charcode= charset= attr(:lang, true) attr(:title, true) attr(:html_link_rel, nil) attr(:html_link_rev, nil) attr(:use_old_anchor, true) # output external Label file. attr(:output_rbl, true) attr_reader :footnotes attr_reader :foottexts def initialize @css = nil @charset = nil @lang = nil @title = nil @html_link_rel = {} @html_link_rev = {} @footnotes = [] @index = {} # @use_old_anchor = nil @use_old_anchor = true # MUST -> nil @output_rbl = nil super end def visit(tree) prepare_labels(tree, "label-") prepare_footnotes(tree) tmp = super(tree) make_rbl_file(@filename) if @output_rbl and @filename tmp end def apply_to_DocumentElement(element, content) ret = "" ret << xml_decl + "\n" ret << doctype_decl + "\n" ret << html_open_tag + "\n" ret << html_head + "\n" ret << html_body(content) + "\n" ret << "\n" ret end def document_title return @title if @title return @filename if @filename return ARGF.filename if ARGF.filename != "-" "Untitled" end private :document_title def xml_decl encoding = %[encoding="#{@charset}" ] if @charset %|| end private :xml_decl def doctype_decl %|| end private :doctype_decl def html_open_tag lang_attr = %[ lang="#{@lang}" xml:lang="#{@lang}"] if @lang %|| end private :html_open_tag def html_head ret = %|\n| ret << html_title + "\n" ret << html_content_type + "\n" if html_content_type ret << link_to_css + "\n" if link_to_css ret << forward_links + "\n" if forward_links ret << backward_links + "\n" if backward_links ret << %Q[] end private :html_head def html_title "#{document_title}" end private :html_title def html_content_type if @charset %Q[" end end private :html_content_type def link_to_css if @css %|" # for ruby-mode.el fontlock, it is separated into 2 lines. end end private :link_to_css def forward_links return nil if @html_link_rel.empty? rels = @html_link_rel.sort{|i, j| i[0] <=> j[0] } (rels.collect do |rel, href| %Q[] end).join("\n") end private :forward_links def backward_links return nil if @html_link_rev.empty? revs = @html_link_rev.sort{|i, j| i[0] <=> j[0] } (revs.collect do |rev, href| %Q[] end).join("\n") end private :backward_links def html_body(contents) content = contents.join("\n") foottext = make_foottext %Q|\n#{content}\n#{foottext}\n| end private :html_body def apply_to_Headline(element, title) anchor = get_anchor(element) label = hyphen_escape(element.label) %Q[#{title}] + %Q[] end # RDVisitor#apply_to_Include def apply_to_TextBlock(element, content) content = content.join("") if (is_this_textblock_only_one_block_of_parent_listitem?(element) or is_this_textblock_only_one_block_other_than_sublists_in_parent_listitem?(element)) content.chomp else %Q[

#{content.chomp}

] end end def is_this_textblock_only_one_block_of_parent_listitem?(element) parent = element.parent (parent.is_a?(ItemListItem) or parent.is_a?(EnumListItem) or parent.is_a?(DescListItem) or parent.is_a?(MethodListItem)) and consist_of_one_textblock?(parent) end def is_this_textblock_only_one_block_other_than_sublists_in_parent_listitem?(element) parent = element.parent (parent.is_a?(ItemListItem) or parent.is_a?(EnumListItem) or parent.is_a?(DescListItem) or parent.is_a?(MethodListItem)) and consist_of_one_textblock_and_sublists(element.parent) end def consist_of_one_textblock_and_sublists(element) i = 0 element.each_child do |child| if i == 0 return false unless child.is_a?(TextBlock) else return false unless child.is_a?(List) end i += 1 end return true end def apply_to_Verbatim(element) content = [] element.each_line do |i| content.push(apply_to_String(i)) end %Q[
#{content.join("").chomp}
] end def apply_to_ItemList(element, items) %Q[
    \n#{items.join("\n").chomp}\n
] end def apply_to_EnumList(element, items) %Q[
    \n#{items.join("\n").chomp}\n
] end def apply_to_DescList(element, items) %Q[
\n#{items.join("\n").chomp}\n
] end def apply_to_MethodList(element, items) %Q[
\n#{items.join("\n").chomp}\n
] end def apply_to_ItemListItem(element, content) %Q[
  • #{content.join("\n").chomp}
  • ] end def apply_to_EnumListItem(element, content) %Q[
  • #{content.join("\n").chomp}
  • ] end def consist_of_one_textblock?(listitem) listitem.children.size == 1 and listitem.children[0].is_a?(TextBlock) end private :consist_of_one_textblock? def apply_to_DescListItem(element, term, description) anchor = get_anchor(element.term) label = hyphen_escape(element.label) if description.empty? %Q[
    #{term}
    ] + %Q[] else %Q[
    #{term}
    ] + %Q[\n] + %Q[
    \n#{description.join("\n").chomp}\n
    ] end end def apply_to_MethodListItem(element, term, description) term = parse_method(term) # maybe: term -> element.term anchor = get_anchor(element.term) label = hyphen_escape(element.label) if description.empty? %Q[
    #{term}] + %Q[
    ] else %Q[
    #{term}] + %Q[
    \n] + %Q[
    \n#{description.join("\n")}
    ] end end def apply_to_StringElement(element) apply_to_String(element.content) end def apply_to_Emphasis(element, content) %Q[#{content.join("")}] end def apply_to_Code(element, content) %Q[#{content.join("")}] end def apply_to_Var(element, content) %Q[#{content.join("")}] end def apply_to_Keyboard(element, content) %Q[#{content.join("")}] end def apply_to_Index(element, content) tmp = [] element.each do |i| tmp.push(i) if i.is_a?(String) end key = meta_char_escape(tmp.join("")) if @index.has_key?(key) # warning? %Q[#{content.join("")}] else num = @index[key] = @index.size anchor = a_name("index", num) %Q[#{content.join("")}] end end def apply_to_Reference_with_RDLabel(element, content) if element.label.filename apply_to_RefToOtherFile(element, content) else apply_to_RefToElement(element, content) end end def apply_to_Reference_with_URL(element, content) %Q[] + %Q[#{content.join("")}] end def apply_to_RefToElement(element, content) content = content.join("") if anchor = refer(element) content = content.sub(/^function#/, "") %Q[#{content}] else # warning? label = hyphen_escape(element.to_label) %Q[] + %Q[#{content}] #' end end def apply_to_RefToOtherFile(element, content) content = content.join("") filename = element.label.filename.sub(/\.(rd|rb)(\.\w+)?$/, "." + OUTPUT_SUFFIX) anchor = refer_external(element) if anchor %Q[#{content}] else %Q[#{content}] end end def apply_to_Footnote(element, content) num = get_footnote_num(element) raise ArgumentError, "[BUG?] #{element} is not registered." unless num add_foottext(num, content) anchor = a_name("footmark", num) href = a_name("foottext", num) %Q|| + %Q|*#{num}| end def get_footnote_num(fn) raise ArgumentError, "#{fn} must be Footnote." unless fn.is_a? Footnote i = @footnotes.index(fn) if i i + 1 else nil end end def prepare_footnotes(tree) @footnotes = tree.find_all{|i| i.is_a? Footnote } @foottexts = [] end private :prepare_footnotes def apply_to_Foottext(element, content) num = get_footnote_num(element) raise ArgumentError, "[BUG] #{element} isn't registered." unless num anchor = a_name("foottext", num) href = a_name("footmark", num) %||+ %|*#{num}| + %|#{content}
    | end def add_foottext(num, foottext) raise ArgumentError, "[BUG] footnote ##{num} isn't here." unless footnotes[num - 1] @foottexts[num - 1] = foottext end def apply_to_Verb(element) content = apply_to_String(element.content) %Q[#{content}] end def sp2nbsp(str) str.gsub(/\s/, " ") end private :sp2nbsp def apply_to_String(element) meta_char_escape(element) end def parse_method(method) klass, kind, method, args = MethodParse.analize_method(method) if kind == :function klass = kind = nil else kind = MethodParse.kind2str(kind) end args.gsub!(/&?\w+;?/){ |m| if /&\w+;/ =~ m then m else ''+m+'' end } case method when "self" klass, kind, method, args = MethodParse.analize_method(args) "#{klass}#{kind}self #{method}#{args}" when "[]" args.strip! args.sub!(/^\((.*)\)$/, '\\1') "#{klass}#{kind}[#{args}]" when "[]=" args.tr!(' ', '') args.sub!(/^\((.*)\)$/, '\\1') ary = args.split(/,/) case ary.length when 1 val = 'val' when 2 args, val = *ary when 3 args, val = ary[0, 2].join(', '), ary[2] end "#{klass}#{kind}[#{args}] = #{val}" else "#{klass}#{kind}#{method}#{args}" end end private :parse_method def meta_char_escape(str) str.gsub(/[<>&]/) { METACHAR[$&] } end private :meta_char_escape def hyphen_escape(str) str.gsub(/--/, "­­") end def make_foottext return nil if foottexts.empty? content = [] foottexts.each_with_index do |ft, num| content.push(apply_to_Foottext(footnotes[num], ft)) end %|
    \n

    \n#{content.join("\n")}\n

    | end private :make_foottext def a_name(prefix, num) "#{prefix}-#{num}" end private :a_name end # RD2HTMLVisitor end # RD $Visitor_Class = RD::RD2HTMLVisitor $RD2_Sub_OptionParser = "rd/rd2html-opt" =begin == script info. RD to HTML translate library for rdfmt.rb $Id: rd2html-lib.rb,v 1.53 2003/03/08 12:45:08 tosh Exp $ =end ### end rd/rd2html-lib ### begin rd/rd2man-lib =begin = rd/rd2man-lib.rb =end #require "rd/rdvisitor" unless [].respond_to? :collect! class Array alias collect! filter end end module RD class RD2MANVisitor < RDVisitor include AutoLabel include MethodParse SYSTEM_NAME = "RDtool -- RD2ManVisitor" SYSTEM_VERSION = "$Version: 0.6.13$" #" VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION) def self.version VERSION end # must-have constants OUTPUT_SUFFIX = "1" INCLUDE_SUFFIX = ["1"] def initialize @enumcounter = 0 @index = {} end def visit(tree) prepare_labels(tree, "") super(tree) end def apply_to_DocumentElement(element, content) content = content.join title = @filename || ARGF.filename || "Untitled" title = File.basename title title.sub!(/\.rd$/i, '') <<"EOT" .\\" DO NOT MODIFY THIS FILE! it was generated by rd2 .TH #{title} 1 "#{Time.now.strftime '%B %Y'}" #{content} EOT end # " def apply_to_Headline(element, title) element.level <= 1 ? ".SH #{title}\n" : ".SS #{title}\n" end # RDVisitor#apply_to_Include def apply_to_TextBlock(element, content) if RD::DescListItem === element.parent || RD::ItemListItem === element.parent || RD::EnumListItem === element.parent return content.join else return ".PP\n" + content.join end end def apply_to_Verbatim(element) content = [] element.each_line do |i| content.push(apply_to_String(i)) end # Can we use BLOCKQUOTE such like? %Q[.nf\n\\& #{content.join("\\& ")}.fi\n] end def apply_to_ItemList(element, items) items.collect! {|x| x.sub(/\n\n/, "\n") } items = items.join(".IP\n.B\n\\(bu\n") # "\\(bu" -> "" ? ".IP\n.B\n\\(bu\n" + items end def apply_to_EnumList(element, items) @enumcounter = 0 items.join end def apply_to_DescList(element, items) items.map{ |i| i =~ /\n$/ ? i : i + "\n" }.join("") end def apply_to_MethodList(element, items) items.map{ |i| i =~ /\n$/ ? i : i + "\n" }.join("") end def apply_to_ItemListItem(element, content) content.map{ |c| c =~ /\n$/ ? c : c + "\n" }.join("") end def apply_to_EnumListItem(element, content) @enumcounter += 1 %Q[.TP\n#{@enumcounter}.\n#{content.join("\n")}] end def apply_to_DescListItem(element, term, description) anchor = refer(element) if description.empty? ".TP\n.fi\n.B\n#{term}" else %[.TP\n.fi\n.B\n#{term}\n#{description.join("\n")}].chomp end end def apply_to_MethodListItem(element, term, description) term = parse_method(term) # maybe: term -> element.term anchor = refer(element) if description.empty? ".TP\n.fi\n.B\n#{term}" else %[.TP\n.fi\n.B\n#{term}\n#{description.join("\n")}] end end def parse_method(method) klass, kind, method, args = MethodParse.analize_method(method) if kind == :function klass = kind = nil else kind = MethodParse.kind2str(kind) end case method when "[]" args.strip! args.sub!(/^\((.*)\)$/, '\\1') "#{klass}#{kind}[#{args}]" when "[]=" args.strip! args.sub!(/^\((.*)\)$/, '\\1') args, val = /^(.*),([^,]*)$/.match(args)[1,2] args.strip! val.strip! "#{klass}#{kind}[#{args}] = #{val}" else "#{klass}#{kind}#{method}#{args}" end end private :parse_method def apply_to_StringElement(element) apply_to_String(element.content) end def apply_to_Emphasis(element, content) %Q[\\fI#{content.join}\\fP] end def apply_to_Code(element, content) %{\\&\\fB#{content.join.sub(/\./, '\\.')}\\fP} end def apply_to_Var(element, content) content.join end def apply_to_Keyboard(element, content) content.join end def apply_to_Index(element, content) tmp = [] element.each do |i| tmp.push(i) if i.is_a?(String) end key = meta_char_escape(tmp.join) if @index.has_key?(key) # warning? "" else num = @index[key] = @index.size %{\\&\\fB#{content.join.sub(/\./, '\\.')}\\fP} end end def apply_to_Reference(element, content) case element.label when Reference::URL apply_to_RefToURL(element, content) when Reference::RDLabel if element.label.filename apply_to_RefToOtherFile(element, content) else apply_to_RefToElement(element, content) end end end def apply_to_RefToElement(element, content) content = content.join content.sub(/^function#/, "") end def apply_to_RefToOtherFile(element, content) content.join end def apply_to_RefToURL(element, content) content.join end def apply_to_Footnote(element, content) "" end def apply_to_Verb(element) apply_to_String(element.content) end def apply_to_String(element) meta_char_escape(element) end def meta_char_escape(str) str.gsub(/[-\\]/, '\\\\\\&').gsub(/^[.']/, '\\&') # ' end private :meta_char_escape end # RD2MANVisitor end # RD $Visitor_Class = RD::RD2MANVisitor =begin == script info. RD to MAN translate library for rdfmt.rb $Id: rd2man-lib.rb,v 1.9 2003/08/02 15:45:49 tosh Exp $ copyright WATANABE Hirofumi , 2000 == changes :0.6.5 (2000/06/13) * refine :0.6.3 * bug, missing @index = {} in initialize, is fixed. thanks. > Dave :0.6.1 (2000/04/09) * first release version =end ### end rd/rd2man-lib ### begin rd/rd2rdo-lib =begin = rd2rdo-lib.rb Format lib to dump tree objects. =end #require "rd/rdvisitor" module RD class RD2RDOVisitor < RDVisitor OUTPUT_SUFFIX = "rdo" INCLUDE_SUFFIX = [] def visit(tree) Marshal.dump(tree) end end end $Visitor_Class = RD::RD2RDOVisitor ### end rd/rd2rdo-lib ### begin rd/rd2rmi-lib =begin = rd2rmi-lib.rb library to output RMI. =end #require "rd/rdvisitor" module RD class RD2RMIVisitor < RDVisitor include AutoLabel include MethodParse OUTPUT_SUFFIX = "rmi" INCLUDE_SUFFIX = ["rmi"] def visit(tree) ret = "" prepare_labels(tree) index = make_method_index(tree) index.each do |i| i[1] = kind2str(i[1]) i[3] = @filename i[4] = refer(i[0]+i[1]+i[2]) ret << "$method_index.push(#{i.inspect})\n" end ret end end # class RD2RMIVisitor end # module RD $Visitor_Class = RD::RD2RMIVisitor ### end rd/rd2rmi-lib # require format lib implicitly if /rd2.+/ =~ File.basename($0, ".*").downcase visitor_lib = "rd/" + $& + "-lib.rb" #require visitor_lib case visitor_lib when 'rd/rd2html-lib.rb' $Visitor_Class = RD::RD2HTMLVisitor ### begin rd/rd2html-opt =begin = rd2html-opt.rb sub-OptionParser for rd2html-lib.rb. =end #require "optparse" q = ARGV.options q.on_tail("rd2html-lib options:") #q.on_tail("--use-numbering-anchor", # "use number for anchor name (old style)") do # $Visitor.use_old_anchor = true #end q.on_tail("--output-rbl", "output external Label file") do $Visitor.output_rbl = true end q.on_tail("--with-css=FILE", String, "use FILE as CSS of output HTML") do |i| $Visitor.css = i end q.on_tail("--html-charset=CHARSET", String, "indicate CHARSET as charset(char encoding)") do |i| $Visitor.charset = i end q.on_tail("--html-lang=LANG", String, "indicate LANG as lang attribute of html") do |i| $Visitor.lang = i end q.on_tail("--html-title=TITLE", String, "content of TITLE element of HTML") do |i| $Visitor.title = i end q.on_tail("--html-link-rel=REL", String, "add forward LINK element.(\":\")") do |i| if /(\w+):(.+)/ =~ i $Visitor.html_link_rel[$1] = $2 else # warning end end q.on_tail("--html-link-rev=REV", String, "add reverse LINK element.(\":\")") do |i| if /(\w+):(.+)/ =~ i $Visitor.html_link_rev[$1] = $2 else # warning end end ### end rd/rd2html-opt when 'rd/rd2man-lib.rb' $Visitor_Class = RD::RD2MANVisitor when 'rd/rd2rdo-lib.rb' $Visitor_Class = RD::RD2RDOVisitor when 'rd/rd2rmi-lib.rb' $Visitor_Class = RD::RD2RMIVisitor else $stderr.puts "#{$0}: format not supported: #{visitor_lib}" exit 1 end #require $RD2_Sub_OptionParser if $RD2_Sub_OptionParser # make visitor $Visitor = $Visitor_Class.new() end begin ARGV.parse! rescue STDERR.print("Error: " + $!.inspect + "\n") STDERR.print(ARGV.options.to_s) exit(1) end unless $Visitor_Class #require $DEFAULT_FORMAT_LIB case $DEFAULT_FORMAT_LIB when 'rd/rd2html-lib.rb' $Visitor_Class = RD::RD2HTMLVisitor when 'rd/rd2man-lib.rb' $Visitor_Class = RD::RD2MANVisitor when 'rd/rd2rdo-lib.rb' $Visitor_Class = RD::RD2RDOVisitor when 'rd/rd2rmi-lib.rb' $Visitor_Class = RD::RD2RMIVisitor else $stderr.puts "#{$0}: format not supported: #{$DEFAULT_FORMAT_LIB}" exit 1 end $Visitor = $Visitor_Class.new end # make tree (but not parsed yet) if from_rdo rdos = [] ARGV.each do |i| rdos.push(File.open(i)) dirname = File.dirname(i) include_path.push(dirname, dirname + "/include") end tree = RDTree.new_from_rdo(*rdos) tree.include_path = include_path else # input from ARGF src = readlines if src.find{|i| /\S/ === i } and !src.find{|i| /^=begin\b/ === i } src.unshift("=begin\n").push("=end\n") end # set Include_Path if ARGF.filename dir = File.dirname(ARGF.filename) else dir = "." end include_path.push(dir) include_path.push(dir + "/include") tree = RDTree.new(src, include_path, nil) # filter set tree.filter with_part.each do |i| tree.filter[i[0]] = $RC["filter"][i[1]] end # parse begin tree.parse rescue Racc::ParseError STDERR.puts($!.message) exit(10) end end # filter: set visitor.include_suffix with_part.each do |i| $Visitor.include_suffix.push(i[0]) end # file base name setup $Visitor.filename = output_file if output_file # character encoding if out_code begin $Visitor.charcode = out_code $Visitor.lang = "ja" rescue NameError end end # output out = $Visitor.visit(tree) # character encoding convert out = Kconv.kconv(out, Kconv::NAME2CONST[out_code], Kconv::AUTO) if out_code if output_file filename = output_file + "." + $Visitor.type::OUTPUT_SUFFIX file = open(filename, "w") file.print(out) file.close STDERR.print("#{$0}: output to #{filename}...\n") else print(out) end # RMI if output_index if output_file # require "rd/rd2rmi-lib" rmivisitor = RD2RMIVisitor.new rmivisitor.filename = output_file rmi = rmivisitor.visit(tree) filename = output_file + ".rmi" file = open(filename, "w") file.print(rmi) file.close STDERR.print("#{$0}: output to #{filename}...\n") else raise %Q[Error: option "--output-index" must be used with option "-oNAME"] end end # filter: remove tmp file Dir.glob("#{RD::RDTree.tmp_dir}/rdtmp.#{$$}.*.*").each do |i| File.delete(i) end