Commit f0a10669acd07ddcd88eccef2675f488068c98e9

Michael Schmidt 2019-05-15T13:41:05

CSS: Extended `url` inside (#1874) This extends the highlighting of the CSS `url` pattern adding highlighting for punctuation and the `url` function.

diff --git a/components/prism-css.js b/components/prism-css.js
index 149a1fb..77d049e 100644
--- a/components/prism-css.js
+++ b/components/prism-css.js
@@ -11,7 +11,13 @@
 				// See rest below
 			}
 		},
-		'url': RegExp('url\\((?:' + string.source + '|.*?)\\)', 'i'),
+		'url': {
+			pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'),
+			inside: {
+				'function': /^url/i,
+				'punctuation': /^\(|\)$/
+			}
+		},
 		'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'),
 		'string': {
 			pattern: string,
diff --git a/components/prism-css.min.js b/components/prism-css.min.js
index d4cecf4..eb99ee4 100644
--- a/components/prism-css.min.js
+++ b/components/prism-css.min.js
@@ -1 +1 @@
-!function(s){var e=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:RegExp("url\\((?:"+e.source+"|.*?)\\)","i"),selector:RegExp("[^{}\\s](?:[^{};\"']|"+e.source+")*?(?=\\s*\\{)"),string:{pattern:e,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var a=s.languages.markup;a&&(a.tag.addInlined("style","css"),s.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:a.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:s.languages.css}},alias:"language-css"}},a.tag))}(Prism);
\ No newline at end of file
+!function(s){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+t.source+"|[^\n\r()]*)\\)","i"),inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var e=s.languages.markup;e&&(e.tag.addInlined("style","css"),s.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:e.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:s.languages.css}},alias:"language-css"}},e.tag))}(Prism);
\ No newline at end of file
diff --git a/prism.js b/prism.js
index fa4b418..ef74c24 100644
--- a/prism.js
+++ b/prism.js
@@ -679,7 +679,13 @@ Prism.languages.svg = Prism.languages.markup;
 				// See rest below
 			}
 		},
-		'url': RegExp('url\\((?:' + string.source + '|.*?)\\)', 'i'),
+		'url': {
+			pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'),
+			inside: {
+				'function': /^url/i,
+				'punctuation': /^\(|\)$/
+			}
+		},
 		'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'),
 		'string': {
 			pattern: string,
diff --git a/tests/languages/css/atrule_feature.test b/tests/languages/css/atrule_feature.test
index 1bc84b0..2634bf3 100644
--- a/tests/languages/css/atrule_feature.test
+++ b/tests/languages/css/atrule_feature.test
@@ -10,7 +10,12 @@
 [
 	["atrule", [
 		["rule", "@import"],
-		["url", "url(foo.css)"],
+		["url", [
+			["function", "url"],
+			["punctuation", "("],
+			"foo.css",
+			["punctuation", ")"]
+		]],
 		["punctuation", ";"]
 	]],
 	["atrule", [
@@ -62,4 +67,4 @@
 ----------------------------------------------------
 
 Checks for at-rules.
-Also checks for LESS variables.
\ No newline at end of file
+Also checks for LESS variables.
diff --git a/tests/languages/css/url_feature.test b/tests/languages/css/url_feature.test
index 05ce8f9..690ec4a 100644
--- a/tests/languages/css/url_feature.test
+++ b/tests/languages/css/url_feature.test
@@ -9,13 +9,38 @@ bar.png")
 ----------------------------------------------------
 
 [
-	["url", "url(foo.png)"],
-	["url", "url('foo.png')"],
-	["url", "url(\"foo.png\")"],
-	["url", "url('foo\\\r\nbar.png')"],
-	["url", "url(\"foo\\\r\nbar.png\")"]
+	["url", [
+		["function", "url"],
+		["punctuation", "("],
+		"foo.png",
+		["punctuation", ")"]
+	]],
+	["url", [
+		["function", "url"],
+		["punctuation", "("],
+		"'foo.png'",
+		["punctuation", ")"]
+	]],
+	["url", [
+		["function", "url"],
+		["punctuation", "("],
+		"\"foo.png\"",
+		["punctuation", ")"]
+	]],
+	["url", [
+		["function", "url"],
+		["punctuation", "("],
+		"'foo\\\r\nbar.png'",
+		["punctuation", ")"]
+	]],
+	["url", [
+		["function", "url"],
+		["punctuation", "("],
+		"\"foo\\\r\nbar.png\"",
+		["punctuation", ")"]
+	]]
 ]
 
 ----------------------------------------------------
 
-Checks for url(), unquoted, single-quoted and double-quoted.
\ No newline at end of file
+Checks for url(), unquoted, single-quoted and double-quoted.