static protected Method

JSON.convert_json_to_yaml(json)

Ensure that ":" and "," are always followed by a space

Source Code

# File active_support/json/decoding.rb, line 22
def convert_json_to_yaml(json) #:nodoc:
  scanner, quoting, marks, pos, times = StringScanner.new(json), false, [], nil, []
  while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/)
    case char = scanner[1]
    when '"', "'"
      if !quoting
        quoting = char
        pos = scanner.pos
      elsif quoting == char
        if json[pos..scanner.pos-2] =~ DATE_REGEX
          # found a date, track the exact positions of the quotes so we can remove them later.
          # oh, and increment them for each current mark, each one is an extra padded space that bumps
          # the position in the final yaml output
          total_marks = marks.size
          times << pos+total_marks << scanner.pos+total_marks
        end
        quoting = false
      end
    when ":",","
      marks << scanner.pos - 1 unless quoting
    end
  end

  if marks.empty?
    json.gsub(/\\\//, '/')
  else
    left_pos  = [-1].push(*marks)
    right_pos = marks << json.length
    output    = []
    left_pos.each_with_index do |left, i|
      output << json[left.succ..right_pos[i]]
    end
    output = output * " "

    times.each { |i| output[i-1] = ' ' }
    output.gsub!(/\\\//, '/')
    output
  end
end
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.