class HamdownCore::IndentTracker
Public Class Methods
new(on_enter: nil, on_leave: nil)
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 32 def initialize(on_enter: nil, on_leave: nil) @indent_levels = [0] @on_enter = on_enter || lambda { |_level, _text| } @on_leave = on_leave || lambda { |_level, _text| } @comment_level = nil end
Public Instance Methods
check_indent_level!(lineno)
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 69 def check_indent_level!(lineno) if @indent_levels.size >= 3 previous_size = @indent_levels[-2] - @indent_levels[-3] current_size = @indent_levels[-1] - @indent_levels[-2] if previous_size != current_size raise InconsistentIndent.new(previous_size, current_size, lineno) end end end
current_level()
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 61 def current_level @indent_levels.last end
enter_comment!()
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 65 def enter_comment! @comment_level = @indent_levels[-2] end
finish()
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 57 def finish indent_leave(0, '', -1) end
process(line, lineno)
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 39 def process(line, lineno) if line.include?("\t") raise HardTabNotAllowed.new(lineno) end indent, text = split(line) indent_level = indent.size unless text.empty? track(indent_level, text, lineno) end [text, indent] end
split(line)
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 52 def split(line) m = line.match(/\A( *)(.*)\z/) [m[1], m[2]] end
Private Instance Methods
indent_enter(indent_level, text, _lineno)
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 89 def indent_enter(indent_level, text, _lineno) unless @comment_level @indent_levels.push(indent_level) @on_enter.call(indent_level, text) end end
indent_leave(indent_level, text, lineno)
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 96 def indent_leave(indent_level, text, lineno) if @comment_level if indent_level <= @comment_level # finish comment mode @comment_level = nil else # still in comment return end end while indent_level < @indent_levels.last @indent_levels.pop @on_leave.call(indent_level, text) end if indent_level != @indent_levels.last raise IndentMismatch.new(indent_level, @indent_levels.dup, lineno) end end
track(indent_level, text, lineno)
click to toggle source
# File lib/hamdown_core/indent_tracker.rb, line 81 def track(indent_level, text, lineno) if indent_level > @indent_levels.last indent_enter(indent_level, text, lineno) elsif indent_level < @indent_levels.last indent_leave(indent_level, text, lineno) end end