d4l3k/WebSync

View on GitHub
lib/strip_json_comments.rb

Summary

Maintainability
A
3 hrs
Test Coverage
# This is the Ruby implementation of sindresorhus's strip-json-comments for Node.JS.
# https://github.com/sindresorhus/strip-json-comments
# Ported by Tristan Rice (https://github.com/d4l3k)

class JSONComments

  # Strips the comments from the JSON file
  #
  # @param str [String] The JSON+Comments blob
  # @return [String] The cleaned JSON
  def self.strip(str)
    insideString = false
    insideComment = false
    skipOne = false
    ret = ''
    str.split("").each_with_index do |currentChar, i|
      if skipOne
        skipOne = false
        next
      end
      nextChar = str[i + 1].to_s
      continue = false
      if !insideComment && str[i - 1] != "\\" && currentChar == '"'
        insideString = !insideString
      end

      if insideString
        ret += currentChar
        continue = true
      end

      if !insideComment && currentChar + nextChar == '//'
        insideComment = 'single'
      elsif insideComment == 'single' && currentChar + nextChar == "\r\n"
        insideComment = false
      elsif insideComment == 'single' && currentChar == "\n"
        insideComment = false
      elsif !insideComment && currentChar + nextChar == '/*'
        insideComment = 'multi'
        continue = true
      elsif insideComment == 'multi' && currentChar + nextChar == '*/'
        insideComment = false
        skipOne = true
        continue = true
      end

      if !continue && !insideComment
        ret += currentChar
      end
    end
    ret
  end
end