html_utils.py
124 lines
| 4.1 KiB
| text/x-python
|
PythonLexer
Matthias BUSSONNIER
|
r7389 | """some html utilis""" | ||
from IPython.core.display import HTML | ||||
def columnize_info(items, separator_width=1, displaywidth=80, empty=None): | ||||
""" Get info on a list of string to display it as a multicolumns list | ||||
returns : | ||||
--------- | ||||
a dict containing several parameters: | ||||
'item_matrix' : list of list with the innermost list representing a row | ||||
'columns_number': number of columns | ||||
'rows_number' : number of rown | ||||
'columns_width' : a list indicating the maximum length of the element in each columns | ||||
Parameters : | ||||
------------ | ||||
separator_width : when trying to ajust the number of column, consider a separator size of this much caracters | ||||
displaywidth : try to fit the columns in this width | ||||
empty : if the number of items is different from nrows * ncols, fill with empty | ||||
""" | ||||
# Note: this code is adapted from columnize 0.3.2. | ||||
# See http://code.google.com/p/pycolumnize/ | ||||
# Some degenerate cases. | ||||
size = len(items) | ||||
if size == 0: | ||||
return {'item_matrix' :[[empty]], | ||||
'columns_number':1, | ||||
'rows_number':1, | ||||
'columns_width':[0]} | ||||
elif size == 1: | ||||
return {'item_matrix' :[[items[0]]], | ||||
'columns_number':1, | ||||
'rows_number':1, | ||||
'columns_width':[len(items[0])]} | ||||
# Special case: if any item is longer than the maximum width, there's no | ||||
# point in triggering the logic below... | ||||
item_len = map(len, items) # save these, we can reuse them below | ||||
#longest = max(item_len) | ||||
#if longest >= displaywidth: | ||||
# return (items, [longest]) | ||||
# Try every row count from 1 upwards | ||||
array_index = lambda nrows, row, col: nrows*col + row | ||||
nrows = 1 | ||||
for nrows in range(1, size): | ||||
ncols = (size + nrows - 1) // nrows | ||||
colwidths = [] | ||||
totwidth = -separator_width | ||||
for col in range(ncols): | ||||
# Get max column width for this column | ||||
colwidth = 0 | ||||
for row in range(nrows): | ||||
i = array_index(nrows, row, col) | ||||
if i >= size: | ||||
break | ||||
len_x = item_len[i] | ||||
colwidth = max(colwidth, len_x) | ||||
colwidths.append(colwidth) | ||||
totwidth += colwidth + separator_width | ||||
if totwidth > displaywidth: | ||||
break | ||||
if totwidth <= displaywidth: | ||||
break | ||||
# The smallest number of rows computed and the max widths for each | ||||
# column has been obtained. Now we just have to format each of the rows. | ||||
reorderd_items = [] | ||||
for row in range(nrows): | ||||
texts = [] | ||||
for col in range(ncols): | ||||
i = row + nrows*col | ||||
if i >= size: | ||||
texts.append(empty) | ||||
else: | ||||
texts.append(items[i]) | ||||
#while texts and not texts[-1]: | ||||
# del texts[-1] | ||||
#for col in range(len(texts)): | ||||
# texts[col] = texts[col].ljust(colwidths[col]) | ||||
reorderd_items.append(texts) | ||||
return {'item_matrix' :reorderd_items, | ||||
'columns_number':ncols, | ||||
'rows_number':nrows, | ||||
'columns_width':colwidths} | ||||
def column_table(items, select=None) : | ||||
""" return a html table of the item with a select class on one""" | ||||
items_m = columnize_info(items)['item_matrix'] | ||||
return HTML(html_tableify(items_m, select=select)) | ||||
def html_tableify(item_matrix, select=None) : | ||||
""" returnr a string for an html table""" | ||||
if not item_matrix : | ||||
return '' | ||||
html_cols = [] | ||||
tds = lambda text : u'<td>'+text+u'</td>' | ||||
trs = lambda text : u'<tr>'+text+u'</tr>' | ||||
tds_items = [map(tds, row) for row in item_matrix ] | ||||
if select : | ||||
row, col = select | ||||
try : | ||||
tds_items[row][col] = u'<td class="inverted">'\ | ||||
+item_matrix[row][col]\ | ||||
+u'</td>' | ||||
except IndexError : | ||||
pass | ||||
#select the right item | ||||
html_cols = map(trs, (u''.join(row) for row in tds_items)) | ||||
html = (u'<table class="completion">'+(u''.join(html_cols))+u'</table>') | ||||
css = u""" | ||||
<style> | ||||
table.completion tr td | ||||
{ padding-right : 4px; } | ||||
</style> | ||||
""" | ||||
return css+html | ||||