@@ -9,70 +9,91 @@ public class MessagesToHtmlWriter : IDisposable
9
9
private readonly Action < StreamWriter , Envelope > _streamSerializer ;
10
10
private readonly string _template ;
11
11
private readonly JsonInHtmlWriter _jsonInHtmlWriter ;
12
+ private readonly HtmlReportSettings _settings ;
12
13
private bool _streamClosed = false ;
13
14
private bool _preMessageWritten = false ;
14
15
private bool _firstMessageWritten = false ;
15
16
private bool _postMessageWritten = false ;
16
17
private readonly bool _isAsyncInitialized = false ;
17
18
18
19
[ 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 ) { }
23
25
24
26
[ Obsolete ( "Cucumber.HtmlFormatter moving to async only operations. Please use the MessagesToHtmlWriter(StreamWriter, Func<StreamWriter, Envelope, Task>) constructor" , false ) ]
25
27
public MessagesToHtmlWriter ( StreamWriter writer , Action < StreamWriter , Envelope > streamSerializer )
26
28
{
27
- this . _writer = writer ;
28
- this . _streamSerializer = streamSerializer ;
29
+ _writer = writer ;
30
+ _streamSerializer = streamSerializer ;
31
+ _settings = new HtmlReportSettings ( ) ;
29
32
// Create async wrapper for sync serializer
30
- this . _asyncStreamSerializer = ( w , e ) =>
33
+ _asyncStreamSerializer = ( w , e ) =>
31
34
{
32
35
streamSerializer ( w , e ) ;
33
36
return Task . CompletedTask ;
34
37
} ;
35
- _template = GetResource ( "index.mustache.html" ) ;
38
+ _template = LoadTemplateResource ( ) ;
36
39
_jsonInHtmlWriter = new JsonInHtmlWriter ( writer ) ;
37
40
_isAsyncInitialized = false ;
38
41
}
39
- public MessagesToHtmlWriter ( StreamWriter writer , Func < StreamWriter , Envelope , Task > asyncStreamSerializer )
42
+
43
+ public MessagesToHtmlWriter ( StreamWriter writer , Func < StreamWriter , Envelope , Task > asyncStreamSerializer , HtmlReportSettings ? settings = null )
40
44
{
41
- this . _writer = writer ;
42
- this . _asyncStreamSerializer = asyncStreamSerializer ;
45
+ _writer = writer ;
46
+ _asyncStreamSerializer = asyncStreamSerializer ;
47
+ _settings = settings ?? new ( ) ;
43
48
// 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 ( ) ;
46
51
_jsonInHtmlWriter = new JsonInHtmlWriter ( writer ) ;
47
52
_isAsyncInitialized = true ;
48
53
}
49
54
50
55
private void WritePreMessage ( )
51
56
{
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}}" ) ;
55
66
}
56
67
57
68
private async Task WritePreMessageAsync ( )
58
69
{
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}}" ) ;
62
79
}
63
80
64
81
private void WritePostMessage ( )
65
82
{
66
83
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 ) ;
69
88
}
70
89
71
90
private async Task WritePostMessageAsync ( )
72
91
{
73
92
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 ) ;
76
97
}
77
98
78
99
public void Write ( Envelope envelope )
@@ -186,18 +207,6 @@ public async Task DisposeAsync()
186
207
}
187
208
}
188
209
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
-
201
210
private void WriteTemplateBetween ( StreamWriter writer , string template , string ? begin , string ? end )
202
211
{
203
212
CalculateBeginAndLength ( template , begin , end , out var beginIndex , out var lengthToWrite ) ;
@@ -217,7 +226,7 @@ private async Task WriteTemplateBetweenAsync(StreamWriter writer, string templat
217
226
await writer . WriteAsync ( template . Substring ( beginIndex , lengthToWrite ) ) ;
218
227
}
219
228
220
- private string GetResource ( string name )
229
+ internal static string GetResource ( string name )
221
230
{
222
231
var assembly = typeof ( MessagesToHtmlWriter ) . Assembly ;
223
232
var resourceStream = assembly . GetManifestResourceStream ( "Cucumber.HtmlFormatter.Resources." + name ) ;
@@ -226,4 +235,9 @@ private string GetResource(string name)
226
235
var resource = new StreamReader ( resourceStream ) . ReadToEnd ( ) ;
227
236
return resource ;
228
237
}
238
+
239
+ private static string LoadTemplateResource ( )
240
+ {
241
+ return GetResource ( "index.mustache.html" ) ;
242
+ }
229
243
}
0 commit comments