CSS: Extended `url` inside (#1874) This extends the highlighting of the CSS `url` pattern adding highlighting for punctuation and the `url` function.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
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.