Skip to content

Commit 0251615

Browse files
committed
ReqnrollFormatters.CustomizedHtml: Use custom resource provider
1 parent a28dc70 commit 0251615

File tree

1 file changed

+103
-93
lines changed

1 file changed

+103
-93
lines changed

ReqnrollFormatters/ReqnrollFormatters.CustomizedHtml/CustomizedHtmlFormatter.cs

Lines changed: 103 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -11,111 +11,121 @@ namespace ReqnrollFormatters.CustomizedHtml;
1111
public class CustomizedHtmlFormatter(IFormattersConfigurationProvider configurationProvider, IFormatterLog logger, IFileSystem fileSystem)
1212
: HtmlFormatter(configurationProvider, logger, fileSystem, "customizedHtml")
1313
{
14-
public class CustomizedMessagesToHtmlWriter : MessagesToHtmlWriter
14+
private class CustomizedResourceProvider : IResourceProvider
1515
{
16-
public CustomizedMessagesToHtmlWriter(Stream stream, Func<StreamWriter, Envelope, Task> asyncStreamSerializer) : base(stream, asyncStreamSerializer)
16+
private readonly IResourceProvider _baseResourceProvider = new DefaultResourceProvider();
17+
18+
public string GetTemplateResource()
1719
{
20+
string originalResource = _baseResourceProvider.GetTemplateResource();
21+
return originalResource.Replace("<div id=\"content\">", "<div id='content' class='dark-theme'>");
1822
}
1923

20-
public CustomizedMessagesToHtmlWriter(StreamWriter writer, Func<StreamWriter, Envelope, Task> asyncStreamSerializer) : base(writer, asyncStreamSerializer)
24+
public string GetCssResource()
2125
{
26+
string originalResource = _baseResourceProvider.GetCssResource();
27+
return originalResource + "\n" +
28+
"""
29+
/* Custom theme, see https://github.com/cucumber/react-components?tab=readme-ov-file#theming */
30+
.dark-theme {
31+
background-color: #1d1d26;
32+
color: #c9c9d1;
33+
--cucumber-anchor-color: #4caaee;
34+
--cucumber-keyword-color: #d89077;
35+
--cucumber-parameter-color: #4caaee;
36+
--cucumber-tag-color: #85a658;
37+
--cucumber-docstring-color: #66a565;
38+
--cucumber-error-background-color: #cf6679;
39+
--cucumber-error-text-color: #222;
40+
--cucumber-code-background-color: #282a36;
41+
--cucumber-code-text-color: #f8f8f2;
42+
--cucumber-panel-background-color: #282a36;
43+
--cucumber-panel-accent-color: #313442;
44+
--cucumber-panel-text-color: #f8f8f2;
45+
}
46+
47+
.acme-docstring {
48+
font-weight: bold;
49+
font-style: italic;
50+
background-color: black;
51+
color: hotpink;
52+
text-shadow: 1px 1px 2px white;
53+
padding: 10px;
54+
}
55+
""";
2256
}
2357

24-
protected override string GetResource(string name)
58+
public string GetJavaScriptResource()
2559
{
26-
string originalResource = base.GetResource(name);
27-
switch (name)
28-
{
29-
case "main.css":
30-
return originalResource + "\n" +
31-
"""
32-
/* Custom theme, see https://github.com/cucumber/react-components?tab=readme-ov-file#theming */
33-
.dark-theme {
34-
background-color: #1d1d26;
35-
color: #c9c9d1;
36-
--cucumber-anchor-color: #4caaee;
37-
--cucumber-keyword-color: #d89077;
38-
--cucumber-parameter-color: #4caaee;
39-
--cucumber-tag-color: #85a658;
40-
--cucumber-docstring-color: #66a565;
41-
--cucumber-error-background-color: #cf6679;
42-
--cucumber-error-text-color: #222;
43-
--cucumber-code-background-color: #282a36;
44-
--cucumber-code-text-color: #f8f8f2;
45-
--cucumber-panel-background-color: #282a36;
46-
--cucumber-panel-accent-color: #313442;
47-
--cucumber-panel-text-color: #f8f8f2;
48-
}
49-
""";
50-
case "index.mustache.html":
51-
{
52-
return originalResource.Replace("<div id=\"content\">", "<div id='content' class='dark-theme'>");
60+
string originalResource = _baseResourceProvider.GetJavaScriptResource();
61+
var globalVarsMatch = Regex.Match(originalResource, @"\.render\((?<reactObj>[\w\.]+)\.createElement\((?<cucComps>[\w\.]+)\.EnvelopesProvider");
62+
if (!globalVarsMatch.Success)
63+
throw new InvalidOperationException("Could not find global variables in main.js resource. The regex did not match: " + originalResource);
64+
var reactObj = globalVarsMatch.Groups["reactObj"].Value;
65+
var cucumberReactComponents = globalVarsMatch.Groups["cucComps"].Value;
66+
return
67+
"""
68+
function customRender0(reactObj, cucumberReactComponents, rootObj, renderArg) {
69+
rootObj.render(renderArg);
5370
}
54-
case "main.js":
55-
var globalVarsMatch = Regex.Match(originalResource, @"\.render\((?<reactObj>[\w\.]+)\.createElement\((?<cucComps>[\w\.]+)\.EnvelopesProvider");
56-
if (!globalVarsMatch.Success)
57-
throw new InvalidOperationException("Could not find global variables in main.js resource. The regex did not match: " + originalResource);
58-
var reactObj = globalVarsMatch.Groups["reactObj"].Value;
59-
var cucumberReactComponents = globalVarsMatch.Groups["cucComps"].Value;
60-
return
61-
"""
62-
function customRender0(reactObj, cucumberReactComponents, rootObj, renderArg) {
63-
rootObj.render(renderArg);
64-
}
65-
function customRender2(reactObj, cucumberReactComponents, rootObj, renderArg) {
66-
console.log(reactObj);
67-
console.log(cucumberReactComponents);
68-
console.log(rootObj);
69-
var customRenderArg =
70-
reactObj.createElement(cucumberReactComponents.CustomRendering, {
71-
overrides: {
72-
DocString: {
73-
docString: 'acme-docstring'
74-
}
75-
}
76-
},
77-
renderArg
78-
);
79-
rootObj.render(customRenderArg);
71+
function customRender2(reactObj, cucumberReactComponents, rootObj, renderArg) {
72+
console.log(reactObj);
73+
console.log(cucumberReactComponents);
74+
console.log(rootObj);
75+
var customRenderArg =
76+
reactObj.createElement(cucumberReactComponents.CustomRendering, {
77+
overrides: {
78+
DocString: {
79+
docString: 'acme-docstring'
80+
}
8081
}
81-
82-
function customRender(reactObj, cucumberReactComponents, rootObj, renderArg) {
83-
console.log(reactObj);
84-
console.log(cucumberReactComponents);
85-
console.log(rootObj);
86-
var customRenderArg =
87-
reactObj.createElement(cucumberReactComponents.CustomRendering, {
88-
overrides: {
89-
DocString: (props) => (
90-
reactObj.createElement(
91-
reactObj.Fragment,
92-
null,
93-
reactObj.createElement(
94-
"p",
95-
null,
96-
"I am going to render this doc string in a textarea:"
97-
),
98-
reactObj.createElement(
99-
"textarea",
100-
null,
101-
props.docString.content
102-
)
103-
)
104-
)
105-
}
106-
},
107-
renderArg
108-
);
109-
rootObj.render(customRenderArg);
82+
},
83+
renderArg
84+
);
85+
rootObj.render(customRenderArg);
86+
}
87+
88+
function customRender(reactObj, cucumberReactComponents, rootObj, renderArg) {
89+
console.log(reactObj);
90+
console.log(cucumberReactComponents);
91+
console.log(rootObj);
92+
var customRenderArg =
93+
reactObj.createElement(cucumberReactComponents.CustomRendering, {
94+
overrides: {
95+
DocString: (props) => (
96+
reactObj.createElement(
97+
reactObj.Fragment,
98+
null,
99+
reactObj.createElement(
100+
"p",
101+
null,
102+
"I am going to render this doc string in a textarea:"
103+
),
104+
reactObj.createElement(
105+
"textarea",
106+
null,
107+
props.docString.content
108+
)
109+
)
110+
)
110111
}
111-
112-
""" +
113-
Regex.Replace(originalResource, @"(?<rootObj>\(0,\w+\(\d+\).createRoot\)\(document.getElementById\(""content""\)\)).render\(", "customRender(" + reactObj + "," + cucumberReactComponents + ", ${rootObj},");
114-
}
115-
return originalResource;
112+
},
113+
renderArg
114+
);
115+
rootObj.render(customRenderArg);
116+
}
117+
118+
""" +
119+
Regex.Replace(originalResource, @"(?<rootObj>\(0,\w+\(\d+\).createRoot\)\(document.getElementById\(""content""\)\)).render\(", "customRender(" + reactObj + "," + cucumberReactComponents + ", ${rootObj},");
116120
}
117121
}
118122

119-
protected override MessagesToHtmlWriter CreateMessagesToHtmlWriter(Stream stream, Func<StreamWriter, Envelope, Task> asyncStreamSerializer)
120-
=> new CustomizedMessagesToHtmlWriter(stream, asyncStreamSerializer);
123+
protected override MessagesToHtmlWriter CreateMessagesToHtmlWriter(Stream stream, Func<StreamWriter, Envelope, Task> asyncStreamSerializer)
124+
{
125+
// Create a custom resource provider that internally handles the default resource provider
126+
var customResourceProvider = new CustomizedResourceProvider();
127+
128+
// Create the writer with the custom resource provider
129+
return new MessagesToHtmlWriter(stream, asyncStreamSerializer, customResourceProvider);
130+
}
121131
}

0 commit comments

Comments
 (0)