Commit 336edeead9c2008248e5723581668c226745bcda

Michael Schmidt 2021-11-22T13:14:09

ERB: Better embedding of Ruby (#3192)

diff --git a/components/prism-erb.js b/components/prism-erb.js
index 3f118cf..21dd7c2 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 c7add59..9e38fee 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 88bb3c5..be2a7b1 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 cb86983..309680b 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 20719ea..ca0793a 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 9f48ce9..57b71a9 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", "%>"]
 	]]
 ]