Commit c1d6cb853ade33da47fa1b422938131bf088713a

Олег Дутченко 2018-10-19T04:06:02

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.

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.