@@ -9,70 +9,91 @@ public class MessagesToHtmlWriter : IDisposable
99 private readonly Action < StreamWriter , Envelope > _streamSerializer ;
1010 private readonly string _template ;
1111 private readonly JsonInHtmlWriter _jsonInHtmlWriter ;
12+ private readonly HtmlReportSettings _settings ;
1213 private bool _streamClosed = false ;
1314 private bool _preMessageWritten = false ;
1415 private bool _firstMessageWritten = false ;
1516 private bool _postMessageWritten = false ;
1617 private readonly bool _isAsyncInitialized = false ;
1718
1819 [ Obsolete ( "Cucumber.HtmlFormatter moving to async only operations. Please use the MessagesToHtmlWriter(Stream, Func<StreamWriter, Envelope, Task>) constructor" , false ) ]
19- public MessagesToHtmlWriter ( Stream stream , Action < StreamWriter , Envelope > streamSerializer ) : this ( new StreamWriter ( stream ) , streamSerializer )
20- {
21- }
22- public MessagesToHtmlWriter ( Stream stream , Func < StreamWriter , Envelope , Task > asyncStreamSerializer ) : this ( new StreamWriter ( stream ) , asyncStreamSerializer ) { }
20+ public MessagesToHtmlWriter ( Stream stream , Action < StreamWriter , Envelope > streamSerializer )
21+ : this ( new StreamWriter ( stream ) , streamSerializer ) { }
22+
23+ public MessagesToHtmlWriter ( Stream stream , Func < StreamWriter , Envelope , Task > asyncStreamSerializer , HtmlReportSettings ? settings = null )
24+ : this ( new StreamWriter ( stream ) , asyncStreamSerializer , settings ) { }
2325
2426 [ Obsolete ( "Cucumber.HtmlFormatter moving to async only operations. Please use the MessagesToHtmlWriter(StreamWriter, Func<StreamWriter, Envelope, Task>) constructor" , false ) ]
2527 public MessagesToHtmlWriter ( StreamWriter writer , Action < StreamWriter , Envelope > streamSerializer )
2628 {
27- this . _writer = writer ;
28- this . _streamSerializer = streamSerializer ;
29+ _writer = writer ;
30+ _streamSerializer = streamSerializer ;
31+ _settings = new HtmlReportSettings ( ) ;
2932 // Create async wrapper for sync serializer
30- this . _asyncStreamSerializer = ( w , e ) =>
33+ _asyncStreamSerializer = ( w , e ) =>
3134 {
3235 streamSerializer ( w , e ) ;
3336 return Task . CompletedTask ;
3437 } ;
35- _template = GetResource ( "index.mustache.html" ) ;
38+ _template = LoadTemplateResource ( ) ;
3639 _jsonInHtmlWriter = new JsonInHtmlWriter ( writer ) ;
3740 _isAsyncInitialized = false ;
3841 }
39- public MessagesToHtmlWriter ( StreamWriter writer , Func < StreamWriter , Envelope , Task > asyncStreamSerializer )
42+
43+ public MessagesToHtmlWriter ( StreamWriter writer , Func < StreamWriter , Envelope , Task > asyncStreamSerializer , HtmlReportSettings ? settings = null )
4044 {
41- this . _writer = writer ;
42- this . _asyncStreamSerializer = asyncStreamSerializer ;
45+ _writer = writer ;
46+ _asyncStreamSerializer = asyncStreamSerializer ;
47+ _settings = settings ?? new ( ) ;
4348 // Create sync wrapper for async serializer (will block)
44- this . _streamSerializer = ( w , e ) => asyncStreamSerializer ( w , e ) . GetAwaiter ( ) . GetResult ( ) ;
45- _template = GetResource ( "index.mustache.html" ) ;
49+ _streamSerializer = ( w , e ) => asyncStreamSerializer ( w , e ) . GetAwaiter ( ) . GetResult ( ) ;
50+ _template = LoadTemplateResource ( ) ;
4651 _jsonInHtmlWriter = new JsonInHtmlWriter ( writer ) ;
4752 _isAsyncInitialized = true ;
4853 }
4954
5055 private void WritePreMessage ( )
5156 {
52- WriteTemplateBetween ( _writer , _template , null , "{{css}}" ) ;
53- WriteResource ( _writer , "main.css" ) ;
54- WriteTemplateBetween ( _writer , _template , "{{css}}" , "{{messages}}" ) ;
57+ WriteTemplateBetween ( _writer , _template , null , "{{title}}" ) ;
58+ _writer . Write ( _settings . Title ) ;
59+ WriteTemplateBetween ( _writer , _template , "{{title}}" , "{{icon}}" ) ;
60+ _writer . Write ( _settings . Icon ) ;
61+ WriteTemplateBetween ( _writer , _template , "{{icon}}" , "{{css}}" ) ;
62+ _writer . Write ( _settings . CssResourceLoader ( ) ) ;
63+ WriteTemplateBetween ( _writer , _template , "{{css}}" , "{{custom_css}}" ) ;
64+ _writer . Write ( _settings . CustomCss ) ;
65+ WriteTemplateBetween ( _writer , _template , "{{custom_css}}" , "{{messages}}" ) ;
5566 }
5667
5768 private async Task WritePreMessageAsync ( )
5869 {
59- await WriteTemplateBetweenAsync ( _writer , _template , null , "{{css}}" ) ;
60- await WriteResourceAsync ( _writer , "main.css" ) ;
61- await WriteTemplateBetweenAsync ( _writer , _template , "{{css}}" , "{{messages}}" ) ;
70+ await WriteTemplateBetweenAsync ( _writer , _template , null , "{{title}}" ) ;
71+ await _writer . WriteAsync ( _settings . Title ) ;
72+ await WriteTemplateBetweenAsync ( _writer , _template , "{{title}}" , "{{icon}}" ) ;
73+ await _writer . WriteAsync ( _settings . Icon ) ;
74+ await WriteTemplateBetweenAsync ( _writer , _template , "{{icon}}" , "{{css}}" ) ;
75+ await _writer . WriteAsync ( _settings . CssResourceLoader ( ) ) ;
76+ await WriteTemplateBetweenAsync ( _writer , _template , "{{css}}" , "{{custom_css}}" ) ;
77+ await _writer . WriteAsync ( _settings . CustomCss ) ;
78+ await WriteTemplateBetweenAsync ( _writer , _template , "{{custom_css}}" , "{{messages}}" ) ;
6279 }
6380
6481 private void WritePostMessage ( )
6582 {
6683 WriteTemplateBetween ( _writer , _template , "{{messages}}" , "{{script}}" ) ;
67- WriteResource ( _writer , "main.js" ) ;
68- WriteTemplateBetween ( _writer , _template , "{{script}}" , null ) ;
84+ _writer . Write ( _settings . JavascriptResourceLoader ( ) ) ;
85+ WriteTemplateBetween ( _writer , _template , "{{script}}" , "{{custom_script}}" ) ;
86+ _writer . Write ( _settings . CustomScript ) ;
87+ WriteTemplateBetween ( _writer , _template , "{{custom_script}}" , null ) ;
6988 }
7089
7190 private async Task WritePostMessageAsync ( )
7291 {
7392 await WriteTemplateBetweenAsync ( _writer , _template , "{{messages}}" , "{{script}}" ) ;
74- await WriteResourceAsync ( _writer , "main.js" ) ;
75- await WriteTemplateBetweenAsync ( _writer , _template , "{{script}}" , null ) ;
93+ await _writer . WriteAsync ( _settings . JavascriptResourceLoader ( ) ) ;
94+ await WriteTemplateBetweenAsync ( _writer , _template , "{{script}}" , "{{custom_script}}" ) ;
95+ await _writer . WriteAsync ( _settings . CustomScript ) ;
96+ await WriteTemplateBetweenAsync ( _writer , _template , "{{custom_script}}" , null ) ;
7697 }
7798
7899 public void Write ( Envelope envelope )
@@ -186,18 +207,6 @@ public async Task DisposeAsync()
186207 }
187208 }
188209
189- private void WriteResource ( StreamWriter writer , string v )
190- {
191- var resource = GetResource ( v ) ;
192- writer . Write ( resource ) ;
193- }
194-
195- private async Task WriteResourceAsync ( StreamWriter writer , string v )
196- {
197- var resource = GetResource ( v ) ;
198- await writer . WriteAsync ( resource ) ;
199- }
200-
201210 private void WriteTemplateBetween ( StreamWriter writer , string template , string ? begin , string ? end )
202211 {
203212 CalculateBeginAndLength ( template , begin , end , out var beginIndex , out var lengthToWrite ) ;
@@ -217,7 +226,7 @@ private async Task WriteTemplateBetweenAsync(StreamWriter writer, string templat
217226 await writer . WriteAsync ( template . Substring ( beginIndex , lengthToWrite ) ) ;
218227 }
219228
220- private string GetResource ( string name )
229+ internal static string GetResource ( string name )
221230 {
222231 var assembly = typeof ( MessagesToHtmlWriter ) . Assembly ;
223232 var resourceStream = assembly . GetManifestResourceStream ( "Cucumber.HtmlFormatter.Resources." + name ) ;
@@ -226,4 +235,9 @@ private string GetResource(string name)
226235 var resource = new StreamReader ( resourceStream ) . ReadToEnd ( ) ;
227236 return resource ;
228237 }
238+
239+ private static string LoadTemplateResource ( )
240+ {
241+ return GetResource ( "index.mustache.html" ) ;
242+ }
229243}
0 commit comments