Module: JSONX
- Defined in:
- lib/json/next/parser/jsonx.rb
Constant Summary collapse
- BACKTICK_ML_QUOTE =
JSON::Next::BACKTICK_ML_QUOTE
- SINGLE_QUOTE =
JSON::Next::SINGLE_QUOTE
- DOUBLE_QUOTE =
JSON::Next::DOUBLE_QUOTE
- CLANG_ML_COMMENT =
JSON::Next::CLANG_ML_COMMENT
- CLANG_COMMENT =
JSON::Next::CLANG_COMMENT
- SHELL_COMMENT =
JSON::Next::SHELL_COMMENT
- KEYWORDS =
JSON::Next::KEYWORDS
- IDENTIFIER =
JSON::Next::IDENTIFIER_EXTENDED
- TRAILING_COMMA =
JSON::Next::TRAILING_COMMA
- UNESCAPE_MAP =
JSON::Next::UNESCAPE_MAP
- ML_ESCAPE_MAP =
JSON::Next::ML_ESCAPE_MAP
Class Method Summary collapse
- .convert(text) ⇒ Object
-
.normalize_quotes(text) ⇒ Object
note: same as hanson (see parser/hanson.rb).
- .parse(text) ⇒ Object
-
.strip_comments(text) ⇒ Object
pass 1.
Class Method Details
.convert(text) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/json/next/parser/jsonx.rb', line 68 def self.convert( text ) ## pass 1: remove/strip comments text = strip_comments( text ) ## pass 2: requote/normalize quotes text = normalize_quotes( text ) ## pass 3: quote unquoted and remove trailing commas text = text.gsub( /#{KEYWORDS}|#{IDENTIFIER}|#{DOUBLE_QUOTE}|#{TRAILING_COMMA}/ox ) do |match| ## puts "match: >>#{match}<< : #{match.class.name}" m = Regexp.last_match if m[:identifier] ## puts "!!! identfier -- wrap in double quotes" '"' + m[:identifier] + '"' elsif m[:trailing_comma] ## puts "!!! trailing comma -- remove" '' else match end end ## pass 4 - auto-add (missing optional) commas text = JSON::Next::Commata.convert( text ) text end |
.normalize_quotes(text) ⇒ Object
note: same as hanson (see parser/hanson.rb)
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/json/next/parser/jsonx.rb', line 44 def self.normalize_quotes( text ) ## pass 2 text.gsub( /#{BACKTICK_ML_QUOTE}|#{SINGLE_QUOTE}|#{DOUBLE_QUOTE}/ox ) do |match| ## puts "match: >>#{match}<< : #{match.class.name}" m = Regexp.last_match if m[:backtick_ml_quote] ## puts "!!! ml_quote -- convert to double quotes" str = m[:backtick_ml_quote] str = str.gsub( /\\./ ) {|r| UNESCAPE_MAP[r] || r } str = str.gsub( /[\n\r\t"]/ ) { |r| ML_ESCAPE_MAP[r] } '"' + str + '"' elsif m[:single_quote] ## puts "!!! single_quote -- convert to double quotes" str = m[:single_quote] str = str.gsub( /\\./ ) {|r| UNESCAPE_MAP[r] || r } str = str.gsub( /"/, %{\\"} ) '"' + str + '"' else match end end end |
.parse(text) ⇒ Object
98 99 100 |
# File 'lib/json/next/parser/jsonx.rb', line 98 def self.parse( text ) JSON.parse( self.convert( text ) ) end |
.strip_comments(text) ⇒ Object
pass 1
30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/json/next/parser/jsonx.rb', line 30 def self.strip_comments( text ) ## pass 1 text.gsub( /#{BACKTICK_ML_QUOTE}|#{SINGLE_QUOTE}|#{DOUBLE_QUOTE}|#{SHELL_COMMENT}|#{CLANG_ML_COMMENT}|#{CLANG_COMMENT}/ox ) do |match| ## puts "match: >>#{match}<< : #{match.class.name}" if match[0] == ?/ || match[0] == ?# ## comments start with // or /* or # ## puts "!!! removing comments" '' ## remove / strip comments else match end end end |