Extensions and render flags can be passed as a list of strings.

This commit is contained in:
Frank Smit 2015-08-06 00:28:01 +02:00
parent 11bfb9014c
commit 782e52c1ff
3 changed files with 110 additions and 29 deletions

View File

@ -1,20 +1,3 @@
# -*- coding: utf-8 -*-
import sys
from inspect import getmembers
from .api import *
from ._hoedown import lib
def _set_constants():
is_int = lambda n: isinstance(n, int)
for name, value in getmembers(lib, is_int):
if not name.startswith('HOEDOWN_'):
continue
setattr(sys.modules[__name__], name[8:], value)
if not hasattr(sys.modules[__name__], 'EXT_TABLES'):
_set_constants()

View File

@ -1,9 +1,16 @@
# -*- coding: utf-8 -*-
import sys
import operator as op
from inspect import getmembers, ismethod
from ._hoedown import lib, ffi
try:
reduce
except NameError:
from functools import reduce
__all__ = [
'html',
@ -12,9 +19,83 @@ __all__ = [
'BaseRenderer',
'HtmlRenderer',
'HtmlTocRenderer',
'dict_to_int',
'extension_map',
'html_flag_map',
'EXT_TABLES',
'EXT_FENCED_CODE',
'EXT_FOOTNOTES',
'EXT_AUTOLINK',
'EXT_STRIKETHROUGH',
'EXT_UNDERLINE',
'EXT_HIGHLIGHT',
'EXT_QUOTE',
'EXT_SUPERSCRIPT',
'EXT_MATH',
'EXT_NO_INTRA_EMPHASIS',
'EXT_SPACE_HEADERS',
'EXT_MATH_EXPLICIT',
'EXT_DISABLE_INDENTED_CODE',
'HTML_SKIP_HTML',
'HTML_ESCAPE',
'HTML_HARD_WRAP',
'HTML_USE_XHTML',
'LIST_ORDERED',
'LI_BLOCK',
'TABLE_ALIGN_LEFT',
'TABLE_ALIGN_RIGHT',
'TABLE_ALIGN_CENTER',
'TABLE_ALIGNMASK',
'TABLE_HEADER',
'AUTOLINK_NORMAL',
'AUTOLINK_EMAIL',
]
def _set_constants():
is_int = lambda n: isinstance(n, int)
for name, value in getmembers(lib, is_int):
if not name.startswith('HOEDOWN_'):
continue
setattr(sys.modules[__name__], name[8:], value)
if not hasattr(sys.modules[__name__], 'EXT_TABLES'):
_set_constants()
extension_map = {
'tables': EXT_TABLES,
'fenced-code': EXT_FENCED_CODE,
'footnotes': EXT_FOOTNOTES,
'autolink': EXT_AUTOLINK,
'strikethrough': EXT_STRIKETHROUGH,
'underline': EXT_UNDERLINE,
'highlight': EXT_HIGHLIGHT,
'quote': EXT_QUOTE,
'superscript': EXT_SUPERSCRIPT,
'math': EXT_MATH,
'no-intra-emphasis': EXT_NO_INTRA_EMPHASIS,
'space-headers': EXT_SPACE_HEADERS,
'math-explicit': EXT_MATH_EXPLICIT,
'disable-indented-code': EXT_DISABLE_INDENTED_CODE,
}
html_flag_map = {
'skip-html': HTML_SKIP_HTML,
'escape': HTML_ESCAPE,
'hard-wrap': HTML_HARD_WRAP,
'use-xhtml': HTML_USE_XHTML,
}
IUNIT = 1024
OUNIT = 64
MAX_NESTING = 16
@ -26,10 +107,27 @@ def to_string(buffer):
return ffi.string(buffer.data, buffer.size).decode('utf-8')
def dict_to_int(mapping, argument):
"""
Reduce a dictionary to an integer.
This function is used to reduce a dictionary (e.g. Markdown extensions,
HTML render flags.) to an integer by OR'ing the values with eachother.
"""
if isinstance(argument, int):
return argument
elif isinstance(argument, (tuple, list)):
return reduce(op.or_, [mapping[n] for n in argument if n in mapping])
raise TypeError('argument must be a list of strings or an int')
def html(text, extensions=0, render_flags=0):
"""
Convert markdown text to HTML.
"""
render_flags = dict_to_int(html_flag_map, render_flags)
ib = lib.hoedown_buffer_new(IUNIT)
ob = lib.hoedown_buffer_new(OUNIT)
renderer = lib.hoedown_html_renderer_new(render_flags, 0)
@ -84,7 +182,7 @@ class Markdown:
"""
def __init__(self, renderer, extensions=0):
self.renderer = renderer
self.extensions = extensions
self.extensions = dict_to_int(extension_map, extensions)
def __call__(self, text):
"""
@ -438,6 +536,7 @@ class HtmlRenderer(BaseRenderer):
by the ``Markdown`` instance.
"""
def __init__(self, flags=0, nesting_level=0):
flags = dict_to_int(html_flag_map, flags)
self.renderer = self._new_renderer(flags, nesting_level)
callbacks = []

View File

@ -347,17 +347,16 @@ class CustomRendererTest(TestCase):
def setup(self):
render_default = m.Markdown(
TestRenderer(),
m.EXT_FENCED_CODE |
m.EXT_TABLES |
m.EXT_FOOTNOTES |
m.EXT_AUTOLINK |
m.EXT_HIGHLIGHT |
m.EXT_QUOTE |
m.EXT_STRIKETHROUGH |
m.EXT_SUPERSCRIPT |
m.EXT_MATH
)
TestRenderer(), (
'fenced-code',
'tables',
'footnotes',
'autolink',
'highlight',
'quote',
'strikethrough',
'superscript',
'math'))
# EXT_UNDERLINE Clashes with emphasis.
render_underline = m.Markdown(TestRenderer(), m.EXT_UNDERLINE)