a string scanner coded by me
CharSource = CharSourceStrscan CharSource = CharSourceDebug
# File lib/maruku/input/charsource.rb, line 44 def initialize(s, parent=nil) raise "Passed #{s.class}" if not s.kind_of? String @buffer = s @buffer_index = 0 @parent = parent end
# File lib/maruku/input/charsource.rb, line 123 def consume_whitespace while c = cur_char if (c == \s\ || c == \t\) # puts "ignoring #{c}" ignore_char else # puts "#{c} is not ws: "<<c break end end end
Return current char as a FixNum (or nil).
# File lib/maruku/input/charsource.rb, line 52 def cur_char; @buffer[@buffer_index] end
Return the next n chars as a String.
# File lib/maruku/input/charsource.rb, line 55 def cur_chars(n); @buffer[@buffer_index,n] end
# File lib/maruku/input/charsource.rb, line 80 def cur_chars_are(string) # There is a bug here if false r2 = %r^.{#{@buffer_index}}#{Regexp.escape string}/ @buffer =~ r2 else cur_chars(string.size) == string end end
# File lib/maruku/input/charsource.rb, line 76 def current_remaining_buffer @buffer[@buffer_index, @buffer.size-@buffer_index] end
# File lib/maruku/input/charsource.rb, line 144 def describe s = describe_pos(@buffer, @buffer_index) if @parent s += "\n\n" + @parent.describe end s end
# File lib/maruku/input/charsource.rb, line 66 def ignore_char @buffer_index+=1 nil end
# File lib/maruku/input/charsource.rb, line 71 def ignore_chars(n) @buffer_index+=n nil end
Return the char after current char as a FixNum (or nil).
# File lib/maruku/input/charsource.rb, line 58 def next_char; @buffer[@buffer_index+1] end
# File lib/maruku/input/charsource.rb, line 90 def next_matches(r) r2 = %r^.{#{@buffer_index}}#{r}/ md = r2.match @buffer return !!md end
# File lib/maruku/input/charsource.rb, line 112 def read_regexp(r) r2 = %r^#{r}/ rest = current_remaining_buffer m = r2.match(rest) if m @buffer_index += m.to_s.size # puts "#{r} matched #{rest.inspect}: #{m.to_s.inspect}" end return m end
# File lib/maruku/input/charsource.rb, line 96 def read_regexp3(r) r2 = %r^.{#{@buffer_index}}#{r}/ m = r2.match @buffer if m consumed = m.to_s.size - @buffer_index # puts "Consumed #{consumed} chars (entire is #{m.to_s.inspect})" ignore_chars consumed else # puts "Could not read regexp #{r2.inspect} from buffer "+ # " index=#{@buffer_index}" # puts "Cur chars = #{cur_chars(20).inspect}" # puts "Matches? = #{cur_chars(20) =~ r}" end m end
# File lib/maruku/input/charsource.rb, line 135 def read_text_chars(out) s = @buffer.size; c=nil while @buffer_index < s && (c=@buffer[@buffer_index]) && ((c>=aa && c<=zz) || (c>=AA && c<=ZZ)) out << c @buffer_index += 1 end end
# File lib/maruku/input/charsource.rb, line 60 def shift_char c = @buffer[@buffer_index] @buffer_index+=1 c end