@@ -15,69 +15,54 @@ namespace ReqnrollFormatters.CustomizedHtml;
1515public 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}
0 commit comments