Skip to content

Commit 0e92528

Browse files
committed
Upgrade hljs, fix Polynomial backtracking
1 parent 846a6d1 commit 0e92528

14 files changed

+188
-110
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## [2.2.0] - 2025-06-26
5+
- Fixed "Polynomial backtracking" vulnerability
6+
- Updated version of hljs
7+
48
## [2.1.2] - 2025-06-25
59
- Fix incorrect processing '>' symbols inside strings in code blocks
610
- Split tests to simplify its running

dist/cshtml-razor.es.min.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*! `cshtml-razor` grammar compiled for Highlight.js 11.11.1 */
2+
var hljsGrammar=(()=>{"use strict";function n(n){
3+
return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n
4+
}var e,a;return n(a?e:(a=1,e=n=>{const e="built_in",a={},s={begin:"}",
5+
className:e,endsParent:!0},i={begin:"{",end:"}",
6+
contains:[n.QUOTE_STRING_MODE,"self"]},r=n.COMMENT("@\\*","\\*@",{relevance:10
7+
}),t={begin:"@[A-Za-z0-9\\._:-]+",returnBegin:!0,end:"(\\r|\\n|<|\\s|\"|')",
8+
subLanguage:"csharp",contains:[{begin:"@",className:e},{begin:"\\[",end:"\\]",
9+
skip:!0},{begin:"\\(",end:"\\)",skip:!0}],returnEnd:!0},g={
10+
begin:"[@]{0,1}<text>",returnBegin:!0,end:"</text>",returnEnd:!0,
11+
subLanguage:"cshtml-razor",contains:[{begin:"[@]{0,1}<text>",className:e},{
12+
begin:"</text>",className:e,endsParent:!0}]},c={begin:"@\\(",end:"\\)",
13+
returnBegin:!0,returnEnd:!0,subLanguage:"csharp",contains:[{begin:"@\\(",
14+
className:e},{begin:"\\(",end:"\\)",subLanguage:"csharp",
15+
contains:[n.QUOTE_STRING_MODE,"self",g]},g,{begin:"\\)",className:e,
16+
endsParent:!0}]},b=((n,e)=>{const a={endsWithParent:!0,illegal:/</,relevance:0,
17+
contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{
18+
begin:/=\s*/,relevance:0,contains:[{className:"string",variants:[{begin:/"/,
19+
end:/"/,contains:e},{begin:/'/,end:/'/,contains:e},{begin:/[^\s"'=<>`]+/}]}]}]}
20+
;return[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{
21+
begin:"\\[",end:"\\]"}]},n.COMMENT("\x3c!--","--\x3e",{relevance:10}),{
22+
begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{className:"meta",
23+
begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",
24+
begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[a],starts:{
25+
end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",
26+
begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[a],
27+
starts:{end:"<\/script>",returnEnd:!0,
28+
subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",
29+
begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^/><\s]+/,relevance:0
30+
},a]}].concat(e)
31+
})(n,[t,c]),l="^\\s*@(page|model|using|inherits|inject|layout)",u={
32+
begin:l+"[^\\r\\n{\\(]*$",end:"$",returnBegin:!0,returnEnd:!0,contains:[{
33+
begin:l,className:e},{variants:[{begin:"\\r|\\n",endsParent:!0},{
34+
begin:"\\s[^\\r\\n]+",end:"$"},{begin:"$"}],className:"type",endsParent:!0}]
35+
},d={variants:[{begin:"@\\{",end:"}"},{begin:"@code\\s*\\{",end:"}"}],
36+
returnBegin:!0,returnEnd:!0,subLanguage:"csharp",contains:[{
37+
begin:"@(code\\s*)?\\{",className:e},a,{begin:"{",end:"}",contains:["self"],
38+
skip:!0},{variants:[{begin:/"/,end:/"/,skip:!0},{begin:/'/,end:/'/,skip:!0}],
39+
skip:!0},s]},o={begin:"^\\s*@helper\\s+[^{\\s]+(?:\\s+[^{\\s]+)*\\s*{",
40+
returnBegin:!0,returnEnd:!0,end:"}",subLanguage:"cshtml-razor",contains:[{
41+
begin:"@helper",className:e},{begin:"{",className:e},s]
42+
},m=["for","if","switch","while","using","lock","foreach"].map((n=>({
43+
begin:`@${n}(?![\\w\\d])[^{]*\\{`,end:"}"}))),p=[{
44+
begin:"\\}\\s*else\\s*(if[^\\{]+|)\\{"}],h={variants:m,returnBegin:!0,
45+
returnEnd:!0,subLanguage:"csharp",contains:[{variants:m.map((n=>({begin:n.begin
46+
}))),returnBegin:!0,contains:[{begin:"@",className:e},{variants:m.map((n=>({
47+
begin:(""+n.begin).substring(1,n.begin.length-2)}))),subLanguage:"csharp"},{
48+
begin:"{",className:e}]},a,{variants:p,returnBegin:!0,contains:[{begin:"}",
49+
className:e},{begin:p[0].begin.substring(2,p[0].begin.length-2),
50+
subLanguage:"csharp"},{begin:"{",className:e}]},i,s]},N={begin:"@try\\s*{",
51+
end:"}",returnBegin:!0,returnEnd:!0,subLanguage:"csharp",contains:[{begin:"@",
52+
className:e},{begin:"try\\s*{",subLanguage:"csharp"},{variants:[{
53+
begin:"}\\s*catch\\s*\\([^\\)]+\\)\\s*{"},{begin:"}\\s*finally\\s*{"}],
54+
returnBegin:!0,contains:[{begin:"}",className:e},{variants:[{
55+
begin:"\\s*catch\\s*\\([^\\)]+\\)\\s*"},{begin:"\\s*finally\\s*"}],
56+
subLanguage:"csharp"},{begin:"{",className:e}]},a,i,s]
57+
},v="@section\\s+[a-zA-Z0-9]+\\s*{",E=[u,o,d,h,{begin:v,returnBegin:!0,
58+
returnEnd:!0,end:"}",subLanguage:"cshtml-razor",contains:[{begin:v,className:e
59+
},i,s]},{begin:"@await ",returnBegin:!0,subLanguage:"csharp",
60+
end:"(\\r|\\n|<|\\s)",contains:[{begin:"@await ",className:e},{
61+
begin:"[<\\r\\n]",endsParent:!0}]},N,{variants:[{begin:"@@"},{begin:"[a-zA-Z]+@"
62+
}],skip:!0},g,r,c,{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,
63+
contains:[{begin:"\\[",end:"\\]"}]},{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",
64+
relevance:10}].concat(b);return[d,h,N].forEach((n=>{
65+
const e=E.filter((e=>e!==n)),s=n.contains.indexOf(a)
66+
;n.contains.splice.apply(n.contains,[s,1].concat(e))})),{
67+
aliases:["cshtml","razor","razor-cshtml","cshtml-razor"],contains:E}}))})()
68+
;export default hljsGrammar;

dist/cshtml-razor.min.js

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,68 @@
1-
hljs.registerLanguage("cshtml-razor",(()=>{"use strict";return n=>{
2-
var e="built_in",s={},a={begin:"}",className:e,endsParent:!0},i={begin:"{",
3-
end:"}",contains:[n.QUOTE_STRING_MODE,"self"]},r=n.COMMENT("@\\*","\\*@",{
4-
relevance:10}),g={begin:"@[A-Za-z0-9\\._:-]+",returnBegin:!0,
5-
end:"(\\r|\\n|<|\\s|\"|')",subLanguage:"csharp",contains:[{begin:"@",className:e
6-
},{begin:"\\[",end:"\\]",skip:!0},{begin:"\\(",end:"\\)",skip:!0}],returnEnd:!0
7-
},t={begin:"[@]{0,1}<text>",returnBegin:!0,end:"</text>",returnEnd:!0,
1+
/*! `cshtml-razor` grammar compiled for Highlight.js 11.11.1 */
2+
(()=>{var n=(()=>{"use strict";function n(n){
3+
return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n
4+
}var e,a;return n(a?e:(a=1,e=n=>{const e="built_in",a={},s={begin:"}",
5+
className:e,endsParent:!0},i={begin:"{",end:"}",
6+
contains:[n.QUOTE_STRING_MODE,"self"]},r=n.COMMENT("@\\*","\\*@",{relevance:10
7+
}),t={begin:"@[A-Za-z0-9\\._:-]+",returnBegin:!0,end:"(\\r|\\n|<|\\s|\"|')",
8+
subLanguage:"csharp",contains:[{begin:"@",className:e},{begin:"\\[",end:"\\]",
9+
skip:!0},{begin:"\\(",end:"\\)",skip:!0}],returnEnd:!0},g={
10+
begin:"[@]{0,1}<text>",returnBegin:!0,end:"</text>",returnEnd:!0,
811
subLanguage:"cshtml-razor",contains:[{begin:"[@]{0,1}<text>",className:e},{
912
begin:"</text>",className:e,endsParent:!0}]},c={begin:"@\\(",end:"\\)",
1013
returnBegin:!0,returnEnd:!0,subLanguage:"csharp",contains:[{begin:"@\\(",
1114
className:e},{begin:"\\(",end:"\\)",subLanguage:"csharp",
12-
contains:[n.QUOTE_STRING_MODE,"self",t]},t,{begin:"\\)",className:e,
13-
endsParent:!0}]},b=((n,e)=>{var s={endsWithParent:!0,illegal:/</,relevance:0,
15+
contains:[n.QUOTE_STRING_MODE,"self",g]},g,{begin:"\\)",className:e,
16+
endsParent:!0}]},b=((n,e)=>{const a={endsWithParent:!0,illegal:/</,relevance:0,
1417
contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{
1518
begin:/=\s*/,relevance:0,contains:[{className:"string",variants:[{begin:/"/,
1619
end:/"/,contains:e},{begin:/'/,end:/'/,contains:e},{begin:/[^\s"'=<>`]+/}]}]}]}
1720
;return[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{
1821
begin:"\\[",end:"\\]"}]},n.COMMENT("\x3c!--","--\x3e",{relevance:10}),{
1922
begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{className:"meta",
2023
begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",
21-
begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[s],starts:{
24+
begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[a],starts:{
2225
end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",
23-
begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[s],
26+
begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[a],
2427
starts:{end:"<\/script>",returnEnd:!0,
2528
subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",
26-
begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0
27-
},s]}].concat(e)
28-
})(n,[g,c]),l="^\\s*@(page|model|using|inherits|inject|layout)",u={
29+
begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^/><\s]+/,relevance:0
30+
},a]}].concat(e)
31+
})(n,[t,c]),l="^\\s*@(page|model|using|inherits|inject|layout)",u={
2932
begin:l+"[^\\r\\n{\\(]*$",end:"$",returnBegin:!0,returnEnd:!0,contains:[{
3033
begin:l,className:e},{variants:[{begin:"\\r|\\n",endsParent:!0},{
3134
begin:"\\s[^\\r\\n]+",end:"$"},{begin:"$"}],className:"type",endsParent:!0}]
3235
},d={variants:[{begin:"@\\{",end:"}"},{begin:"@code\\s*\\{",end:"}"}],
3336
returnBegin:!0,returnEnd:!0,subLanguage:"csharp",contains:[{
34-
begin:"@(code\\s*)?\\{",className:e},s,{begin:"{",end:"}",contains:["self"],
35-
skip:!0},a]},o={begin:"^\\s*@helper[\\s]*[^{]+[\\s]*{",returnBegin:!0,
36-
returnEnd:!0,end:"}",subLanguage:"cshtml-razor",contains:[{begin:"@helper",
37-
className:e},{begin:"{",className:e},a]},m=[{begin:"@for[\\s]*\\([^{]+[\\s]*{",
38-
end:"}"},{begin:"@if[\\s]*\\([^{]+[\\s]*{",end:"}"},{
39-
begin:"@switch[\\s]*\\([^{]+[\\s]*{",end:"}"},{
40-
begin:"@while[\\s]*\\([^{]+[\\s]*{",end:"}"},{
41-
begin:"@using[\\s]*\\([^{]+[\\s]*{",end:"}"},{
42-
begin:"@lock[\\s]*\\([^{]+[\\s]*{",end:"}"},{
43-
begin:"@foreach[\\s]*\\([^{]+[\\s]*{",end:"}"}],N={variants:m,returnBegin:!0,
37+
begin:"@(code\\s*)?\\{",className:e},a,{begin:"{",end:"}",contains:["self"],
38+
skip:!0},{variants:[{begin:/"/,end:/"/,skip:!0},{begin:/'/,end:/'/,skip:!0}],
39+
skip:!0},s]},o={begin:"^\\s*@helper\\s+[^{\\s]+(?:\\s+[^{\\s]+)*\\s*{",
40+
returnBegin:!0,returnEnd:!0,end:"}",subLanguage:"cshtml-razor",contains:[{
41+
begin:"@helper",className:e},{begin:"{",className:e},s]
42+
},m=["for","if","switch","while","using","lock","foreach"].map((n=>({
43+
begin:`@${n}(?![\\w\\d])[^{]*\\{`,end:"}"}))),p=[{
44+
begin:"\\}\\s*else\\s*(if[^\\{]+|)\\{"}],h={variants:m,returnBegin:!0,
4445
returnEnd:!0,subLanguage:"csharp",contains:[{variants:m.map((n=>({begin:n.begin
4546
}))),returnBegin:!0,contains:[{begin:"@",className:e},{variants:m.map((n=>({
46-
begin:n.begin.substr(1,n.begin.length-2)}))),subLanguage:"csharp"},{begin:"{",
47-
className:e}]},s,{variants:[{begin:"}[\\s]*else\\sif[\\s]*\\([^{]+[\\s]*{"},{
48-
begin:"}[\\s]*else[\\s]*{"}],returnBegin:!0,contains:[{begin:"}",className:e},{
49-
variants:[{begin:"[\\s]*else\\sif[\\s]*\\([^{]+[\\s]*{"},{
50-
begin:"[\\s]*else[\\s]*"}],subLanguage:"csharp"},{begin:"{",className:e}]},i,a]
51-
},h={begin:"@try[\\s]*{",end:"}",returnBegin:!0,returnEnd:!0,
52-
subLanguage:"csharp",contains:[{begin:"@",className:e},{begin:"try[\\s]*{",
53-
subLanguage:"csharp"},{variants:[{begin:"}[\\s]*catch[\\s]*\\([^\\)]+\\)[\\s]*{"
54-
},{begin:"}[\\s]*finally[\\s]*{"}],returnBegin:!0,contains:[{begin:"}",
55-
className:e},{variants:[{begin:"[\\s]*catch[\\s]*\\([^\\)]+\\)[\\s]*"},{
56-
begin:"[\\s]*finally[\\s]*"}],subLanguage:"csharp"},{begin:"{",className:e}]
57-
},s,i,a]},p="@section[\\s]+[a-zA-Z0-9]+[\\s]*{",v=[u,o,d,N,{begin:p,
58-
returnBegin:!0,returnEnd:!0,end:"}",subLanguage:"cshtml-razor",contains:[{
59-
begin:p,className:e},i,a]},{begin:"@await ",returnBegin:!0,subLanguage:"csharp",
47+
begin:(""+n.begin).substring(1,n.begin.length-2)}))),subLanguage:"csharp"},{
48+
begin:"{",className:e}]},a,{variants:p,returnBegin:!0,contains:[{begin:"}",
49+
className:e},{begin:p[0].begin.substring(2,p[0].begin.length-2),
50+
subLanguage:"csharp"},{begin:"{",className:e}]},i,s]},N={begin:"@try\\s*{",
51+
end:"}",returnBegin:!0,returnEnd:!0,subLanguage:"csharp",contains:[{begin:"@",
52+
className:e},{begin:"try\\s*{",subLanguage:"csharp"},{variants:[{
53+
begin:"}\\s*catch\\s*\\([^\\)]+\\)\\s*{"},{begin:"}\\s*finally\\s*{"}],
54+
returnBegin:!0,contains:[{begin:"}",className:e},{variants:[{
55+
begin:"\\s*catch\\s*\\([^\\)]+\\)\\s*"},{begin:"\\s*finally\\s*"}],
56+
subLanguage:"csharp"},{begin:"{",className:e}]},a,i,s]
57+
},v="@section\\s+[a-zA-Z0-9]+\\s*{",E=[u,o,d,h,{begin:v,returnBegin:!0,
58+
returnEnd:!0,end:"}",subLanguage:"cshtml-razor",contains:[{begin:v,className:e
59+
},i,s]},{begin:"@await ",returnBegin:!0,subLanguage:"csharp",
6060
end:"(\\r|\\n|<|\\s)",contains:[{begin:"@await ",className:e},{
61-
begin:"[<\\r\\n]",endsParent:!0}]},h,{variants:[{begin:"@@"},{begin:"[a-zA-Z]+@"
62-
}],skip:!0},t,r,c,{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,
61+
begin:"[<\\r\\n]",endsParent:!0}]},N,{variants:[{begin:"@@"},{begin:"[a-zA-Z]+@"
62+
}],skip:!0},g,r,c,{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,
6363
contains:[{begin:"\\[",end:"\\]"}]},{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",
64-
relevance:10}].concat(b);return[d,N,h].forEach((n=>{
65-
var e=v.filter((e=>e!==n)),a=n.contains.indexOf(s)
66-
;n.contains.splice.apply(n.contains,[a,1].concat(e))})),{
67-
aliases:["cshtml","razor","razor-cshtml","cshtml-razor"],contains:v}}})());
64+
relevance:10}].concat(b);return[d,h,N].forEach((n=>{
65+
const e=E.filter((e=>e!==n)),s=n.contains.indexOf(a)
66+
;n.contains.splice.apply(n.contains,[s,1].concat(e))})),{
67+
aliases:["cshtml","razor","razor-cshtml","cshtml-razor"],contains:E}}))})()
68+
;hljs.registerLanguage("cshtml-razor",n)})();

