class JSON::Next::Commata
auto-add commas for objects and arrays
Public Class Methods
convert( str, opts={} )
click to toggle source
convenience helper
# File lib/json/next/commata.rb, line 12 def self.convert( str, opts={} ) self.new.convert( str, opts ) end
Public Instance Methods
convert( str, opts={} )
click to toggle source
# File lib/json/next/commata.rb, line 17 def convert( str, opts={} ) @debug = opts.fetch( :debug, false ) @out = "" @buffer = StringScanner.new( str ) skip_whitespaces parse_value @out end
debug?()
click to toggle source
# File lib/json/next/commata.rb, line 28 def debug?() @debug; end
parse_array()
click to toggle source
# File lib/json/next/commata.rb, line 105 def parse_array if @buffer.peek(1) == '[' @buffer.getch # consume '[' @out << ' [ ' skip_whitespaces if @buffer.peek(1) == ']' ## empty array? @buffer.getch # consume ']' @out << ' ] ' skip_whitespaces return end loop do parse_value if @buffer.peek(1) == ']' @buffer.getch # consume ']' @out << ' ] ' skip_whitespaces return ## use break - why? why not? else if @buffer.peek(1) == ',' @buffer.getch # consume ',' @out << ' , ' skip_whitespaces else puts "array literal - auto-add comma for value" if debug? @out << ' , ' end end end else puts "!! format error: array literal - expected square open bracket ([) - rest is >>#{@buffer.rest}<<" end end
parse_object()
click to toggle source
# File lib/json/next/commata.rb, line 57 def parse_object if @buffer.peek(1) == '{' @buffer.getch # consume '{' @out << ' { ' skip_whitespaces if @buffer.peek(1) == '}' ## empty object? @buffer.getch # consume '{' @out << ' } ' skip_whitespaces return end loop do parse_string if @buffer.peek(1) == ':' @buffer.getch # consume ':' @out << ' : ' skip_whitespaces parse_value if @buffer.peek(1) == '}' @buffer.getch # consume '}' @out << ' } ' skip_whitespaces return ## use break - why? why not? else if @buffer.peek(1) == ',' @buffer.getch # consume ',' @out << ' , ' skip_whitespaces else puts "object literal - auto-add comma for key-value pair" if debug? @out << ' , ' end end else puts "!! format error: object literal - expected colon (:) - rest is >>#{@buffer.rest}<<" end end else puts "!! format error: object literal - expected curly open bracket ({) - rest is >>#{@buffer.rest}<<" end end
parse_string()
click to toggle source
# File lib/json/next/commata.rb, line 37 def parse_string if @buffer.peek(1) == '"' ## double quote @buffer.getch # consume double quote value = @buffer.scan( /(\\.|[^"])*/ ) @buffer.getch # consume double quote puts %{string value >>#{value}<<} if debug? @out << ' "' @out << value @out << '" ' skip_whitespaces else puts "!! format error: string literal - expected opening quote (\") - rest is >>#{@buffer.rest}<<" end end
parse_value()
click to toggle source
# File lib/json/next/commata.rb, line 144 def parse_value if @buffer.peek(1) == '{' parse_object elsif @buffer.peek(1) == '[' parse_array elsif @buffer.peek(1) == '"' parse_string else ## assume number or literal/identifier value = @buffer.scan( /[_$a-zA-Z0-9.+\-]+/ ) puts %{literal value >>#{value}<<} if debug? @out << " " @out << value @out << " " skip_whitespaces end ## todo/fix: check if eof reached ?? if not report warning - more data available?? ## wrap in object ({}) or array ([]) end
skip_whitespaces()
click to toggle source
# File lib/json/next/commata.rb, line 32 def skip_whitespaces @buffer.skip( /[ \t\n]*/ ) ## skip trailing WHITESPACE end