highlight.js icon indicating copy to clipboard operation
highlight.js copied to clipboard

(css) Escaped special character in selector class name breaks highlighting

Open sentience opened this issue 1 year ago • 2 comments

Describe the issue

CSS class and ID selectors contain arbitrary strings (e.g. .myclassname), which can contain escaped special characters (e.g. .foo\:myclassname to match class="foo:myclassname"). Currently, the backslash that escapes a special character is not recognised by highlight.js as a valid part of the class name or ID.

Which language seems to have the issue?

css

Are you using highlight or highlightAuto?

highlight

Sample Code to Reproduce

.dark\:hover\:bg-sky-500:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(14 165 233 / var(--tw-bg-opacity));
}

Current highlighting:

CleanShot 2024-01-16 at 11 45 54

Expected behavior

The escaped special characters (\:) should not interfere with the highlighting of the class name, but actual pseudoclasses (:hover) should still be highlighted.

GitHub:

CleanShot 2024-01-16 at 11 43 34

VS Code:

CleanShot 2024-01-16 at 11 45 17

Additional context

TailwindCSS makes extensive use of escaped characters in CSS selectors for its modifiers.

Other special characters are escaped for features like color opacity:

.dark\:hover\:bg-sky-500\/25:hover {
  background-color: rgb(14 165 233 / 0.25);
}

…and arbitrary values:

.dark\:hover\:bg-\[\#ff0000\]\/25:hover {
  background-color: rgb(255 0 0 / 0.25);
}

sentience avatar Jan 16 '24 00:01 sentience

Probably need to push a proper CLASS_NAME_RE down into css-shared.js where it can then be shared with all the css-like grammars.

Anyone wanting to pick this up will need to take a look at tools/css. (helps with CSS testing). We require that all our css-like grammars remain consistent, so a patch here would need to fix all 4 grammars, not just CSS.

A PR would be welcome.

joshgoebel avatar Jan 16 '24 01:01 joshgoebel