You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.7 KiB
196 lines
5.7 KiB
# 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)
|
|
|