diff options
author | hukun@chromium.org <hukun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-09 21:40:16 +0000 |
---|---|---|
committer | hukun@chromium.org <hukun@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-09 21:40:16 +0000 |
commit | ea583c06bc760b671beb3952d6e6123317a75d53 (patch) | |
tree | 79574fdacdae2ce1ab6fd1960fa1eaf81c71ffbd /third_party/markdown/extensions/tables.py | |
parent | 467bfa68f4004c441e17cc6c9fedc66d436904a0 (diff) | |
download | chromium_src-ea583c06bc760b671beb3952d6e6123317a75d53.zip chromium_src-ea583c06bc760b671beb3952d6e6123317a75d53.tar.gz chromium_src-ea583c06bc760b671beb3952d6e6123317a75d53.tar.bz2 |
Docserver: Support markdown for HTML content.
R=kalman@chromium.org
BUG=293681
Review URL: https://codereview.chromium.org/93743005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243980 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/markdown/extensions/tables.py')
-rw-r--r-- | third_party/markdown/extensions/tables.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/third_party/markdown/extensions/tables.py b/third_party/markdown/extensions/tables.py new file mode 100644 index 0000000..ad52ec1 --- /dev/null +++ b/third_party/markdown/extensions/tables.py @@ -0,0 +1,100 @@ +""" +Tables Extension for Python-Markdown +==================================== + +Added parsing of tables to Python-Markdown. + +A simple example: + + First Header | Second Header + ------------- | ------------- + Content Cell | Content Cell + Content Cell | Content Cell + +Copyright 2009 - [Waylan Limberg](http://achinghead.com) +""" + +from __future__ import absolute_import +from __future__ import unicode_literals +from . import Extension +from ..blockprocessors import BlockProcessor +from ..util import etree + +class TableProcessor(BlockProcessor): + """ Process Tables. """ + + def test(self, parent, block): + rows = block.split('\n') + return (len(rows) > 2 and '|' in rows[0] and + '|' in rows[1] and '-' in rows[1] and + rows[1].strip()[0] in ['|', ':', '-']) + + def run(self, parent, blocks): + """ Parse a table block and build table. """ + block = blocks.pop(0).split('\n') + header = block[0].strip() + seperator = block[1].strip() + rows = block[2:] + # Get format type (bordered by pipes or not) + border = False + if header.startswith('|'): + border = True + # Get alignment of columns + align = [] + for c in self._split_row(seperator, border): + if c.startswith(':') and c.endswith(':'): + align.append('center') + elif c.startswith(':'): + align.append('left') + elif c.endswith(':'): + align.append('right') + else: + align.append(None) + # Build table + table = etree.SubElement(parent, 'table') + thead = etree.SubElement(table, 'thead') + self._build_row(header, thead, align, border) + tbody = etree.SubElement(table, 'tbody') + for row in rows: + self._build_row(row.strip(), tbody, align, border) + + def _build_row(self, row, parent, align, border): + """ Given a row of text, build table cells. """ + tr = etree.SubElement(parent, 'tr') + tag = 'td' + if parent.tag == 'thead': + tag = 'th' + cells = self._split_row(row, border) + # We use align here rather than cells to ensure every row + # contains the same number of columns. + for i, a in enumerate(align): + c = etree.SubElement(tr, tag) + try: + c.text = cells[i].strip() + except IndexError: + c.text = "" + if a: + c.set('align', a) + + def _split_row(self, row, border): + """ split a row of text into list of cells. """ + if border: + if row.startswith('|'): + row = row[1:] + if row.endswith('|'): + row = row[:-1] + return row.split('|') + + +class TableExtension(Extension): + """ Add tables to Markdown. """ + + def extendMarkdown(self, md, md_globals): + """ Add an instance of TableProcessor to BlockParser. """ + md.parser.blockprocessors.add('table', + TableProcessor(md.parser), + '<hashheader') + + +def makeExtension(configs={}): + return TableExtension(configs=configs) |