Index: webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py |
diff --git a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py |
index a0cb41148de31f0c2c87cce35acf1dabc80edf74..c3cb9fd1f1f86502473d79eafc40730d2b8e9dae 100644 |
--- a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py |
+++ b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py |
@@ -12,6 +12,8 @@ import re |
class HtmlExport(object): |
+ """HTML exporter class for APM quality scores. |
+ """ |
# Path to CSS and JS files. |
_PATH = os.path.dirname(os.path.realpath(__file__)) |
@@ -31,9 +33,8 @@ class HtmlExport(object): |
self._noise_params = None |
self._output_filepath = output_filepath |
- def export(self, scores): |
- """ |
- Export the scores into an HTML file. |
+ def Export(self, scores): |
+ """Exports the scores into an HTML file. |
Args: |
scores: nested dictionary containing the scores. |
@@ -41,29 +42,33 @@ class HtmlExport(object): |
# Generate one table for each evaluation score. |
tables = [] |
for score_name in sorted(scores.keys()): |
- tables.append(self._build_score_table(score_name, scores[score_name])) |
+ tables.append(self._BuildScoreTable(score_name, scores[score_name])) |
# Create the html file. |
html = ( |
'<html>' + |
- self._build_header() + |
+ self._BuildHeader() + |
'<body onload="initialize()">' + |
'<h1>Results from {}</h1>'.format(self._output_filepath) + |
self._NEW_LINE.join(tables) + |
'</body>' + |
'</html>') |
- self._save(self._output_filepath, html) |
+ self._Save(self._output_filepath, html) |
- def _build_header(self): |
- """ |
- HTML file header with page title and either embedded or linked CSS and JS |
+ def _BuildHeader(self): |
+ """Builds the <head> section of the HTML file. |
+ |
+ The header contains the page title and either embedded or linked CSS and JS |
files. |
+ |
+ Returns: |
+ A string with <head>...</head> HTML. |
""" |
html = ['<head>', '<title>Results</title>'] |
# Function to append the lines of a text file to html. |
- def _embed_file(filepath): |
+ def EmbedFile(filepath): |
with open(filepath) as f: |
for l in f: |
html.append(l.strip()) |
@@ -72,7 +77,7 @@ class HtmlExport(object): |
if self._INLINE_CSS: |
# Embed. |
html.append('<style>') |
- _embed_file(self._CSS_FILEPATH) |
+ EmbedFile(self._CSS_FILEPATH) |
html.append('</style>') |
else: |
# Link. |
@@ -83,7 +88,7 @@ class HtmlExport(object): |
if self._INLINE_JS: |
# Embed. |
html.append('<script>') |
- _embed_file(self._JS_FILEPATH) |
+ EmbedFile(self._JS_FILEPATH) |
html.append('</script>') |
else: |
# Link. |
@@ -94,54 +99,88 @@ class HtmlExport(object): |
return self._NEW_LINE.join(html) |
- def _build_score_table(self, score_name, scores): |
- """ |
- Generate a table for a specific evaluation score (e.g., POLQA). |
+ def _BuildScoreTable(self, score_name, scores): |
+ """Builds a table for a specific evaluation score (e.g., POLQA). |
+ |
+ Args: |
+ score_name: name of the score. |
+ scores: nested dictionary of scores. |
+ |
+ Returns: |
+ A string with <table>...</table> HTML. |
""" |
config_names = sorted(scores.keys()) |
input_names = sorted(scores[config_names[0]].keys()) |
- rows = [self._table_row( |
+ rows = [self._BuildTableRow( |
score_name, config_name, scores[config_name], input_names) for ( |
config_name) in config_names] |
html = ( |
'<table celpadding="0" cellspacing="0">' + |
'<thead><tr>{}</tr></thead>'.format( |
- self._table_header(score_name, input_names)) + |
+ self._BuildTableHeader(score_name, input_names)) + |
'<tbody>' + |
'<tr>' + '</tr><tr>'.join(rows) + '</tr>' + |
'</tbody>' + |
- '</table>' + self._legend()) |
+ '</table>' + self._BuildLegend()) |
return html |
- def _table_header(self, score_name, input_names): |
- """ |
- Generate a table header with the name of the evaluation score in the first |
- column and then one column for each probing signal. |
+ def _BuildTableHeader(self, score_name, input_names): |
+ """Builds the cells of a table header. |
+ |
+ A table header starts with a cell containing the name of the evaluation |
+ score, and then it includes one column for each probing signal. |
+ |
+ Args: |
+ score_name: name of the score. |
+ input_names: list of probing signal names. |
+ |
+ Returns: |
+ A string with a list of <th>...</th> HTML elements. |
""" |
html = ( |
- '<th>{}</th>'.format(self._format_name(score_name)) + |
+ '<th>{}</th>'.format(self._FormatName(score_name)) + |
'<th>' + '</th><th>'.join( |
- [self._format_name(name) for name in input_names]) + '</th>') |
+ [self._FormatName(name) for name in input_names]) + '</th>') |
return html |
- def _table_row(self, score_name, config_name, scores, input_names): |
- """ |
- Generate a table body row with the name of the APM configuration file in the |
- first column and then one column for each probing singal. |
+ def _BuildTableRow(self, score_name, config_name, scores, input_names): |
+ """Builds the cells of a table row. |
+ |
+ A table row starts with the name of the APM configuration file, and then it |
+ includes one column for each probing singal. |
+ |
+ Args: |
+ score_name: name of the score. |
+ config_name: name of the APM configuration. |
+ scores: nested dictionary of scores. |
+ input_names: list of probing signal names. |
+ |
+ Returns: |
+ A string with a list of <td>...</td> HTML elements. |
""" |
- cells = [self._table_cell( |
+ cells = [self._BuildTableCell( |
scores[input_name], score_name, config_name, input_name) for ( |
input_name) in input_names] |
- html = ('<td>{}</td>'.format(self._format_name(config_name)) + |
+ html = ('<td>{}</td>'.format(self._FormatName(config_name)) + |
'<td>' + '</td><td>'.join(cells) + '</td>') |
return html |
- def _table_cell(self, scores, score_name, config_name, input_name): |
- """ |
- Generate a table cell content with all the scores for the current evaluation |
- score, APM configuration, and probing signal. |
+ def _BuildTableCell(self, scores, score_name, config_name, input_name): |
+ """Builds the inner content of a table cell. |
+ |
+ A table cell includes all the scores computed for a specific evaluation |
+ score (e.g., POLQA), APM configuration (e.g., default), and probing signal. |
+ |
+ Args: |
+ scores: dictionary of score data. |
+ score_name: name of the score. |
+ config_name: name of the APM configuration. |
+ input_name: name of the probing signal. |
+ |
+ Returns: |
+ A string with the HTML of a table body cell. |
""" |
# Init noise generator names and noise parameters cache (if not done). |
if self._noise_names is None: |
@@ -195,9 +234,13 @@ class HtmlExport(object): |
return html |
- def _legend(self): |
- """ |
- Generate the legend for each noise generator name and parameters pair. |
+ def _BuildLegend(self): |
+ """Builds the legend. |
+ |
+ The legend details noise generator name and parameter pairs. |
+ |
+ Returns: |
+ A string with a <div class="legend">...</div> HTML element. |
""" |
items = [] |
for name_index, noise_name in enumerate(self._noise_names): |
@@ -213,10 +256,24 @@ class HtmlExport(object): |
return html |
@classmethod |
- def _save(cls, output_filepath, html): |
+ def _Save(cls, output_filepath, html): |
+ """Writes the HTML file. |
+ |
+ Args: |
+ output_filepath: output file path. |
+ html: string with the HTML content. |
+ """ |
with open(output_filepath, 'w') as f: |
f.write(html) |
@classmethod |
- def _format_name(cls, name): |
+ def _FormatName(cls, name): |
+ """Formats a name. |
+ |
+ Args: |
+ name: a string. |
+ |
+ Returns: |
+ A copy of name in which underscores and dashes are replaced with a space. |
+ """ |
return re.sub(r'[_\-]', ' ', name) |