Commit 29643f4e462d2fdac353c44c2d826f0c4c5dc62f

Golmote 2015-10-06T08:48:21

Simplify patterns for <style> and <script> tags

diff --git a/components/prism-aspnet.js b/components/prism-aspnet.js
index 291823e..9511e45 100644
--- a/components/prism-aspnet.js
+++ b/components/prism-aspnet.js
@@ -29,23 +29,8 @@ Prism.languages.insertBefore('aspnet', 'comment', {
 // script runat="server" contains csharp, not javascript
 Prism.languages.insertBefore('aspnet', Prism.languages.javascript ? 'script' : 'tag', {
 	'asp script': {
-		pattern: /<script(?=.*runat=['"]?server['"]?)[\w\W]*?>[\w\W]*?<\/script>/i,
-		inside: {
-			tag: {
-				pattern: /<\/?script\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/i,
-				inside: Prism.languages.aspnet.tag.inside
-			},
-			rest: Prism.languages.csharp || {}
-		}
+		pattern: /(<script(?=.*runat=['"]?server['"]?)[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
+		lookbehind: true,
+		inside: Prism.languages.csharp || {}
 	}
-});
-
-// Hacks to fix eager tag matching finishing too early: <script src="<% Foo.Bar %>"> => <script src="<% Foo.Bar %>
-if ( Prism.languages.aspnet.style ) {
-	Prism.languages.aspnet.style.inside.tag.pattern = /<\/?style\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/i;
-	Prism.languages.aspnet.style.inside.tag.inside = Prism.languages.aspnet.tag.inside;
-}
-if ( Prism.languages.aspnet.script ) {
-	Prism.languages.aspnet.script.inside.tag.pattern = Prism.languages.aspnet['asp script'].inside.tag.pattern;
-	Prism.languages.aspnet.script.inside.tag.inside = Prism.languages.aspnet.tag.inside;
-}
\ No newline at end of file
+});
\ No newline at end of file
diff --git a/components/prism-aspnet.min.js b/components/prism-aspnet.min.js
index f315148..0afede5 100644
--- a/components/prism-aspnet.min.js
+++ b/components/prism-aspnet.min.js
@@ -1 +1 @@
-Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive tag":{pattern:/<%\s*@.*%>/i,inside:{"page-directive tag":/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},"directive tag":{pattern:/<%.*%>/i,inside:{"directive tag":/<%\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{"directive tag":Prism.languages.aspnet["directive tag"]},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp comment":/<%--[\w\W]*?--%>/}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp script":{pattern:/<script(?=.*runat=['"]?server['"]?)[\w\W]*?>[\w\W]*?<\/script>/i,inside:{tag:{pattern:/<\/?script\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/i,inside:Prism.languages.aspnet.tag.inside},rest:Prism.languages.csharp||{}}}}),Prism.languages.aspnet.style&&(Prism.languages.aspnet.style.inside.tag.pattern=/<\/?style\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|\w+))?\s*)*\/?>/i,Prism.languages.aspnet.style.inside.tag.inside=Prism.languages.aspnet.tag.inside),Prism.languages.aspnet.script&&(Prism.languages.aspnet.script.inside.tag.pattern=Prism.languages.aspnet["asp script"].inside.tag.pattern,Prism.languages.aspnet.script.inside.tag.inside=Prism.languages.aspnet.tag.inside);
\ No newline at end of file
+Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive tag":{pattern:/<%\s*@.*%>/i,inside:{"page-directive tag":/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},"directive tag":{pattern:/<%.*%>/i,inside:{"directive tag":/<%\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{"directive tag":Prism.languages.aspnet["directive tag"]},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp comment":/<%--[\w\W]*?--%>/}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp script":{pattern:/(<script(?=.*runat=['"]?server['"]?)[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.csharp||{}}});
\ No newline at end of file
diff --git a/components/prism-css.js b/components/prism-css.js
index 05af658..3b219a9 100644
--- a/components/prism-css.js
+++ b/components/prism-css.js
@@ -21,14 +21,9 @@ Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css
 if (Prism.languages.markup) {
 	Prism.languages.insertBefore('markup', 'tag', {
 		'style': {
-			pattern: /<style[\w\W]*?>[\w\W]*?<\/style>/i,
-			inside: {
-				'tag': {
-					pattern: /<style[\w\W]*?>|<\/style>/i,
-					inside: Prism.languages.markup.tag.inside
-				},
-				rest: Prism.languages.css
-			},
+			pattern: /(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,
+			lookbehind: true,
+			inside: Prism.languages.css,
 			alias: 'language-css'
 		}
 	});
diff --git a/components/prism-css.min.js b/components/prism-css.min.js
index da88a59..5d8be07 100644
--- a/components/prism-css.min.js
+++ b/components/prism-css.min.js
@@ -1 +1 @@
-Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/<style[\w\W]*?>[\w\W]*?<\/style>/i,inside:{tag:{pattern:/<style[\w\W]*?>|<\/style>/i,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css},alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));
\ No newline at end of file
+Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));
\ No newline at end of file
diff --git a/components/prism-javascript.js b/components/prism-javascript.js
index 0d81394..1c75a76 100644
--- a/components/prism-javascript.js
+++ b/components/prism-javascript.js
@@ -34,14 +34,9 @@ Prism.languages.insertBefore('javascript', 'class-name', {
 if (Prism.languages.markup) {
 	Prism.languages.insertBefore('markup', 'tag', {
 		'script': {
-			pattern: /<script[\w\W]*?>[\w\W]*?<\/script>/i,
-			inside: {
-				'tag': {
-					pattern: /<script[\w\W]*?>|<\/script>/i,
-					inside: Prism.languages.markup.tag.inside
-				},
-				rest: Prism.languages.javascript
-			},
+			pattern: /(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
+			lookbehind: true,
+			inside: Prism.languages.javascript,
 			alias: 'language-javascript'
 		}
 	});
diff --git a/components/prism-javascript.min.js b/components/prism-javascript.min.js
index 617a028..c0a924b 100644
--- a/components/prism-javascript.min.js
+++ b/components/prism-javascript.min.js
@@ -1 +1 @@
-Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),Prism.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/<script[\w\W]*?>[\w\W]*?<\/script>/i,inside:{tag:{pattern:/<script[\w\W]*?>|<\/script>/i,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript},alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript;
\ No newline at end of file
+Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),Prism.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript;
\ No newline at end of file
diff --git a/prism.js b/prism.js
index f1df177..f575db3 100644
--- a/prism.js
+++ b/prism.js
@@ -518,14 +518,9 @@ Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css
 if (Prism.languages.markup) {
 	Prism.languages.insertBefore('markup', 'tag', {
 		'style': {
-			pattern: /<style[\w\W]*?>[\w\W]*?<\/style>/i,
-			inside: {
-				'tag': {
-					pattern: /<style[\w\W]*?>|<\/style>/i,
-					inside: Prism.languages.markup.tag.inside
-				},
-				rest: Prism.languages.css
-			},
+			pattern: /(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,
+			lookbehind: true,
+			inside: Prism.languages.css,
 			alias: 'language-css'
 		}
 	});
@@ -621,14 +616,9 @@ Prism.languages.insertBefore('javascript', 'class-name', {
 if (Prism.languages.markup) {
 	Prism.languages.insertBefore('markup', 'tag', {
 		'script': {
-			pattern: /<script[\w\W]*?>[\w\W]*?<\/script>/i,
-			inside: {
-				'tag': {
-					pattern: /<script[\w\W]*?>|<\/script>/i,
-					inside: Prism.languages.markup.tag.inside
-				},
-				rest: Prism.languages.javascript
-			},
+			pattern: /(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
+			lookbehind: true,
+			inside: Prism.languages.javascript,
 			alias: 'language-javascript'
 		}
 	});
diff --git a/tests/languages/markup!+css/css_inclusion.test b/tests/languages/markup!+css/css_inclusion.test
index b606f11..6296fce 100644
--- a/tests/languages/markup!+css/css_inclusion.test
+++ b/tests/languages/markup!+css/css_inclusion.test
@@ -9,37 +9,37 @@ foo {
 ----------------------------------------------------
 
 [
-	["style", [
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "<"],
-				"style"
-			]],
-			["attr-name", [
-				"type"
-			]],
-			["attr-value", [
-				["punctuation", "="],
-				["punctuation", "\""],
-				"text/css",
-				["punctuation", "\""]
-			]],
-			["punctuation", ">"]
+			["punctuation", "<"],
+			"style"
 		]],
+		["attr-name", [
+			"type"
+		]],
+		["attr-value", [
+			["punctuation", "="],
+			["punctuation", "\""],
+			"text/css",
+			["punctuation", "\""]
+		]],
+		["punctuation", ">"]
+	]],
+	["style", [
 		["selector", "foo"],
 		["punctuation", "{"],
 		["property", "bar"],
 		["punctuation", ":"],
 		" baz",
 		["punctuation", ";"],
-		["punctuation", "}"],
+		["punctuation", "}"]
+	]],
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "</"],
-				"style"
-			]],
-			["punctuation", ">"]
-		]]
+			["punctuation", "</"],
+			"style"
+		]],
+		["punctuation", ">"]
 	]],
 
 	["tag", [
diff --git a/tests/languages/markup!+javascript/javascript_inclusion.test b/tests/languages/markup!+javascript/javascript_inclusion.test
index 0aeeb0e..ef9a0ce 100644
--- a/tests/languages/markup!+javascript/javascript_inclusion.test
+++ b/tests/languages/markup!+javascript/javascript_inclusion.test
@@ -6,51 +6,53 @@
 ----------------------------------------------------
 
 [
-	["script", [
+
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "<"],
-				"script"
-			]],
-			["attr-name", [
-				"type"
-			]],
-			["attr-value", [
-				["punctuation", "="],
-				["punctuation", "\""],
-				"text/javascript",
-                ["punctuation", "\""]
-			]],
-			["punctuation", ">"]
+			["punctuation", "<"],
+			"script"
+		]],
+		["attr-name", [
+			"type"
+		]],
+		["attr-value", [
+			["punctuation", "="],
+			["punctuation", "\""],
+			"text/javascript",
+			["punctuation", "\""]
 		]],
