# 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)