From ca501abd10d6573e1a417516d856c2a0efaab173 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 25 Feb 2022 13:27:08 +0100 Subject: [PATCH 1/8] Added `@helper` block --- components/prism-cshtml.js | 2 ++ components/prism-cshtml.min.js | 2 +- tests/languages/cshtml/block_feature.test | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index a917626aa0..94f9126d52 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -134,6 +134,8 @@ /try\s*/.source + curly + /\s*catch\s*/.source + round + /\s*/.source + curly + /\s*finally\s*/.source + curly, // @if (...) {...} else if (...) {...} else {...} /if\s*/.source + round + /\s*/.source + curly + '(?:' + /\s*else/.source + '(?:' + /\s+if\s*/.source + round + ')?' + /\s*/.source + curly + ')*', + // @helper Ident(params) { ... } + /helper\s+\w+\s*/.source + round + /\s*/.source + curly, ].join('|') + ')' ), diff --git a/components/prism-cshtml.min.js b/components/prism-cshtml.min.js index 537152a87f..5d28648fab 100644 --- a/components/prism-cshtml.min.js +++ b/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),r=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),t=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n=s("<(?:[^<>'\"@/]|||)*>",2),l="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?",i="(?!\\d)[^\\s>/=$<%]+"+l+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+l+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+i+")";e.languages.cshtml=e.languages.extend("markup",{});var g={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})};e.languages.insertBefore("cshtml","prolog",{"razor-comment":{pattern:/@\*[\s\S]*?\*@/,greedy:!0,alias:"comment"},block:{pattern:RegExp("(^|[^@])@(?:"+[t,"(?:code|functions)\\s*"+t,"(?:for|foreach|lock|switch|using|while)\\s*"+a+"\\s*"+t,"do\\s*"+t+"\\s*while\\s*"+a+"(?:\\s*;)?","try\\s*"+t+"\\s*catch\\s*"+a+"\\s*"+t+"\\s*finally\\s*"+t,"if\\s*"+a+"\\s*"+t+"(?:\\s*else(?:\\s+if\\s*"+a+")?\\s*"+t+")*"].join("|")+")"),lookbehind:!0,greedy:!0,inside:{keyword:/^@\w*/,csharp:g}},directive:{pattern:/^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,lookbehind:!0,greedy:!0,inside:{keyword:/^@\w+/,csharp:g}},value:{pattern:RegExp("(^|[^@])@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+r+"|"+n+a+")*"),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:g}},"delegate-operator":{pattern:/(^|[^@])@(?=<)/,lookbehind:!0,alias:"operator"}}),e.languages.razor=e.languages.cshtml}(Prism); \ No newline at end of file +!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),r=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),t=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n=s("<(?:[^<>'\"@/]|||)*>",2),l="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?",i="(?!\\d)[^\\s>/=$<%]+"+l+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+l+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+i+")";e.languages.cshtml=e.languages.extend("markup",{});var g={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})};e.languages.insertBefore("cshtml","prolog",{"razor-comment":{pattern:/@\*[\s\S]*?\*@/,greedy:!0,alias:"comment"},block:{pattern:RegExp("(^|[^@])@(?:"+[t,"(?:code|functions)\\s*"+t,"(?:for|foreach|lock|switch|using|while)\\s*"+a+"\\s*"+t,"do\\s*"+t+"\\s*while\\s*"+a+"(?:\\s*;)?","try\\s*"+t+"\\s*catch\\s*"+a+"\\s*"+t+"\\s*finally\\s*"+t,"if\\s*"+a+"\\s*"+t+"(?:\\s*else(?:\\s+if\\s*"+a+")?\\s*"+t+")*","helper\\s+\\w+\\s*"+a+"\\s*"+t].join("|")+")"),lookbehind:!0,greedy:!0,inside:{keyword:/^@\w*/,csharp:g}},directive:{pattern:/^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,lookbehind:!0,greedy:!0,inside:{keyword:/^@\w+/,csharp:g}},value:{pattern:RegExp("(^|[^@])@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+r+"|"+n+a+")*"),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:g}},"delegate-operator":{pattern:/(^|[^@])@(?=<)/,lookbehind:!0,alias:"operator"}}),e.languages.razor=e.languages.cshtml}(Prism); \ No newline at end of file diff --git a/tests/languages/cshtml/block_feature.test b/tests/languages/cshtml/block_feature.test index 59bd8b05de..e3d1875316 100644 --- a/tests/languages/cshtml/block_feature.test +++ b/tests/languages/cshtml/block_feature.test @@ -94,6 +94,10 @@ finally // Do critical section work } +@helper TrialHelper(string name) { + // some code +} + ---------------------------------------------------- [ @@ -893,6 +897,24 @@ finally ["punctuation", "("], "SomeLock", ["punctuation", ")"], ["punctuation", "{"], ["comment", "// Do critical section work"], + ["punctuation", "}"] + ]] + ]], + + ["block", [ + ["keyword", "@helper"], + ["csharp", [ + ["function", "TrialHelper"], + ["punctuation", "("], + ["class-name", [ + ["keyword", "string"] + ]], + " name", + ["punctuation", ")"], + ["punctuation", "{"], + + ["comment", "// some code"], + ["punctuation", "}"] ]] ]] From e63976917e77bd273e3327aaa1977cec6d932ff2 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 25 Feb 2022 15:03:02 +0100 Subject: [PATCH 2/8] Added support for CS inside attribute values --- components/prism-cshtml.js | 48 ++++--- components/prism-cshtml.min.js | 2 +- tests/languages/cshtml/issue3354.test | 194 ++++++++++++++++++++++++++ 3 files changed, 227 insertions(+), 17 deletions(-) create mode 100644 tests/languages/cshtml/issue3354.test diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index 94f9126d52..aff7b98629 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -32,6 +32,11 @@ var curly = nested(/\{(?:[^{}'"@/]|||)*\}/.source, 2); var angle = nested(/<(?:[^<>'"@/]|||)*>/.source, 2); + var inlineCs = /@/.source + + /(?:await\b\s*)?/.source + + '(?:' + /\w+\b/.source + '|' + round + ')' + + '(?:' + /[?!]?\.\w+\b/.source + '|' + round + '|' + square + '|' + angle + round + ')*'; + // Note about the above bracket patterns: // They all ignore HTML expressions that might be in the C# code. This is a problem because HTML (like strings and // comments) is parsed differently. This is a huge problem because HTML might contain brackets and quotes which @@ -44,7 +49,16 @@ // To somewhat alleviate the problem a bit, the patterns for characters (e.g. 'a') is very permissive, it also // allows invalid characters to support HTML expressions like this:

