##// END OF EJS Templates
add option to choose for empty
add option to choose for empty

File last commit:

r7389:1422d277
r7392:ef8d7e2f
Show More
html_utils.py
124 lines | 4.1 KiB | text/x-python | PythonLexer
"""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