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