class RT::RTParser
Constants
- DefaultConfig
- ESCAPE_TMP
Attributes
body[R]
config[R]
header[R]
str[R]
Public Class Methods
new(str="")
click to toggle source
# File lib/rt/rtparser.rb, line 62 def initialize(str="") @str = str.dup normalize_linefeed! @str @config_line = [] @header_line = [] @body_line = [] @config = DefaultConfig.dup @header = [] @body = [] end
parse(str)
click to toggle source
# File lib/rt/rtparser.rb, line 79 def self::parse(str) obj = self::new str obj.make_blocks obj.parse_config obj.parse_header obj.parse_body obj.calc_span(obj.header) obj.calc_span(obj.body) obj end
Public Instance Methods
blocks()
click to toggle source
# File lib/rt/rtparser.rb, line 90 def blocks [@config_line, @header_line, @body_line] end
calc_span(tbl)
click to toggle source
# File lib/rt/rtparser.rb, line 184 def calc_span(tbl) return if tbl.empty? cols = tbl[0].length tbl.each do |row| row.each_with_index do |elm, j| case elm when String when RTCell nspan = 1 1.upto(cols-j-1) do |k| break unless row[j+k] == config['colspan'] nspan += 1 end row[j].colspan = nspan else raise "[BUG] invalid cell" end end end rows = tbl.length 0.upto(cols-1) do |j| 0.upto(rows-1) do |i| case tbl[i][j] when String when RTCell nspan = 1 1.upto(rows-i-1) do |k| break unless tbl[i+k][j] == config['rowspan'] nspan += 1 end tbl[i][j].rowspan = nspan else raise "[BUG] invalid cell" end end end end
make_blocks(str = @str)
click to toggle source
# File lib/rt/rtparser.rb, line 94 def make_blocks(str = @str) part = str.split(/\n\n/).collect{|x| x.split(/\n/)} case part.length when 0 when 1 @body_line, = part when 2 @config_line, @body_line = part when 3 @config_line, @header_line, @body_line = part else raise "RT: blocks are too many." end self end
normalize_linefeed!(str)
click to toggle source
# File lib/rt/rtparser.rb, line 74 def normalize_linefeed!(str) str.gsub!("\r\n", "\n") str.gsub!("\r", "\n") end
parse_body(lines = @body_line)
click to toggle source
# File lib/rt/rtparser.rb, line 177 def parse_body(lines = @body_line) @body = parse_table_data(lines) {|x| _make_cell x, nil } self end
parse_config(lines = @config_line)
click to toggle source
# File lib/rt/rtparser.rb, line 110 def parse_config(lines = @config_line) lines.each do |line| case line when /^#/ # comment when /^\s*(\S+)\s*=\s*(.+)$/ @config[$1] = $2 else raise "RT: syntax error in config block" end end self end
parse_header(lines = @header_line)
click to toggle source
# File lib/rt/rtparser.rb, line 170 def parse_header(lines = @header_line) @header = parse_table_data(lines) {|x| _make_cell x, :center } self end
Private Instance Methods
_escape!(str)
click to toggle source
# File lib/rt/rtparser.rb, line 129 def _escape!(str) esc = config['escape'] str.gsub!(/#{Regexp.quote(esc)}#{config['delimiter']}/, ESCAPE_TMP) if esc end
_make_cell(x, align)
click to toggle source
# File lib/rt/rtparser.rb, line 160 def _make_cell(x, align) case x when config['rowspan'], config['colspan'] x else RTCell::new(x, align) end end
_unescape!(str)
click to toggle source
# File lib/rt/rtparser.rb, line 135 def _unescape!(str) str.gsub!(/#{ESCAPE_TMP}/, config['delimiter']) end
parse_table_data(lines) { |strip| ... }
click to toggle source
# File lib/rt/rtparser.rb, line 140 def parse_table_data(lines) # iterator ret = [] lines.each do |line| case line when /^#/ # comment else _escape! line ret << split2(line, /\s*#{config['delimiter']}\s*/).collect {|x| _unescape! x yield(x.strip) } end end unless ret.find_all{|x| x.length == ret[0].length} == ret raise "RT: different column size" end ret end
split2(str,re)
click to toggle source
# File lib/rt/rtparser.rb, line 123 def split2(str,re) ret = str.split(re, -1) end