M wiki/core/markdown/__init__.py => wiki/core/markdown/__init__.py +2 -1
@@ 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
A wiki/core/markdown/mdx/responsivetable.py => wiki/core/markdown/mdx/responsivetable.py +41 -0
@@ 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')