class Kramdown::Utils::StringScanner
start_line_number override for nested StringScanners.
This patched StringScanner adds line number information for current scan position and a
def current_line_number
NOTE: Normally we'd have to add one to the count of newlines to get the correct line number.
NOTE: Requires that all line endings are normalized to '\n'
Returns the line number for current charpos.
def current_line_number # Not using string[@previous_pos..best_pos].count('\n') because it is slower strscan = ::StringScanner.new(string) strscan.pos = @previous_pos old_pos = pos + 1 @previous_line_number += 1 while strscan.skip_until(/\n/) && strscan.pos <= old_pos @previous_pos = (eos? ? pos : pos + 1) @previous_line_number end
def initialize(string, start_line_number = 1)
Takes the start line number as optional second argument.
def initialize(string, start_line_number = 1) super(string) @start_line_number = start_line_number || 1 @previous_pos = 0 @previous_line_number = @start_line_number end
def pos=(pos)
Note: This also resets some internal variables, so always use pos= when setting the position
Sets the byte position of the scan pointer.
def pos=(pos) if self.pos > pos @previous_line_number = @start_line_number @previous_pos = 0 end super end
def revert_pos(data)
def revert_pos(data) self.pos = data[0] @previous_pos, @previous_line_number = data[1], data[2] end
def save_pos
The returned data can be fed to #revert_pos to revert the position to the saved one.
way.
Return information needed to revert the byte position of the string scanner in a performant
def save_pos [pos, @previous_pos, @previous_line_number] end