package-lock.json

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "highlightjs-cshtml-razor",
3-
"version": "2.1.2",
3+
"version": "2.2.0",
44
"description": "highlight.js syntax definition for ASP.NET Razor CSHTML language",
55
"main": "src/languages/cshtml-razor.js",
66
"scripts": {
@@ -32,7 +32,7 @@
3232
},
3333
"homepage": "https://github.com/highlightjs/highlightjs-cshtml-razor#readme",
3434
"devDependencies": {
35-
"highlight.js": "^10.7.2",
35+
"highlight.js": "^11.1.1",
3636
"mocha": "^5.2.0",
3737
"should": "^13.2.3"
3838
},

src/languages/cshtml-razor.js

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable no-useless-escape */
12
/*
23
* Language: cshtml-razor
34
* Requires: xml.js, csharp.js, css.js, javascript.js
@@ -166,14 +167,13 @@ module.exports = function(hljs) {
166167
closedBrace
167168
]
168169
};
169-
const razorCodeBlockVariants = [
170-
{ begin: "@for\\s*\\([^{]+\\s*{", end: "}" },
171-
{ begin: "@if\\s*\\([^{]+\\s*{", end: "}" },
172-
{ begin: "@switch\\s*\\([^{]+\\s*{", end: "}" },
173-
{ begin: "@while\\s*\\([^{]+\\s*{", end: "}" },
174-
{ begin: "@using\\s*\\([^{]+\\s*{", end: "}" },
175-
{ begin: "@lock\\s*\\([^{]+\\s*{", end: "}" },
176-
{ begin: "@foreach\\s*\\([^{]+\\s*{", end: "}" }
170+
const razorCodeBlockVariants = ['for', 'if', 'switch', 'while', 'using', 'lock', 'foreach']
171+
.map(keyword => ({
172+
begin: `@${keyword}(?![\\w\\d])[^{]*\\{`,
173+
end: "}"
174+
}));
175+
const elseVariants = [
176+
{ begin: "\\}\\s*else\\s*(if[^\\{]+|)\\{" }
177177
];
178178
const razorCodeBlock = {
179179
variants: razorCodeBlockVariants,
@@ -187,26 +187,20 @@ module.exports = function(hljs) {
187187
contains: [
188188
{ begin: "@", className: SPECIAL_SYMBOL_CLASSNAME },
189189
{
190-
variants: razorCodeBlockVariants.map(function(v) { return { begin: v.begin.substr(1, v.begin.length - 2) }; }),
190+
variants: razorCodeBlockVariants.map(function(v) { return { begin: `${v.begin}`.substring(1, v.begin.length - 2) }; }),
191191
subLanguage: 'csharp'
192192
},
193193
{ begin: "{", className: SPECIAL_SYMBOL_CLASSNAME }
194194
]
195195
},
196196
CONTENT_REPLACER,
197197
{
198-
variants: [
199-
{ begin: "}\\s*else\\sif\\s*\\([^{]+\\s*{" },
200-
{ begin: "}\\s*else\\s*{" }
201-
],
198+
variants: elseVariants,
202199
returnBegin: true,
203200
contains: [
204201
{ begin: "}", className: SPECIAL_SYMBOL_CLASSNAME },
205202
{
206-
variants: [
207-
{ begin: "\\s*else\\sif\\s*\\([^{]+\\s*{" },
208-
{ begin: "\\s*else\\s*" }
209-
],
203+
begin: elseVariants[0].begin.substring(2, elseVariants[0].begin.length - 2),
210204
subLanguage: 'csharp'
211205
},
212206
{

test/index.js

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,32 @@ let hljsDefineCshtmlRazor = require("../src/languages/cshtml-razor");
88
const readdir = promisify(fs.readdir),
99
readFile = promisify(fs.readFile);
1010

11-
describe("CSHTML Razor Tests", () => {
12-
beforeEach(() => {
13-
hljs.registerLanguage('cshtml-razor', hljsDefineCshtmlRazor);
14-
});
15-
async function testMarkupGeneration(fileName) {
16-
const codeFn = path.join(__dirname, "markup", "cshtml-razor", `${fileName}.txt`);
17-
const expectedFn = path.join(__dirname, "markup", "cshtml-razor", `${fileName}.expect.txt`);
11+
async function testMarkupGeneration(fileName) {
12+
const codeFn = path.join(__dirname, "markup", "cshtml-razor", `${fileName}.txt`);
13+
const expectedFn = path.join(__dirname, "markup", "cshtml-razor", `${fileName}.expect.txt`);
1814

19-
const code = (await readFile(codeFn, "utf-8")).trim();
20-
const expectedMarkup = (await readFile(expectedFn, "utf-8")).trim();
15+
const code = (await readFile(codeFn, "utf-8")).trim();
16+
const expectedMarkup = (await readFile(expectedFn, "utf-8")).trim();
2117

22-
const actualMarkup = hljs.highlight("cshtml-razor", code).value.trim();
23-
actualMarkup.should.eql(expectedMarkup, `
24-
Markup for ${fileName} does not match expected output.
18+
const actualMarkup = hljs.highlight("cshtml-razor", code).value.trim();
19+
actualMarkup.should.eql(expectedMarkup, `Markup for ${fileName} does not match expected output.
2520
2621
📄 Source code:
2722
${code}
2823
29-
📄 Expected generated markup:
24+
Expected generated markup:
3025
${expectedMarkup}
3126
32-
📄 Actual generated markup:
33-
${actualMarkup}
34-
`);
35-
}
27+
❌ Actual generated markup:
28+
${actualMarkup}`);
29+
}
30+
31+
32+
describe("CSHTML Razor Tests", () => {
33+
beforeEach(() => {
34+
hljs.registerLanguage('cshtml-razor', hljsDefineCshtmlRazor);
35+
});
36+
3637
it("should generate correct markup - code-block-multiline", async () => {
3738
await testMarkupGeneration("code-block-multiline");
3839
});
@@ -48,6 +49,9 @@ ${actualMarkup}
4849
it("should generate correct markup - triangle-bracket-in-cs", async () => {
4950
await testMarkupGeneration("triangle-bracket-in-cs");
5051
});
52+
it("should generate correct markup - directives", async () => {
53+
await testMarkupGeneration("directives");
54+
});
5155

5256
it("should be detected correctly", async () => {
5357
var code = await readFile(path.join(__dirname, 'detect', "cshtml-razor", "default.txt"), "utf-8");

0 commit comments

Comments
 (0)