Skip to content

Commit

Permalink
Update HOCON lexer to work with new JSON lexer
Browse files Browse the repository at this point in the history
  • Loading branch information
pyrmont committed Jul 12, 2019
1 parent 5a6295b commit 6b3de9a
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 35 deletions.
56 changes: 41 additions & 15 deletions lib/rouge/lexers/hocon.rb
Expand Up @@ -11,33 +11,59 @@ class HOCON < JSON
tag 'hocon'
filenames '*.hocon'

prepend :root do
state :comments do
# Comments
rule %r(//.*?$), Comment::Single
rule %r(#.*?$), Comment::Single
end

prepend :root do
mixin :comments
end

prepend :object do
# Keywords
rule %r/\b(?:include|url|file|classpath)\b/, Keyword
end

state :name do
rule %r/("(?:\"|[^"\n])*?")(\s*)([:=]|(?={))/ do
groups Name::Label, Text::Whitespace, Punctuation
end

rule %r/([-\w.]+)(\s*)([:=]|(?={))/ do
groups Name::Label, Text::Whitespace, Punctuation
end
end

state :value do
mixin :comments

rule %r/\n/, Text::Whitespace
rule %r/\s+/, Text::Whitespace

mixin :constants

# Interpolation
rule %r/[$][{][?]?/, Literal::String::Interpol, :interpolation

# Strings
rule %r/"""/, Literal::String::Double, :multiline_string
rule %r/"/, Str::Double, :string

# Keywords
rule %r/\b(?:include|url|file|classpath)\b/, Keyword
rule %r/\[/, Punctuation, :array
rule %r/{/, Punctuation, :object

# Symbols (only those not handled by JSON)
rule %r/[()=]/, Punctuation

# Keys
rule %r/([\w\-\.]+? *)([{:=]|\+=)/ do
groups Name::Attribute, Punctuation::Indicator
end

# Numbers (handle the case where we have multiple periods, ie. IP addresses)
rule %r/\d+\.(\d+\.?){3,}/, Literal #

# Values
rule %r/[^\$\"{}\[\]:=,\+#`\^\?!@\*&]+?/, Literal
rule %r/[^$"{}\[\]:=,\+#`^?!@*&]+?/, Literal
end

state :interpolation do
rule %r/[\w\-\.]+?/, Name::Variable
rule %r/}/, Literal::String::Interpol, :pop!
end

prepend :string do
Expand All @@ -51,9 +77,9 @@ class HOCON < JSON
rule %r/"""/, Literal::String::Double, :pop!
end

state :interpolation do
rule %r/[\w\-\.]+?/, Name::Variable
rule %r/}/, Literal::String::Interpol, :pop!
prepend :constants do
# Numbers (handle the case where we have multiple periods, ie. IP addresses)
rule %r/\d+\.(\d+\.?){3,}/, Literal #
end
end
end
Expand Down
10 changes: 5 additions & 5 deletions lib/rouge/lexers/json.rb
Expand Up @@ -20,7 +20,7 @@ class JSON < RegexLexer
mixin :whitespace
rule %r/{/, Punctuation, :object
rule %r/\[/, Punctuation, :array

mixin :name
mixin :value
end
Expand All @@ -34,20 +34,20 @@ class JSON < RegexLexer
end

state :name do
rule %r/("(?:\"|[^"\n])*?")(:)/ do
groups Name::Label, Punctuation
rule %r/("(?:\"|[^"\n])*?")(\s*)(:)/ do
groups Name::Label, Text::Whitespace, Punctuation
end
end

state :value do
mixin :whitespace
mixin :constants
rule %r/"/, Str::Double, :string_value
rule %r/"/, Str::Double, :string
rule %r/\[/, Punctuation, :array
rule %r/{/, Punctuation, :object
end

state :string_value do
state :string do
rule %r/[^\\"]+/, Str::Double
rule %r/\\./, Str::Escape
rule %r/"/, Str::Double, :pop!
Expand Down
7 changes: 0 additions & 7 deletions spec/lexers/javascript_spec.rb
Expand Up @@ -18,17 +18,10 @@

it 'guesses by filename' do
assert_guess :filename => 'foo.js'
assert_guess Rouge::Lexers::JSON, :filename => 'foo.json'
assert_guess Rouge::Lexers::JSON, :filename => 'Pipfile.lock'
end

it 'guesses by mimetype' do
assert_guess :mimetype => 'text/javascript'
assert_guess Rouge::Lexers::JSON, :mimetype => 'application/json'
assert_guess Rouge::Lexers::JSON, :mimetype => 'application/vnd.api+json'
assert_guess Rouge::Lexers::JSON, :mimetype => 'application/hal+json'
assert_guess Rouge::Lexers::JSON, :mimetype => 'application/problem+json'
assert_guess Rouge::Lexers::JSON, :mimetype => 'application/schema+json'
end

it 'guesses by source' do
Expand Down
13 changes: 6 additions & 7 deletions spec/lexers/json_spec.rb
@@ -1,33 +1,32 @@
# -*- coding: utf-8 -*- #
# frozen_string_literal: true

describe Rouge::Lexers::Jsonnet do
describe Rouge::Lexers::JSON do
let(:subject) { Rouge::Lexers::JSON.new }

describe 'guessing' do
include Support::Guessing

it 'guesses by filename' do
assert_guess :filename => 'foo.json'
assert_guess :filename => 'Pipfile.lock'
end

it 'guesses by mimetype' do
assert_guess :mimetype => 'application/json'
assert_guess :mimetype => 'application/vnd.api+json'
assert_guess :mimetype => 'application/hal+json'
assert_guess :mimetype => 'application/problem+json'
assert_guess :mimetype => 'application/schema+json'
end

it 'guesses by source' do
assert_guess :mimetype => 'application/json', :source => '{"name": "value"}'
assert_guess :mimetype => 'application/json', :source => <<-eos

{"name": "value"}

eos
assert_guess :mimetype => 'application/json',:source => <<-eos
{
"statement": "SELECT (CASE\n WHEN (SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\"))=0 THEN NULL\n WHEN (SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\"))=(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'skipped') THEN 'skipped'\n WHEN (SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\"))=(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'success')+(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"allow_failure\" = 't' AND \"ci_builds\".\"status\" IN ('failed', 'canceled'))+(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'skipped') THEN 'success'\n WHEN (SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\"))=(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'pending')+(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'skipped') THEN 'pending'\n WHEN (SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\"))=(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'canceled')+(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'success')+(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"allow_failure\" = 't' AND \"ci_builds\".\"status\" IN ('failed', 'canceled'))+(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'skipped') THEN 'canceled'\n WHEN (SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'running')+(SELECT count(*) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = 77 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\") AND \"ci_builds\".\"status\" = 'pending')>0 THEN 'running'\n ELSE 'failed'\n END) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = $1 AND \"ci_builds\".\"id\" IN (SELECT max(\"ci_builds\".id) FROM \"ci_builds\" WHERE \"ci_builds\".\"commit_id\" = $2 GROUP BY \"ci_builds\".\"name\", \"ci_builds\".\"commit_id\")"
}
eos
eos
end
end
end
2 changes: 1 addition & 1 deletion spec/visual/samples/json
Expand Up @@ -29,7 +29,7 @@
"life_is_good": true,
"life_is_bad": 10e-4,
"errors": {
"object": { "a": 1, "b": 2,
"object": { "a": 1, "b": 2,
"c": "some string" }
},
"emptyObject": {},
Expand Down

0 comments on commit 6b3de9a

Please sign in to comment.