# HG changeset patch # User Paul Boddie # Date 1329679585 -3600 # Node ID f40e68a2828b9ca7f2b5fc125fbf1f71c2fe0674 # Parent 5fb05743a40076bc286fbfb443e6b346304d9c75 Added missing stylesheet. Removed table name anchor definition where no table name is specified. Introduced conversion to plain text in order to support more reliable ordering of formatted text. diff -r 5fb05743a400 -r f40e68a2828b ImprovedTableParser.py --- a/ImprovedTableParser.py Sun Feb 19 19:24:29 2012 +0100 +++ b/ImprovedTableParser.py Sun Feb 19 20:26:25 2012 +0100 @@ -251,6 +251,19 @@ except wikiutil.PluginMissingError: return wikiutil.searchAndImportPlugin(request.cfg, "parser", "plain") +def getFormatterClass(request, format): + + """ + Return a formatter class using the 'request' for the given output 'format', + returning a plain text formatter if no formatter can be found for the + specified 'format'. + """ + + try: + return wikiutil.searchAndImportPlugin(request.cfg, "formatter", format or "text_plain") + except wikiutil.PluginMissingError: + return wikiutil.searchAndImportPlugin(request.cfg, "formatter", "text_plain") + def formatText(text, request, fmt): "Format the given 'text' using the specified 'request' and formatter 'fmt'." @@ -313,18 +326,36 @@ else: return "" -def to_number(s): +def to_number(s, request): "Convert 's' to a number, discarding any non-numeric trailing data." return int(get_number(s)) +def to_plain_text(s, request): + + "Convert 's' to plain text." + + fmt = getFormatterClass(request, "text_plain")(request) + fmt.page = request.page + return formatText(s, request, fmt) + +converters = { + "n" : to_number, + "" : to_plain_text, + } + +suffixes = {} +for key, value in converters.items(): + suffixes[value] = key + class Sorter: "A sorting helper class." - def __init__(self, sort_columns): + def __init__(self, sort_columns, request): self.sort_columns = sort_columns + self.request = request def __call__(self, row1, row2): row_attrs1, columns1 = row1 @@ -339,8 +370,8 @@ # Ignore a column when a conversion is not possible. try: - text1 = fn(text1) - text2 = fn(text2) + text1 = fn(text1, self.request) + text2 = fn(text2, self.request) result = cmp(text1, text2) # Where the columns differ, return a result observing the sense @@ -372,7 +403,7 @@ # Get the specification of this column. - columnfn, columnascending = column_types.get(columnnumber, (str, True)) + columnfn, columnascending = column_types.get(columnnumber, (to_plain_text, True)) newsortcolumn = columnnumber, columnfn, columnascending newlabel = columns[columnnumber][1].strip() @@ -470,17 +501,6 @@ return ",".join([("%d%s%s" % (column + start, suffixes[fn], not ascending and "d" or "")) for (column, fn, ascending) in columns]) -# Sorting-related tables. - -converters = { - "n" : to_number, - "" : str, - } - -suffixes = {} -for key, value in converters.items(): - suffixes[value] = key - # Common formatting functions. def formatTable(text, request, fmt, attrs=None): @@ -497,7 +517,8 @@ # Override any region arguments with request parameters. table_name = attrs.get("name") - table_attrs["tableid"] = table_attrs.get("tableid", table_name) + if table_name: + table_attrs["tableid"] = table_name # Get sorting criteria from the region and the request. @@ -517,7 +538,7 @@ sort_columns = get_sort_columns(sortcolumns) region_sort_columns = get_sort_columns(region_sortcolumns) - sorter = Sorter(sort_columns) + sorter = Sorter(sort_columns, request) data.sort(cmp=sorter) table = headers + data diff -r 5fb05743a400 -r f40e68a2828b css/improvedtableparser.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/css/improvedtableparser.css Sun Feb 19 20:26:25 2012 +0100 @@ -0,0 +1,84 @@ +/* improvedtableparser.css - some additional styles for ImprovedTableParser + * which can be included in screen.css and print.css + * using... + * + * @import "improvedtableparser.css"; + * + * ...before any rules. + * + * Copyright (c) 2012 by Paul Boddie + * Licensed under the GNU GPL (v2 or later), see COPYING.txt for details. + */ + +.sortablecolumn { + position: relative; + padding-bottom: 0.5em; +} + +.sortablecolumn .sortcolumns { + display: none; + position: absolute; + top: 1em; + left: 0; + z-index: 3; + background-color: #fff; + color: #000; + border: 1px solid #000; + padding: 0; +} + +.sortablecolumn:hover .sortcolumns { + display: block; +} + +.sortcolumn-container { + position: relative; + padding-right: 0.25em; +} + +a.removecolumn, +.unlinkedcolumn { + margin-left: 0.25em; /* replaces the container used for the pop-up */ +} + +.sortcolumns ol { + margin: 0.5em; + padding: 0.25em 1.5em 0.25em 1.5em; +} + +.sortcolumns li { + white-space: nowrap; + border-top: 2px solid #fff; +} + +.sortcolumn a { + text-decoration: none !important; + color: inherit !important; +} + +.sortcolumn:hover { + border-top: 2px solid #f66; +} + +.sortcolumn .newsortcolumn { + display: none; + position: absolute; + bottom: 0.5em; + right: 0.25em; + z-index: 4; + background-color: #f66; + color: #000; + padding: 0.5em; +} + +.sortcolumn:hover .newsortcolumn { + display: block; +} + +a.removecolumn { + color: inherit !important; +} + +a.removecolumn:hover { + text-decoration: line-through !important; +}