Fix tokenizing !important (#1585) Updates the regex to ensure that when `!important` sits next to a property with no spaces, it's still tokenized correctly.
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
diff --git a/components/prism-css.js b/components/prism-css.js
index e6fdf6f..38c77ca 100644
--- a/components/prism-css.js
+++ b/components/prism-css.js
@@ -14,7 +14,7 @@ Prism.languages.css = {
greedy: true
},
'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,
- 'important': /\B!important\b/i,
+ 'important': /!important\b/i,
'function': /[-a-z0-9]+(?=\()/i,
'punctuation': /[(){};:]/
};
@@ -49,4 +49,4 @@ if (Prism.languages.markup) {
alias: 'language-css'
}
}, Prism.languages.markup.tag);
-}
\ No newline at end of file
+}
diff --git a/components/prism-css.min.js b/components/prism-css.min.js
index 3fe10c8..c9f7507 100644
--- a/components/prism-css.min.js
+++ b/components/prism-css.min.js
@@ -1 +1 @@
-Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\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:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\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));
diff --git a/examples/prism-css.html b/examples/prism-css.html
index e211053..a36f196 100644
--- a/examples/prism-css.html
+++ b/examples/prism-css.html
@@ -7,7 +7,13 @@ ol {}</code></pre>
<pre><code>p { color: red; }</code></pre>
<h2>Important rule</h2>
-<pre><code>p { color: red !important; }</code></pre>
+<pre><code>
+p {
+ color: red !important;
+ line-height: normal!important;
+}
+p{position:absolute!important}
+</code></pre>
<h2>@ rule</h2>
<pre><code>@media screen and (min-width: 100px) {}</code></pre>
@@ -25,4 +31,4 @@ ol {}</code></pre>
<pre><code>content: 'foo';</code></pre>
<h2>URL</h2>
-<pre><code>content: url(foo.png);</code></pre>
\ No newline at end of file
+<pre><code>content: url(foo.png);</code></pre>
diff --git a/prism.js b/prism.js
index a60c2ce..89eaf85 100644
--- a/prism.js
+++ b/prism.js
@@ -647,7 +647,7 @@ Prism.languages.css = {
greedy: true
},
'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,
- 'important': /\B!important\b/i,
+ 'important': /!important\b/i,
'function': /[-a-z0-9]+(?=\()/i,
'punctuation': /[(){};:]/
};
@@ -889,4 +889,4 @@ Prism.languages.js = Prism.languages.javascript;
document.addEventListener('DOMContentLoaded', self.Prism.fileHighlight);
-})();
\ No newline at end of file
+})();
diff --git a/tests/languages/css/important_feature.test b/tests/languages/css/important_feature.test
index ad69c39..0f5c140 100644
--- a/tests/languages/css/important_feature.test
+++ b/tests/languages/css/important_feature.test
@@ -1,5 +1,6 @@
color: red !important;
padding: 10px 20px 30px !important;
+position:absolute!important;
----------------------------------------------------
@@ -10,12 +11,17 @@ padding: 10px 20px 30px !important;
["important", "!important"],
["punctuation", ";"],
["property", "padding"],
- ["punctuation", ":"],
- " 10px 20px 30px ",
- ["important", "!important"],
- ["punctuation", ";"]
+ ["punctuation", ":"],
+ " 10px 20px 30px ",
+ ["important", "!important"],
+ ["punctuation", ";"],
+ ["property", "position"],
+ ["punctuation", ":"],
+ "absolute",
+ ["important", "!important"],
+ ["punctuation", ";"]
]
----------------------------------------------------
-Checks for !important rule.
\ No newline at end of file
+Checks for !important rule.