That's it!

. - var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?/.source; + var tagAttrInlineCs = /@(?![\w()])/.source + '|' + inlineCs; + var tagAttrValue = '(?:' + + '"(?:[^"@]|' + tagAttrInlineCs + ')*"' + + '|' + + "'(?:[^'@]|" + tagAttrInlineCs + ")*'" + + '|' + + /[^\s'"@>=]+(?=[\s>])/.source + + ')'; + + var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*|(?=[\s/>])))+)?/.source.replace(//, tagAttrValue); var tagContent = /(?!\d)[^\s>\/=$<%]+/.source + tagAttrs + /\s*\/?>/.source; var tagRegion = /\B@?/.source + @@ -110,6 +124,22 @@ inside: csharpWithHtml }; + var inlineValue = { + pattern: RegExp(/(^|[^@])/.source + inlineCs), + lookbehind: true, + greedy: true, + alias: 'variable', + inside: { + 'keyword': /^@/, + 'csharp': cs + } + }; + + Prism.languages.cshtml.tag.pattern = RegExp(/<\/?/.source + tagContent); + Prism.languages.cshtml.tag.inside['attr-value'].pattern = RegExp(/=\s*/.source + tagAttrValue); + Prism.languages.insertBefore('inside', 'punctuation', { 'value': inlineValue }, Prism.languages.cshtml.tag.inside['attr-value']); + + Prism.languages.insertBefore('cshtml', 'prolog', { 'razor-comment': { pattern: /@\*[\s\S]*?\*@/, @@ -157,21 +187,7 @@ } }, - 'value': { - pattern: RegExp( - /(^|[^@])@/.source + - /(?:await\b\s*)?/.source + - '(?:' + /\w+\b/.source + '|' + round + ')' + - '(?:' + /[?!]?\.\w+\b/.source + '|' + round + '|' + square + '|' + angle + round + ')*' - ), - lookbehind: true, - greedy: true, - alias: 'variable', - inside: { - 'keyword': /^@/, - 'csharp': cs - } - }, + 'value': inlineValue, 'delegate-operator': { pattern: /(^|[^@])@(?=<)/, diff --git a/components/prism-cshtml.min.js b/components/prism-cshtml.min.js index 5d28648fab..106b52bf8f 100644 --- a/components/prism-cshtml.min.js +++ b/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),r=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),t=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n=s("<(?:[^<>'\"@/]|||)*>",2),l="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?",i="(?!\\d)[^\\s>/=$<%]+"+l+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+l+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+i+")";e.languages.cshtml=e.languages.extend("markup",{});var g={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})};e.languages.insertBefore("cshtml","prolog",{"razor-comment":{pattern:/@\*[\s\S]*?\*@/,greedy:!0,alias:"comment"},block:{pattern:RegExp("(^|[^@])@(?:"+[t,"(?:code|functions)\\s*"+t,"(?:for|foreach|lock|switch|using|while)\\s*"+a+"\\s*"+t,"do\\s*"+t+"\\s*while\\s*"+a+"(?:\\s*;)?","try\\s*"+t+"\\s*catch\\s*"+a+"\\s*"+t+"\\s*finally\\s*"+t,"if\\s*"+a+"\\s*"+t+"(?:\\s*else(?:\\s+if\\s*"+a+")?\\s*"+t+")*","helper\\s+\\w+\\s*"+a+"\\s*"+t].join("|")+")"),lookbehind:!0,greedy:!0,inside:{keyword:/^@\w*/,csharp:g}},directive:{pattern:/^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,lookbehind:!0,greedy:!0,inside:{keyword:/^@\w+/,csharp:g}},value:{pattern:RegExp("(^|[^@])@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+r+"|"+n+a+")*"),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:g}},"delegate-operator":{pattern:/(^|[^@])@(?=<)/,lookbehind:!0,alias:"operator"}}),e.languages.razor=e.languages.cshtml}(Prism); \ No newline at end of file +!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+t+"|"+s("<(?:[^<>'\"@/]|||)*>",2)+a+")*",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp(" + +

+ @Localize.GetLabelHtml("TITLE") +

+ +@{ + var man = "Federico"; + var text = string.Concat("Nice to meet you", " ", man); +} + +@helper TrialHelper(string name) { + var text = string.Concat("Hello", " ", name); +

+ @(text + ", how's going?") +

+

+ Hello World! +

+} + +---------------------------------------------------- + +[ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "input" + ]], + ["attr-name", ["type"]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + "text", + ["punctuation", "\""] + ]], + ["attr-name", ["placeholder"]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + ["value", [ + ["keyword", "@"], + ["csharp", [ + "Localize", + ["punctuation", "."], + ["function", "GetLabelHtml"], + ["punctuation", "("], + ["string", "\"PLACEHOLDER\""], + ["punctuation", ")"] + ]] + ]], + ["punctuation", "\""] + ]], + ["punctuation", "/>"] + ]], + + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "h1" + ]], + ["punctuation", ">"] + ]], + ["value", [ + ["keyword", "@"], + ["csharp", [ + "Localize", + ["punctuation", "."], + ["function", "GetLabelHtml"], + ["punctuation", "("], + ["string", "\"TITLE\""], + ["punctuation", ")"] + ]] + ]], + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]], + + ["block", [ + ["keyword", "@"], + ["csharp", [ + ["punctuation", "{"], + + ["class-name", [ + ["keyword", "var"] + ]], + " man ", + ["operator", "="], + ["string", "\"Federico\""], + ["punctuation", ";"], + + ["class-name", [ + ["keyword", "var"] + ]], + " text ", + ["operator", "="], + ["keyword", "string"], + ["punctuation", "."], + ["function", "Concat"], + ["punctuation", "("], + ["string", "\"Nice to meet you\""], + ["punctuation", ","], + ["string", "\" \""], + ["punctuation", ","], + " man", + ["punctuation", ")"], + ["punctuation", ";"], + + ["punctuation", "}"] + ]] + ]], + + ["block", [ + ["keyword", "@helper"], + ["csharp", [ + ["function", "TrialHelper"], + ["punctuation", "("], + ["class-name", [ + ["keyword", "string"] + ]], + " name", + ["punctuation", ")"], + ["punctuation", "{"], + + ["class-name", [ + ["keyword", "var"] + ]], + " text ", + ["operator", "="], + ["keyword", "string"], + ["punctuation", "."], + ["function", "Concat"], + ["punctuation", "("], + ["string", "\"Hello\""], + ["punctuation", ","], + ["string", "\" \""], + ["punctuation", ","], + " name", + ["punctuation", ")"], + ["punctuation", ";"], + + ["html", [ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "h1" + ]], + ["punctuation", ">"] + ]], + ["value", [ + ["keyword", "@"], + ["csharp", [ + ["punctuation", "("], + "text ", + ["operator", "+"], + ["string", "\", how's going?\""], + ["punctuation", ")"] + ]] + ]], + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]] + ]], + + ["html", [ + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "p" + ]], + ["punctuation", ">"] + ]], + "\r\n Hello World!\r\n ", + ["tag", [ + ["tag", [ + ["punctuation", ""] + ]] + ]], + + ["punctuation", "}"] + ]] + ]] +] From e6002abf90c7d9d34fadca63286b862223a23225 Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 25 Feb 2022 15:04:37 +0100 Subject: [PATCH 3/8] Formatting --- components/prism-cshtml.js | 1 - 1 file changed, 1 deletion(-) diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index aff7b98629..648ff77da1 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -139,7 +139,6 @@ Prism.languages.cshtml.tag.inside['attr-value'].pattern = RegExp(/=\s*/.source + tagAttrValue); Prism.languages.insertBefore('inside', 'punctuation', { 'value': inlineValue }, Prism.languages.cshtml.tag.inside['attr-value']); - Prism.languages.insertBefore('cshtml', 'prolog', { 'razor-comment': { pattern: /@\*[\s\S]*?\*@/, From b41e5658df42de1f2e32c1d1d0908bdd0daa526a Mon Sep 17 00:00:00 2001 From: RunDevelopment Date: Fri, 25 Feb 2022 15:47:34 +0100 Subject: [PATCH 4/8] Fixed exp backtracking --- components/prism-cshtml.js | 3 ++- components/prism-cshtml.min.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index 648ff77da1..d54e78cccc 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -35,7 +35,8 @@ var inlineCs = /@/.source + /(?:await\b\s*)?/.source + '(?:' + /\w+\b/.source + '|' + round + ')' + - '(?:' + /[?!]?\.\w+\b/.source + '|' + round + '|' + square + '|' + angle + round + ')*'; + '(?:' + /[?!]?\.\w+\b/.source + '|' + round + '|' + square + '|' + angle + round + ')*' + + /(?![?!\.(\[<])/.source; // Note about the above bracket patterns: // They all ignore HTML expressions that might be in the C# code. This is a problem because HTML (like strings and diff --git a/components/prism-cshtml.min.js b/components/prism-cshtml.min.js index 106b52bf8f..c8311b6f89 100644 --- a/components/prism-cshtml.min.js +++ b/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+t+"|"+s("<(?:[^<>'\"@/]|||)*>",2)+a+")*",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp("/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+t+"|"+s("<(?:[^<>'\"@/]|||)*>",2)+a+")*(?![?!\\.(\\[<])",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp(" Date: Fri, 25 Feb 2022 16:02:50 +0100 Subject: [PATCH 5/8] Fixed exp backtracking and simplified pattern --- components/prism-cshtml.js | 4 ++-- components/prism-cshtml.min.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index d54e78cccc..963607e247 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -34,8 +34,8 @@ var inlineCs = /@/.source + /(?:await\b\s*)?/.source + - '(?:' + /\w+\b/.source + '|' + round + ')' + - '(?:' + /[?!]?\.\w+\b/.source + '|' + round + '|' + square + '|' + angle + round + ')*' + + '(?:' + /(?!await\b)\w+\b/.source + '|' + round + ')' + + '(?:' + /[?!]?\.\w+\b/.source + '|' + '(?:' + angle + ')?' + round + '|' + square + ')*' + /(?![?!\.(\[<])/.source; // Note about the above bracket patterns: diff --git a/components/prism-cshtml.min.js b/components/prism-cshtml.min.js index c8311b6f89..b6746c48a2 100644 --- a/components/prism-cshtml.min.js +++ b/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|"+a+"|"+t+"|"+s("<(?:[^<>'\"@/]|||)*>",2)+a+")*(?![?!\\.(\\[<])",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp("/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]|||)*>",2)+")?"+a+"|"+t+")*(?![?!\\.(\\[<])",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp(" Date: Sun, 13 Mar 2022 10:33:39 +0100 Subject: [PATCH 6/8] Fixed false negatives --- components/prism-cshtml.js | 2 +- components/prism-cshtml.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index 963607e247..0ae78f6ccf 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -36,7 +36,7 @@ /(?:await\b\s*)?/.source + '(?:' + /(?!await\b)\w+\b/.source + '|' + round + ')' + '(?:' + /[?!]?\.\w+\b/.source + '|' + '(?:' + angle + ')?' + round + '|' + square + ')*' + - /(?![?!\.(\[<])/.source; + /(?![?!\.(\[]|<(?!\/))/.source; // Note about the above bracket patterns: // They all ignore HTML expressions that might be in the C# code. This is a problem because HTML (like strings and diff --git a/components/prism-cshtml.min.js b/components/prism-cshtml.min.js index b6746c48a2..da6b8d1a76 100644 --- a/components/prism-cshtml.min.js +++ b/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]|||)*>",2)+")?"+a+"|"+t+")*(?![?!\\.(\\[<])",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp("/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]|||)*>",2)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp(" Date: Sun, 13 Mar 2022 10:34:21 +0100 Subject: [PATCH 7/8] Less nesting --- components/prism-cshtml.js | 4 ++-- components/prism-cshtml.min.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index 0ae78f6ccf..6f76055dc4 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -28,9 +28,9 @@ } var round = nested(/\((?:[^()'"@/]|||)*\)/.source, 2); - var square = nested(/\[(?:[^\[\]'"@/]|||)*\]/.source, 2); + var square = nested(/\[(?:[^\[\]'"@/]|||)*\]/.source, 1); var curly = nested(/\{(?:[^{}'"@/]|||)*\}/.source, 2); - var angle = nested(/<(?:[^<>'"@/]|||)*>/.source, 2); + var angle = nested(/<(?:[^<>'"@/]|||)*>/.source, 1); var inlineCs = /@/.source + /(?:await\b\s*)?/.source + diff --git a/components/prism-cshtml.min.js b/components/prism-cshtml.min.js index da6b8d1a76..460e9bf528 100644 --- a/components/prism-cshtml.min.js +++ b/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",2),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]|||)*>",2)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp("/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",1),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]|||)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp(" Date: Sun, 13 Mar 2022 10:45:27 +0100 Subject: [PATCH 8/8] Simplified patterns --- components/prism-cshtml.js | 8 +++----- components/prism-cshtml.min.js | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/components/prism-cshtml.js b/components/prism-cshtml.js index 6f76055dc4..4643710d3d 100644 --- a/components/prism-cshtml.js +++ b/components/prism-cshtml.js @@ -30,7 +30,7 @@ var round = nested(/\((?:[^()'"@/]|||)*\)/.source, 2); var square = nested(/\[(?:[^\[\]'"@/]|||)*\]/.source, 1); var curly = nested(/\{(?:[^{}'"@/]|||)*\}/.source, 2); - var angle = nested(/<(?:[^<>'"@/]|||)*>/.source, 1); + var angle = nested(/<(?:[^<>'"@/]||)*>/.source, 1); var inlineCs = /@/.source + /(?:await\b\s*)?/.source + @@ -52,11 +52,9 @@ var tagAttrInlineCs = /@(?![\w()])/.source + '|' + inlineCs; var tagAttrValue = '(?:' + - '"(?:[^"@]|' + tagAttrInlineCs + ')*"' + + /"[^"@]*"|'[^'@]*'|[^\s'"@>=]+(?=[\s>])/.source + '|' + - "'(?:[^'@]|" + tagAttrInlineCs + ")*'" + - '|' + - /[^\s'"@>=]+(?=[\s>])/.source + + '["\'][^"\'@]*(?:(?:' + tagAttrInlineCs + ')[^"\'@]*)+["\']' + ')'; var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*|(?=[\s/>])))+)?/.source.replace(//, tagAttrValue); diff --git a/components/prism-cshtml.min.js b/components/prism-cshtml.min.js index 460e9bf528..c5c96841e6 100644 --- a/components/prism-cshtml.min.js +++ b/components/prism-cshtml.min.js @@ -1 +1 @@ -!function(e){function s(e,s){for(var a=0;a/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",1),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]|||)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="@(?![\\w()])|"+n,i='(?:"(?:[^"@]|'+l+")*\"|'(?:[^'@]|"+l+")*'|[^\\s'\"@>=]+(?=[\\s>]))",g="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,i),o="(?!\\d)[^\\s>/=$<%]+"+g+"\\s*/?>",c="\\B@?(?:<([a-zA-Z][\\w:]*)"+g+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+o+")";e.languages.cshtml=e.languages.extend("markup",{});var p={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(c),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},u={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:p}};e.languages.cshtml.tag.pattern=RegExp("/g,function(){return"(?:"+e+")"});return e.replace(//g,"[^\\s\\S]").replace(//g,'(?:@(?!")|"(?:[^\r\n\\\\"]|\\\\.)*"|@"(?:[^\\\\"]|""|\\\\[^])*"(?!")|'+"'(?:(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'|(?=[^\\\\](?!'))))").replace(//g,"(?:/(?![/*])|//.*[\r\n]|/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/)")}var a=s("\\((?:[^()'\"@/]|||)*\\)",2),t=s("\\[(?:[^\\[\\]'\"@/]|||)*\\]",1),r=s("\\{(?:[^{}'\"@/]|||)*\\}",2),n="@(?:await\\b\\s*)?(?:(?!await\\b)\\w+\\b|"+a+")(?:[?!]?\\.\\w+\\b|(?:"+s("<(?:[^<>'\"@/]||)*>",1)+")?"+a+"|"+t+")*(?![?!\\.(\\[]|<(?!/))",l="(?:\"[^\"@]*\"|'[^'@]*'|[^\\s'\"@>=]+(?=[\\s>])|[\"'][^\"'@]*(?:(?:"+("@(?![\\w()])|"+n)+")[^\"'@]*)+[\"'])",i="(?:\\s(?:\\s*[^\\s>/=]+(?:\\s*=\\s*|(?=[\\s/>])))+)?".replace(//,l),g="(?!\\d)[^\\s>/=$<%]+"+i+"\\s*/?>",o="\\B@?(?:<([a-zA-Z][\\w:]*)"+i+"\\s*>(?:[^<]|(?:[^<]|)*",2)+")*|<"+g+")";e.languages.cshtml=e.languages.extend("markup",{});var c={pattern:/\S[\s\S]*/,alias:"language-csharp",inside:e.languages.insertBefore("csharp","string",{html:{pattern:RegExp(o),greedy:!0,inside:e.languages.cshtml}},{csharp:e.languages.extend("csharp",{})})},p={pattern:RegExp("(^|[^@])"+n),lookbehind:!0,greedy:!0,alias:"variable",inside:{keyword:/^@/,csharp:c}};e.languages.cshtml.tag.pattern=RegExp("