diff options
Diffstat (limited to 'crosperf/results_report_templates.py')
-rw-r--r-- | crosperf/results_report_templates.py | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/crosperf/results_report_templates.py b/crosperf/results_report_templates.py new file mode 100644 index 00000000..827649fd --- /dev/null +++ b/crosperf/results_report_templates.py @@ -0,0 +1,196 @@ +# Copyright 2016 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Text templates used by various parts of results_report.""" +from __future__ import print_function + +import cgi +from string import Template + +_TabMenuTemplate = Template(""" +<div class='tab-menu'> + <a href="javascript:switchTab('$table_name', 'html')">HTML</a> + <a href="javascript:switchTab('$table_name', 'text')">Text</a> + <a href="javascript:switchTab('$table_name', 'tsv')">TSV</a> +</div>""") + +def _GetTabMenuHTML(table_name): + # N.B. cgi.escape does some very basic HTML escaping. Nothing more. + escaped = cgi.escape(table_name, quote=True) + return _TabMenuTemplate.substitute(table_name=escaped) + + +_ExperimentFileHTML = """ +<div class='results-section'> + <div class='results-section-title'>Experiment File</div> + <div class='results-section-content'> + <pre>%s</pre> +</div> +""" + +def _GetExperimentFileHTML(experiment_file_text): + if not experiment_file_text: + return '' + return _ExperimentFileHTML % (cgi.escape(experiment_file_text), ) + + +_ResultsSectionHTML = Template(""" +<div class='results-section'> + <div class='results-section-title'>$sect_name</div> + <div class='results-section-content'> + <div id='${short_name}-html'>$html_table</div> + <div id='${short_name}-text'><pre>$text_table</pre></div> + <div id='${short_name}-tsv'><pre>$tsv_table</pre></div> + </div> + $tab_menu +</div> +""") + +def _GetResultsSectionHTML(print_table, table_name, data): + first_word = table_name.strip().split()[0] + short_name = first_word.lower() + return _ResultsSectionHTML.substitute(sect_name=table_name, + html_table=print_table(data, 'HTML'), + text_table=print_table(data, 'PLAIN'), + tsv_table=print_table(data, 'TSV'), + tab_menu=_GetTabMenuHTML(short_name), + short_name=short_name) + + + +_MainHTML = Template(""" +<html> +<head> + <style type="text/css"> + body { + font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif; + font-size: 12px; + } + + pre { + margin: 10px; + color: #039; + font-size: 14px; + } + + .chart { + display: inline; + } + + .hidden { + visibility: hidden; + } + + .results-section { + border: 1px solid #b9c9fe; + margin: 10px; + } + + .results-section-title { + background-color: #b9c9fe; + color: #039; + padding: 7px; + font-size: 14px; + width: 200px; + } + + .results-section-content { + margin: 10px; + padding: 10px; + overflow:auto; + } + + #box-table-a { + font-size: 12px; + width: 480px; + text-align: left; + border-collapse: collapse; + } + + #box-table-a th { + padding: 6px; + background: #b9c9fe; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + color: #039; + text-align: center; + } + + #box-table-a td { + padding: 4px; + background: #e8edff; + border-bottom: 1px solid #fff; + border-right: 1px solid #fff; + color: #669; + border-top: 1px solid transparent; + } + + #box-table-a tr:hover td { + background: #d0dafd; + color: #339; + } + + </style> + <script type='text/javascript' src='https://www.google.com/jsapi'></script> + <script type='text/javascript'> + google.load('visualization', '1', {packages:['corechart']}); + google.setOnLoadCallback(init); + function init() { + switchTab('summary', 'html'); + ${perf_init}; + switchTab('full', 'html'); + drawTable(); + } + function drawTable() { + ${chart_js}; + } + function switchTab(table, tab) { + document.getElementById(table + '-html').style.display = 'none'; + document.getElementById(table + '-text').style.display = 'none'; + document.getElementById(table + '-tsv').style.display = 'none'; + document.getElementById(table + '-' + tab).style.display = 'block'; + } + </script> +</head> + +<body> + $summary_table + $perf_html + <div class='results-section'> + <div class='results-section-title'>Charts</div> + <div class='results-section-content'>$chart_divs</div> + </div> + $full_table + $experiment_file +</body> +</html> +""") + +# It's a bit ugly that we take some HTML things, and some non-HTML things, but I +# need to balance prettiness with time spent making things pretty. +def GenerateHTMLPage(perf_table, chart_js, summary_table, print_table, + chart_divs, full_table, experiment_file): + """Generates a crosperf HTML page from the given arguments. + + print_table is a two-arg function called like: print_table(t, f) + t is one of [summary_table, print_table, full_table]; it's the table we want + to format. + f is one of ['TSV', 'HTML', 'PLAIN']; it's the type of format we want. + """ + summary_table_html = _GetResultsSectionHTML(print_table, 'Summary Table', + summary_table) + if perf_table: + perf_html = _GetResultsSectionHTML(print_table, 'Perf Table', perf_table) + perf_init = "switchTab('perf', 'html')" + else: + perf_html = '' + perf_init = '' + + full_table_html = _GetResultsSectionHTML(print_table, 'Full Table', + full_table) + experiment_file_html = _GetExperimentFileHTML(experiment_file) + return _MainHTML.substitute(perf_init=perf_init, chart_js=chart_js, + summary_table=summary_table_html, + perf_html=perf_html, chart_divs=chart_divs, + full_table=full_table_html, + experiment_file=experiment_file_html) |