def process(string, current_level=3, counters=[1])
s = StringScanner.new(string)
level_hash = {}
while !s.eos?
re = %r{^h(\d)(?:\((#.*?)\))?\s*\.\s*(.*)$}
s.match?(re)
if matched = s.matched
matched =~ re
level, idx, title = $1.to_i, $2, $3.strip
if level < current_level
return level_hash
elsif level == current_level
index = counters.join(".")
idx ||= '#' + title_to_idx(title)
raise "Parsing Fail" unless @result.sub!(matched, "h#{level}(#{idx}). #{index} #{title}")
key = {
:title => title,
:id => idx
}
counters << 1
level_hash[key] = process(s.post_match, current_level + 1, counters)
counters.pop
last = counters.pop
counters << last + 1
end
end
s.getch
end
level_hash
end