| # -*- coding: utf-8 -*- |
| # Copyright 2016 The ChromiumOS Authors |
| # 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.""" |
| |
| import html |
| 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 = html.escape(table_name) |
| 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 % ( |
| html.escape(experiment_file_text, quote=False), |
| ) |
| |
| |
| _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, |
| ) |