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 }