1*760c253cSXin Li# -*- coding: utf-8 -*- 2*760c253cSXin Li# Copyright 2016 The ChromiumOS Authors 3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be 4*760c253cSXin Li# found in the LICENSE file. 5*760c253cSXin Li 6*760c253cSXin Li"""Text templates used by various parts of results_report.""" 7*760c253cSXin Li 8*760c253cSXin Liimport html 9*760c253cSXin Lifrom string import Template 10*760c253cSXin Li 11*760c253cSXin Li 12*760c253cSXin Li_TabMenuTemplate = Template( 13*760c253cSXin Li """ 14*760c253cSXin Li<div class='tab-menu'> 15*760c253cSXin Li <a href="javascript:switchTab('$table_name', 'html')">HTML</a> 16*760c253cSXin Li <a href="javascript:switchTab('$table_name', 'text')">Text</a> 17*760c253cSXin Li <a href="javascript:switchTab('$table_name', 'tsv')">TSV</a> 18*760c253cSXin Li</div>""" 19*760c253cSXin Li) 20*760c253cSXin Li 21*760c253cSXin Li 22*760c253cSXin Lidef _GetTabMenuHTML(table_name): 23*760c253cSXin Li # N.B. cgi.escape does some very basic HTML escaping. Nothing more. 24*760c253cSXin Li escaped = html.escape(table_name) 25*760c253cSXin Li return _TabMenuTemplate.substitute(table_name=escaped) 26*760c253cSXin Li 27*760c253cSXin Li 28*760c253cSXin Li_ExperimentFileHTML = """ 29*760c253cSXin Li<div class='results-section'> 30*760c253cSXin Li <div class='results-section-title'>Experiment File</div> 31*760c253cSXin Li <div class='results-section-content'> 32*760c253cSXin Li <pre>%s</pre> 33*760c253cSXin Li</div> 34*760c253cSXin Li""" 35*760c253cSXin Li 36*760c253cSXin Li 37*760c253cSXin Lidef _GetExperimentFileHTML(experiment_file_text): 38*760c253cSXin Li if not experiment_file_text: 39*760c253cSXin Li return "" 40*760c253cSXin Li return _ExperimentFileHTML % ( 41*760c253cSXin Li html.escape(experiment_file_text, quote=False), 42*760c253cSXin Li ) 43*760c253cSXin Li 44*760c253cSXin Li 45*760c253cSXin Li_ResultsSectionHTML = Template( 46*760c253cSXin Li """ 47*760c253cSXin Li<div class='results-section'> 48*760c253cSXin Li <div class='results-section-title'>$sect_name</div> 49*760c253cSXin Li <div class='results-section-content'> 50*760c253cSXin Li <div id='${short_name}-html'>$html_table</div> 51*760c253cSXin Li <div id='${short_name}-text'><pre>$text_table</pre></div> 52*760c253cSXin Li <div id='${short_name}-tsv'><pre>$tsv_table</pre></div> 53*760c253cSXin Li </div> 54*760c253cSXin Li $tab_menu 55*760c253cSXin Li</div> 56*760c253cSXin Li""" 57*760c253cSXin Li) 58*760c253cSXin Li 59*760c253cSXin Li 60*760c253cSXin Lidef _GetResultsSectionHTML(print_table, table_name, data): 61*760c253cSXin Li first_word = table_name.strip().split()[0] 62*760c253cSXin Li short_name = first_word.lower() 63*760c253cSXin Li return _ResultsSectionHTML.substitute( 64*760c253cSXin Li sect_name=table_name, 65*760c253cSXin Li html_table=print_table(data, "HTML"), 66*760c253cSXin Li text_table=print_table(data, "PLAIN"), 67*760c253cSXin Li tsv_table=print_table(data, "TSV"), 68*760c253cSXin Li tab_menu=_GetTabMenuHTML(short_name), 69*760c253cSXin Li short_name=short_name, 70*760c253cSXin Li ) 71*760c253cSXin Li 72*760c253cSXin Li 73*760c253cSXin Li_MainHTML = Template( 74*760c253cSXin Li """ 75*760c253cSXin Li<html> 76*760c253cSXin Li<head> 77*760c253cSXin Li <style type="text/css"> 78*760c253cSXin Li body { 79*760c253cSXin Li font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif; 80*760c253cSXin Li font-size: 12px; 81*760c253cSXin Li } 82*760c253cSXin Li 83*760c253cSXin Li pre { 84*760c253cSXin Li margin: 10px; 85*760c253cSXin Li color: #039; 86*760c253cSXin Li font-size: 14px; 87*760c253cSXin Li } 88*760c253cSXin Li 89*760c253cSXin Li .chart { 90*760c253cSXin Li display: inline; 91*760c253cSXin Li } 92*760c253cSXin Li 93*760c253cSXin Li .hidden { 94*760c253cSXin Li visibility: hidden; 95*760c253cSXin Li } 96*760c253cSXin Li 97*760c253cSXin Li .results-section { 98*760c253cSXin Li border: 1px solid #b9c9fe; 99*760c253cSXin Li margin: 10px; 100*760c253cSXin Li } 101*760c253cSXin Li 102*760c253cSXin Li .results-section-title { 103*760c253cSXin Li background-color: #b9c9fe; 104*760c253cSXin Li color: #039; 105*760c253cSXin Li padding: 7px; 106*760c253cSXin Li font-size: 14px; 107*760c253cSXin Li width: 200px; 108*760c253cSXin Li } 109*760c253cSXin Li 110*760c253cSXin Li .results-section-content { 111*760c253cSXin Li margin: 10px; 112*760c253cSXin Li padding: 10px; 113*760c253cSXin Li overflow:auto; 114*760c253cSXin Li } 115*760c253cSXin Li 116*760c253cSXin Li #box-table-a { 117*760c253cSXin Li font-size: 12px; 118*760c253cSXin Li width: 480px; 119*760c253cSXin Li text-align: left; 120*760c253cSXin Li border-collapse: collapse; 121*760c253cSXin Li } 122*760c253cSXin Li 123*760c253cSXin Li #box-table-a th { 124*760c253cSXin Li padding: 6px; 125*760c253cSXin Li background: #b9c9fe; 126*760c253cSXin Li border-right: 1px solid #fff; 127*760c253cSXin Li border-bottom: 1px solid #fff; 128*760c253cSXin Li color: #039; 129*760c253cSXin Li text-align: center; 130*760c253cSXin Li } 131*760c253cSXin Li 132*760c253cSXin Li #box-table-a td { 133*760c253cSXin Li padding: 4px; 134*760c253cSXin Li background: #e8edff; 135*760c253cSXin Li border-bottom: 1px solid #fff; 136*760c253cSXin Li border-right: 1px solid #fff; 137*760c253cSXin Li color: #669; 138*760c253cSXin Li border-top: 1px solid transparent; 139*760c253cSXin Li } 140*760c253cSXin Li 141*760c253cSXin Li #box-table-a tr:hover td { 142*760c253cSXin Li background: #d0dafd; 143*760c253cSXin Li color: #339; 144*760c253cSXin Li } 145*760c253cSXin Li 146*760c253cSXin Li </style> 147*760c253cSXin Li <script type='text/javascript' src='https://www.google.com/jsapi'></script> 148*760c253cSXin Li <script type='text/javascript'> 149*760c253cSXin Li google.load('visualization', '1', {packages:['corechart']}); 150*760c253cSXin Li google.setOnLoadCallback(init); 151*760c253cSXin Li function init() { 152*760c253cSXin Li switchTab('summary', 'html'); 153*760c253cSXin Li ${perf_init}; 154*760c253cSXin Li switchTab('full', 'html'); 155*760c253cSXin Li drawTable(); 156*760c253cSXin Li } 157*760c253cSXin Li function drawTable() { 158*760c253cSXin Li ${chart_js}; 159*760c253cSXin Li } 160*760c253cSXin Li function switchTab(table, tab) { 161*760c253cSXin Li document.getElementById(table + '-html').style.display = 'none'; 162*760c253cSXin Li document.getElementById(table + '-text').style.display = 'none'; 163*760c253cSXin Li document.getElementById(table + '-tsv').style.display = 'none'; 164*760c253cSXin Li document.getElementById(table + '-' + tab).style.display = 'block'; 165*760c253cSXin Li } 166*760c253cSXin Li </script> 167*760c253cSXin Li</head> 168*760c253cSXin Li 169*760c253cSXin Li<body> 170*760c253cSXin Li $summary_table 171*760c253cSXin Li $perf_html 172*760c253cSXin Li <div class='results-section'> 173*760c253cSXin Li <div class='results-section-title'>Charts</div> 174*760c253cSXin Li <div class='results-section-content'>$chart_divs</div> 175*760c253cSXin Li </div> 176*760c253cSXin Li $full_table 177*760c253cSXin Li $experiment_file 178*760c253cSXin Li</body> 179*760c253cSXin Li</html> 180*760c253cSXin Li""" 181*760c253cSXin Li) 182*760c253cSXin Li 183*760c253cSXin Li 184*760c253cSXin Li# It's a bit ugly that we take some HTML things, and some non-HTML things, but I 185*760c253cSXin Li# need to balance prettiness with time spent making things pretty. 186*760c253cSXin Lidef GenerateHTMLPage( 187*760c253cSXin Li perf_table, 188*760c253cSXin Li chart_js, 189*760c253cSXin Li summary_table, 190*760c253cSXin Li print_table, 191*760c253cSXin Li chart_divs, 192*760c253cSXin Li full_table, 193*760c253cSXin Li experiment_file, 194*760c253cSXin Li): 195*760c253cSXin Li """Generates a crosperf HTML page from the given arguments. 196*760c253cSXin Li 197*760c253cSXin Li print_table is a two-arg function called like: print_table(t, f) 198*760c253cSXin Li t is one of [summary_table, print_table, full_table]; it's the table we want 199*760c253cSXin Li to format. 200*760c253cSXin Li f is one of ['TSV', 'HTML', 'PLAIN']; it's the type of format we want. 201*760c253cSXin Li """ 202*760c253cSXin Li summary_table_html = _GetResultsSectionHTML( 203*760c253cSXin Li print_table, "Summary Table", summary_table 204*760c253cSXin Li ) 205*760c253cSXin Li if perf_table: 206*760c253cSXin Li perf_html = _GetResultsSectionHTML( 207*760c253cSXin Li print_table, "Perf Table", perf_table 208*760c253cSXin Li ) 209*760c253cSXin Li perf_init = "switchTab('perf', 'html')" 210*760c253cSXin Li else: 211*760c253cSXin Li perf_html = "" 212*760c253cSXin Li perf_init = "" 213*760c253cSXin Li 214*760c253cSXin Li full_table_html = _GetResultsSectionHTML( 215*760c253cSXin Li print_table, "Full Table", full_table 216*760c253cSXin Li ) 217*760c253cSXin Li experiment_file_html = _GetExperimentFileHTML(experiment_file) 218*760c253cSXin Li return _MainHTML.substitute( 219*760c253cSXin Li perf_init=perf_init, 220*760c253cSXin Li chart_js=chart_js, 221*760c253cSXin Li summary_table=summary_table_html, 222*760c253cSXin Li perf_html=perf_html, 223*760c253cSXin Li chart_divs=chart_divs, 224*760c253cSXin Li full_table=full_table_html, 225*760c253cSXin Li experiment_file=experiment_file_html, 226*760c253cSXin Li ) 227