1 /**
2 Copyright: Copyright (c) 2018, Joakim Brännström. All rights reserved.
3 License: MPL-2
4 Author: Joakim Brännström (joakim.brannstrom@gmx.com)
5 
6 This Source Code Form is subject to the terms of the Mozilla Public License,
7 v.2.0. If a copy of the MPL was not distributed with this file, You can obtain
8 one at http://mozilla.org/MPL/2.0/.
9 */
10 module dextool.plugin.mutate.backend.report.html.tmpl;
11 
12 import arsd.dom : Document, Element, require, Table;
13 
14 @safe:
15 
16 immutable tmplIndexStyle = `
17 .mutant {display:none; background-color: yellow;}
18 .status_alive {background-color: lightpink;}
19 .status_killed {background-color: lightgreen;}
20 .status_killedByCompiler {background-color: #eeeeee;}
21 .status_timeout {background-color: limegreen;}
22 .status_unknown {background-color: mistyrose;}
23 .hover_alive {color: lightpink;}
24 .hover_killed {color: lightgreen;}
25 .hover_killedByCompiler {color: #eeeeee;}
26 .hover_timeout {color: limegreen;}
27 .hover_unknown {color: mistyrose;}
28 .literal {color: darkred;}
29 .keyword {color: blue;}
30 .comment {color: grey;}
31 .line_nr {color: grey;}
32 #mousehover {
33     background: grey;
34     border-radius: 8px;
35     -moz-border-radius: 8px;
36     padding: 5px;
37     display: none;
38     position: absolute;
39     background: #2e3639;
40     color: #fff;
41 }
42 span.xx_label {
43     font-weight: bold;
44 }
45 #info_wrapper {
46     position: absolute;
47     width: 99%;
48 }
49 #info {
50     position: absolute;
51     top: 0;
52     width: 400px;
53     background: grey;
54     border-radius: 10px;
55     -moz-border-radius: 10px;
56     padding: 5px;
57     border: 1px solid;
58     opacity:0.9;
59 
60     background: #2e3639;
61 }
62 #info.fixed {
63     position: fixed;
64 }
65 #info span {
66     font-size: 80%;
67     color: #fff;
68     font-family: sans-serif;
69 }
70 #info select {
71     width: 250px;
72 }
73 `;
74 
75 immutable tmplIndexBody = `<div id="mousehover"></div>
76 <div id="info_wrapper">
77 <div id="info" class="fixed">
78 <table>
79   <tr>
80     <td><span class="xx_label">Id: </span> <span id="current_mutant_id"></span></td>
81     <td></td>
82     <td><a href="../index.html" style="color: white">Back</a></td>
83   </tr>
84   <tr>
85     <td><span class="xx_label">Original: </span></td>
86     <td><span id="current_mutant_original"></span></td>
87     <td><input id="show_legend" type="checkbox" onclick='toggle_legend(this)'/><span class="xx_label" id="legend">Legend</span></td>
88   </tr>
89   <tr>
90     <td><span class="xx_label">Status: </span></td>
91     <td><span id="current_mutant_status"></span></td>
92     <td><span id="current_mutant_metadata"></span></td>
93   </tr>
94   <tr>
95     <td><span class="xx_label">Mutant: </span></td>
96     <td>
97       <select id="current_mutant">
98         <option value="-1" selected="selected">Original</option>
99       </select>
100     </td>
101     <td><input id="show_mutant" type="checkbox" checked onclick='click_show_mutant(this)'/><span class="xx_label">Show</span></td>
102   </tr>
103 </table>
104 </div>
105 </div>
106 `;
107 
108 Document tmplBasicPage() @trusted {
109     auto doc = new Document(`<html lang="en">
110 <head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head>
111 <body></body>
112 </html>
113 `);
114     tmplDefaultCss(doc);
115     return doc;
116 }
117 
118 /// Add the CSS style after the head element.
119 void tmplDefaultCss(Document doc) @trusted {
120     auto s = doc.root.childElements("head")[0].addChild("style");
121     s.appendText(`
122 body {font-family: monospace; font-size: 14px;}
123 .stat_tbl      {border-collapse:collapse; border-spacing: 0;border-style: solid;border-width:1px;}
124 .stat_tbl    td{border-style: none;}
125 .overlap_tbl   {border-collapse:collapse;border-spacing:0;}
126 .overlap_tbl td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
127 .overlap_tbl th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
128 .overlap_tbl .tg-g59y{font-weight:bold;background-color:#ffce93;border-color:#000000;text-align:left;vertical-align:top}
129 .overlap_tbl .tg-0lax{text-align:left;vertical-align:top}
130 .overlap_tbl .tg-0lax_dark{background-color: lightgrey;text-align:left;vertical-align:top}
131 
132 .vertical_tbl   {border-collapse:collapse;border-spacing:0;}
133 .vertical_tbl:before { content:''; padding-top:110%;/* takes width as reference, + 10% for faking some extra padding */ display:inline-block; vertical-align:middle; }
134 .vertical_tbl td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
135 .vertical_tbl th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
136 .vertical_tbl .tg{ font-weight:bold;background-color:#ffce93;border-color:#000000;text-align:left;vertical-align:top;text-align:center; white-space:nowrap; transform-origin:50% 50%; -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -ms-transform: rotate(90deg); -o-transform: rotate(90deg); transform: rotate(90deg); }
137 
138 .diff_del {background-color: lightpink;}
139 .diff_add {background-color: lightgreen;}`);
140 }
141 
142 Table tmplDefaultTable(Element n, string[] header) @trusted {
143     import std.algorithm : map;
144     import std.array : array;
145     import std.range : enumerate;
146     import std.format : format;
147     import dextool.plugin.mutate.backend.report.html.constants;
148 
149     auto tbl = n.addChild("table").require!Table;
150     tbl.addClass(tableStyle);
151 
152     auto tr = n.parentDocument.createElement("tr");
153     foreach (h; header.enumerate) {
154         auto th = tr.addChild("th", h.value);
155         th.addClass(tableColumnHdrStyle);
156         th.setAttribute("id", format("%s-%d", "col", h.index));
157     }
158 
159     tbl.addChild("thead").appendChild(tr);
160 
161     return tbl;
162 }
163 
164 Table tmplDefaultMatrixTable(Element n, string[] header) @trusted {
165     import std.algorithm : map;
166     import std.array : array;
167     import dextool.plugin.mutate.backend.report.html.constants;
168 
169     auto tbl = n.addChild("table").require!Table;
170     tbl.addClass(matrixTableStyle);
171 
172     auto tr = n.parentDocument.createElement("tr");
173     foreach (h; header) {
174         auto th = tr.addChild("th", h);
175         th.addClass(matrixTableHdrStyle);
176     }
177 
178     tbl.addChild("thead").appendChild(tr);
179 
180     return tbl;
181 }