1.1 --- a/ImprovedTableParser.py Sun Feb 19 19:24:29 2012 +0100
1.2 +++ b/ImprovedTableParser.py Sun Feb 19 20:26:25 2012 +0100
1.3 @@ -251,6 +251,19 @@
1.4 except wikiutil.PluginMissingError:
1.5 return wikiutil.searchAndImportPlugin(request.cfg, "parser", "plain")
1.6
1.7 +def getFormatterClass(request, format):
1.8 +
1.9 + """
1.10 + Return a formatter class using the 'request' for the given output 'format',
1.11 + returning a plain text formatter if no formatter can be found for the
1.12 + specified 'format'.
1.13 + """
1.14 +
1.15 + try:
1.16 + return wikiutil.searchAndImportPlugin(request.cfg, "formatter", format or "text_plain")
1.17 + except wikiutil.PluginMissingError:
1.18 + return wikiutil.searchAndImportPlugin(request.cfg, "formatter", "text_plain")
1.19 +
1.20 def formatText(text, request, fmt):
1.21
1.22 "Format the given 'text' using the specified 'request' and formatter 'fmt'."
1.23 @@ -313,18 +326,36 @@
1.24 else:
1.25 return ""
1.26
1.27 -def to_number(s):
1.28 +def to_number(s, request):
1.29
1.30 "Convert 's' to a number, discarding any non-numeric trailing data."
1.31
1.32 return int(get_number(s))
1.33
1.34 +def to_plain_text(s, request):
1.35 +
1.36 + "Convert 's' to plain text."
1.37 +
1.38 + fmt = getFormatterClass(request, "text_plain")(request)
1.39 + fmt.page = request.page
1.40 + return formatText(s, request, fmt)
1.41 +
1.42 +converters = {
1.43 + "n" : to_number,
1.44 + "" : to_plain_text,
1.45 + }
1.46 +
1.47 +suffixes = {}
1.48 +for key, value in converters.items():
1.49 + suffixes[value] = key
1.50 +
1.51 class Sorter:
1.52
1.53 "A sorting helper class."
1.54
1.55 - def __init__(self, sort_columns):
1.56 + def __init__(self, sort_columns, request):
1.57 self.sort_columns = sort_columns
1.58 + self.request = request
1.59
1.60 def __call__(self, row1, row2):
1.61 row_attrs1, columns1 = row1
1.62 @@ -339,8 +370,8 @@
1.63 # Ignore a column when a conversion is not possible.
1.64
1.65 try:
1.66 - text1 = fn(text1)
1.67 - text2 = fn(text2)
1.68 + text1 = fn(text1, self.request)
1.69 + text2 = fn(text2, self.request)
1.70 result = cmp(text1, text2)
1.71
1.72 # Where the columns differ, return a result observing the sense
1.73 @@ -372,7 +403,7 @@
1.74
1.75 # Get the specification of this column.
1.76
1.77 - columnfn, columnascending = column_types.get(columnnumber, (str, True))
1.78 + columnfn, columnascending = column_types.get(columnnumber, (to_plain_text, True))
1.79 newsortcolumn = columnnumber, columnfn, columnascending
1.80 newlabel = columns[columnnumber][1].strip()
1.81
1.82 @@ -470,17 +501,6 @@
1.83 return ",".join([("%d%s%s" % (column + start, suffixes[fn], not ascending and "d" or ""))
1.84 for (column, fn, ascending) in columns])
1.85
1.86 -# Sorting-related tables.
1.87 -
1.88 -converters = {
1.89 - "n" : to_number,
1.90 - "" : str,
1.91 - }
1.92 -
1.93 -suffixes = {}
1.94 -for key, value in converters.items():
1.95 - suffixes[value] = key
1.96 -
1.97 # Common formatting functions.
1.98
1.99 def formatTable(text, request, fmt, attrs=None):
1.100 @@ -497,7 +517,8 @@
1.101 # Override any region arguments with request parameters.
1.102
1.103 table_name = attrs.get("name")
1.104 - table_attrs["tableid"] = table_attrs.get("tableid", table_name)
1.105 + if table_name:
1.106 + table_attrs["tableid"] = table_name
1.107
1.108 # Get sorting criteria from the region and the request.
1.109
1.110 @@ -517,7 +538,7 @@
1.111 sort_columns = get_sort_columns(sortcolumns)
1.112 region_sort_columns = get_sort_columns(region_sortcolumns)
1.113
1.114 - sorter = Sorter(sort_columns)
1.115 + sorter = Sorter(sort_columns, request)
1.116 data.sort(cmp=sorter)
1.117
1.118 table = headers + data