From b5abdd7aca745db36f0af882f6882d0d7e769a3c Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Sat, 20 Feb 2021 13:17:38 -0800 Subject: [PATCH 01/17] Update elixir Add support for @doc, @moduledoc, atom modules, function call tokens & raise keyword --- components/prism-elixir.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index cfad1c8841..cf75e5d1be 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -1,5 +1,14 @@ Prism.languages.elixir = { 'comment': /#.*/m, + 'doc': { + pattern: /@doc.*/, + alias: 'doc-comment' + }, + 'moduledoc': { + pattern: /@moduledoc\s+("""|''')[\s\S]*\1/, + greedy: true, + alias: 'doc-comment' + }, // ~r"""foo""" (multi-line), ~r'''foo''' (multi-line), ~r/foo/, ~r|foo|, ~r"foo", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r 'regex': { pattern: /~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/, @@ -36,6 +45,9 @@ Prism.languages.elixir = { lookbehind: true, alias: 'symbol' }, + 'class-name': { + pattern: /\b[A-Z](?:[A-Z_a-z]|\dx?)*\b/ + }, // Look-ahead prevents bad highlighting of the :: operator 'attr-name': /\w+\??:(?!:)/, 'capture': { @@ -44,6 +56,10 @@ Prism.languages.elixir = { lookbehind: true, alias: 'function' }, + 'function-call': { + pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(\?|!)?(?=\s*(?:\.\s*\s*)?\()/, + alias: 'function' + }, 'argument': { // Look-behind prevents bad highlighting of the && operator pattern: /(^|[^&])&\d+/, @@ -55,7 +71,7 @@ Prism.languages.elixir = { alias: 'variable' }, 'number': /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i, - 'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|require|rescue|try|unless|use|when)\b/, + 'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/, 'boolean': /\b(?:true|false|nil)\b/, 'operator': [ /\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/, From 2b6afff311771c4f685b2479bea34e880f6db731 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 01:17:26 -0800 Subject: [PATCH 02/17] Give precedence to doc/moduledoc than comment --- components/prism-elixir.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index cf75e5d1be..e9e5233679 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -1,14 +1,9 @@ Prism.languages.elixir = { - 'comment': /#.*/m, 'doc': { - pattern: /@doc.*/, - alias: 'doc-comment' - }, - 'moduledoc': { - pattern: /@moduledoc\s+("""|''')[\s\S]*\1/, - greedy: true, + pattern: /@(?:doc|moduledoc)\s+(?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|.*)/, alias: 'doc-comment' }, + 'comment': /#.*/m, // ~r"""foo""" (multi-line), ~r'''foo''' (multi-line), ~r/foo/, ~r|foo|, ~r"foo", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r 'regex': { pattern: /~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/, From 311a5081037d3a286cf8777053dc58414187c5cf Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 01:17:40 -0800 Subject: [PATCH 03/17] Simplify patterns --- components/prism-elixir.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index e9e5233679..4f601b67bf 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -40,8 +40,9 @@ Prism.languages.elixir = { lookbehind: true, alias: 'symbol' }, - 'class-name': { - pattern: /\b[A-Z](?:[A-Z_a-z]|\dx?)*\b/ + 'atom-module': { + pattern: /\b[A-Z][A-Z_a-z0-9]*\b/, + alias: 'class-name' }, // Look-ahead prevents bad highlighting of the :: operator 'attr-name': /\w+\??:(?!:)/, @@ -52,7 +53,7 @@ Prism.languages.elixir = { alias: 'function' }, 'function-call': { - pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(\?|!)?(?=\s*(?:\.\s*\s*)?\()/, + pattern: /[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\?|!)?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/, alias: 'function' }, 'argument': { @@ -81,7 +82,7 @@ Prism.languages.elixir = { lookbehind: true } ], - 'punctuation': /<<|>>|[.,%\[\]{}()]/ + 'punctuation': /<<|>>|[.,%\[\]{}()]/, }; Prism.languages.insertBefore('elixir', 'keyword', { From 8a2a8c2e6b088004036e3bae1d7dffca44c91f4d Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 01:17:46 -0800 Subject: [PATCH 04/17] Update test-suite --- tests/languages/elixir/attribute_feature.test | 6 ++---- tests/languages/elixir/capture_feature.test | 11 ++++++++--- tests/languages/elixir/issue1392.test | 6 +++--- tests/languages/elixir/issue775.test | 7 ++----- tests/languages/elixir/keyword_feature.test | 4 ++-- tests/languages/elixir/module_feature.test | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/languages/elixir/attribute_feature.test b/tests/languages/elixir/attribute_feature.test index 273c2a402f..393302578a 100644 --- a/tests/languages/elixir/attribute_feature.test +++ b/tests/languages/elixir/attribute_feature.test @@ -8,12 +8,10 @@ foobar [ ["attribute", "@vsn"], ["number", "2"], - ["attribute", "@moduledoc"], ["string", [ - "\"\"\"\r\nfoobar\r\n\"\"\"" - ]], + ["doc", "@moduledoc \"\"\"\r\nfoobar\r\n\"\"\""], ["attribute", "@tag"], ["atom", ":external"] ] ---------------------------------------------------- -Checks for module attributes. \ No newline at end of file +Checks for module attributes. diff --git a/tests/languages/elixir/capture_feature.test b/tests/languages/elixir/capture_feature.test index 8a64b66154..33ca246db7 100644 --- a/tests/languages/elixir/capture_feature.test +++ b/tests/languages/elixir/capture_feature.test @@ -7,7 +7,10 @@ fun = &(&1 + 1) [ "fun ", ["operator", "="], - ["capture", "&Math.zero?/1"], + ["operator", "&"], + ["atom-module", "Math"], + ["punctuation", "."], + ["function-call", "zero?/1"], ["punctuation", "("], ["capture", "&is_function/1"], ["punctuation", ")"], @@ -17,7 +20,9 @@ fun = &(&1 + 1) ["capture", "&"], ["punctuation", "("], ["argument", "&1"], ["operator", "+"], ["number", "1"], ["punctuation", ")"], - ["capture", "&List.flatten"], + ["operator", "&"], + ["atom-module", "List"], + ["punctuation", "."], ["function-call", "flatten"], ["punctuation", "("], ["argument", "&1"], ["punctuation", ","], ["argument", "&2"], ["punctuation", ")"] @@ -25,4 +30,4 @@ fun = &(&1 + 1) ---------------------------------------------------- -Checks for function capturing and arguments. \ No newline at end of file +Checks for function capturing and arguments. diff --git a/tests/languages/elixir/issue1392.test b/tests/languages/elixir/issue1392.test index c7d20a8366..61ae98a27d 100644 --- a/tests/languages/elixir/issue1392.test +++ b/tests/languages/elixir/issue1392.test @@ -3,9 +3,9 @@ String.upcase(@fixed) ---------------------------------------------------- [ - "String", + ["atom-module", "String"], ["punctuation", "."], - "upcase", + ["function-call", "upcase"], ["punctuation", "("], ["attribute", "@fixed"], ["punctuation", ")"] @@ -13,4 +13,4 @@ String.upcase(@fixed) ---------------------------------------------------- -Ensure module attributes don't consume punctuation. \ No newline at end of file +Ensure module attributes don't consume punctuation. diff --git a/tests/languages/elixir/issue775.test b/tests/languages/elixir/issue775.test index d3243f80a8..65d822ebfc 100644 --- a/tests/languages/elixir/issue775.test +++ b/tests/languages/elixir/issue775.test @@ -5,13 +5,10 @@ ---------------------------------------------------- [ - ["attribute", "@doc"], - ["string", [ - "\"\"\"\r\n## Parameters\r\n\"\"\"" - ]] + ["doc", "@doc \"\"\"\r\n## Parameters\r\n\"\"\""] ] ---------------------------------------------------- Ensures that markdown headers are not highlighted as comments inside strings. -See #775 for details. \ No newline at end of file +See #775 for details. diff --git a/tests/languages/elixir/keyword_feature.test b/tests/languages/elixir/keyword_feature.test index 6a851f1b24..c4f56fed67 100644 --- a/tests/languages/elixir/keyword_feature.test +++ b/tests/languages/elixir/keyword_feature.test @@ -9,7 +9,7 @@ defdelegate defstruct do else end fn for if import not or -require rescue try +raise require rescue try unless use when ---------------------------------------------------- @@ -26,7 +26,7 @@ unless use when ["keyword", "defstruct"], ["keyword", "do"], ["keyword", "else"], ["keyword", "end"], ["keyword", "fn"], ["keyword", "for"], ["keyword", "if"], ["keyword", "import"], ["keyword", "not"], ["keyword", "or"], - ["keyword", "require"], ["keyword", "rescue"], ["keyword", "try"], + ["keyword", "raise"], ["keyword", "require"], ["keyword", "rescue"], ["keyword", "try"], ["keyword", "unless"], ["keyword", "use"], ["keyword", "when"] ] diff --git a/tests/languages/elixir/module_feature.test b/tests/languages/elixir/module_feature.test index c0236d0bb7..effa744a3b 100644 --- a/tests/languages/elixir/module_feature.test +++ b/tests/languages/elixir/module_feature.test @@ -7,10 +7,10 @@ end ---------------------------------------------------- [ - ["keyword", "defmodule"], ["module", "Math"], ["keyword", "do"], + ["keyword", "defmodule"], ["atom-module", "Math"], ["keyword", "do"], ["keyword", "def"], - ["function", "sum"], + ["function-call", "sum"], ["punctuation", "("], "a", ["punctuation", ","], From 6b61080d478fc4546d7ca87408c875c41bc4f6d0 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 09:04:12 -0800 Subject: [PATCH 05/17] Update components/prism-elixir.js Co-authored-by: Michael Schmidt --- components/prism-elixir.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index 4f601b67bf..5ec0786785 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -41,7 +41,7 @@ Prism.languages.elixir = { alias: 'symbol' }, 'atom-module': { - pattern: /\b[A-Z][A-Z_a-z0-9]*\b/, + pattern: /\b[A-Z]\w*\b/, alias: 'class-name' }, // Look-ahead prevents bad highlighting of the :: operator From 4d7d9b3879e2106e8c9facf04e3ebd73a66f0a1d Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 09:32:34 -0800 Subject: [PATCH 06/17] Code review fixes --- components/prism-elixir.js | 20 ++++++++++---------- components/prism-elixir.min.js | 2 +- tests/languages/elixir/capture_feature.test | 4 +++- tests/languages/elixir/module_feature.test | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index 5ec0786785..62372899b9 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -1,6 +1,6 @@ Prism.languages.elixir = { 'doc': { - pattern: /@(?:doc|moduledoc)\s+(?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|.*)/, + pattern: /@(?:doc|moduledoc)\s+(?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|.*)/, alias: 'doc-comment' }, 'comment': /#.*/m, @@ -40,10 +40,10 @@ Prism.languages.elixir = { lookbehind: true, alias: 'symbol' }, - 'atom-module': { - pattern: /\b[A-Z]\w*\b/, - alias: 'class-name' - }, + 'atom-module': { + pattern: /\b[A-Z]\w*\b/, + alias: 'class-name' + }, // Look-ahead prevents bad highlighting of the :: operator 'attr-name': /\w+\??:(?!:)/, 'capture': { @@ -52,10 +52,6 @@ Prism.languages.elixir = { lookbehind: true, alias: 'function' }, - 'function-call': { - pattern: /[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\?|!)?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/, - alias: 'function' - }, 'argument': { // Look-behind prevents bad highlighting of the && operator pattern: /(^|[^&])&\d+/, @@ -68,6 +64,10 @@ Prism.languages.elixir = { }, 'number': /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i, 'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/, + 'function-call': { + pattern: /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/, + alias: 'function' + }, 'boolean': /\b(?:true|false|nil)\b/, 'operator': [ /\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/, @@ -82,7 +82,7 @@ Prism.languages.elixir = { lookbehind: true } ], - 'punctuation': /<<|>>|[.,%\[\]{}()]/, + 'punctuation': /<<|>>|[.,%\[\]{}()]/ }; Prism.languages.insertBefore('elixir', 'keyword', { diff --git a/components/prism-elixir.min.js b/components/prism-elixir.min.js index ee6542e41f..8c4dc22ad7 100644 --- a/components/prism-elixir.min.js +++ b/components/prism-elixir.min.js @@ -1 +1 @@ -Prism.languages.elixir={comment:/#.*/m,regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},"attr-name":/\w+\??:(?!:)/,capture:{pattern:/(^|[^&])&(?:[^&\s\d()][^\s()]*|(?=\())/,lookbehind:!0,alias:"function"},argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|require|rescue|try|unless|use|when)\b/,boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.insertBefore("elixir","keyword",{module:{pattern:/\b(defmodule\s)[A-Z][\w.\\]+/,lookbehind:!0,alias:"class-name"},function:{pattern:/\b(defp?\s)[\w.\\]+/,lookbehind:!0}}),Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|.*)/,alias:"doc-comment"},comment:/#.*/m,regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},"atom-module":{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\w+\??:(?!:)/,capture:{pattern:/(^|[^&])&(?:[^&\s\d()][^\s()]*|(?=\())/,lookbehind:!0,alias:"function"},argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/,"function-call":{pattern:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/,alias:"function"},boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.insertBefore("elixir","keyword",{module:{pattern:/\b(defmodule\s)[A-Z][\w.\\]+/,lookbehind:!0,alias:"class-name"},function:{pattern:/\b(defp?\s)[\w.\\]+/,lookbehind:!0}}),Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file diff --git a/tests/languages/elixir/capture_feature.test b/tests/languages/elixir/capture_feature.test index 33ca246db7..070c8f974a 100644 --- a/tests/languages/elixir/capture_feature.test +++ b/tests/languages/elixir/capture_feature.test @@ -10,7 +10,9 @@ fun = &(&1 + 1) ["operator", "&"], ["atom-module", "Math"], ["punctuation", "."], - ["function-call", "zero?/1"], + "zero?", + ["operator", "/"], + ["number", "1"], ["punctuation", "("], ["capture", "&is_function/1"], ["punctuation", ")"], diff --git a/tests/languages/elixir/module_feature.test b/tests/languages/elixir/module_feature.test index effa744a3b..60c5aec8ad 100644 --- a/tests/languages/elixir/module_feature.test +++ b/tests/languages/elixir/module_feature.test @@ -10,7 +10,7 @@ end ["keyword", "defmodule"], ["atom-module", "Math"], ["keyword", "do"], ["keyword", "def"], - ["function-call", "sum"], + ["function", "sum"], ["punctuation", "("], "a", ["punctuation", ","], From c114f6c0af2e504d1ad5dc111a2f323d8e6364a3 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 18:39:51 -0800 Subject: [PATCH 07/17] Replace module & function with supersets --- components/prism-elixir.js | 19 +++---------------- tests/languages/elixir/capture_feature.test | 6 +++--- tests/languages/elixir/issue1392.test | 4 ++-- tests/languages/elixir/module_feature.test | 2 +- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index 62372899b9..2bab8866e5 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -40,7 +40,7 @@ Prism.languages.elixir = { lookbehind: true, alias: 'symbol' }, - 'atom-module': { + 'module': { pattern: /\b[A-Z]\w*\b/, alias: 'class-name' }, @@ -64,9 +64,8 @@ Prism.languages.elixir = { }, 'number': /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i, 'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/, - 'function-call': { - pattern: /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/, - alias: 'function' + 'function': { + pattern: /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/ }, 'boolean': /\b(?:true|false|nil)\b/, 'operator': [ @@ -85,18 +84,6 @@ Prism.languages.elixir = { 'punctuation': /<<|>>|[.,%\[\]{}()]/ }; -Prism.languages.insertBefore('elixir', 'keyword', { - 'module': { - pattern: /\b(defmodule\s)[A-Z][\w.\\]+/, - lookbehind: true, - alias: 'class-name' - }, - 'function': { - pattern: /\b(defp?\s)[\w.\\]+/, - lookbehind: true - } -}); - Prism.languages.elixir.string.forEach(function(o) { o.inside = { 'interpolation': { diff --git a/tests/languages/elixir/capture_feature.test b/tests/languages/elixir/capture_feature.test index 070c8f974a..431f431011 100644 --- a/tests/languages/elixir/capture_feature.test +++ b/tests/languages/elixir/capture_feature.test @@ -8,7 +8,7 @@ fun = &(&1 + 1) [ "fun ", ["operator", "="], ["operator", "&"], - ["atom-module", "Math"], + ["module", "Math"], ["punctuation", "."], "zero?", ["operator", "/"], @@ -23,8 +23,8 @@ fun = &(&1 + 1) ["punctuation", "("], ["argument", "&1"], ["operator", "+"], ["number", "1"], ["punctuation", ")"], ["operator", "&"], - ["atom-module", "List"], - ["punctuation", "."], ["function-call", "flatten"], + ["module", "List"], + ["punctuation", "."], ["function", "flatten"], ["punctuation", "("], ["argument", "&1"], ["punctuation", ","], ["argument", "&2"], ["punctuation", ")"] diff --git a/tests/languages/elixir/issue1392.test b/tests/languages/elixir/issue1392.test index 61ae98a27d..1c0c93b3aa 100644 --- a/tests/languages/elixir/issue1392.test +++ b/tests/languages/elixir/issue1392.test @@ -3,9 +3,9 @@ String.upcase(@fixed) ---------------------------------------------------- [ - ["atom-module", "String"], + ["module", "String"], ["punctuation", "."], - ["function-call", "upcase"], + ["function", "upcase"], ["punctuation", "("], ["attribute", "@fixed"], ["punctuation", ")"] diff --git a/tests/languages/elixir/module_feature.test b/tests/languages/elixir/module_feature.test index 60c5aec8ad..c0236d0bb7 100644 --- a/tests/languages/elixir/module_feature.test +++ b/tests/languages/elixir/module_feature.test @@ -7,7 +7,7 @@ end ---------------------------------------------------- [ - ["keyword", "defmodule"], ["atom-module", "Math"], ["keyword", "do"], + ["keyword", "defmodule"], ["module", "Math"], ["keyword", "do"], ["keyword", "def"], ["function", "sum"], From 183fa9461a6cb9e1dade980fd0ff402e025dc5d7 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 18:40:10 -0800 Subject: [PATCH 08/17] Update doc to only parse strings --- components/prism-elixir.js | 3 +- tests/languages/elixir/doc_feature.test | 56 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 tests/languages/elixir/doc_feature.test diff --git a/components/prism-elixir.js b/components/prism-elixir.js index 2bab8866e5..a8ad61c21c 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -1,7 +1,6 @@ Prism.languages.elixir = { 'doc': { - pattern: /@(?:doc|moduledoc)\s+(?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|.*)/, - alias: 'doc-comment' + pattern: /@(?:doc|moduledoc)\s+("{1,3}|'{1,3})(?:\\[\s\S]|(?!\1)[^\\])+\1/ }, 'comment': /#.*/m, // ~r"""foo""" (multi-line), ~r'''foo''' (multi-line), ~r/foo/, ~r|foo|, ~r"foo", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r diff --git a/tests/languages/elixir/doc_feature.test b/tests/languages/elixir/doc_feature.test new file mode 100644 index 0000000000..4f0ff6d043 --- /dev/null +++ b/tests/languages/elixir/doc_feature.test @@ -0,0 +1,56 @@ +@doc "single" +@doc 'single' +@doc """triple""" +@doc '''triple''' +@doc ''' +multiline +''' +@doc """ +multiline +""" +@doc since: "1.3.0" +@doc deprecated: "phased out" + +@moduledoc "single" +@moduledoc 'single' +@moduledoc """triple""" +@moduledoc '''triple''' +@moduledoc ''' +multiline +''' +@moduledoc """ +multiline +""" +@moduledoc since: "1.3.0" +@moduledoc deprecated: "phased out" + +---------------------------------------------------- + +[ + [ "doc", "@doc \"single\"" ], + [ "doc", "@doc 'single'" ], + [ "doc", "@doc \"\"\"triple\"\"\"" ], + [ "doc", "@doc '''triple'''" ], + [ "doc", "@doc '''\nmultiline\n'''" ], + [ "doc", "@doc \"\"\"\nmultiline\n\"\"\"" ], + [ "attribute", "@doc" ], + [ "attr-name", "since:" ], + [ "string", [ "\"1.3.0\"" ] ], + [ "attribute", "@doc" ], + [ "attr-name", "deprecated:" ], + [ "string", [ "\"phased out\"" ] ], + [ "doc", "@moduledoc \"single\"" ], + [ "doc", "@moduledoc 'single'" ], + [ "doc", "@moduledoc \"\"\"triple\"\"\"" ], + [ "doc", "@moduledoc '''triple'''" ], + [ "doc", "@moduledoc '''\nmultiline\n'''" ], + [ "doc", "@moduledoc \"\"\"\nmultiline\n\"\"\"" ], + [ "attribute", "@moduledoc" ], + [ "attr-name", "since:" ], + [ "string", [ "\"1.3.0\"" ] ], + [ "attribute", "@moduledoc" ], + [ "attr-name", "deprecated:" ], + [ "string", [ "\"phased out\"" ] ] +] + +---------------------------------------------------- From 9b06d01536e57328c2046b3f02b392be239b4ae9 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Tue, 23 Feb 2021 18:40:14 -0800 Subject: [PATCH 09/17] Update build --- components/prism-elixir.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-elixir.min.js b/components/prism-elixir.min.js index 8c4dc22ad7..b1e207dfc0 100644 --- a/components/prism-elixir.min.js +++ b/components/prism-elixir.min.js @@ -1 +1 @@ -Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|.*)/,alias:"doc-comment"},comment:/#.*/m,regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},"atom-module":{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\w+\??:(?!:)/,capture:{pattern:/(^|[^&])&(?:[^&\s\d()][^\s()]*|(?=\())/,lookbehind:!0,alias:"function"},argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/,"function-call":{pattern:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/,alias:"function"},boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.insertBefore("elixir","keyword",{module:{pattern:/\b(defmodule\s)[A-Z][\w.\\]+/,lookbehind:!0,alias:"class-name"},function:{pattern:/\b(defp?\s)[\w.\\]+/,lookbehind:!0}}),Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+("{1,3}|'{1,3})(?:\\[\s\S]|(?!\1)[^\\])+\1/},comment:/#.*/m,regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\w+\??:(?!:)/,capture:{pattern:/(^|[^&])&(?:[^&\s\d()][^\s()]*|(?=\())/,lookbehind:!0,alias:"function"},argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/,function:{pattern:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/},boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file From 514fa4888d7f00708161134869c754c050928ba9 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 11:40:50 -0800 Subject: [PATCH 10/17] Update components/prism-elixir.js Co-authored-by: Michael Schmidt --- components/prism-elixir.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index a8ad61c21c..1a8d20853c 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -63,9 +63,7 @@ Prism.languages.elixir = { }, 'number': /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i, 'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/, - 'function': { - pattern: /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/ - }, + 'function': /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/, 'boolean': /\b(?:true|false|nil)\b/, 'operator': [ /\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/, From 6947c69d4d7c56a96a8fca1794f65a549268b069 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 11:41:04 -0800 Subject: [PATCH 11/17] Update components/prism-elixir.js Co-authored-by: Michael Schmidt --- components/prism-elixir.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index 1a8d20853c..fd35565d91 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -2,7 +2,10 @@ Prism.languages.elixir = { 'doc': { pattern: /@(?:doc|moduledoc)\s+("{1,3}|'{1,3})(?:\\[\s\S]|(?!\1)[^\\])+\1/ }, - 'comment': /#.*/m, + 'comment': { + pattern: /#.*/m, + greedy: true + }, // ~r"""foo""" (multi-line), ~r'''foo''' (multi-line), ~r/foo/, ~r|foo|, ~r"foo", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r 'regex': { pattern: /~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/, From dac119b61cd05b99632b08095a77a10816fec733 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 11:41:12 -0800 Subject: [PATCH 12/17] Update components/prism-elixir.js Co-authored-by: Michael Schmidt --- components/prism-elixir.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index fd35565d91..812860435b 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -1,6 +1,6 @@ Prism.languages.elixir = { 'doc': { - pattern: /@(?:doc|moduledoc)\s+("{1,3}|'{1,3})(?:\\[\s\S]|(?!\1)[^\\])+\1/ + pattern: /@(?:doc|moduledoc)\s+(?:("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|("""|''')[\s\S]*?\2)/ }, 'comment': { pattern: /#.*/m, From db13dfd5eaa77e4023c3726279758095e209b1a8 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 12:18:13 -0800 Subject: [PATCH 13/17] Code review changes --- components/prism-elixir.js | 6 ++++- tests/languages/elixir/attribute_feature.test | 2 +- tests/languages/elixir/doc_feature.test | 24 +++++++++---------- tests/languages/elixir/issue775.test | 8 ++++++- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index 812860435b..6c2bc9a252 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -1,6 +1,10 @@ Prism.languages.elixir = { 'doc': { - pattern: /@(?:doc|moduledoc)\s+(?:("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|("""|''')[\s\S]*?\2)/ + pattern: /@(?:doc|moduledoc)\s+("|'|"""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1/, + inside: { + 'attribute': /^@\w+/, + 'string': /['"][\s\S]+/ + } }, 'comment': { pattern: /#.*/m, diff --git a/tests/languages/elixir/attribute_feature.test b/tests/languages/elixir/attribute_feature.test index 393302578a..52c0bc1c6d 100644 --- a/tests/languages/elixir/attribute_feature.test +++ b/tests/languages/elixir/attribute_feature.test @@ -8,7 +8,7 @@ foobar [ ["attribute", "@vsn"], ["number", "2"], - ["doc", "@moduledoc \"\"\"\r\nfoobar\r\n\"\"\""], + ["doc", [ ["attribute", "@moduledoc" ], [ "string", "\"\"\"\r\nfoobar\r\n\"\"\"" ] ] ], ["attribute", "@tag"], ["atom", ":external"] ] diff --git a/tests/languages/elixir/doc_feature.test b/tests/languages/elixir/doc_feature.test index 4f0ff6d043..27e8ceadbb 100644 --- a/tests/languages/elixir/doc_feature.test +++ b/tests/languages/elixir/doc_feature.test @@ -27,24 +27,24 @@ multiline ---------------------------------------------------- [ - [ "doc", "@doc \"single\"" ], - [ "doc", "@doc 'single'" ], - [ "doc", "@doc \"\"\"triple\"\"\"" ], - [ "doc", "@doc '''triple'''" ], - [ "doc", "@doc '''\nmultiline\n'''" ], - [ "doc", "@doc \"\"\"\nmultiline\n\"\"\"" ], + [ "doc", [ [ "attribute", "@doc" ], [ "string", "\"single\"" ] ] ], + [ "doc", [ [ "attribute", "@doc" ], [ "string", "'single'" ] ] ], + [ "doc", [ [ "attribute", "@doc" ], [ "string", "\"\"\"triple\"\"\"" ] ] ], + [ "doc", [ [ "attribute", "@doc" ], [ "string", "'''triple'''" ] ] ], + [ "doc", [ [ "attribute", "@doc" ], [ "string", "'''\nmultiline\n'''" ] ] ], + [ "doc", [ [ "attribute", "@doc" ], [ "string", "\"\"\"\nmultiline\n\"\"\"" ] ] ], [ "attribute", "@doc" ], [ "attr-name", "since:" ], [ "string", [ "\"1.3.0\"" ] ], [ "attribute", "@doc" ], [ "attr-name", "deprecated:" ], [ "string", [ "\"phased out\"" ] ], - [ "doc", "@moduledoc \"single\"" ], - [ "doc", "@moduledoc 'single'" ], - [ "doc", "@moduledoc \"\"\"triple\"\"\"" ], - [ "doc", "@moduledoc '''triple'''" ], - [ "doc", "@moduledoc '''\nmultiline\n'''" ], - [ "doc", "@moduledoc \"\"\"\nmultiline\n\"\"\"" ], + [ "doc", [ [ "attribute", "@moduledoc" ], [ "string", "\"single\"" ] ] ], + [ "doc", [ [ "attribute", "@moduledoc" ], [ "string", "'single'" ] ] ], + [ "doc", [ [ "attribute", "@moduledoc" ], [ "string", "\"\"\"triple\"\"\"" ] ] ], + [ "doc", [ [ "attribute", "@moduledoc" ], [ "string", "'''triple'''" ] ] ], + [ "doc", [ [ "attribute", "@moduledoc" ], [ "string", "'''\nmultiline\n'''" ] ] ], + [ "doc", [ [ "attribute", "@moduledoc" ], [ "string", "\"\"\"\nmultiline\n\"\"\"" ] ] ], [ "attribute", "@moduledoc" ], [ "attr-name", "since:" ], [ "string", [ "\"1.3.0\"" ] ], diff --git a/tests/languages/elixir/issue775.test b/tests/languages/elixir/issue775.test index 65d822ebfc..9804bba6d9 100644 --- a/tests/languages/elixir/issue775.test +++ b/tests/languages/elixir/issue775.test @@ -5,7 +5,13 @@ ---------------------------------------------------- [ - ["doc", "@doc \"\"\"\r\n## Parameters\r\n\"\"\""] + [ + "doc", + [ + [ "attribute", "@doc" ], + [ "string", "\"\"\"\r\n## Parameters\r\n\"\"\"" ] + ] + ] ] ---------------------------------------------------- From df1647e328677c8cae6145e7292d3a78071e4bd7 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 12:41:20 -0800 Subject: [PATCH 14/17] Update function tokenizer --- components/prism-elixir.js | 8 +----- tests/languages/elixir/capture_feature.test | 31 +++++++++++++++++---- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index 6c2bc9a252..dd8aae9cf0 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -52,12 +52,6 @@ Prism.languages.elixir = { }, // Look-ahead prevents bad highlighting of the :: operator 'attr-name': /\w+\??:(?!:)/, - 'capture': { - // Look-behind prevents bad highlighting of the && operator - pattern: /(^|[^&])&(?:[^&\s\d()][^\s()]*|(?=\())/, - lookbehind: true, - alias: 'function' - }, 'argument': { // Look-behind prevents bad highlighting of the && operator pattern: /(^|[^&])&\d+/, @@ -68,9 +62,9 @@ Prism.languages.elixir = { pattern: /@\w+/, alias: 'variable' }, + 'function': /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d+))/, 'number': /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i, 'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/, - 'function': /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/, 'boolean': /\b(?:true|false|nil)\b/, 'operator': [ /\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/, diff --git a/tests/languages/elixir/capture_feature.test b/tests/languages/elixir/capture_feature.test index 431f431011..caa9473be9 100644 --- a/tests/languages/elixir/capture_feature.test +++ b/tests/languages/elixir/capture_feature.test @@ -1,25 +1,38 @@ +&Math.zero?(0) fun = &Math.zero?/1 (&is_function/1).(fun) fun = &(&1 + 1) &List.flatten(&1, &2) +fun = &Math.zero?/invalid + ---------------------------------------------------- [ - "fun ", ["operator", "="], ["operator", "&"], ["module", "Math"], ["punctuation", "."], - "zero?", + ["function", "zero?" ], + ["punctuation", "("], + ["number", "0"], + ["punctuation", ")"], + "\r\nfun ", ["operator", "="], + ["operator", "&"], + ["module", "Math"], + ["punctuation", "."], + ["function", "zero?" ], ["operator", "/"], ["number", "1"], ["punctuation", "("], - ["capture", "&is_function/1"], + ["operator", "&"], + ["function", "is_function"], + ["operator", "/"], + ["number", "1"], ["punctuation", ")"], ["punctuation", "."], ["punctuation", "("], "fun", ["punctuation", ")"], "\r\nfun ", ["operator", "="], - ["capture", "&"], + ["operator", "&"], ["punctuation", "("], ["argument", "&1"], ["operator", "+"], ["number", "1"], ["punctuation", ")"], ["operator", "&"], @@ -27,7 +40,15 @@ fun = &(&1 + 1) ["punctuation", "."], ["function", "flatten"], ["punctuation", "("], ["argument", "&1"], ["punctuation", ","], ["argument", "&2"], - ["punctuation", ")"] + ["punctuation", ")"], + "\r\n\r\nfun ", + [ "operator", "=" ], + [ "operator", "&" ], + [ "module", "Math" ], + [ "punctuation", "." ], + "zero?", + [ "operator", "/" ], + "invalid" ] ---------------------------------------------------- From 56de037ecf6caa359e588daa22136cb6e627c8b0 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 12:41:24 -0800 Subject: [PATCH 15/17] Build --- components/prism-elixir.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-elixir.min.js b/components/prism-elixir.min.js index b1e207dfc0..759faa3ebc 100644 --- a/components/prism-elixir.min.js +++ b/components/prism-elixir.min.js @@ -1 +1 @@ -Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+("{1,3}|'{1,3})(?:\\[\s\S]|(?!\1)[^\\])+\1/},comment:/#.*/m,regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\w+\??:(?!:)/,capture:{pattern:/(^|[^&])&(?:[^&\s\d()][^\s()]*|(?=\())/,lookbehind:!0,alias:"function"},argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/,function:{pattern:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|\/\d+)/},boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+("|'|"""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/m,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d+))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/,boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file From 06e0523d3a0261ceba02a8dae7d6b63a2ce0a623 Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 15:17:44 -0800 Subject: [PATCH 16/17] Update components/prism-elixir.js Co-authored-by: Michael Schmidt --- components/prism-elixir.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-elixir.js b/components/prism-elixir.js index dd8aae9cf0..868e1fc732 100644 --- a/components/prism-elixir.js +++ b/components/prism-elixir.js @@ -1,6 +1,6 @@ Prism.languages.elixir = { 'doc': { - pattern: /@(?:doc|moduledoc)\s+("|'|"""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1/, + pattern: /@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/, inside: { 'attribute': /^@\w+/, 'string': /['"][\s\S]+/ From bf45116eb51738374ff9a27f88fabdbafaa6e13c Mon Sep 17 00:00:00 2001 From: Samuel Gordalina Date: Mon, 1 Mar 2021 15:18:19 -0800 Subject: [PATCH 17/17] Update build --- components/prism-elixir.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/prism-elixir.min.js b/components/prism-elixir.min.js index 759faa3ebc..83f6871ed9 100644 --- a/components/prism-elixir.min.js +++ b/components/prism-elixir.min.js @@ -1 +1 @@ -Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+("|'|"""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/m,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d+))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/,boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file +Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/m,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d+))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct|delegate)?|do|else|end|fn|for|if|import|not|or|raise|require|rescue|try|unless|use|when)\b/,boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}); \ No newline at end of file