diff -r bb96e12a3242 -r df47381b41d6 mercurial/minirst.py --- a/mercurial/minirst.py Thu Aug 11 22:05:31 2011 -0500 +++ b/mercurial/minirst.py Thu Aug 11 22:05:57 2011 -0500 @@ -103,6 +103,7 @@ r'((.*) +)(.*)$') _fieldre = re.compile(r':(?![: ])([^:]*)(? 4 and + _tablere.match(block['lines'][0]) and + block['lines'][0] == block['lines'][-1]): + block['type'] = 'table' + block['header'] = False + div = block['lines'][0] + columns = [x for x in xrange(len(div)) + if div[x] == '=' and (x == 0 or div[x - 1] == ' ')] + rows = [] + for l in block['lines'][1:-1]: + if l == div: + block['header'] = True + continue + row = [] + for n, start in enumerate(columns): + if n + 1 < len(columns): + row.append(l[start:columns[n + 1]].strip()) + else: + row.append(l[start:].strip()) + rows.append(row) + block['table'] = rows + + return blocks + def findsections(blocks): """Finds sections. @@ -392,6 +433,24 @@ if block['type'] == 'section': underline = encoding.colwidth(block['lines'][0]) * block['underline'] return "%s%s\n%s%s" % (indent, block['lines'][0],indent, underline) + if block['type'] == 'table': + table = block['table'] + # compute column widths + widths = [max([encoding.colwidth(e) for e in c]) for c in zip(*table)] + text = '' + span = sum(widths) + len(widths) - 1 + indent = ' ' * block['indent'] + hang = ' ' * (len(indent) + span - widths[-1]) + f = ' '.join('%%-%ds' % n for n in widths) + + for row in table: + l = f % tuple(row) + l = util.wrap(l, width=width, initindent=indent, hangindent=hang) + if not text and block['header']: + text = l + '\n' + indent + '-' * (min(width, span)) + '\n' + else: + text += l + "\n" + return text if block['type'] == 'definition': term = indent + block['lines'][0] hang = len(block['lines'][-1]) - len(block['lines'][-1].lstrip()) @@ -440,6 +499,7 @@ for b in blocks: b['indent'] += indent blocks = findliteralblocks(blocks) + blocks = findtables(blocks) blocks, pruned = prunecontainers(blocks, keep or []) blocks = findsections(blocks) blocks = inlineliterals(blocks)