From bd0006bcb0f8add19c7d20bec2c8aaceccbde16e Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Sun, 28 Jun 2020 01:44:00 +0200 Subject: [PATCH] CSS: Improved url and added keywords (#2432) --- components/prism-css.js | 13 +++++++++++-- components/prism-css.min.js | 2 +- prism.js | 13 +++++++++++-- tests/languages/css/atrule_feature.test | 4 ++-- tests/languages/css/url_feature.test | 19 +++++++++++++------ 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/components/prism-css.js b/components/prism-css.js index 4d7e718fdc..b0b56ebfc9 100644 --- a/components/prism-css.js +++ b/components/prism-css.js @@ -12,16 +12,25 @@ pattern: /(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/, lookbehind: true, alias: 'selector' + }, + 'keyword': { + pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, + lookbehind: true } // See rest below } }, 'url': { - pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'), + // https://drafts.csswg.org/css-values-3/#urls + pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), greedy: true, inside: { 'function': /^url/i, - 'punctuation': /^\(|\)$/ + 'punctuation': /^\(|\)$/, + 'string': { + pattern: RegExp('^' + string.source + '$'), + alias: 'url' + } } }, 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), diff --git a/components/prism-css.min.js b/components/prism-css.min.js index c1a74079d1..f2197a3c66 100644 --- a/components/prism-css.min.js +++ b/components/prism-css.min.js @@ -1 +1 @@ -!function(s){var e=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"}}},url:{pattern:RegExp("url\\((?:"+e.source+"|[^\n\r()]*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+e.source+")*?(?=\\s*\\{)"),string:{pattern:e,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),s.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:s.languages.css}},alias:"language-css"}},t.tag))}(Prism); \ No newline at end of file +!function(e){var s=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+s.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+s.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+s.source+")*?(?=\\s*\\{)"),string:{pattern:s,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism); \ No newline at end of file diff --git a/prism.js b/prism.js index bde34e3c0e..c1dc95c1e9 100644 --- a/prism.js +++ b/prism.js @@ -1329,16 +1329,25 @@ Prism.languages.rss = Prism.languages.xml; pattern: /(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/, lookbehind: true, alias: 'selector' + }, + 'keyword': { + pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, + lookbehind: true } // See rest below } }, 'url': { - pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'), + // https://drafts.csswg.org/css-values-3/#urls + pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), greedy: true, inside: { 'function': /^url/i, - 'punctuation': /^\(|\)$/ + 'punctuation': /^\(|\)$/, + 'string': { + pattern: RegExp('^' + string.source + '$'), + alias: 'url' + } } }, 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), diff --git a/tests/languages/css/atrule_feature.test b/tests/languages/css/atrule_feature.test index 2634bf3acc..adb84ab093 100644 --- a/tests/languages/css/atrule_feature.test +++ b/tests/languages/css/atrule_feature.test @@ -31,7 +31,7 @@ ["punctuation", ":"], " 640px", ["punctuation", ")"], - " and ", + ["keyword", "and"], ["punctuation", "("], ["property", "min-height"], ["punctuation", ":"], @@ -47,7 +47,7 @@ ["punctuation", ":"], " 50vmax", ["punctuation", ")"], - "\r\n\tor ", + ["keyword", "or"], ["punctuation", "("], ["property", "top"], ["punctuation", ":"], diff --git a/tests/languages/css/url_feature.test b/tests/languages/css/url_feature.test index 014404b2bc..6acaf0f074 100644 --- a/tests/languages/css/url_feature.test +++ b/tests/languages/css/url_feature.test @@ -1,4 +1,5 @@ url(foo.png) +url(close\)parens) url('foo.png') url("foo.png") url('foo\ @@ -21,25 +22,31 @@ bar.png") ["url", [ ["function", "url"], ["punctuation", "("], - "'foo.png'", + "close\\)parens", ["punctuation", ")"] ]], ["url", [ ["function", "url"], ["punctuation", "("], - "\"foo.png\"", + ["string", "'foo.png'"], ["punctuation", ")"] ]], ["url", [ ["function", "url"], ["punctuation", "("], - "'foo\\\r\nbar.png'", + ["string", "\"foo.png\""], ["punctuation", ")"] ]], ["url", [ ["function", "url"], ["punctuation", "("], - "\"foo\\\r\nbar.png\"", + ["string", "'foo\\\r\nbar.png'"], + ["punctuation", ")"] + ]], + ["url", [ + ["function", "url"], + ["punctuation", "("], + ["string", "\"foo\\\r\nbar.png\""], ["punctuation", ")"] ]], ["atrule", [ @@ -47,7 +54,7 @@ bar.png") ["url", [ ["function", "url"], ["punctuation", "("], - "\"https://cdn.jsdelivr.net/npm/prismj1.19.0/themes/prism-dark.css\"", + ["string", "\"https://cdn.jsdelivr.net/npm/prismj1.19.0/themes/prism-dark.css\""], ["punctuation", ")"] ]], ["punctuation", ";"] @@ -57,7 +64,7 @@ bar.png") ["url", [ ["function", "url"], ["punctuation", "("], - "\"https://cdn.jsdelivr.net/npm/prismjs/themes/prism-dark.css\"", + ["string", "\"https://cdn.jsdelivr.net/npm/prismjs/themes/prism-dark.css\""], ["punctuation", ")"] ]], ["punctuation", ";"]