report_builder_fix 0.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,429 @@
1
+ require_relative 'report_builder/builder'
2
+
3
+ ##
4
+ # ReportBuilder Main module
5
+ #
6
+ module ReportBuilder
7
+
8
+ ##
9
+ # ReportBuilder options
10
+ #
11
+ def self.options
12
+ @options ||= {
13
+ input_path: Dir.pwd,
14
+ report_types: [:html],
15
+ report_title: 'Test Results',
16
+ include_images: true,
17
+ voice_commands: false,
18
+ additional_info: {},
19
+ report_path: 'test_report',
20
+ color: 'brown'
21
+ }
22
+ end
23
+
24
+ ##
25
+ # Configure ReportBuilder
26
+ #
27
+ # Example:
28
+ #
29
+ # ReportBuilder.configure do |config|
30
+ # config.input_path = 'cucumber_sample/logs'
31
+ # config.report_path = 'my_test_report'
32
+ # config.report_types = [:RETRY, :HTML]
33
+ # config.report_title = 'My Test Results'
34
+ # config.include_images = true
35
+ # config.voice_commands = true
36
+ # config.additional_info = {Browser: 'Chrome', Environment: 'Stage 5'}
37
+ # end
38
+ #
39
+ def self.configure
40
+ options
41
+ more_options = OpenStruct.new
42
+ yield more_options if block_given?
43
+ @options.merge! more_options.marshal_dump
44
+ end
45
+
46
+ ##
47
+ # Build Report
48
+ #
49
+ # @param [Hash] more_options override the default and configured options.
50
+ #
51
+ # Example:
52
+ #
53
+ # options = {
54
+ # json_path: 'cucumber_sample/logs',
55
+ # report_path: 'my_test_report',
56
+ # report_types: ['retry', 'html'],
57
+ # report_title: 'My Test Results',
58
+ # include_images: true,
59
+ # voice_commands: true,
60
+ # color: 'deep-purple',
61
+ # additional_info: {'browser' => 'Chrome', 'environment' => 'Stage 5'}
62
+ # }
63
+ #
64
+ # ReportBuilder.build_report options
65
+ #
66
+ def self.build_report(more_options = {})
67
+ options
68
+ if more_options.is_a? String
69
+ @options[:input_path] = more_options
70
+ elsif more_options.is_a? Hash
71
+ @options.merge! more_options
72
+ end
73
+ @options[:input_path] = @options[:json_path] if @options[:json_path]
74
+ @options[:report_types] = [@options[:report_types]] unless @options[:report_types].is_a? Array
75
+ @options[:report_types].map!(&:to_s).map!(&:upcase)
76
+ Builder.new.build_report
77
+ end
78
+
79
+ ##
80
+ # Set Report Builder input json files path / array of json files or path / hash of json files or path
81
+ #
82
+ # @param [String/Array/Hash] json_path input json files path / array of json files or path / hash of json files or path
83
+ #
84
+ # Example:
85
+ #
86
+ # ReportBuilder.json_path = 'my_project/cucumber_json'
87
+ #
88
+ def self.json_path=(json_path)
89
+ options
90
+ @options[:input_path] = json_path
91
+ end
92
+
93
+ ##
94
+ # Returns Report Builder input json files path / array of json files or path / hash of json files or path
95
+ #
96
+ # @return [String/Array/Hash] json_path input json files path / array of json files or path / hash of json files or path
97
+ #
98
+ def self.json_path
99
+ options[:input_path]
100
+ end
101
+
102
+ ##
103
+ # Set Report Builder input json files path / array of json files or path / hash of json files or path
104
+ #
105
+ # @param [String/Array/Hash] input_path input json files path / array of json files or path / hash of json files or path
106
+ #
107
+ # Example:
108
+ #
109
+ # ReportBuilder.input_path = 'my_project/cucumber_json'
110
+ #
111
+ def self.input_path=(input_path)
112
+ options
113
+ @options[:input_path] = input_path
114
+ end
115
+
116
+ ##
117
+ # Returns Report Builder input json files path / array of json files or path / hash of json files or path
118
+ #
119
+ # @return [String/Array/Hash] input_path input json files path / array of json files or path / hash of json files or path
120
+ #
121
+ def self.input_path
122
+ options[:input_path]
123
+ end
124
+
125
+ ##
126
+ # Set Report Builder report_types :json, :html, :retry (output file types)
127
+ #
128
+ # @param [Array] report_types :json, :html, :retry (output file types)
129
+ #
130
+ # Example:
131
+ #
132
+ # ReportBuilder.report_types = [:html, :retry]
133
+ #
134
+ def self.report_types=(report_types)
135
+ options
136
+ @options[:report_types] = report_types.is_a? Array ? report_types : [report_types]
137
+ end
138
+
139
+ ##
140
+ # Returns Report Builder report_types :json, :html, :retry (output file types)
141
+ #
142
+ # @return [Array] report_types :json, :html, :retry (output file types)
143
+ #
144
+ def self.report_types
145
+ options[:report_types]
146
+ end
147
+
148
+ ##
149
+ # Set Report Builder HTML report title
150
+ #
151
+ # @param [String] report_title HTML report title
152
+ #
153
+ # Example:
154
+ #
155
+ # ReportBuilder.report_title = 'My Report'
156
+ #
157
+ def self.report_title=(report_title)
158
+ options
159
+ @options[:report_title] = report_title if report_title.is_a? String
160
+ end
161
+
162
+ ##
163
+ # Returns Report Builder HTML report title
164
+ #
165
+ # @return [String] report_title HTML report title
166
+ #
167
+ def self.report_title
168
+ options[:report_title]
169
+ end
170
+
171
+ ##
172
+ # Set Report Builder include or excluding embedded images
173
+ #
174
+ # @param [Boolean] include_images include or excluding embedded images
175
+ #
176
+ # Example:
177
+ #
178
+ # ReportBuilder.include_images = false
179
+ #
180
+ def self.include_images=(include_images)
181
+ options
182
+ @options[:include_images] = include_images if !!include_images == include_images
183
+ end
184
+
185
+ ##
186
+ # Returns Report Builder include or excluding embedded images
187
+ #
188
+ # @return [Boolean] include_images include or excluding embedded images
189
+ #
190
+ def self.include_images
191
+ options[:include_images]
192
+ end
193
+
194
+ ##
195
+ # Set Report Builder enable or disable voice commands
196
+ #
197
+ # @param [Boolean] voice_commands enable or disable voice commands
198
+ #
199
+ # Example:
200
+ #
201
+ # ReportBuilder.voice_commands = true
202
+ #
203
+ def self.voice_commands=(voice_commands)
204
+ options
205
+ @options[:voice_commands] = voice_commands if !!voice_commands == voice_commands
206
+ end
207
+
208
+ ##
209
+ # Returns Report Builder enable or disable voice commands
210
+ #
211
+ # @return [Boolean] voice_commands enable or disable voice commands
212
+ #
213
+ def self.voice_commands
214
+ options[:voice_commands]
215
+ end
216
+
217
+ ##
218
+ # Set Report Builder additional info for report summary
219
+ #
220
+ # @param [Hash] additional_info additional info for report summary
221
+ #
222
+ # Example:
223
+ #
224
+ # ReportBuilder.additional_info = {'Environment' => 'Abc Environment', 'Browser' => 'Chrome'}
225
+ #
226
+ def self.additional_info=(additional_info)
227
+ options
228
+ @options[:additional_info] = additional_info if additional_info.is_a? Hash
229
+ end
230
+
231
+ ##
232
+ # Returns Report Builder additional info for report summary
233
+ #
234
+ # @return [Hash] additional_info additional info for report summary
235
+ #
236
+ def self.additional_info
237
+ options[:additional_info]
238
+ end
239
+
240
+ ##
241
+ # Set Report Builder reports output file path with file name without extension
242
+ #
243
+ # @param [String] report_path reports output file path with file name without extension
244
+ #
245
+ # Example:
246
+ #
247
+ # ReportBuilder.report_path = 'reports/report'
248
+ #
249
+ def self.report_path=(report_path)
250
+ options
251
+ options[:report_path] = report_path if report_path.is_a? String
252
+ end
253
+
254
+ ##
255
+ # Returns Report Builder reports output file path with file name without extension
256
+ #
257
+ # @return [String] report_path reports output file path with file name without extension
258
+ #
259
+ def self.report_path
260
+ options[:report_path]
261
+ end
262
+
263
+ ##
264
+ # Set Report Builder json report output file path with file name without extension
265
+ #
266
+ # @param [String] json_report_path json report output file path with file name without extension
267
+ #
268
+ # Example:
269
+ #
270
+ # ReportBuilder.json_report_path = 'reports/report'
271
+ #
272
+ def self.json_report_path=(json_report_path)
273
+ options
274
+ @options[:json_report_path] = json_report_path if json_report_path.is_a? String
275
+ end
276
+
277
+ ##
278
+ # Returns Report Builder json report output file path with file name without extension
279
+ #
280
+ # @return [String] json_report_path json report output file path with file name without extension
281
+ #
282
+ def self.json_report_path
283
+ options[:json_report_path] || options[:report_path]
284
+ end
285
+
286
+ ##
287
+ # Set Report Builder html report output file path with file name without extension
288
+ #
289
+ # @param [String] html_report_path html report output file path with file name without extension
290
+ #
291
+ # Example:
292
+ #
293
+ # ReportBuilder.html_report_path = 'reports/report'
294
+ #
295
+ def self.html_report_path=(html_report_path)
296
+ options
297
+ @options[:html_report_path] = html_report_path if html_report_path.is_a? String
298
+ end
299
+
300
+ ##
301
+ # Returns Report Builder html report output file path with file name without extension
302
+ #
303
+ # @return [String] html_report_path html report output file path with file name without extension
304
+ #
305
+ def self.html_report_path
306
+ options[:html_report_path] || options[:report_path]
307
+ end
308
+
309
+ ##
310
+ # Set Report Builder retry report output file path with file name without extension
311
+ #
312
+ # @param [String] retry_report_path retry report output file path with file name without extension
313
+ #
314
+ # Example:
315
+ #
316
+ # ReportBuilder.retry_report_path = 'reports/report'
317
+ #
318
+ def self.retry_report_path=(retry_report_path)
319
+ options
320
+ @options[:retry_report_path] = retry_report_path if retry_report_path.is_a? String
321
+ end
322
+
323
+ ##
324
+ # Returns Report Builder retry report output file path with file name without extension
325
+ #
326
+ # @return [String] retry_report_path retry report output file path with file name without extension
327
+ #
328
+ def self.retry_report_path
329
+ options[:retry_report_path] || options[:report_path]
330
+ end
331
+
332
+ ##
333
+ # Set Report Builder additional CSS string or CSS file path or CSS file url for customizing html report
334
+ #
335
+ # @param [String] additional_css additional CSS string or CSS file path or CSS file url for customizing html report
336
+ #
337
+ # Example:
338
+ #
339
+ # ReportBuilder.additional_css = 'css/style.css'
340
+ #
341
+ def self.additional_css=(additional_css)
342
+ options
343
+ @options[:additional_css] = additional_css if additional_css.is_a? String
344
+ end
345
+
346
+ ##
347
+ # Returns Report Builder additional CSS string or CSS file path or CSS file url for customizing html report
348
+ #
349
+ # @return [String] additional_css additional CSS string or CSS file path or CSS file url for customizing html report
350
+ #
351
+ def self.additional_css
352
+ options[:additional_css]
353
+ end
354
+
355
+ ##
356
+ # Set Report Builder additional JS string or JS file path or JS file url for customizing html report
357
+ #
358
+ # @param [String] additional_js additional JS string or JS file path or JS file url for customizing html report
359
+ #
360
+ # Example:
361
+ #
362
+ # ReportBuilder.json_report_path = 'js/script.js'
363
+ #
364
+ def self.additional_js=(additional_js)
365
+ options
366
+ @options[:additional_js=] = additional_js if additional_js.is_a? String
367
+ end
368
+
369
+ ##
370
+ # Returns Report Builder additional JS string or JS file path or JS file url for customizing html report
371
+ #
372
+ # @return [String] additional_js additional JS string or JS file path or JS file url for customizing html report
373
+ #
374
+ def self.additional_js
375
+ options[:additional_js]
376
+ end
377
+
378
+ ##
379
+ # Set Report Builder report color, Ex: indigo, cyan, purple, grey, lime etc.
380
+ #
381
+ # @param [String] color report color, Ex: indigo, cyan, purple, grey, lime etc.
382
+ #
383
+ # Example:
384
+ #
385
+ # ReportBuilder.color = 'purple'
386
+ #
387
+ def self.color=(color)
388
+ options
389
+ @options[:color] = color if color.is_a? String
390
+ end
391
+
392
+ ##
393
+ # Returns Report Builder report color, Ex: indigo, cyan, purple, grey, lime etc.
394
+ #
395
+ # @return [String] color report color, Ex: indigo, cyan, purple, grey, lime etc.
396
+ #
397
+ def self.color
398
+ options[:color]
399
+ end
400
+
401
+ ##
402
+ # Set Report Builder Options
403
+ #
404
+ # @param [String] option
405
+ # @param [String] value
406
+ #
407
+ # Example:
408
+ #
409
+ # ReportBuilder.set('title', 'My Features')
410
+ #
411
+ def self.set_option(option, value)
412
+ options
413
+ @options[option.to_sym] = value
414
+ end
415
+
416
+ ##
417
+ # Set Report Builder Options
418
+ #
419
+ # @param [String] option
420
+ # @param [String] value
421
+ #
422
+ # Example:
423
+ #
424
+ # ReportBuilder.set('title', 'My Features')
425
+ #
426
+ def self.set(option, value)
427
+ set_option(option, value)
428
+ end
429
+ end
@@ -0,0 +1,21 @@
1
+ <li class="error">
2
+ <div class="collapsible-header red lighten-2 white-text waves-effect waves-light">
3
+ <i class="material-icons">bug_report</i><%= error %>
4
+ </div>
5
+
6
+ <div class="collapsible-body <%= options[:color] %> lighten-4">
7
+ <div class="collection failedScenarioList">
8
+ <% features.each_with_index do |feature, f| %>
9
+ <% feature['elements'].each_with_index do |scenario, s| %>
10
+ <% if scenario['error'] %>
11
+ <% if scenario['error'] == error %>
12
+ <a class="collection-item failedScenario <%= options[:color] %> lighten-5 red-text modal-trigger waves-effect waves-light" href="#<%= "#{gid}f#{f}s#{s}" %>">
13
+ <i class="material-icons">highlight_off</i>&nbsp;<%= scenario['name'] %>
14
+ </a>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
19
+ </div>
20
+ </div>
21
+ </li>
@@ -0,0 +1,5 @@
1
+ <ul class="errorList collapsible popout" data-collapsible="expandable">
2
+ <% errors.uniq.each do |error| %>
3
+ <%= get('error').result(binding) %>
4
+ <% end %>
5
+ </ul>
@@ -0,0 +1,16 @@
1
+ <li class="feature <%= feature['status'] %>">
2
+ <div class="collapsible-header <%= options[:color] %> lighten-1 waves-effect waves-light">
3
+ <i class="material-icons">featured_play_list</i>
4
+ <b><%= feature['keyword'] %></b>&nbsp;<%= feature['name'] %>&nbsp;(<%= duration(feature['duration']) %>)
5
+ </div>
6
+
7
+ <div class="collapsible-body <%= options[:color] %> lighten-4">
8
+ <div class="collection scenarioList <%= options[:color] %>">
9
+ <% feature['elements'].each_with_index do |scenario, s| %>
10
+ <a class="collection-item scenario modal-trigger waves-effect waves-light white-text <%= scenario['status'] %>" href="#<%= "#{fid}s#{s}" %>">
11
+ <b><%= scenario['keyword'] %></b> <%= scenario['name'] %>&nbsp;(<%= duration(scenario['duration']) %>)
12
+ </a>
13
+ <% end %>
14
+ </div>
15
+ </div>
16
+ </li>
@@ -0,0 +1,6 @@
1
+ <ul class="featureList collapsible popout" data-collapsible="expandable">
2
+ <% features.each_with_index do |feature, f| %>
3
+ <% fid = "#{gid}f#{f}" %>
4
+ <%= get('feature').result(binding) %>
5
+ <% end %>
6
+ </ul>
@@ -0,0 +1,46 @@
1
+ <footer class="page-footer <%= options[:color] %> lighten-4">
2
+ <div class="footer-copyright <%= options[:color] %> lighten-1">
3
+ <div class="container">
4
+ Happy Reporting!
5
+ <a class="white-text text-lighten-4 right" href="https://reportbuilder.rajatthareja.com">Generated by Report Builder</a>
6
+ </div>
7
+ </div>
8
+ </footer>
9
+
10
+ <script type="text/javascript" src="https://cdn.rawgit.com/rajatthareja/ReportBuilder/v1.9/js/report.builder.min.js"></script>
11
+
12
+ <% if options[:voice_commands] %>
13
+ <script src="//cdnjs.cloudflare.com/ajax/libs/annyang/2.6.0/annyang.min.js"></script>
14
+ <script>
15
+ var commands = {
16
+ 'show :tab': function(tab) {
17
+ if (tab === "overview") {
18
+ $("a[data-tooltip='Results Overview']").click();
19
+ } else if (tab === "features" || tab === "feature") {
20
+ $("a[data-tooltip='Scenarios by Features']").click();
21
+ } else if (tab === "summary") {
22
+ $("a[data-tooltip='Scenarios Summary Table']").click();
23
+ } else if (tab === "errors" || tab === "error" || tab === "failed" || tab === "bugs") {
24
+ $("a[data-tooltip='Failed Scenarios']").click();
25
+ }
26
+ },
27
+ 'search *search': function (search) {
28
+ $("a[data-tooltip='Scenarios Summary Table']").click();
29
+ $("input[type='search']").val(search);
30
+ $('table#summaryTable').DataTable().search(search).draw();
31
+ }
32
+ };
33
+ annyang.addCommands(commands);
34
+ annyang.start();
35
+ </script>
36
+ <% end %>
37
+
38
+ <% if options[:additional_js] %>
39
+ <% if options[:additional_js] =~ /^http(|s):\/\/.*\.js$/ %>
40
+ <script src="<%= options[:additional_js] %>"></script>
41
+ <% else %>
42
+ <script type="text/javascript">
43
+ <%= options[:additional_js]%>
44
+ </script>
45
+ <% end %>
46
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <ul class="groupErrorList collapsible popout" data-collapsible="expandable">
2
+ <% groups.each_with_index do |group, g| %>
3
+
4
+ <% gid = "g#{g}" %>
5
+ <% features = group['features'] %>
6
+ <li class="groupError">
7
+
8
+ <div class="collapsible-header red lighten-2 white-text waves-effect waves-light">
9
+ <i class="material-icons">group_work</i>
10
+ <b><%= group['name'] %></b>
11
+ </div>
12
+
13
+ <div class="collapsible-body <%= options[:color] %> lighten-4">
14
+ <%= get('errors').result(binding) %>
15
+ </div>
16
+ </li>
17
+ <% end %>
18
+ </ul>
@@ -0,0 +1,18 @@
1
+ <ul class="groupList collapsible popout" data-collapsible="expandable">
2
+ <% groups.each_with_index do |group, g| %>
3
+
4
+ <% gid = "g#{g}" %>
5
+ <% features = group['features'] %>
6
+ <li class="group">
7
+
8
+ <div class="collapsible-header <%= options[:color] %> lighten-1 waves-effect waves-light">
9
+ <i class="material-icons">group_work</i>
10
+ <b><%= group['name'] %></b>&nbsp;(<%= duration(total_time(features)) %>)
11
+ </div>
12
+
13
+ <div class="collapsible-body <%= options[:color] %> lighten-4">
14
+ <%= get('features').result(binding) %>
15
+ </div>
16
+ </li>
17
+ <% end %>
18
+ </ul>
@@ -0,0 +1,33 @@
1
+ <div class="row">
2
+ <div class="col m4 s12">
3
+ <canvas id="featuresDoughnut" width="400" height="400"></canvas>
4
+ <table id="metaDataFeatures" class="bordered">
5
+ <tbody></tbody>
6
+ </table>
7
+ </div>
8
+
9
+ <div class="col m4 s12">
10
+ <canvas id="scenariosDoughnut" width="400" height="400"></canvas>
11
+ <table id="metaDataScenarios" class="bordered">
12
+ <tbody></tbody>
13
+ </table>
14
+ </div>
15
+
16
+ <div class="col m4 s12">
17
+ <table id="metaData" class="bordered">
18
+ <tbody>
19
+ <tr><th>Total Time</th><td><%= duration(total_time(groups.map{|g| g['features']}.flatten)) %></td></tr>
20
+ <% options[:additional_info].each do |key, value| %>
21
+ <tr>
22
+ <th><%= key %></th>
23
+ <td><%= value %></td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+ </div>
29
+
30
+ <div class="col s12">
31
+ <canvas id="groupBarChart"></canvas>
32
+ </div>
33
+ </div>
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <%= get('head').result(binding) %>
4
+ <body>
5
+ <%= get('header').result(binding) %>
6
+
7
+ <% errors = [] %>
8
+
9
+ <% groups.each_with_index do |group, g| %>
10
+ <% gid = "g#{g}" %>
11
+ <% features = group['features'] %>
12
+ <%= get('scenarios').result(binding) %>
13
+ <% end %>
14
+
15
+ <main class="<%= options[:color] %> lighten-5">
16
+ <div class="row">
17
+ <div id="overview" class="col s12 <%= options[:color] %> lighten-5">
18
+ <%= get('group_overview').result(binding) %>
19
+ </div>
20
+
21
+ <div id="features" class="col s12 <%= options[:color] %> lighten-5 white-text">
22
+ <%= get('group_features').result(binding) %>
23
+ </div>
24
+
25
+ <div id="summary" class="col s12 <%= options[:color] %> lighten-5">
26
+ <%= get('group_summary').result(binding) %>
27
+ </div>
28
+
29
+ <div id="errors" class="col s12 <%= options[:color] %> lighten-5">
30
+ <%= get('group_errors').result(binding) %>
31
+ </div>
32
+ </div>
33
+ </main>
34
+
35
+ <script type="text/javascript" src="https://cdn.rawgit.com/rajatthareja/ReportBuilder/v1.4/js/group.report.builder.min.js"></script>
36
+
37
+ <%= get('footer').result(binding) %>
38
+ </body>
39
+ </html>
@@ -0,0 +1,25 @@
1
+ <table id="summaryTable" class="bordered <%= options[:color] %> lighten-1 white-text" width="100%">
2
+ <thead>
3
+ <tr>
4
+ <th class="hide-on-small-only">Group</th>
5
+ <th class="hide-on-small-only">Feature</th>
6
+ <th>Scenario</th>
7
+ <th class="hide">Tags</th>
8
+ <th>Status</th>
9
+ <th class="hide-on-small-only">Error</th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <% groups.each_with_index do |group, g| %>
14
+ <% group['features'].each_with_index do |feature, f| %>
15
+ <% feature['elements'].each_with_index do |scenario, s| %>
16
+ <% sid = "g#{g}f#{f}s#{s}" %>
17
+ <tr class="<%= scenario['status'] %>">
18
+ <td class="hide-on-small-only"><%= group['name'] %></td>
19
+ <%= get('summary_row').result(binding) %>
20
+ </tr>
21
+ <% end %>
22
+ <% end %>
23
+ <% end %>
24
+ </tbody>
25
+ </table>
data/template/head.erb ADDED
@@ -0,0 +1,22 @@
1
+ <head>
2
+ <meta charset="utf-8">
3
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
4
+
5
+ <title><%= options[:report_title] %></title>
6
+
7
+ <link rel="icon" href="https://reportbuilder.rajatthareja.com/rb.ico">
8
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
9
+ <link href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css" rel="stylesheet">
10
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css" media="screen,projection"/>
11
+ <link href="https://cdn.rawgit.com/rajatthareja/ReportBuilder/v1.9/css/report.builder.min.css" rel="stylesheet">
12
+
13
+ <% if options[:additional_css] %>
14
+ <% if options[:additional_css] =~ /^http(|s):\/\/.*\.css$/ %>
15
+ <link rel="stylesheet" href="<%= options[:additional_css] %>" media="all"/>
16
+ <% else %>
17
+ <style type="text/css">
18
+ <%= options[:additional_css]%>
19
+ </style>
20
+ <% end %>
21
+ <% end %>
22
+ </head>