OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * TablePrinter is a helper to format a table as ASCII art or an HTML table. | 6 * TablePrinter is a helper to format a table as ASCII art or an HTML table. |
7 * | 7 * |
8 * Usage: call addRow() and addCell() repeatedly to specify the data. | 8 * Usage: call addRow() and addCell() repeatedly to specify the data. |
9 * | 9 * |
10 * addHeaderCell() can optionally be called to specify header cells for a | 10 * addHeaderCell() can optionally be called to specify header cells for a |
(...skipping 11 matching lines...) Expand all Loading... |
22 var TablePrinter = (function() { | 22 var TablePrinter = (function() { |
23 'use strict'; | 23 'use strict'; |
24 | 24 |
25 /** | 25 /** |
26 * @constructor | 26 * @constructor |
27 */ | 27 */ |
28 function TablePrinter() { | 28 function TablePrinter() { |
29 this.rows_ = []; | 29 this.rows_ = []; |
30 this.hasHeaderRow_ = false; | 30 this.hasHeaderRow_ = false; |
31 this.title_ = null; | 31 this.title_ = null; |
| 32 // Number of cells automatically added at the start of new rows. |
| 33 this.newRowCellIndent_ = 0; |
32 } | 34 } |
33 | 35 |
34 TablePrinter.prototype = { | 36 TablePrinter.prototype = { |
35 /** | 37 /** |
| 38 * Sets the number of blank cells to add after each call to addRow. |
| 39 */ |
| 40 setNewRowCellIndent: function(newRowCellIndent) { |
| 41 this.newRowCellIndent_ = newRowCellIndent; |
| 42 }, |
| 43 |
| 44 /** |
36 * Starts a new row. | 45 * Starts a new row. |
37 */ | 46 */ |
38 addRow: function() { | 47 addRow: function() { |
39 this.rows_.push([]); | 48 this.rows_.push([]); |
| 49 for (var i = 0; i < this.newRowCellIndent_; ++i) |
| 50 this.addCell(''); |
40 }, | 51 }, |
41 | 52 |
42 /** | 53 /** |
43 * Adds a column to the current row, setting its value to cellText. | 54 * Adds a column to the current row, setting its value to cellText. |
44 * | 55 * |
45 * @returns {!TablePrinterCell} the cell that was added. | 56 * @returns {!TablePrinterCell} the cell that was added. |
46 */ | 57 */ |
47 addCell: function(cellText) { | 58 addCell: function(cellText) { |
48 var r = this.rows_[this.rows_.length - 1]; | 59 var r = this.rows_[this.rows_.length - 1]; |
49 var cell = new TablePrinterCell(cellText); | 60 var cell = new TablePrinterCell(cellText); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 if (columnIndex >= row.length) | 108 if (columnIndex >= row.length) |
98 return null; | 109 return null; |
99 return row[columnIndex]; | 110 return row[columnIndex]; |
100 }, | 111 }, |
101 | 112 |
102 /** | 113 /** |
103 * Returns a formatted text representation of the table data. | 114 * Returns a formatted text representation of the table data. |
104 * |spacing| indicates number of extra spaces, if any, to add between | 115 * |spacing| indicates number of extra spaces, if any, to add between |
105 * columns. | 116 * columns. |
106 */ | 117 */ |
107 toText: function(spacing) { | 118 toText: function(spacing, parent) { |
| 119 var pre = addNode(parent, 'pre'); |
108 var numColumns = this.getNumColumns(); | 120 var numColumns = this.getNumColumns(); |
109 | 121 |
110 // Figure out the maximum width of each column. | 122 // Figure out the maximum width of each column. |
111 var columnWidths = []; | 123 var columnWidths = []; |
112 columnWidths.length = numColumns; | 124 columnWidths.length = numColumns; |
113 for (var i = 0; i < numColumns; ++i) | 125 for (var i = 0; i < numColumns; ++i) |
114 columnWidths[i] = 0; | 126 columnWidths[i] = 0; |
115 | 127 |
116 // If header row is present, temporarily add a spacer row to |rows_|. | 128 // If header row is present, temporarily add a spacer row to |rows_|. |
117 if (this.hasHeaderRow_) { | 129 if (this.hasHeaderRow_) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 // Print each row. | 164 // Print each row. |
153 var spacingStr = makeRepeatedString(' ', spacing); | 165 var spacingStr = makeRepeatedString(' ', spacing); |
154 for (var r = 0; r < numRows; ++r) { | 166 for (var r = 0; r < numRows; ++r) { |
155 for (var c = 0; c < numColumns; ++c) { | 167 for (var c = 0; c < numColumns; ++c) { |
156 var cell = this.getCell_(r, c); | 168 var cell = this.getCell_(r, c); |
157 if (cell) { | 169 if (cell) { |
158 // Pad the cell with spaces to make it fit the maximum column width. | 170 // Pad the cell with spaces to make it fit the maximum column width. |
159 var padding = columnWidths[c] - cell.text.length; | 171 var padding = columnWidths[c] - cell.text.length; |
160 var paddingStr = makeRepeatedString(' ', padding); | 172 var paddingStr = makeRepeatedString(' ', padding); |
161 | 173 |
162 if (cell.alignRight) { | 174 if (cell.alignRight) |
163 out.push(paddingStr); | 175 out.push(paddingStr); |
164 out.push(cell.text); | 176 if (cell.link) { |
| 177 // Output all previous text, and clear |out|. |
| 178 addTextNode(pre, out.join('')); |
| 179 out = []; |
| 180 // Create anchor. |
| 181 var linkNode = addNodeWithText(pre, 'a', cell.text); |
| 182 linkNode.href = cell.link; |
165 } else { | 183 } else { |
166 out.push(cell.text); | 184 out.push(cell.text); |
| 185 } |
| 186 if (!cell.alignRight) |
167 out.push(paddingStr); | 187 out.push(paddingStr); |
168 } | |
169 out.push(spacingStr); | 188 out.push(spacingStr); |
170 } | 189 } |
171 } | 190 } |
172 out.push('\n'); | 191 out.push('\n'); |
173 } | 192 } |
174 | 193 |
175 // Remove spacer row under the header row, if one was added. | 194 // Remove spacer row under the header row, if one was added. |
176 if (this.hasHeaderRow_) | 195 if (this.hasHeaderRow_) |
177 this.rows_.splice(1, 1); | 196 this.rows_.splice(1, 1); |
178 | 197 |
179 return out.join(''); | 198 addTextNode(pre, out.join('')); |
180 }, | 199 }, |
181 | 200 |
182 /** | 201 /** |
183 * Adds a new HTML table to the node |parent| using the specified style. | 202 * Adds a new HTML table to the node |parent| using the specified style. |
184 */ | 203 */ |
185 toHTML: function(parent, style) { | 204 toHTML: function(parent, style) { |
186 var numRows = this.rows_.length; | 205 var numRows = this.rows_.length; |
187 var numColumns = this.getNumColumns(); | 206 var numColumns = this.getNumColumns(); |
188 | 207 |
189 var table = addNode(parent, 'table'); | 208 var table = addNode(parent, 'table'); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 */ | 259 */ |
241 function TablePrinterCell(value) { | 260 function TablePrinterCell(value) { |
242 this.text = '' + value; | 261 this.text = '' + value; |
243 this.link = null; | 262 this.link = null; |
244 this.alignRight = false; | 263 this.alignRight = false; |
245 this.allowOverflow = false; | 264 this.allowOverflow = false; |
246 } | 265 } |
247 | 266 |
248 return TablePrinter; | 267 return TablePrinter; |
249 })(); | 268 })(); |
OLD | NEW |