From 336edeead9c2008248e5723581668c226745bcda Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Mon, 22 Nov 2021 13:14:09 +0100 Subject: [PATCH] ERB: Better embedding of Ruby (#3192) --- components/prism-erb.js | 13 +++++--- components/prism-erb.min.js | 2 +- tests/languages/erb+haml/erb_inclusion.test | 31 +++++++++--------- tests/languages/erb/erb_feature.test | 32 +++++++++++-------- .../languages/erb/erb_in_markup_feature.test | 27 ++++++++++------ tests/languages/erb/issue1767.test | 24 +++++++++++--- 6 files changed, 80 insertions(+), 49 deletions(-) diff --git a/components/prism-erb.js b/components/prism-erb.js index 3f118cfcf0..21dd7c228d 100644 --- a/components/prism-erb.js +++ b/components/prism-erb.js @@ -1,12 +1,17 @@ (function (Prism) { - Prism.languages.erb = Prism.languages.extend('ruby', {}); - Prism.languages.insertBefore('erb', 'comment', { + Prism.languages.erb = { 'delimiter': { - pattern: /^<%=?|%>$/, + pattern: /^(\s*)<%=?|%>(?=\s*$)/, + lookbehind: true, alias: 'punctuation' + }, + 'ruby': { + pattern: /\s*\S[\s\S]*/, + alias: 'language-ruby', + inside: Prism.languages.ruby } - }); + }; Prism.hooks.add('before-tokenize', function (env) { var erbPattern = /<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g; diff --git a/components/prism-erb.min.js b/components/prism-erb.min.js index c7add59889..9e38fee156 100644 --- a/components/prism-erb.min.js +++ b/components/prism-erb.min.js @@ -1 +1 @@ -!function(n){n.languages.erb=n.languages.extend("ruby",{}),n.languages.insertBefore("erb","comment",{delimiter:{pattern:/^<%=?|%>$/,alias:"punctuation"}}),n.hooks.add("before-tokenize",function(e){n.languages["markup-templating"].buildPlaceholders(e,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"erb")})}(Prism); \ No newline at end of file +!function(n){n.languages.erb={delimiter:{pattern:/^(\s*)<%=?|%>(?=\s*$)/,lookbehind:!0,alias:"punctuation"},ruby:{pattern:/\s*\S[\s\S]*/,alias:"language-ruby",inside:n.languages.ruby}},n.hooks.add("before-tokenize",function(e){n.languages["markup-templating"].buildPlaceholders(e,"erb",/<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"erb")})}(Prism); \ No newline at end of file diff --git a/tests/languages/erb+haml/erb_inclusion.test b/tests/languages/erb+haml/erb_inclusion.test index 88bb3c5cce..be2a7b1a12 100644 --- a/tests/languages/erb+haml/erb_inclusion.test +++ b/tests/languages/erb+haml/erb_inclusion.test @@ -11,28 +11,27 @@ ["filter-erb", [ ["filter-name", ":erb"], ["text", [ - ["operator", "<"], - ["operator", "%"], - ["operator", "="], - " render ", - ["variable", "@products"], - ["operator", "||"], - ["string", ["\"empty_list\""]], - ["operator", "%"], - ["operator", ">"] + ["delimiter", "<%="], + ["ruby", [ + " render ", + ["variable", "@products"], + ["operator", "||"], + ["string", ["\"empty_list\""]] + ]], + ["delimiter", "%>"] ]] ]], ["punctuation", "~"], ["filter-erb", [ ["filter-name", ":erb"], ["text", [ - ["operator", "<"], - ["operator", "%"], - ["operator", "="], - " render ", - ["variable", "@products"], - ["operator", "||"], - ["string", ["\"empty_list\""]], + ["delimiter", "<%="], + ["ruby", [ + " render ", + ["variable", "@products"], + ["operator", "||"], + ["string", ["\"empty_list\""]] + ]], ["delimiter", "%>"] ]] ]] diff --git a/tests/languages/erb/erb_feature.test b/tests/languages/erb/erb_feature.test index cb86983d17..309680bb9a 100644 --- a/tests/languages/erb/erb_feature.test +++ b/tests/languages/erb/erb_feature.test @@ -7,30 +7,36 @@ [ ["erb", [ ["delimiter", "<%"], - ["comment", "# comment "], + ["ruby", [ + ["comment", "# comment "] + ]], ["delimiter", "%>"] ]], ["erb", [ ["delimiter", "<%="], - " render ", - ["variable", "@products"], - ["operator", "||"], - ["string", ["\"empty_list\""]], + ["ruby", [ + " render ", + ["variable", "@products"], + ["operator", "||"], + ["string", ["\"empty_list\""]] + ]], ["delimiter", "%>"] ]], ["erb", [ ["delimiter", "<%"], - ["variable", "@books"], - ["punctuation", "."], - ["keyword", "each"], - ["keyword", "do"], - ["operator", "|"], - "book", - ["operator", "|"], + ["ruby", [ + ["variable", "@books"], + ["punctuation", "."], + ["keyword", "each"], + ["keyword", "do"], + ["operator", "|"], + "book", + ["operator", "|"] + ]], ["delimiter", "%>"] ]] ] ---------------------------------------------------- -Checks for ERB tags. \ No newline at end of file +Checks for ERB tags. diff --git a/tests/languages/erb/erb_in_markup_feature.test b/tests/languages/erb/erb_in_markup_feature.test index 20719ea8c6..ca0793ad51 100644 --- a/tests/languages/erb/erb_in_markup_feature.test +++ b/tests/languages/erb/erb_in_markup_feature.test @@ -15,30 +15,37 @@ ___ERB1___<%= 1 %>___ERB2___<%= 2 %> ["punctuation", "\""], ["erb", [ ["delimiter", "<%="], - ["builtin", "Time"], - ["punctuation", "."], - "now", - ["punctuation", "."], - "strftime", - ["punctuation", "("], - ["string", ["'%A'"]], - ["punctuation", ")"], + ["ruby", [ + ["builtin", "Time"], + ["punctuation", "."], + "now", + ["punctuation", "."], + "strftime", + ["punctuation", "("], + ["string", ["'%A'"]], + ["punctuation", ")"] + ]], ["delimiter", "%>"] ]], ["punctuation", "\""] ]], ["punctuation", ">"] ]], + "\r\n___ERB1___", ["erb", [ ["delimiter", "<%="], - ["number", "1"], + ["ruby", [ + ["number", "1"] + ]], ["delimiter", "%>"] ]], "___ERB2___", ["erb", [ ["delimiter", "<%="], - ["number", "2"], + ["ruby", [ + ["number", "2"] + ]], ["delimiter", "%>"] ]] ] diff --git a/tests/languages/erb/issue1767.test b/tests/languages/erb/issue1767.test index 9f48ce946a..57b71a943e 100644 --- a/tests/languages/erb/issue1767.test +++ b/tests/languages/erb/issue1767.test @@ -18,28 +18,42 @@ [ ["erb", [ ["delimiter", "<%"], - ["comment", "# this is a block comment "], + ["ruby", [ + ["comment", "# this is a block comment "] + ]], ["delimiter", "%>"] ]], ["erb", [ ["delimiter", "<%"], - ["comment", "=begin %>\r\n\tblock comment\r\n\t(both lines of both the begin and end tags must be at the start of their lines)\r\n<%\r\n=end"], + ["ruby", [ + ["comment", "=begin %>\r\n\tblock comment\r\n\t(both lines of both the begin and end tags must be at the start of their lines)\r\n<%\r\n=end"] + ]], ["delimiter", "%>"] ]], ["erb", [ ["delimiter", "<%"], - ["comment", "# this is not "], + ["ruby", [ + ["comment", "# this is not "] + ]], ["delimiter", "%>"] ]], ["erb", [ ["delimiter", "<%"], - ["operator", "="], ["keyword", "begin"], ["delimiter", "%>"] + ["ruby", [ + ["operator", "="], + ["keyword", "begin"] + ]], + ["delimiter", "%>"] ]], "\r\n\tnot a comment\r\n\t", ["erb", [ ["delimiter", "<%"], - ["operator", "="], ["keyword", "end"], ["delimiter", "%>"] + ["ruby", [ + ["operator", "="], + ["keyword", "end"] + ]], + ["delimiter", "%>"] ]] ]