In table cells, make leading spaces nonbreaking

pull/26/head
Catherine Devlin 2015-01-06 20:31:52 -05:00
parent e8002cd219
commit 24a9171d90
3 changed files with 230 additions and 200 deletions

View File

@ -1,5 +1,5 @@
#!wing
#!version=4.0
#!version=5.0
##################################################################
# Wing IDE project file #
##################################################################

View File

@ -1,5 +1,5 @@
#!wing
#!version=4.0
#!version=5.0
##################################################################
# Wing IDE project file : User-specific branch #
##################################################################
@ -8,7 +8,7 @@ debug.err-values = {None: {}}
guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'windows': [{'name': 'pl1wewRCfZASfmghIM3JwuU1ss'\
'ZVfe0h',
'size-state': '',
'size-state': 'maximized',
'type': 'dock',
'view': {'area': 'tall',
'constraint': None,
@ -18,25 +18,17 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'notebook_display': 'normal',
'notebook_percent': 0.24701670644391405,
'override_title': None,
'pagelist': [('debug-stack',
'tall',
1,
{'codeline-mode': 'below'}),
('indent',
'tall',
2,
{}),
('project',
'pagelist': [('project',
'tall',
0,
{'tree-state': {'file-sort-method': 'by name',
'list-files-first': False,
'tree-states': {'deep': {'column-widths': [1.0],
'expanded-nodes': [(2,),
(3,),
(3,
1)],
'selected-nodes': [(3,
'tree-states': {'deep': {'expanded-nodes': [(1,),
(1,
1),
(2,),
(3,)],
'selected-nodes': [(1,
1,
3)],
'top-node': (0,)}},
@ -49,16 +41,23 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
u'django': [],
u'html': [],
u'py': []}}),
('source-assistant',
'tall',
2,
{'docstring-during-complete': False,
'wrap-lines': True}),
('browser',
'tall',
0,
{'all_tree_states': {u'By Module': {'column-w'\
'idths': [1.0],
{'all_tree_states': {loc('../cmd2/NEWS.txt'): {''\
'column-widths': [1.0],
'expanded-nodes': [],
'selected-nodes': [],
'top-node': None},
loc('../cpython/Lib/doctest.py'): {'column-widths': [1.0],
'expanded-nodes': [],
'selected-nodes': [[('generic attribute',
loc('../cpython/Lib/doctest.py'),
'TestResults')]],
'top-node': [('generic attribute',
loc('../cpython/Lib/doctest.py'),
'BLANKLINE_MARKER')]},
u'By Module': {'column-widths': [1.0],
'expanded-nodes': [],
'selected-nodes': [None],
'top-node': None},
@ -141,10 +140,6 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'top-node': [('function def',
loc('../../org/mpwfw/ipy/tst.py'),
'f')]},
loc('../cmd2/NEWS.txt'): {'column-widths': [1.0],
'expanded-nodes': [],
'selected-nodes': [],
'top-node': None},
loc('../cmd2/cmd2.py'): {'column-widths': [1.0],
'expanded-nodes': [],
'selected-nodes': [],
@ -161,14 +156,6 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'top-node': [('generic attribute',
loc('../cmd2/setup.py'),
'install_requires')]},
loc('../cpython/Lib/doctest.py'): {'column-widths': [1.0],
'expanded-nodes': [],
'selected-nodes': [[('generic attribute',
loc('../cpython/Lib/doctest.py'),
'TestResults')]],
'top-node': [('generic attribute',
loc('../cpython/Lib/doctest.py'),
'BLANKLINE_MARKER')]},
loc('../ipython_doctester/doctester.py'): {'column-widths': [1.0],
'expanded-nodes': [],
'selected-nodes': [],
@ -240,12 +227,24 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
('uses',
'tall',
0,
{}),
('debug-stack',
'tall',
1,
{'codeline-mode': 'below'}),
('indent',
'tall',
2,
{}),
('source-assistant',
'tall',
2,
{})],
'primary_view_state': {'area': 'wide',
'constraint': None,
'current_pages': [11],
'notebook_display': 'normal',
'notebook_percent': 0.30332409972299168,
'notebook_percent': 0.3033240997229917,
'override_title': None,
'pagelist': [('bookmarks',
'wide',
@ -268,56 +267,44 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
('debug-probe',
'wide',
2,
{'attrib-starts': [],
{'active-range': (None,
-1,
-1),
'attrib-starts': [],
'first-line': 0,
'folded-linenos': [],
'history': {None: ['uld'],
u'file:/home/catherine/Dropbox/pillars2/pillars_gdsii_2.py': [''\
'self.matrix\n',
'dir(self_matrix)\n',
'dir(self.matrix)\n',
'( (self.n0 * (2 - (self.rho/self.matrix.big_r_um) ** 2)**0.5\n '\
' - air_index) * self.matrix.lattice_constant_um ** 2'\
')\n\n',
'(self.rho/self.matrix.big_r_um) ** 2\n',
'(2 - (self.rho/self.matrix.big_r_um) ** 2)**0.5\n',
'self.rho\n',
'self.xindex\n',
'self.yindex\n',
'self.matrix.big_r_um\n',
'self.matrix.x_max_um\n'],
u'file:/home/catherine/itninja/database/improve/nltk_data/process.py': [''\
'result\n'],
u'file:/home/catherine/itninja/database/improve/pos_corpus_auto.py': [''\
'print line\n',
'word\n',
'replacement\n',
'line\n'],
u'file:/home/catherine/org/mpwfw/ipy/tst.py': [''\
'bool(tests)\n',
'len(tests)\n',
'tests[0]\n',
'test\n',
'dir(test)\n',
'test.examples\n',
'func\n',
'func.__name__\n',
'self.lines.splitlines()\n',
'self.lines\n',
'dir(self.lines)\n',
'raw_txt\n',
'print raw_txt\n',
'self.called\n'],
u'file:/home/catherine/proj/ipython_doctester/doctester.py': [''\
'txt\n',
'print txt\n',
'str(captured)\n',
'print captured\n',
'captured\n'],
u'file:/home/catherine/proj/ipython_doctester/tst.py': [''\
'test.globs\n',
't.globs\n',
't\n']},
'history': {u'file:/home/catherine/ve/fec2/bin/rdbms-subsetter': [''\
'target.exists\n',
'target.exists(**dict(source_row))\n',
'target.db\n',
'child_tbl\n',
'target_parent_row\n',
'source_parent_row\n',
'self\n',
'self.inspector.\n',
'self.inspector.get_primary_keys(target.name)\n',
'args.keys()\n',
"args.force_rows = {'dimcand': [10071936,]}\n",
'args\n',
'args.require_children\n',
'args.for\n',
'args.force\n',
'args.fraction\n',
'source_by_pk\n',
'args.force_rows\n',
'args.force_rows[source_name]\n',
'self.db.inspector.get_primary_keys(self.name)\n',
'pk_name\n',
'pk\n',
'**{pk_name:pk}\n',
'print **{pk_name:pk}\n',
'print **({pk_name:pk})\n',
'print {pk_name: pk}\n',
'print slct\n',
'source_row\n',
'target\n',
'source_by_pk(-1)\n']},
'launch-id': None,
'sel-line': 0,
'sel-line-start': 0,
'selection_end': 0,
@ -341,16 +328,20 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
('os-command',
'wide',
1,
{'last-percent': 0.80000000000000004,
{'last-percent': 0.8,
'toolbox-percent': 1.0,
'toolbox-tree-sel': ''}),
('python-shell',
'wide',
2,
{'attrib-starts': [],
{'active-range': (None,
-1,
-1),
'attrib-starts': [],
'first-line': 0,
'folded-linenos': [],
'history': {},
'launch-id': None,
'sel-line': 3,
'sel-line-start': 130,
'selection_end': 130,
@ -368,7 +359,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'fMatchCase': False,
'fOmitBinary': True,
'fRegexFlags': 46,
'fReplaceText': '',
'fReplaceText': u'',
'fReverse': False,
'fSearchText': u'.new',
'fStartPos': 0,
@ -401,7 +392,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'fRegexFlags': 46,
'fReplaceText': u'called',
'fReverse': False,
'fSearchText': u'sys',
'fSearchText': u'//',
'fStartPos': 0,
'fStyle': 'regex',
'fWholeWords': False,
@ -433,20 +424,11 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
1,
{'node-states': [],
'tree-state': {'column-widths': [0.38426349496797807,
0.61573650503202193],
0.6157365050320219],
'expanded-nodes': [],
'selected-nodes': [],
'top-node': (0,)}})],
'primary_view_state': {'editor_states': {'bookmarks': ([[loc('../../org/mpwfw/disk/ColorWall/run.py'),
{'attrib-starts': [],
'first-line': 30,
'folded-linenos': [],
'sel-line': 42,
'sel-line-start': 1437,
'selection_end': 1437,
'selection_start': 1437},
1357513098.9413929],
(loc('../ipython_doctester/ipython_doctester.py'),
'primary_view_state': {'editor_states': ({'bookmarks': ([(loc('../ipython_doctester/ipython_doctester.py'),
{'attrib-starts': [],
'first-line': 19,
'folded-linenos': [],
@ -454,7 +436,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 696,
'selection_end': 724,
'selection_start': 724},
1358988102.8065691),
1358988102.806569),
[loc('../ipython_doctester/ipython_doctester.py'),
{'attrib-starts': [],
'first-line': 19,
@ -463,7 +445,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 696,
'selection_end': 724,
'selection_start': 724},
1358988140.2782991],
1358988140.278299],
[loc('../../Dropbox/wof/trough_trial_1.py'),
{'attrib-starts': [],
'first-line': 0,
@ -490,7 +472,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 1397,
'selection_end': 1418,
'selection_start': 1418},
1363624868.1423759),
1363624868.142376),
(loc('../cmd2/NEWS.txt'),
{'attrib-starts': [],
'first-line': 0,
@ -499,7 +481,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 206,
'selection_end': 313,
'selection_start': 313},
1363624892.6995621),
1363624892.699562),
[loc('../cmd2/patch.diff'),
{'attrib-starts': [],
'first-line': 0,
@ -517,7 +499,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 361,
'selection_end': 422,
'selection_start': 422},
1363626438.5112541),
1363626438.511254),
(loc('../cmd2/cmd2.py'),
{'attrib-starts': [],
'first-line': 38,
@ -535,7 +517,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 350,
'selection_end': 370,
'selection_start': 370},
1363626634.4066069),
1363626634.406607),
(loc('../cmd2/NEWS.txt'),
{'attrib-starts': [],
'first-line': 6,
@ -601,7 +583,7 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 1116,
'selection_end': 1122,
'selection_start': 1122},
1364592268.7543321),
1364592268.754332),
[loc('../../itninja/database/improve/condense.py'),
{'attrib-starts': [],
'first-line': 15,
@ -610,65 +592,95 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'sel-line-start': 1116,
'selection_end': 1122,
'selection_start': 1122},
1364592275.5137169],
1364592275.513717],
[loc('src/sql/run.py'),
{'attrib-starts': [('run',
25)],
'first-line': 13,
{'attrib-starts': [('ResultSet',
68),
('ResultSet.__init__',
74)],
'first-line': 68,
'folded-linenos': [],
'sel-line': 29,
'sel-line-start': 1006,
'selection_end': 1050,
'selection_start': 1050},
1364621577.7297421]],
19),
'current-loc': loc('src/sql/run.py'),
'editor-states': {loc('../cmd2/README.txt'): {'attrib-starts': [],
'first-line': 83,
'folded-linenos': [],
'sel-line': 132,
'sel-line-start': 5332,
'selection_end': 5339,
'selection_start': 5339},
loc('README.rst'): {'attrib-starts': [],
'first-line': 87,
'folded-linenos': [],
'sel-line': 98,
'sel-line-start': 3099,
'selection_end': 3174,
'selection_start': 3174},
loc('examples/writers.ipynb'): {'attrib-starts': [],
'sel-line': 84,
'sel-line-start': 2635,
'selection_end': 2652,
'selection_start': 2652},
1419831638.277049],
[loc('src/sql/parse.py'),
{'attrib-starts': [],
'first-line': 0,
'folded-linenos': [],
'sel-line': 0,
'sel-line-start': 0,
'selection_end': 0,
'selection_start': 0},
loc('setup.py'): {'attrib-starts': [],
1419831640.918957]],
20),
'current-loc': loc('src/sql/parse.py'),
'editor-state-list': [(loc('src/sql/parse.py'),
{'attrib-starts': [],
'first-line': 1,
'folded-linenos': [],
'sel-line': 2,
'sel-line-start': 52,
'selection_end': 86,
'selection_start': 86}),
(loc('README.rst'),
{'attrib-starts': [],
'first-line': 87,
'folded-linenos': [],
'sel-line': 98,
'sel-line-start': 3099,
'selection_end': 3174,
'selection_start': 3174}),
(loc('../cmd2/README.txt'),
{'attrib-starts': [],
'first-line': 83,
'folded-linenos': [],
'sel-line': 132,
'sel-line-start': 5332,
'selection_end': 5339,
'selection_start': 5339}),
(loc('src/sql/run.py'),
{'attrib-starts': [('ResultSet',
68),
('ResultSet.__init__',
74)],
'first-line': 68,
'folded-linenos': [],
'sel-line': 85,
'sel-line-start': 2645,
'selection_end': 2652,
'selection_start': 2652}),
(loc('setup.py'),
{'attrib-starts': [],
'first-line': 10,
'folded-linenos': [],
'sel-line': 24,
'sel-line-start': 535,
'selection_end': 568,
'selection_start': 568},
loc('src/sql/run.py'): {'attrib-starts': [('Result'\
'Set',
6),
('ResultSet.__init__',
7)],
'first-line': 4,
'selection_start': 568}),
(loc('examples/writers.ipynb'),
{'attrib-starts': [],
'first-line': 0,
'folded-linenos': [],
'sel-line': 15,
'sel-line-start': 479,
'selection_end': 497,
'selection_start': 496}},
'has-focus': True,
'sel-line': 0,
'sel-line-start': 0,
'selection_end': 0,
'selection_start': 0})],
'has-focus': False,
'locked': False},
[loc('src/sql/parse.py'),
loc('README.rst'),
loc('../cmd2/README.txt'),
loc('src/sql/run.py'),
loc('setup.py'),
loc('examples/writers.ipynb')]),
'open_files': [u'../cmd2/README.txt',
u'README.rst',
u'examples/writers.ipynb',
u'setup.py',
u'src/sql/run.py']},
u'src/sql/run.py',
u'src/sql/parse.py']},
'saved_notebook_display': None,
'split_percents': {},
'splits': 1,
@ -679,11 +691,12 @@ guimgr.overall-gui-state = {'windowing-policy': 'combined-window',
'splits': 2,
'tab_location': 'left',
'user_data': {}},
'window-alloc': (0,
27,
1431,
813)}]}
guimgr.recent-documents = [loc('src/sql/run.py')]
'window-alloc': (65,
24,
2495,
1576)}]}
guimgr.recent-documents = [loc('src/sql/parse.py'),
loc('src/sql/run.py')]
guimgr.visual-state = {loc('../astropy/astropy/table/table.py'): {'attrib-st'\
'arts': [('Table',
845),
@ -933,10 +946,11 @@ guimgr.visual-state = {loc('../astropy/astropy/table/table.py'): {'attrib-st'\
proj.build-cmd = {None: ('default',
None)}
proj.env-vars = {None: ('default',
[''])}
[u''])}
proj.pyexec = {None: ('custom',
'/home/catherine/ve/ipy/bin/python')}
search.search-history = [u'sys',
u'/home/catherine/ve/ipy3/bin/python')}
search.search-history = [u'//',
u'sys',
u'ip',
u'texttable',
u'True',

View File

@ -6,6 +6,7 @@ import six
from six.moves import cStringIO
import codecs
import os.path
import re
import sqlalchemy
import sqlparse
import prettytable
@ -66,6 +67,20 @@ class CsvResultDescriptor(object):
def _repr_html_(self):
return '<a href="%s">CSV results</a>' % os.path.join('.', 'files', self.file_path)
def _nonbreaking_spaces(match_obj):
"""
Make spaces visible in HTML by replacing all `` `` with ``&nbsp;``
Call with a ``re`` match object. Retain group 1, replace group 2
with nonbreaking speaces.
"""
spaces = '&nbsp;' * len(match_obj.group(2))
return '%s%s' % (match_obj.group(1), spaces)
_cell_with_spaces_pattern = re.compile(r'(<td>)( {2,})')
class ResultSet(list, ColumnGuesserMixin):
"""
Results of a SQL query.
@ -94,8 +109,10 @@ class ResultSet(list, ColumnGuesserMixin):
list.__init__(self, [])
self.pretty = None
def _repr_html_(self):
_cell_with_spaces_pattern = re.compile(r'(<td>)( {2,})')
if self.pretty:
result = self.pretty.get_html_string()
result = _cell_with_spaces_pattern.sub(_nonbreaking_spaces, result)
if self.config.displaylimit and len(self) > self.config.displaylimit:
result = '%s\n<span style="font-style:italic;text-align:center;">%d rows, truncated to displaylimit of %d</span>' % (
result, len(self), self.config.displaylimit)
@ -253,4 +270,3 @@ def run(conn, sql, config, user_namespace):
#returning only last result, intentionally
else:
return 'Connected: %s' % conn.name