Table patch from SomeDude. Features: Patch from SomeDude to do MoinMoin style table formatting. Patch CHK from FMS (applied against 0ad7286d96a8): CHK@TCAI-QHXuyBYOJkqBFIPrxJGMPI~6GB7V8aWBgK~PfQ,831jq0VBNXV-3q6uSS0VtXlqzAj2HD1FdZNS-r7CWWU,AAIC--8/table.patch
diff --git a/fniki/piki.py b/fniki/piki.py
--- a/fniki/piki.py
+++ b/fniki/piki.py
@@ -548,6 +548,7 @@ class PageFormatter:
self.is_em = self.is_b = 0
self.list_indents = []
self.in_pre = 0
+ self.in_table = 0
def _emph_repl(self, word):
@@ -656,7 +657,110 @@ class PageFormatter:
macro_name = word[2:-2]
# TODO: Somehow get the default value into the search field
return apply(globals()['_macro_' + macro_name], ())
+
+ def _tablerow_repl(self, word):
+ if word[0:2] == '||':
+ # strip off the beginning and ending ||
+ word = word[2:-2]
+ rval = ''
+ # start the table if we aren't inside one yet
+ if self.in_table == 0:
+ self.in_table = 1
+ rval = rval + '<table'
+
+ table_re = re.compile(
+ r"(?:(?P<tableborder>\<tableborder:(?P<borderval>\d+(%|px)?)\>)"
+ + r"|(?P<tablebordercolor>\<tablebordercolor:(?P<bordercolorval>#[0-9A-Fa-f]{6})\>)"
+ + r"|(?P<tablewidth>\<tablewidth:(?P<widthval>\d+(%|px)?)\>)"
+ + r"|(?P<tableheight>\<tableheight:(?P<heightval>\d+(%|px)?)\>)"
+ + r"|(?P<collapse>\<collapse\>)"
+ + r")")
+
+ stylestr = ''
+
+ for match in table_re.finditer(word):
+ stylestr = stylestr + self.table_replace(match)
+
+ # replace all matches with empty string
+ word = re.sub(table_re,'',word)
+
+ if stylestr != '':
+ rval = rval + ' style="' + stylestr + '"'
+
+ rval = rval + '>'
+
+ # start a new table row
+ colspan = 1
+ rval = rval + '<tr>'
+ for line in word.split('||'):
+ if line == '':
+ colspan = colspan + 1
+ else:
+ if colspan > 1:
+ rval = rval + '<td colspan="' + str(colspan) + '"'
+ else:
+ rval = rval + '<td'
+
+ td_re = re.compile(
+ r"(?:(?P<tdborder>\<border:(?P<borderval>\d+(%|px)?)\>)"
+ + r"|(?P<tdbordercolor>\<bordercolor:(?P<bordercolorval>#[0-9A-Fa-f]{6})\>)"
+ + r"|(?P<tdwidth>\<width:(?P<widthval>\d+(%|px)?)\>)"
+ + r"|(?P<tdheight>\<height:(?P<heightval>\d+(%|px)?)\>)"
+ + r"|(?P<tdbgcolor>\<bgcolor:(?P<bgcolorval>#[0-9A-Fa-f]{6})\>)"
+ + r"|(?P<tdalign>\<align:(?P<alignval>(left|center|right))\>)"
+ + r")")
+
+ stylestr = ''
+
+ for match in td_re.finditer(line):
+ stylestr = stylestr + self.table_replace(match)
+
+ # replace all matches with empty string
+ line = re.sub(td_re,'',line)
+
+ if stylestr != '':
+ rval = rval + ' style="' + stylestr + '"'
+
+ rval = rval + '>'
+
+ # recursive call to pageformatter to format any code within the table data
+ # is there a better way to do this??
+ rval = rval + PageFormatter(line).return_html() + '</td>'
+ colspan = 1
+
+ # end the current table row - make sure to close final td if one is open
+ if colspan > 1:
+ rval = rval + '<td colspan="' + str(colspan-1) + '"></td>'
+
+ rval = rval + '</tr>'
+ return rval
+ elif self.in_table == 1:
+ self.in_table = 0
+ return '</table>'
+ else:
+ return ''
+
+ def table_replace(self, match):
+ replaced = ''
+ for type, hit in match.groupdict().items():
+ if hit:
+ if type == 'tableborder' or type == 'tdborder':
+ replaced = 'border-style:solid;border-width:'+match.group('borderval')+';'
+ elif type == 'tablebordercolor' or type == 'tdbordercolor':
+ replaced = 'border-color:'+match.group('bordercolorval')+';'
+ elif type == 'tablewidth' or type == 'tdwidth':
+ replaced = 'width:'+match.group('widthval')+';'
+ elif type == 'tableheight' or type == 'tdheight':
+ replaced = 'height:'+match.group('heightval')+';'
+ elif type == 'tdbgcolor':
+ replaced = 'background-color:'+match.group('bgcolorval')+';'
+ elif type == 'tdalign':
+ replaced = 'text-align:'+match.group('alignval')+';'
+ elif type == 'collapse':
+ replaced = 'border-collapse:collapse;'
+ return replaced
+
def _indent_level(self):
return len(self.list_indents) and self.list_indents[-1]
@@ -679,11 +783,15 @@ class PageFormatter:
def replace(self, match):
for type, hit in match.groupdict().items():
if hit:
- return apply(getattr(self, '_' + type + '_repl'), (hit,))
+ replaced = ''
+ if self.in_table == 1 and type != 'tablerow':
+ replaced = self._tablerow_repl(hit)
+ return replaced + apply(getattr(self, '_' + type + '_repl'), (hit,))
else:
raise "Can't handle match " + `match`
-
- def print_html(self):
+
+ def return_html(self):
+ returnval = ''
# For each line, we scan through looking for magic
# strings, outputting verbatim any intervening text
scan_re = re.compile(
@@ -702,6 +810,7 @@ class PageFormatter:
+ r"|TitleIndex|ActiveLink"
+ r"|LocalChanges|RemoteChanges|BookMark|"
+ r"FreesiteUri|GoTo)\]\])"
+ + r"|(?P<tablerow>^\|\|.*\|\|$)"
+ r")")
blank_re = re.compile("^\s*$")
bullet_re = re.compile("^\s+\*")
@@ -712,13 +821,19 @@ class PageFormatter:
if not self.in_pre:
# XXX: Should we check these conditions in this order?
if blank_re.match(line):
- print '<p>'
+ if self.in_table:
+ returnval = returnval + self._tablerow_repl('')
+ returnval = returnval + '<p>\n'
continue
indent = indent_re.match(line)
- print self._indent_to(len(indent.group(0)))
- print re.sub(scan_re, self.replace, line)
- if self.in_pre: print '</pre>'
- print self._undent()
+ returnval = returnval + self._indent_to(len(indent.group(0)))
+ returnval = returnval + re.sub(scan_re, self.replace, line) + '\n'
+ if self.in_pre: returnval = returnval + '</pre>\n'
+ returnval = returnval + self._undent() + '\n'
+ return returnval
+
+ def print_html(self):
+ print self.return_html()
# ----------------------------------------------------------
class Page: