@@ -11,111 +11,121 @@ namespace ReqnrollFormatters.CustomizedHtml;
11
11
public class CustomizedHtmlFormatter ( IFormattersConfigurationProvider configurationProvider , IFormatterLog logger , IFileSystem fileSystem )
12
12
: HtmlFormatter ( configurationProvider , logger , fileSystem , "customizedHtml" )
13
13
{
14
- public class CustomizedMessagesToHtmlWriter : MessagesToHtmlWriter
14
+ private class CustomizedResourceProvider : IResourceProvider
15
15
{
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 ( )
17
19
{
20
+ string originalResource = _baseResourceProvider . GetTemplateResource ( ) ;
21
+ return originalResource . Replace ( "<div id=\" content\" >" , "<div id='content' class='dark-theme'>" ) ;
18
22
}
19
23
20
- public CustomizedMessagesToHtmlWriter ( StreamWriter writer , Func < StreamWriter , Envelope , Task > asyncStreamSerializer ) : base ( writer , asyncStreamSerializer )
24
+ public string GetCssResource ( )
21
25
{
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
+ """ ;
22
56
}
23
57
24
- protected override string GetResource ( string name )
58
+ public string GetJavaScriptResource ( )
25
59
{
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);
53
70
}
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
+ }
80
81
}
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
+ )
110
111
}
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}," ) ;
116
120
}
117
121
}
118
122
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
+ }
121
131
}
0 commit comments