class ReVIEW::TOCParser
Public Class Methods
chapter_node(chap)
click to toggle source
# File ../../../../../lib/review/tocparser.rb, line 26 def self.chapter_node(chap) toc = self.parse(chap) $stderr.puts "warning: chapter #{toc.join} contains more than 1 chapter" unless toc.size == 1 toc.first end
parse(chap)
click to toggle source
# File ../../../../../lib/review/tocparser.rb, line 17 def self.parse(chap) f = StringIO.new(chap.content, 'r:BOM|utf-8') stream = Preprocessor::Strip.new(f) new.parse(stream, chap).map do |root| root.number = chap.number root end end
Public Instance Methods
parse(f, chap)
click to toggle source
# File ../../../../../lib/review/tocparser.rb, line 32 def parse(f, chap) roots = [] # list of chapters node_stack = [] filename = chap.path while line = f.gets case line when /\A\#@/ # do nothing next when /\A\s*\z/ # do nothing next when /\A(={2,})[\[\s\{]/ lev = $1.size error! filename, f.lineno, "section level too deep: #{lev}" if lev > 5 label = get_label(line) if node_stack.empty? # missing chapter label dummy_chapter = Chapter.new(label, chap) node_stack.push dummy_chapter roots.push dummy_chapter end next if label =~ %r{\A\[/} # ex) "[/column]" sec = Section.new(lev, label.gsub(/\A\{.*?\}\s?/, '')) node_stack.pop until node_stack.last.level < sec.level node_stack.last.add_child sec node_stack.push sec when /\A=[^=]/ label = get_label(line) node_stack.clear new_chapter = Chapter.new(label, chap) node_stack.push new_chapter roots.push new_chapter when %r{\A//\w+(?:\[.*?\])*\{\s*\z} error! filename, f.lineno, 'list found before section label' if node_stack.empty? node_stack.last.add_child(list = List.new) beg = f.lineno list.add line while line = f.gets break if %r{\A//\}} =~ line list.add line end error! filename, beg, 'unterminated list' unless line when %r{\A//\w} # do nothing next else # if node_stack.empty? # error! filename, f.lineno, 'text found before section label' # end next if node_stack.empty? node_stack.last.add_child(par = Paragraph.new(chap)) par.add line while line = f.gets break if /\A\s*\z/ =~ line par.add line end end end