From 967aa1d820cca0ce27cf69d861f7fa0695bfaf87 Mon Sep 17 00:00:00 2001 From: Christian Duvholt Date: Sun, 19 Jun 2016 13:15:22 +0200 Subject: [PATCH] Add markdown plugin that wraps all tables with Bootstrap's table-responsive --- wiki/core/markdown/__init__.py | 3 +- wiki/core/markdown/mdx/responsivetable.py | 41 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 wiki/core/markdown/mdx/responsivetable.py diff --git a/wiki/core/markdown/__init__.py b/wiki/core/markdown/__init__.py index 130ee0eb..8b87429d 100644 --- a/wiki/core/markdown/__init__.py +++ b/wiki/core/markdown/__init__.py @@ -2,6 +2,7 @@ from __future__ import absolute_import, unicode_literals from wiki.conf import settings from wiki.core.markdown.mdx.previewlinks import PreviewLinksExtension +from wiki.core.markdown.mdx.responsivetable import ResponsiveTableExtension from wiki.core.plugins import registry as plugin_registry import markdown @@ -17,7 +18,7 @@ class ArticleMarkdown(markdown.Markdown): def core_extensions(self): """List of core extensions found in the mdx folder""" - return [PreviewLinksExtension()] + return [PreviewLinksExtension(), ResponsiveTableExtension()] def get_markdown_extensions(self): kwargs = settings.MARKDOWN_KWARGS diff --git a/wiki/core/markdown/mdx/responsivetable.py b/wiki/core/markdown/mdx/responsivetable.py new file mode 100644 index 00000000..2b031bf4 --- /dev/null +++ b/wiki/core/markdown/mdx/responsivetable.py @@ -0,0 +1,41 @@ +from __future__ import absolute_import, unicode_literals + +import markdown +from markdown.util import etree +from markdown.treeprocessors import Treeprocessor + + +class ResponsiveTableExtension(markdown.Extension): + """Wraps all tables with Bootstrap's table-responsive class""" + + def extendMarkdown(self, md, md_globals): + md.treeprocessors.add('responsivetable', ResponsiveTableTree(md), "_end") + + +class ResponsiveTableTree(Treeprocessor): + def run(self, root): + for table_wrapper in root.findall('.//table'): + table_new = self.create_table_element() + self.convert_to_wrapper(table_wrapper) + self.move_children(table_wrapper, table_new) + table_wrapper.append(table_new) + return root + + def create_table_element(self): + """Create table element with text and tail""" + element = etree.Element('table') + element.text = '\n' + element.tail = '\n' + return element + + def move_children(self, element1, element2): + """Moves children from element1 to element2""" + for child in element1: + element2.append(child) + # reversed is needed to safely remove items while iterating + for child in reversed(element1): + element1.remove(child) + + def convert_to_wrapper(self, element): + element.tag = 'div' + element.set('class', 'table-responsive') -- 2.45.2