diff --git a/CHANGES.md b/CHANGES.md
index 6b1a4c2939..994bc79ec5 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -34,6 +34,7 @@ Grammars:
- enh(scala) add `using` soft keyword (#3330) [Nicolas Stucki][]
- enh(fsharp) added `f#` alias (#3337) [Bahnschrift][]
- enh(bash) added gnu core utilities (#3342) [katzeprior][]
+- fix(css/less/stylus/scss) highlight single-colon psuedo-elements properly (#3240) [zsoltlengyelit][]
[Austin Schick]: https://github.com/austin-schick
[Josh Goebel]: https://github.com/joshgoebel
@@ -44,6 +45,7 @@ Grammars:
[Bahnschrift]: https://github.com/Bahnschrift
[Melvyn Laïly]: https://github.com/mlaily
[katzeprior]: https://github.com/katzeprior
+[zsoltlengyelit]: github.com/zsoltlengyelit
## Version 11.2.0
diff --git a/src/languages/css.js b/src/languages/css.js
index ca3952c6c2..e9121740e9 100644
--- a/src/languages/css.js
+++ b/src/languages/css.js
@@ -58,7 +58,7 @@ export default function(hljs) {
begin: ':(' + css.PSEUDO_CLASSES.join('|') + ')'
},
{
- begin: '::(' + css.PSEUDO_ELEMENTS.join('|') + ')'
+ begin: ':(:)?(' + css.PSEUDO_ELEMENTS.join('|') + ')'
}
]
},
diff --git a/src/languages/less.js b/src/languages/less.js
index 08001098fc..b1ad793d9a 100644
--- a/src/languages/less.js
+++ b/src/languages/less.js
@@ -199,7 +199,7 @@ export default function(hljs) {
},
{
className: 'selector-pseudo',
- begin: '::(' + css.PSEUDO_ELEMENTS.join('|') + ')'
+ begin: ':(:)?(' + css.PSEUDO_ELEMENTS.join('|') + ')'
},
{
begin: /\(/,
diff --git a/src/languages/scss.js b/src/languages/scss.js
index 87a07cc4d4..f44f8ee57c 100644
--- a/src/languages/scss.js
+++ b/src/languages/scss.js
@@ -55,7 +55,7 @@ export default function(hljs) {
},
{
className: 'selector-pseudo',
- begin: '::(' + PSEUDO_ELEMENTS.join('|') + ')'
+ begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')'
},
VARIABLE,
{ // pseudo-selector params
diff --git a/src/languages/stylus.js b/src/languages/stylus.js
index 6d5d4e5985..40ac186cba 100644
--- a/src/languages/stylus.js
+++ b/src/languages/stylus.js
@@ -96,7 +96,7 @@ export default function(hljs) {
},
{
className: 'selector-pseudo',
- begin: '&?::(' + css.PSEUDO_ELEMENTS.join('|') + ')' + LOOKAHEAD_TAG_END
+ begin: '&?:(:)?(' + css.PSEUDO_ELEMENTS.join('|') + ')' + LOOKAHEAD_TAG_END
},
modes.ATTRIBUTE_SELECTOR_MODE,
diff --git a/test/markup/css/pseudo.expect.txt b/test/markup/css/pseudo.expect.txt
index 1ea40bb2ab..c6833dcef0 100644
--- a/test/markup/css/pseudo.expect.txt
+++ b/test/markup/css/pseudo.expect.txt
@@ -1,5 +1,5 @@
-.test:before,
-.test:after {
+.test:before,
+.test:after {
color: pink;
color: red;
}
diff --git a/test/markup/less/css_consistency.expect.txt b/test/markup/less/css_consistency.expect.txt
index 5df3c49ffc..7d2646167a 100644
--- a/test/markup/less/css_consistency.expect.txt
+++ b/test/markup/less/css_consistency.expect.txt
@@ -22,7 +22,9 @@
a:visited { color: blue; }
div::after { content: "test"; }
+div:after { content: "test"; }
div::before { content: open-quote; }
+div:before { content: open-quote; }
span:nth-child(33) { color:red; }
p:lang(en) {}
diff --git a/test/markup/less/css_consistency.txt b/test/markup/less/css_consistency.txt
index 1f2354ba28..fdf6529313 100644
--- a/test/markup/less/css_consistency.txt
+++ b/test/markup/less/css_consistency.txt
@@ -22,7 +22,9 @@ h1, h2, figcaption, aside, main, form, footer {}
a:visited { color: blue; }
div::after { content: "test"; }
+div:after { content: "test"; }
div::before { content: open-quote; }
+div:before { content: open-quote; }
span:nth-child(33) { color:red; }
p:lang(en) {}
diff --git a/test/markup/scss/css_consistency.expect.txt b/test/markup/scss/css_consistency.expect.txt
index 53fda48980..fa8feaa41c 100644
--- a/test/markup/scss/css_consistency.expect.txt
+++ b/test/markup/scss/css_consistency.expect.txt
@@ -22,7 +22,9 @@
a:visited { color: blue; }
div::after { content: "test"; }
+div:after { content: "test"; }
div::before { content: open-quote; }
+div:before { content: open-quote; }
span:nth-child(33) { color:red; }
p:lang(en) {}
diff --git a/test/markup/scss/css_consistency.txt b/test/markup/scss/css_consistency.txt
index 1f2354ba28..fdf6529313 100644
--- a/test/markup/scss/css_consistency.txt
+++ b/test/markup/scss/css_consistency.txt
@@ -22,7 +22,9 @@ h1, h2, figcaption, aside, main, form, footer {}
a:visited { color: blue; }
div::after { content: "test"; }
+div:after { content: "test"; }
div::before { content: open-quote; }
+div:before { content: open-quote; }
span:nth-child(33) { color:red; }
p:lang(en) {}
diff --git a/test/markup/stylus/css_consistency.expect.txt b/test/markup/stylus/css_consistency.expect.txt
index 53fda48980..fa8feaa41c 100644
--- a/test/markup/stylus/css_consistency.expect.txt
+++ b/test/markup/stylus/css_consistency.expect.txt
@@ -22,7 +22,9 @@
a:visited { color: blue; }
div::after { content: "test"; }
+div:after { content: "test"; }
div::before { content: open-quote; }
+div:before { content: open-quote; }
span:nth-child(33) { color:red; }
p:lang(en) {}
diff --git a/test/markup/stylus/css_consistency.txt b/test/markup/stylus/css_consistency.txt
index 1f2354ba28..fdf6529313 100644
--- a/test/markup/stylus/css_consistency.txt
+++ b/test/markup/stylus/css_consistency.txt
@@ -22,7 +22,9 @@ h1, h2, figcaption, aside, main, form, footer {}
a:visited { color: blue; }
div::after { content: "test"; }
+div:after { content: "test"; }
div::before { content: open-quote; }
+div:before { content: open-quote; }
span:nth-child(33) { color:red; }
p:lang(en) {}