~netlandish/django-wiki

967aa1d820cca0ce27cf69d861f7fa0695bfaf87 — Christian Duvholt 8 years ago 1d72a79
Add markdown plugin that wraps all tables with Bootstrap's table-responsive
2 files changed, 43 insertions(+), 1 deletions(-)

M wiki/core/markdown/__init__.py
A wiki/core/markdown/mdx/responsivetable.py
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')