From 7fdeb8eaa223b65de837112d0fe436c5a710f9e2 Mon Sep 17 00:00:00 2001 From: kshetline Date: Tue, 6 May 2025 00:26:03 -0400 Subject: [PATCH 1/6] Fix for CSS unicode-range support, issue #4253. --- src/languages/css.js | 3 ++- src/languages/lib/css-shared.js | 7 ++++++- test/markup/css/css_consistency.expect.txt | 2 +- test/markup/css/css_consistency.txt | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/languages/css.js b/src/languages/css.js index e76259c266..9ae5d86e5e 100644 --- a/src/languages/css.js +++ b/src/languages/css.js @@ -73,9 +73,10 @@ export default function(hljs) { modes.HEXCOLOR, modes.IMPORTANT, modes.CSS_NUMBER_MODE, + modes.UNICODE_RANGE, ...STRINGS, // needed to highlight these as strings and to avoid issues with - // illegal characters that might be inside urls that would tigger the + // illegal characters that might be inside urls that would trigger the // languages illegal stack { begin: /(url|data-uri)\(/, diff --git a/src/languages/lib/css-shared.js b/src/languages/lib/css-shared.js index 3193ae3d26..39303e5d1f 100644 --- a/src/languages/lib/css-shared.js +++ b/src/languages/lib/css-shared.js @@ -7,7 +7,11 @@ export const MODES = (hljs) => { BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, HEXCOLOR: { scope: 'number', - begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + begin: /#(([0-9A-F]{3,4})|(([0-9A-F]{2}){3,4}))\b/i + }, + UNICODE_RANGE: { + scope: 'number', + begin: /\bU\+[0-9A-F][0-9A-F?]{0,4}(-[0-9A-F][0-9A-F]{0,4})?/i }, FUNCTION_DISPATCH: { className: "built_in", @@ -777,6 +781,7 @@ export const ATTRIBUTES = [ 'transition-timing-function', 'translate', 'unicode-bidi', + 'unicode-range', 'user-modify', 'user-select', 'vector-effect', diff --git a/test/markup/css/css_consistency.expect.txt b/test/markup/css/css_consistency.expect.txt index 93690630c5..2475b9b8ad 100644 --- a/test/markup/css/css_consistency.expect.txt +++ b/test/markup/css/css_consistency.expect.txt @@ -54,7 +54,7 @@ font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ diff --git a/test/markup/css/css_consistency.txt b/test/markup/css/css_consistency.txt index fdf6529313..5d086f5b5c 100644 --- a/test/markup/css/css_consistency.txt +++ b/test/markup/css/css_consistency.txt @@ -54,7 +54,7 @@ a[href*="example"] {} font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ From 285dd01926c44019867ffc04b48b67ed27e78706 Mon Sep 17 00:00:00 2001 From: kshetline Date: Tue, 6 May 2025 00:40:31 -0400 Subject: [PATCH 2/6] Update CHANGES.md. --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 5c5978a3c5..6a0af7ad9f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,7 @@ Core Grammars: - fix(ex) adds support for `?'` char literal and missing `defguardp` keyword [Kevin Bloch][] - fix(diff) fix unified diff hunk header regex to allow unpaired numbers [Chris Wilson][] - enh(php) support single line and hash comments in attributes, constructor and functions [Antoine Musso][] +- fix(css) `unicode-range` parsing, issue #4253 [Kerry Shetline][] CONTRIBUTORS @@ -23,6 +24,7 @@ CONTRIBUTORS [Chris Wilson]: https://github.com/sushicw [Antoine Musso]: https://github.com/hashar [Chester Moses]: https://github.com/Chester-Moses-HCL +[Kerry Shetline]: https://github.com/kshetline ## Version 11.11.1 From 8e263e93207e8f56b16193079533b3870d7dbd43 Mon Sep 17 00:00:00 2001 From: kshetline Date: Tue, 6 May 2025 07:52:17 -0400 Subject: [PATCH 3/6] Update less/scss/styles tests. --- test/markup/less/css_consistency.expect.txt | 2 +- test/markup/less/css_consistency.txt | 2 +- test/markup/scss/css_consistency.expect.txt | 6 +++--- test/markup/scss/css_consistency.txt | 2 +- test/markup/stylus/css_consistency.expect.txt | 6 +++--- test/markup/stylus/css_consistency.txt | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/markup/less/css_consistency.expect.txt b/test/markup/less/css_consistency.expect.txt index 93690630c5..2475b9b8ad 100644 --- a/test/markup/less/css_consistency.expect.txt +++ b/test/markup/less/css_consistency.expect.txt @@ -54,7 +54,7 @@ font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ diff --git a/test/markup/less/css_consistency.txt b/test/markup/less/css_consistency.txt index fdf6529313..5d086f5b5c 100644 --- a/test/markup/less/css_consistency.txt +++ b/test/markup/less/css_consistency.txt @@ -54,7 +54,7 @@ a[href*="example"] {} font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ diff --git a/test/markup/scss/css_consistency.expect.txt b/test/markup/scss/css_consistency.expect.txt index ccbab101d1..2475b9b8ad 100644 --- a/test/markup/scss/css_consistency.expect.txt +++ b/test/markup/scss/css_consistency.expect.txt @@ -54,16 +54,16 @@ font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ } @keyframes important1 { - from { margin-top: 50px; } + from { margin-top: 50px; } 50% { margin-top: 60px !important; } - to { margin-top: 100px; } + to { margin-top: 100px; } } main { diff --git a/test/markup/scss/css_consistency.txt b/test/markup/scss/css_consistency.txt index fdf6529313..5d086f5b5c 100644 --- a/test/markup/scss/css_consistency.txt +++ b/test/markup/scss/css_consistency.txt @@ -54,7 +54,7 @@ a[href*="example"] {} font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ diff --git a/test/markup/stylus/css_consistency.expect.txt b/test/markup/stylus/css_consistency.expect.txt index ccbab101d1..2475b9b8ad 100644 --- a/test/markup/stylus/css_consistency.expect.txt +++ b/test/markup/stylus/css_consistency.expect.txt @@ -54,16 +54,16 @@ font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ } @keyframes important1 { - from { margin-top: 50px; } + from { margin-top: 50px; } 50% { margin-top: 60px !important; } - to { margin-top: 100px; } + to { margin-top: 100px; } } main { diff --git a/test/markup/stylus/css_consistency.txt b/test/markup/stylus/css_consistency.txt index fdf6529313..5d086f5b5c 100644 --- a/test/markup/stylus/css_consistency.txt +++ b/test/markup/stylus/css_consistency.txt @@ -54,7 +54,7 @@ a[href*="example"] {} font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - /* unicode-range: U+0025-00FF, U+4??; */ + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ From 3089423e8f6b4c7eda464516132c6951bba01f52 Mon Sep 17 00:00:00 2001 From: kshetline Date: Mon, 12 May 2025 00:19:11 -0400 Subject: [PATCH 4/6] Take care of unexpected case sensitivity issues. --- src/languages/lib/css-shared.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/lib/css-shared.js b/src/languages/lib/css-shared.js index 39303e5d1f..e2073f40ea 100644 --- a/src/languages/lib/css-shared.js +++ b/src/languages/lib/css-shared.js @@ -7,11 +7,11 @@ export const MODES = (hljs) => { BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, HEXCOLOR: { scope: 'number', - begin: /#(([0-9A-F]{3,4})|(([0-9A-F]{2}){3,4}))\b/i + begin: /#(([0-9A-Fa-f]{3,4})|(([0-9A-F]{2}){3,4}))\b/ }, UNICODE_RANGE: { scope: 'number', - begin: /\bU\+[0-9A-F][0-9A-F?]{0,4}(-[0-9A-F][0-9A-F]{0,4})?/i + begin: /\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,4}(-[0-9A-Fa-f][0-9A-Fa-f]{0,4})?/ }, FUNCTION_DISPATCH: { className: "built_in", From 2a4f4de79d2bdcf145da986cd666d279cb15a8c7 Mon Sep 17 00:00:00 2001 From: kshetline Date: Mon, 12 May 2025 00:21:28 -0400 Subject: [PATCH 5/6] Take care of unexpected case sensitivity issues, part 2. --- src/languages/lib/css-shared.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/lib/css-shared.js b/src/languages/lib/css-shared.js index e2073f40ea..381d984d1e 100644 --- a/src/languages/lib/css-shared.js +++ b/src/languages/lib/css-shared.js @@ -7,7 +7,7 @@ export const MODES = (hljs) => { BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, HEXCOLOR: { scope: 'number', - begin: /#(([0-9A-Fa-f]{3,4})|(([0-9A-F]{2}){3,4}))\b/ + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ }, UNICODE_RANGE: { scope: 'number', From c6e9baa63122a520c838f7531717bc2c0ed0eb4c Mon Sep 17 00:00:00 2001 From: kshetline Date: Mon, 12 May 2025 01:33:32 -0400 Subject: [PATCH 6/6] Fix the tests I thought had been working! --- src/languages/less.js | 3 ++- src/languages/scss.js | 1 + src/languages/stylus.js | 1 + test/markup/scss/css_consistency.expect.txt | 4 ++-- test/markup/stylus/css_consistency.expect.txt | 6 +++--- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/languages/less.js b/src/languages/less.js index c6a17ad79c..31d0ec79d8 100644 --- a/src/languages/less.js +++ b/src/languages/less.js @@ -67,6 +67,7 @@ export default function(hljs) { excludeEnd: true } }, + modes.UNICODE_RANGE, modes.HEXCOLOR, PARENS_MODE, IDENT_MODE('variable', '@@?' + IDENT_RE, 10), @@ -177,7 +178,7 @@ export default function(hljs) { MIXIN_GUARD_MODE, IDENT_MODE('keyword', 'all\\b'), IDENT_MODE('variable', '@\\{' + IDENT_RE + '\\}'), // otherwise it’s identified as tag - + { begin: '\\b(' + css.TAGS.join('|') + ')\\b', className: 'selector-tag' diff --git a/src/languages/scss.js b/src/languages/scss.js index 0eaf922955..5c16c4dff1 100644 --- a/src/languages/scss.js +++ b/src/languages/scss.js @@ -79,6 +79,7 @@ export default function(hljs) { VARIABLE, modes.HEXCOLOR, modes.CSS_NUMBER_MODE, + modes.UNICODE_RANGE, hljs.QUOTE_STRING_MODE, hljs.APOS_STRING_MODE, modes.IMPORTANT, diff --git a/src/languages/stylus.js b/src/languages/stylus.js index f680f90c7d..34747708f1 100644 --- a/src/languages/stylus.js +++ b/src/languages/stylus.js @@ -148,6 +148,7 @@ export default function(hljs) { VARIABLE, hljs.APOS_STRING_MODE, modes.CSS_NUMBER_MODE, + modes.UNICODE_RANGE, hljs.QUOTE_STRING_MODE ] } diff --git a/test/markup/scss/css_consistency.expect.txt b/test/markup/scss/css_consistency.expect.txt index 2475b9b8ad..aba76711e5 100644 --- a/test/markup/scss/css_consistency.expect.txt +++ b/test/markup/scss/css_consistency.expect.txt @@ -61,9 +61,9 @@ } @keyframes important1 { - from { margin-top: 50px; } + from { margin-top: 50px; } 50% { margin-top: 60px !important; } - to { margin-top: 100px; } + to { margin-top: 100px; } } main { diff --git a/test/markup/stylus/css_consistency.expect.txt b/test/markup/stylus/css_consistency.expect.txt index 2475b9b8ad..5c9b4378d1 100644 --- a/test/markup/stylus/css_consistency.expect.txt +++ b/test/markup/stylus/css_consistency.expect.txt @@ -54,16 +54,16 @@ font-variant: no-common-ligatures proportional-nums; font-feature-settings: "liga" 0; font-variation-settings: "xhgt" 0.7; - unicode-range: U+0025-00FF, U+4??; + unicode-range: U+0025-00FF, U+4??; /* it's not 100% clear how url and format should be highlighted universally */ /* src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), url("/fonts/OpenSans-Regular-webfont.woff") format("woff"); */ } @keyframes important1 { - from { margin-top: 50px; } + from { margin-top: 50px; } 50% { margin-top: 60px !important; } - to { margin-top: 100px; } + to { margin-top: 100px; } } main {