From 58b810cd69942de239007fd830276f376a9eb3af Mon Sep 17 00:00:00 2001 From: Jorge Garcia Date: Wed, 26 Jul 2017 17:18:26 +0200 Subject: [PATCH 1/2] Fix embedded-erb in strings --- grammars/html (rails).cson | 59 +++++++++++++++++++------------ grammars/javascript (rails).cson | 60 ++++++++++++++++++++------------ 2 files changed, 75 insertions(+), 44 deletions(-) diff --git a/grammars/html (rails).cson b/grammars/html (rails).cson index fe70edf..9aea837 100644 --- a/grammars/html (rails).cson +++ b/grammars/html (rails).cson @@ -9,34 +9,49 @@ 'foldingStopMarker': '(?x)\n\t\t(\n\t\t|^\\s*-->\n\t\t|(^|\\s)\\}\n\t\t)' 'patterns': [ { - 'begin': '<%+#' - 'captures': - '0': - 'name': 'punctuation.definition.comment.erb' - 'end': '%>' - 'name': 'comment.block.erb' + 'include': '#tags' } { - 'begin': '<%+(?!>)[-=]?' - 'captures': - '0': - 'name': 'punctuation.section.embedded.ruby' - 'end': '-?%>' - 'name': 'source.ruby.rails.embedded.html' + 'include': 'text.html.basic' + } +] +'injections': + 'string.quoted': + 'patterns': [ + { + 'include': '#tags' + } + ] + +'repository': + 'tags': 'patterns': [ { + 'begin': '<%+#' 'captures': - '1': - 'name': 'punctuation.definition.comment.ruby' - 'match': '(#).*?(?=-?%>)' - 'name': 'comment.line.number-sign.ruby' + '0': + 'name': 'punctuation.definition.comment.erb' + 'end': '%>' + 'name': 'comment.block.erb' } { - 'include': 'source.ruby.rails' + 'begin': '<%+(?!>)[-=]?' + 'captures': + '0': + 'name': 'punctuation.section.embedded.ruby' + 'end': '-?%>' + 'name': 'source.ruby.rails.embedded.html' + 'patterns': [ + { + 'captures': + '1': + 'name': 'punctuation.definition.comment.ruby' + 'match': '(#).*?(?=-?%>)' + 'name': 'comment.line.number-sign.ruby' + } + { + 'include': 'source.ruby.rails' + } + ] } ] - } - { - 'include': 'text.html.basic' - } -] diff --git a/grammars/javascript (rails).cson b/grammars/javascript (rails).cson index 10f3388..3a25610 100644 --- a/grammars/javascript (rails).cson +++ b/grammars/javascript (rails).cson @@ -7,34 +7,50 @@ 'foldingStopMarker': '\\*\\*/|^\\s*\\}' 'patterns': [ { - 'begin': '<%+#' - 'captures': - '0': - 'name': 'punctuation.definition.comment.erb' - 'end': '%>' - 'name': 'comment.block.erb' + 'include': '#tags' } { - 'begin': '<%+(?!>)[-=]?' - 'captures': - '0': - 'name': 'punctuation.section.embedded.ruby' - 'end': '-?%>' - 'name': 'source.ruby.rails.embedded.html' + 'include': 'source.js' + } +] + +'injections': + 'string.quoted': + 'patterns': [ + { + 'include': '#tags' + } + ] + +'repository': + 'tags': 'patterns': [ { + 'begin': '<%+#' 'captures': - '1': - 'name': 'punctuation.definition.comment.ruby' - 'match': '(#).*?(?=-?%>)' - 'name': 'comment.line.number-sign.ruby' + '0': + 'name': 'punctuation.definition.comment.erb' + 'end': '%>' + 'name': 'comment.block.erb' } { - 'include': 'source.ruby.rails' + 'begin': '<%+(?!>)[-=]?' + 'captures': + '0': + 'name': 'punctuation.section.embedded.ruby' + 'end': '-?%>' + 'name': 'source.ruby.rails.embedded.html' + 'patterns': [ + { + 'captures': + '1': + 'name': 'punctuation.definition.comment.ruby' + 'match': '(#).*?(?=-?%>)' + 'name': 'comment.line.number-sign.ruby' + } + { + 'include': 'source.ruby.rails' + } + ] } ] - } - { - 'include': 'source.js' - } -] From 0d77c712e618c5bf13ca1272aeaebd28efe6cf46 Mon Sep 17 00:00:00 2001 From: Jorge Garcia Date: Fri, 30 Mar 2018 19:30:09 +0200 Subject: [PATCH 2/2] spec test for html.erb and js.erb --- spec/grammar-spec.coffee | 110 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/spec/grammar-spec.coffee b/spec/grammar-spec.coffee index ab12474..66592fd 100644 --- a/spec/grammar-spec.coffee +++ b/spec/grammar-spec.coffee @@ -1,4 +1,5 @@ describe "Ruby on Rails package", -> + grammar= null beforeEach -> waitsForPromise -> atom.packages.activatePackage("language-ruby-on-rails") @@ -8,11 +9,120 @@ describe "Ruby on Rails package", -> expect(grammar).toBeDefined() expect(grammar.scopeName).toBe "text.html.ruby" + describe 'HTML ERB tags', -> + beforeEach -> + waitsForPromise -> + atom.packages.activatePackage('language-ruby-on-rails') + + it 'tokenizes the <% %>', -> + lines = grammar.tokenizeLines ''' + <% foo = 10 %> + ''' + + expect(lines[0][0]).toEqual value: '<%', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][1]).toEqual value: ' foo = 10 ', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html'] + expect(lines[0][2]).toEqual value: '%>', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + + it 'tokenizes the <%= %>', -> + lines = grammar.tokenizeLines ''' + <%= foo %> + ''' + + expect(lines[0][0]).toEqual value: '<%=', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][1]).toEqual value: ' foo ', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html'] + expect(lines[0][2]).toEqual value: '%>', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + + it 'tokenizes the <%= %> in string', -> + lines = grammar.tokenizeLines ''' + '<%= foo %>' + "<%= bar %>" + ''' + expect(lines[0][0]).toEqual value: "'", scopes: ['text.html.ruby'] + expect(lines[0][1]).toEqual value: '<%=', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][2]).toEqual value: ' foo ', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html'] + expect(lines[0][3]).toEqual value: '%>', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][4]).toEqual value: "'", scopes: ['text.html.ruby'] + expect(lines[1][0]).toEqual value: '"', scopes: ['text.html.ruby'] + expect(lines[1][1]).toEqual value: '<%=', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[1][2]).toEqual value: ' bar ', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html'] + expect(lines[1][3]).toEqual value: '%>', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[1][4]).toEqual value: '"', scopes: ['text.html.ruby'] + + it 'tokenizes the <%= %> in string in HTML tag', -> + lines = grammar.tokenizeLines ''' +
+
+
+
+ + ''' + expect(lines[0][0]).toEqual value: "
', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][4]).toEqual value: "'>", scopes: ['text.html.ruby'] + expect(lines[1][0]).toEqual value: '
', scopes: ['text.html.ruby'] + expect(lines[2][0]).toEqual value: "
', scopes: ['text.html.ruby', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[2][4]).toEqual value: "'>", scopes: ['text.html.ruby'] + expect(lines[3][0]).toEqual value: '
', scopes: ['text.html.ruby'] + + + it "parses the JavaScript grammar", -> grammar = atom.grammars.grammarForScopeName("source.js.rails source.js.jquery") expect(grammar).toBeDefined() expect(grammar.scopeName).toBe "source.js.rails source.js.jquery" + describe 'HTML ERB tags', -> + beforeEach -> + waitsForPromise -> + atom.packages.activatePackage('language-ruby-on-rails') + + it 'tokenizes the <% %>', -> + lines = grammar.tokenizeLines ''' + <% foo = 10 %> + ''' + + expect(lines[0][0]).toEqual value: '<%', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][1]).toEqual value: ' foo = 10 ', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html'] + expect(lines[0][2]).toEqual value: '%>', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + + it 'tokenizes the <%= %>', -> + lines = grammar.tokenizeLines ''' + <%= foo %> + ''' + + expect(lines[0][0]).toEqual value: '<%=', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][1]).toEqual value: ' foo ', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html'] + expect(lines[0][2]).toEqual value: '%>', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + + it 'tokenizes the <%= %> in string', -> + lines = grammar.tokenizeLines ''' + '<%= foo %>' + "<%= bar %>" + ''' + expect(lines[0][0]).toEqual value: "'", scopes: ['source.js.rails source.js.jquery'] + expect(lines[0][1]).toEqual value: '<%=', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][2]).toEqual value: ' foo ', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html'] + expect(lines[0][3]).toEqual value: '%>', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[0][4]).toEqual value: "'", scopes: ['source.js.rails source.js.jquery'] + expect(lines[1][0]).toEqual value: '"', scopes: ['source.js.rails source.js.jquery'] + expect(lines[1][1]).toEqual value: '<%=', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[1][2]).toEqual value: ' bar ', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html'] + expect(lines[1][3]).toEqual value: '%>', scopes: ['source.js.rails source.js.jquery', 'source.ruby.rails.embedded.html', 'punctuation.section.embedded.ruby'] + expect(lines[1][4]).toEqual value: '"', scopes: ['source.js.rails source.js.jquery'] + it "parses the RJS grammar", -> grammar = atom.grammars.grammarForScopeName("source.ruby.rails.rjs") expect(grammar).toBeDefined()