Skip to content

Commit 39727dc

Browse files
committed
1 parent f6232a6 commit 39727dc

File tree

10 files changed

+205
-311
lines changed

10 files changed

+205
-311
lines changed

ReqnrollFormatters/ReqnrollFormatters.CustomizedHtml/Build-TemplateFormatter.ps1

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,12 @@ Write-Host "CustomTemplate path: $customTemplatePath"
1414
Push-Location $customTemplatePath
1515

1616
try {
17-
# Install dependencies if node_modules doesn't exist
18-
if (-not (Test-Path "node_modules")) {
19-
Write-Host "Installing npm dependencies..."
20-
npm install --no-fund --no-audit --legacy-peer-deps
17+
Write-Host "Installing npm dependencies..."
18+
npm install --no-fund --no-audit --legacy-peer-deps
2119

22-
if ($LASTEXITCODE -ne 0) {
23-
Write-Warning "npm install failed with exit code $LASTEXITCODE"
24-
# Continue anyway - we have fallback resources
25-
}
26-
}
27-
else {
28-
Write-Host "node_modules directory already exists, skipping npm install"
20+
if ($LASTEXITCODE -ne 0) {
21+
Write-Warning "npm install failed with exit code $LASTEXITCODE"
22+
# Continue anyway - we have fallback resources
2923
}
3024

3125
# Build the project

ReqnrollFormatters/ReqnrollFormatters.CustomizedHtml/CustomRenderingHtmlFormatter.cs

Lines changed: 44 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -15,69 +15,54 @@ namespace ReqnrollFormatters.CustomizedHtml;
1515
public class CustomRenderingHtmlFormatter(IFormattersConfigurationProvider configurationProvider, IFormatterLog logger, IFileSystem fileSystem)
1616
: HtmlFormatter(configurationProvider, logger, fileSystem, "customRenderingHtml")
1717
{
18-
private class CustomRenderingResourceProvider : IResourceProvider
18+
private string LoadJavascriptResourceWithCustomRenderFunction(string customRenderScript)
1919
{
20-
private readonly IResourceProvider _baseResourceProvider = new DefaultResourceProvider();
20+
string originalResource = new HtmlReportSettings().JavascriptResourceLoader();
21+
var globalVarsMatch = Regex.Match(originalResource, @"\.render\((?<reactObj>[\w\.]+)\.createElement\((?<cucComps>[\w\.]+)\.EnvelopesProvider");
22+
if (!globalVarsMatch.Success)
23+
throw new InvalidOperationException("Could not find global variables in main.js resource. The regex did not match: " + originalResource);
24+
var reactObj = globalVarsMatch.Groups["reactObj"].Value;
25+
var cucumberReactComponents = globalVarsMatch.Groups["cucComps"].Value;
2126

22-
public string GetTemplateResource()
23-
{
24-
// No template customization needed for custom rendering
25-
return _baseResourceProvider.GetTemplateResource();
26-
}
27-
28-
public string GetCssResource()
29-
{
30-
// No CSS customization needed for custom rendering
31-
return _baseResourceProvider.GetCssResource();
32-
}
33-
34-
public string GetJavaScriptResource()
35-
{
36-
string originalResource = _baseResourceProvider.GetJavaScriptResource();
37-
var globalVarsMatch = Regex.Match(originalResource, @"\.render\((?<reactObj>[\w\.]+)\.createElement\((?<cucComps>[\w\.]+)\.EnvelopesProvider");
38-
if (!globalVarsMatch.Success)
39-
throw new InvalidOperationException("Could not find global variables in main.js resource. The regex did not match: " + originalResource);
40-
var reactObj = globalVarsMatch.Groups["reactObj"].Value;
41-
var cucumberReactComponents = globalVarsMatch.Groups["cucComps"].Value;
42-
43-
// Use customRender which completely customizes the rendering of DocString
44-
return
45-
"""
46-
function customRender(reactObj, cucumberReactComponents, rootObj, renderArg) {
47-
var customRenderArg =
48-
reactObj.createElement(cucumberReactComponents.CustomRendering, {
49-
overrides: {
50-
DocString: (props) => (
51-
reactObj.createElement(
52-
reactObj.Fragment,
53-
null,
54-
reactObj.createElement(
55-
"p",
56-
null,
57-
"I am going to render this doc string in a textarea:"
58-
),
59-
reactObj.createElement(
60-
"textarea",
61-
null,
62-
props.docString.content
63-
)
64-
)
65-
)
66-
}
67-
},
68-
renderArg
69-
);
70-
rootObj.render(customRenderArg);
71-
}
72-
73-
""" +
74-
Regex.Replace(originalResource, @"(?<rootObj>\(0,\w+\(\d+\).createRoot\)\(document.getElementById\(""content""\)\)).render\(", "customRender(" + reactObj + "," + cucumberReactComponents + ", ${rootObj},");
75-
}
27+
// Use customRender which completely customizes the rendering of DocString
28+
return
29+
customRenderScript +
30+
Regex.Replace(originalResource, @"(?<rootObj>\(0,\w+\(\d+\).createRoot\)\(document.getElementById\(""content""\)\)).render\(", "customRender(" + reactObj + "," + cucumberReactComponents + ", ${rootObj},");
7631
}
7732

78-
protected override MessagesToHtmlWriter CreateMessagesToHtmlWriter(Stream stream, Func<StreamWriter, Envelope, Task> asyncStreamSerializer)
33+
protected override HtmlReportSettings GetHtmlReportSettings()
7934
{
80-
var customResourceProvider = new CustomRenderingResourceProvider();
81-
return new MessagesToHtmlWriter(stream, asyncStreamSerializer, customResourceProvider);
35+
var customRenderScript =
36+
"""
37+
function customRender(reactObj, cucumberReactComponents, rootObj, renderArg) {
38+
var customRenderArg =
39+
reactObj.createElement(cucumberReactComponents.CustomRendering, {
40+
overrides: {
41+
DocString: (props) => (
42+
reactObj.createElement(
43+
reactObj.Fragment,
44+
null,
45+
reactObj.createElement(
46+
"p",
47+
null,
48+
"I am going to render this doc string in a textarea:"
49+
),
50+
reactObj.createElement(
51+
"textarea",
52+
null,
53+
props.docString.content
54+
)
55+
)
56+
)
57+
}
58+
},
59+
renderArg
60+
);
61+
rootObj.render(customRenderArg);
62+
}
63+
""";
64+
var settings = base.GetHtmlReportSettings();
65+
settings.JavascriptResourceLoader = () => LoadJavascriptResourceWithCustomRenderFunction(customRenderScript);
66+
return settings;
8267
}
8368
}

ReqnrollFormatters/ReqnrollFormatters.CustomizedHtml/CustomStyledHtmlFormatter.cs

Lines changed: 42 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -15,68 +15,52 @@ namespace ReqnrollFormatters.CustomizedHtml;
1515
public class CustomStyledHtmlFormatter(IFormattersConfigurationProvider configurationProvider, IFormatterLog logger, IFileSystem fileSystem)
1616
: HtmlFormatter(configurationProvider, logger, fileSystem, "customStyledHtml")
1717
{
18-
private class CustomStyledResourceProvider : IResourceProvider
18+
private string LoadJavascriptResourceWithCustomRenderFunction(string customRenderScript)
1919
{
20-
private readonly IResourceProvider _baseResourceProvider = new DefaultResourceProvider();
20+
string originalResource = new HtmlReportSettings().JavascriptResourceLoader();
21+
var globalVarsMatch = Regex.Match(originalResource, @"\.render\((?<reactObj>[\w\.]+)\.createElement\((?<cucComps>[\w\.]+)\.EnvelopesProvider");
22+
if (!globalVarsMatch.Success)
23+
throw new InvalidOperationException("Could not find global variables in main.js resource. The regex did not match: " + originalResource);
24+
var reactObj = globalVarsMatch.Groups["reactObj"].Value;
25+
var cucumberReactComponents = globalVarsMatch.Groups["cucComps"].Value;
2126

22-
public string GetTemplateResource()
23-
{
24-
// No template customization needed for custom styles
25-
return _baseResourceProvider.GetTemplateResource();
26-
}
27-
28-
public string GetCssResource()
29-
{
30-
string originalResource = _baseResourceProvider.GetCssResource();
31-
// Add custom style for docstring
32-
return originalResource + "\n" +
33-
"""
34-
/* Custom styles, see https://github.com/cucumber/react-components?tab=readme-ov-file#custom-styles */
35-
.acme-docstring {
36-
font-weight: bold;
37-
font-style: italic;
38-
background-color: black;
39-
color: hotpink;
40-
text-shadow: 1px 1px 2px white;
41-
padding: 10px;
42-
}
43-
""";
44-
}
45-
46-
public string GetJavaScriptResource()
47-
{
48-
string originalResource = _baseResourceProvider.GetJavaScriptResource();
49-
var globalVarsMatch = Regex.Match(originalResource, @"\.render\((?<reactObj>[\w\.]+)\.createElement\((?<cucComps>[\w\.]+)\.EnvelopesProvider");
50-
if (!globalVarsMatch.Success)
51-
throw new InvalidOperationException("Could not find global variables in main.js resource. The regex did not match: " + originalResource);
52-
var reactObj = globalVarsMatch.Groups["reactObj"].Value;
53-
var cucumberReactComponents = globalVarsMatch.Groups["cucComps"].Value;
54-
55-
// Use customRender which applies a custom style class
56-
return
57-
"""
58-
function customRender(reactObj, cucumberReactComponents, rootObj, renderArg) {
59-
var customRenderArg =
60-
reactObj.createElement(cucumberReactComponents.CustomRendering, {
61-
overrides: {
62-
DocString: {
63-
docString: 'acme-docstring'
64-
}
65-
}
66-
},
67-
renderArg
68-
);
69-
rootObj.render(customRenderArg);
70-
}
71-
72-
""" +
73-
Regex.Replace(originalResource, @"(?<rootObj>\(0,\w+\(\d+\).createRoot\)\(document.getElementById\(""content""\)\)).render\(", "customRender(" + reactObj + "," + cucumberReactComponents + ", ${rootObj},");
74-
}
27+
// Use customRender which completely customizes the rendering of DocString
28+
return
29+
customRenderScript +
30+
Regex.Replace(originalResource, @"(?<rootObj>\(0,\w+\(\d+\).createRoot\)\(document.getElementById\(""content""\)\)).render\(", "customRender(" + reactObj + "," + cucumberReactComponents + ", ${rootObj},");
7531
}
7632

77-
protected override MessagesToHtmlWriter CreateMessagesToHtmlWriter(Stream stream, Func<StreamWriter, Envelope, Task> asyncStreamSerializer)
33+
protected override HtmlReportSettings GetHtmlReportSettings()
7834
{
79-
var customResourceProvider = new CustomStyledResourceProvider();
80-
return new MessagesToHtmlWriter(stream, asyncStreamSerializer, customResourceProvider);
35+
var customRenderScript =
36+
"""
37+
function customRender(reactObj, cucumberReactComponents, rootObj, renderArg) {
38+
var customRenderArg =
39+
reactObj.createElement(cucumberReactComponents.CustomRendering, {
40+
overrides: {
41+
DocString: {
42+
docString: 'acme-docstring'
43+
}
44+
}
45+
},
46+
renderArg
47+
);
48+
rootObj.render(customRenderArg);
49+
}
50+
""";
51+
var settings = base.GetHtmlReportSettings();
52+
settings.JavascriptResourceLoader = () => LoadJavascriptResourceWithCustomRenderFunction(customRenderScript);
53+
settings.CustomCss = """
54+
/* Custom styles, see https://github.com/cucumber/react-components?tab=readme-ov-file#custom-styles */
55+
.acme-docstring {
56+
font-weight: bold;
57+
font-style: italic;
58+
background-color: black;
59+
color: hotpink;
60+
text-shadow: 1px 1px 2px white;
61+
padding: 10px;
62+
}
63+
""";
64+
return settings;
8165
}
8266
}

0 commit comments

Comments
 (0)