# # version 1.00 2008.01.24 aike # # setMode(mode) mode:"raw"/"compact" # # generate HTML with JavaScript library # generate(source) # # generate JavaScript library only (for CGI) # getJSlibrary(drawflag) flag: true/false # getTreeData(source) # # ruby_parser needs HOME if not ENV.has_key?('HOME') ENV['HOME'] = '' end require 'ruby_parser' require 'cgi' class TrettyPrint def initialize() @mode = 0 @filename = "" @parser = RubyParser.new @buf = "" end attr_accessor :filename def setMode(mode) if mode == "raw" @mode = 0 elsif mode == "compact" @mode = 1 else put "mode error" end end def generate(text) s = getHTMLheader + getJSlibrary(true) + getTreeData(text) + getHTMLbody return s end def put(s) @buf += s end def putNode(sexp) car = getCAR(sexp) cdr = getCDR(sexp) if car.is_a? Sexp put "td();\n" putNode(car) put "tu();\n" else putAtom(car, getCAR(cdr)) end if (@mode == 1) and (has_nodelabel(car)) cdr = getCDR(cdr) end if (not cdr.nil?) and (not cdr.empty?) if (getCAR(cdr).is_a? Sexp) putNode(cdr) else put "td();\n" putNode(cdr) put "tu();\n" end end end def has_nodelabel(item) if has_nodelabel_1(item) or has_nodelabel_2(item) return true else return false end end def has_nodelabel_1(item) if not item.is_a? Symbol return false end return [:const, :str, :dstr, :evstr, :lvar, :dvar, :gvar, :ivar, :fcall, :vcall, :defn, :class, :lasgn, :iasgn, :gasgn, :cvdecl ].include?(item) end def has_nodelabel_2(item) if not item.is_a? Symbol return false end return [:lit].include?(item) end def getCAR(sexp) if sexp.is_a? Sexp return sexp[0] else return nil end end def getCDR(sexp) if sexp.is_a? Sexp return sexp[1...sexp.length] else return nil end end def putAtom(item, nextitem) if item.nil? putItem("(nil)") elsif item.is_a? Symbol s = "[" + item.to_s + "]" if @mode == 1 # compact mode if has_nodelabel_1(item) s = s + ' "' + nextitem.to_s + '"' elsif has_nodelabel_2(item) s = s + " " + nextitem.to_s + "" end end putItem(s) else putItem(item.to_s) end end def putItem(item) s = item s = CGI::escapeHTML(s) s = s.gsub("\\", "\\") s = s.gsub("\t", "\t") s = s.gsub("\a", "\a") s = s.gsub("\r", "\r") s = s.gsub("\n", "\n") s = s.gsub("'", "'") put "ta('" + s + "');\n" end def getHTMLheader @buf = "" put "\n" put "\n" put "\n" put "\n" put "" + @filename + "\n" return @buf end def getJSlibrary(flag) @buf = "" put "\n" put "\n" put "\n" put "\n" put "\n" return @buf end def getTreeData(text) sexp = @parser.parse(text) @buf = "" put "\n" return @buf end def getHTMLbody @buf = "" put "\n" put "

" + @filename + "

\n" put "
\n" put "\n" put "\n" return @buf end end