##// END OF EJS Templates
new completer for qtconsole....
new completer for qtconsole. add a completer to the qtconsole that is navigable by arraow keys and tab. One need to call it twice to get it on focus and be able to select completion with Return. looks like zsh completer, not the gui drop down list of --gui-completer. This also try to split the completion logic from console_widget, and try to keep the old completer qui around. The plain completer that never takes focus back, and the QlistWidget completer. to switch between the 3, the --gui-completion flag as been changed to take an argument (plain, droplist, ncurses).

File last commit:

r7389:1422d277
r7389:1422d277
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