35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/review/tocparser.rb', line 35
def parse(f, chap)
roots = [] node_stack = []
filename = chap.path
while line = f.gets
case line
when /\A\#@/
;
when /\A\s*\z/
;
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?
dummy_chapter = Chapter.new(label, chap)
node_stack.push dummy_chapter
roots.push dummy_chapter
end
next if label =~ /\A\[\// sec = Section.new(lev, label.gsub(/\A\{.*?\}\s?/, ""))
until node_stack.last.level < sec.level
node_stack.pop
end
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>
if node_stack.empty?
error! filename, f.lineno, 'list found before section label'
end
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>
;
else
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
roots
end
|