+		["punctuation", ">"]
+	]],
+	["script", [
 		["function", "foo"],
 		["punctuation", "("],
-		["punctuation", ")"],
+		["punctuation", ")"]
+	]],
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "</"],
-				"script"
-			]],
-			["punctuation", ">"]
-		]]
+			["punctuation", "</"],
+			"script"
+		]],
+		["punctuation", ">"]
 	]],
-	["script", [
+
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "<"],
-				"script"
-			]],
-			["punctuation", ">"]
+			["punctuation", "<"],
+			"script"
 		]],
-		["string", "\"foo bar\""],
+		["punctuation", ">"]
+	]],
+	["script", [
+		["string", "\"foo bar\""]
+	]],
+	["tag", [
 		["tag", [
-            ["tag", [
-                ["punctuation", "</"],
-                "script"
-            ]],
-            ["punctuation", ">"]
-        ]]
-    ]]
+			["punctuation", "</"],
+			"script"
+		]],
+		["punctuation", ">"]
+	]]
 ]
 
 ----------------------------------------------------
diff --git a/tests/languages/markup+javascript+csharp+aspnet/script_feature.test b/tests/languages/markup+javascript+csharp+aspnet/script_feature.test
index 80c1ef8..2be50eb 100644
--- a/tests/languages/markup+javascript+csharp+aspnet/script_feature.test
+++ b/tests/languages/markup+javascript+csharp+aspnet/script_feature.test
@@ -4,48 +4,49 @@
 ----------------------------------------------------
 
 [
+	["tag", [
+		["tag", [
+			["punctuation", "<"],
+			"script"
+		]],
+		["attr-name", [
+			"runat"
+		]],
+		["attr-value", [
+			["punctuation", "="],
+			["punctuation", "\""],
+			"server",
+			["punctuation", "\""]
+		]],
+		["punctuation", ">"]
+	]],
 	["asp script", [
+		["preprocessor", "#foo"]
+	]],
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "<"],
-				"script"
-			]],
-			["attr-name", [
-				"runat"
-			]],
-			["attr-value", [
-				["punctuation", "="],
-				["punctuation", "\""],
-				"server",
-				["punctuation", "\""]
-			]],
-			["punctuation", ">"]
+			["punctuation", "</"],
+			"script"
 		]],
-		["preprocessor", "#foo"],
+		["punctuation", ">"]
+	]],
+
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "</"],
-				"script"
-			]],
-			["punctuation", ">"]
-		]]
+			["punctuation", "<"],
+			"script"
+		]],
+		["punctuation", ">"]
 	]],
 	["script", [
+		["regex", "/foo/"]
+	]],
+	["tag", [
 		["tag", [
-			["tag", [
-				["punctuation", "<"],
-				"script"
-			]],
-			["punctuation", ">"]
+			["punctuation", "</"],
+			"script"
 		]],
-		["regex", "/foo/"],
-		["tag", [
-			["tag", [
-				["punctuation", "</"],
-				"script"
-			]],
-			["punctuation", ">"]
-		]]
+		["punctuation", ">"]
 	]]
 ]