From 005ba46924638b6709ed42f7bfe9c9bb9a01ca8d Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Wed, 10 Nov 2021 16:25:22 +0100 Subject: [PATCH] Haml: Improved filter and interpolation tokenization (#3191) --- components/prism-haml.js | 11 ++- components/prism-haml.min.js | 2 +- .../coffeescript_inclusion.test | 14 ++-- tests/languages/css+haml/css+haml_usage.test | 22 +++--- tests/languages/erb+haml/erb_inclusion.test | 42 +++++------ .../languages/haml/interpolation_feature.test | 10 ++- tests/languages/haml/tag_feature.test | 27 ++++--- .../javascript+haml/javascript_inclusion.test | 10 ++- tests/languages/less+haml/less_inclusion.test | 26 ++++--- .../markdown+haml/markdown_inclusion.test | 20 +++--- tests/languages/ruby+haml/ruby_inclusion.test | 70 ++++++++++--------- tests/languages/scss+haml/scss_inclusion.test | 40 +++++++---- .../textile+haml/textile_inclusion.test | 48 ++++++------- 13 files changed, 198 insertions(+), 144 deletions(-) diff --git a/components/prism-haml.js b/components/prism-haml.js index 69c2d6fd56..d1bc7ef336 100644 --- a/components/prism-haml.js +++ b/components/prism-haml.js @@ -95,7 +95,10 @@ pattern: /^#\{|\}$/, alias: 'punctuation' }, - rest: Prism.languages.ruby + 'ruby': { + pattern: /[\s\S]+/, + inside: Prism.languages.ruby + } } }, 'punctuation': { @@ -131,7 +134,11 @@ pattern: /^:[\w-]+/, alias: 'variable' }, - rest: Prism.languages[filter.language] + 'text': { + pattern: /[\s\S]+/, + alias: [filter.language, 'language-' + filter.language], + inside: Prism.languages[filter.language] + } } }; } diff --git a/components/prism-haml.min.js b/components/prism-haml.min.js index 24b4db4a50..cdde71d4ec 100644 --- a/components/prism-haml.min.js +++ b/components/prism-haml.min.js @@ -1 +1 @@ -!function(e){e.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:e.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:e.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:e.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:e.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:e.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:e.languages.ruby}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var t=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],n={},r=0,a=t.length;r]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:e.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:e.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:e.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},ruby:{pattern:/[\s\S]+/,inside:e.languages.ruby}}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var n=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],t={},r=0,a=n.length;r"] + ["text", [ + ["operator", "<"], + ["operator", "%"], + ["operator", "="], + " render ", + ["variable", "@products"], + ["operator", "||"], + ["string", ["\"empty_list\""]], + ["operator", "%"], + ["operator", ">"] + ]] ]], ["punctuation", "~"], ["filter-erb", [ ["filter-name", ":erb"], - ["operator", "<"], - ["operator", "%"], - ["operator", "="], - " render ", - ["variable", "@products"], - ["operator", "||"], - ["string", [ - "\"empty_list\"" - ]], - ["delimiter", "%>"] + ["text", [ + ["operator", "<"], + ["operator", "%"], + ["operator", "="], + " render ", + ["variable", "@products"], + ["operator", "||"], + ["string", ["\"empty_list\""]], + ["delimiter", "%>"] + ]] ]] ] diff --git a/tests/languages/haml/interpolation_feature.test b/tests/languages/haml/interpolation_feature.test index ed13c87a81..17d00e6924 100644 --- a/tests/languages/haml/interpolation_feature.test +++ b/tests/languages/haml/interpolation_feature.test @@ -6,16 +6,20 @@ [ ["interpolation", [ ["delimiter", "#{"], - ["number", "42"], + ["ruby", [ + ["number", "42"] + ]], ["delimiter", "}"] ]], ["interpolation", [ ["delimiter", "#{"], - ["string", ["\"foobar\""]], + ["ruby", [ + ["string", ["\"foobar\""]] + ]], ["delimiter", "}"] ]] ] ---------------------------------------------------- -Checks for interpolation in plain text. \ No newline at end of file +Checks for interpolation in plain text. diff --git a/tests/languages/haml/tag_feature.test b/tests/languages/haml/tag_feature.test index a1e0c0de8d..09f967f5e7 100644 --- a/tests/languages/haml/tag_feature.test +++ b/tests/languages/haml/tag_feature.test @@ -42,11 +42,14 @@ ["attributes", [ ["punctuation", "{"], ["symbol", ":type"], - ["operator", "="], ["operator", ">"], + ["operator", "="], + ["operator", ">"], ["string", ["\"text/javascript\""]], ["punctuation", ","], + ["symbol", ":src"], - ["operator", "="], ["operator", ">"], + ["operator", "="], + ["operator", ">"], ["string", [ "\"javascripts/script_", ["interpolation", [ @@ -65,7 +68,8 @@ ["attributes", [ ["punctuation", "{"], ["symbol", ":id"], - ["operator", "="], ["operator", ">"], + ["operator", "="], + ["operator", ">"], ["punctuation", "["], ["variable", "@item"], ["punctuation", "."], @@ -88,8 +92,8 @@ ["attr-value", "@title"], ["attr-name", "href"], ["punctuation", "="], - ["attr-value", "href"], - ["punctuation", ")"] + ["attr-value", "href"], + ["punctuation", ")"] ]] ]], ["tag", [ @@ -138,7 +142,8 @@ ["attributes", [ ["punctuation", "{"], ["symbol", ":id"], - ["operator", "="], ["operator", ">"], + ["operator", "="], + ["operator", ">"], ["variable", "@article"], ["punctuation", "."], "number", @@ -150,8 +155,14 @@ ["tag", [".item"]], ["tag", ["%br/"]], - ["tag", ["%blockquote", ["punctuation", "<"]]], - ["tag", ["%img", ["punctuation", ">"]]] + ["tag", [ + "%blockquote", + ["punctuation", "<"] + ]], + ["tag", [ + "%img", + ["punctuation", ">"] + ]] ] ---------------------------------------------------- diff --git a/tests/languages/javascript+haml/javascript_inclusion.test b/tests/languages/javascript+haml/javascript_inclusion.test index 2420e60f12..2faae7b676 100644 --- a/tests/languages/javascript+haml/javascript_inclusion.test +++ b/tests/languages/javascript+haml/javascript_inclusion.test @@ -10,15 +10,19 @@ [ ["filter-javascript", [ ["filter-name", ":javascript"], - ["number", "0xBadFace"] + ["text", [ + ["number", "0xBadFace"] + ]] ]], ["punctuation", "~"], ["filter-javascript", [ ["filter-name", ":javascript"], - ["number", "0xBadFace"] + ["text", [ + ["number", "0xBadFace"] + ]] ]] ] ---------------------------------------------------- -Checks for JavaScript filter in Haml. The tilde serves only as a separator. \ No newline at end of file +Checks for JavaScript filter in Haml. The tilde serves only as a separator. diff --git a/tests/languages/less+haml/less_inclusion.test b/tests/languages/less+haml/less_inclusion.test index fffe2ca74e..ae8db1a307 100644 --- a/tests/languages/less+haml/less_inclusion.test +++ b/tests/languages/less+haml/less_inclusion.test @@ -10,23 +10,27 @@ [ ["filter-less", [ ["filter-name", ":less"], - ["selector", [".foo"]], - ["punctuation", "{"], - ["mixin-usage", ".bar"], - ["punctuation", ";"], - ["punctuation", "}"] + ["text", [ + ["selector", [".foo"]], + ["punctuation", "{"], + ["mixin-usage", ".bar"], + ["punctuation", ";"], + ["punctuation", "}"] + ]] ]], ["punctuation", "~"], ["filter-less", [ ["filter-name", ":less"], - ["selector", [".foo"]], - ["punctuation", "{"], - ["mixin-usage", ".bar"], - ["punctuation", ";"], - ["punctuation", "}"] + ["text", [ + ["selector", [".foo"]], + ["punctuation", "{"], + ["mixin-usage", ".bar"], + ["punctuation", ";"], + ["punctuation", "}"] + ]] ]] ] ---------------------------------------------------- -Checks for Less filter in Haml. The tilde serves only as a separator. \ No newline at end of file +Checks for Less filter in Haml. The tilde serves only as a separator. diff --git a/tests/languages/markdown+haml/markdown_inclusion.test b/tests/languages/markdown+haml/markdown_inclusion.test index 4a75fa9cc2..c0b9224640 100644 --- a/tests/languages/markdown+haml/markdown_inclusion.test +++ b/tests/languages/markdown+haml/markdown_inclusion.test @@ -10,18 +10,22 @@ [ ["filter-markdown", [ ["filter-name", ":markdown"], - ["title", [ - ["punctuation", "#"], - " Title 1" + ["text", [ + ["title", [ + ["punctuation", "#"], + " Title 1" + ]] ]] ]], ["punctuation", "~"], ["filter-markdown", [ ["filter-name", ":markdown"], - ["title", [ - ["punctuation", "#"], - " Title 1" - ]] + ["text", [ + ["title", [ + ["punctuation", "#"], + " Title 1" + ]] + ]] ]] ] @@ -29,4 +33,4 @@ Checks for Markdown filter in Haml. The tilde serves only as a separator. Indentation is intentionally less than 1 tab, otherwise markdown is -interpreted as code. \ No newline at end of file +interpreted as code. diff --git a/tests/languages/ruby+haml/ruby_inclusion.test b/tests/languages/ruby+haml/ruby_inclusion.test index dc1cd7cb25..f1bbc0f006 100644 --- a/tests/languages/ruby+haml/ruby_inclusion.test +++ b/tests/languages/ruby+haml/ruby_inclusion.test @@ -14,45 +14,47 @@ [ ["filter-ruby", [ ["filter-name", ":ruby"], - - ["keyword", "def"], - ["method-definition", [ - ["function", "circumference"] - ]], - - ["constant", "Math"], - ["punctuation", ":"], - ["punctuation", ":"], - ["constant", "PI"], - ["operator", "*"], - " radius ", - ["operator", "*"], - ["operator", "*"], - ["number", "2"], - - ["keyword", "end"] + ["text", [ + ["keyword", "def"], + ["method-definition", [ + ["function", "circumference"] + ]], + + ["constant", "Math"], + ["punctuation", ":"], + ["punctuation", ":"], + ["constant", "PI"], + ["operator", "*"], + " radius ", + ["operator", "*"], + ["operator", "*"], + ["number", "2"], + + ["keyword", "end"] + ]] ]], ["punctuation", "~"], ["filter-ruby", [ ["filter-name", ":ruby"], - - ["keyword", "def"], - ["method-definition", [ - ["function", "circumference"] - ]], - - ["constant", "Math"], - ["punctuation", ":"], - ["punctuation", ":"], - ["constant", "PI"], - ["operator", "*"], - " radius ", - ["operator", "*"], - ["operator", "*"], - ["number", "2"], - - ["keyword", "end"] + ["text", [ + ["keyword", "def"], + ["method-definition", [ + ["function", "circumference"] + ]], + + ["constant", "Math"], + ["punctuation", ":"], + ["punctuation", ":"], + ["constant", "PI"], + ["operator", "*"], + " radius ", + ["operator", "*"], + ["operator", "*"], + ["number", "2"], + + ["keyword", "end"] + ]] ]] ] diff --git a/tests/languages/scss+haml/scss_inclusion.test b/tests/languages/scss+haml/scss_inclusion.test index b2c545c45c..ab69f07839 100644 --- a/tests/languages/scss+haml/scss_inclusion.test +++ b/tests/languages/scss+haml/scss_inclusion.test @@ -14,27 +14,37 @@ [ ["filter-scss", [ ["filter-name", ":scss"], - ["selector", ["#main "]], - ["punctuation", "{"], - ["property", ["width"]], - ["punctuation", ":"], - ["variable", "$width"], - ["punctuation", ";"], - ["punctuation", "}"] + ["text", [ + ["selector", ["#main "]], + ["punctuation", "{"], + + ["property", ["width"]], + ["punctuation", ":"], + ["variable", "$width"], + ["punctuation", ";"], + + ["punctuation", "}"] + ]] ]], + ["punctuation", "~"], + ["filter-scss", [ ["filter-name", ":scss"], - ["selector", ["#main "]], - ["punctuation", "{"], - ["property", ["width"]], - ["punctuation", ":"], - ["variable", "$width"], - ["punctuation", ";"], - ["punctuation", "}"] + ["text", [ + ["selector", ["#main "]], + ["punctuation", "{"], + + ["property", ["width"]], + ["punctuation", ":"], + ["variable", "$width"], + ["punctuation", ";"], + + ["punctuation", "}"] + ]] ]] ] ---------------------------------------------------- -Checks for CSS filter in Haml. The tilde serves only as a separator. \ No newline at end of file +Checks for CSS filter in Haml. The tilde serves only as a separator. diff --git a/tests/languages/textile+haml/textile_inclusion.test b/tests/languages/textile+haml/textile_inclusion.test index c6474027ef..2bdd989b44 100644 --- a/tests/languages/textile+haml/textile_inclusion.test +++ b/tests/languages/textile+haml/textile_inclusion.test @@ -10,41 +10,41 @@ [ ["filter-textile", [ ["filter-name", ":textile"], - - ["tag", [ + ["text", [ ["tag", [ - ["punctuation", "<"], - "div" + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["punctuation", ">"] ]], - ["punctuation", ">"] - ]], - ["tag", [ ["tag", [ - ["punctuation", ""] + ["tag", [ + ["punctuation", ""] + ]] ]] ]], - ["punctuation", "~"], - ["filter-textile", [ ["filter-name", ":textile"], - - ["tag", [ + ["text", [ ["tag", [ - ["punctuation", "<"], - "div" + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["punctuation", ">"] ]], - ["punctuation", ">"] - ]], - ["tag", [ ["tag", [ - ["punctuation", ""] + ["tag", [ + ["punctuation", ""] + ]] ]] ]] ]