110 lines
3.2 KiB
Python
110 lines
3.2 KiB
Python
#!/usr/bin/env python
|
|
|
|
#
|
|
# Example for using the shared library from python.
|
|
# Will work with either python 2 or python 3.
|
|
# Requires cmark-gfm and cmark-gfm-extensions libraries to be installed.
|
|
#
|
|
# This particular example uses the GitHub extensions from the gfm-extensions
|
|
# library. EXTENSIONS specifies which to use, and the sample shows how to
|
|
# connect them into a parser.
|
|
#
|
|
|
|
import sys
|
|
import ctypes
|
|
|
|
if sys.platform == 'darwin':
|
|
libname = 'libcmark-gfm.dylib'
|
|
extname = 'libcmark-gfm-extensions.dylib'
|
|
elif sys.platform == 'win32':
|
|
libname = 'cmark-gfm.dll'
|
|
extname = 'cmark-gfm-extensions.dll'
|
|
else:
|
|
libname = 'libcmark-gfm.so'
|
|
extname = 'libcmark-gfm-extensions.so'
|
|
cmark = ctypes.CDLL(libname)
|
|
cmark_ext = ctypes.CDLL(extname)
|
|
|
|
# Options for the GFM rendering call
|
|
OPTS = 0 # defaults
|
|
|
|
# The GFM extensions that we want to use
|
|
EXTENSIONS = (
|
|
'autolink',
|
|
'table',
|
|
'strikethrough',
|
|
'tagfilter',
|
|
)
|
|
|
|
# Use ctypes to access the functions in libcmark-gfm
|
|
|
|
F_cmark_parser_new = cmark.cmark_parser_new
|
|
F_cmark_parser_new.restype = ctypes.c_void_p
|
|
F_cmark_parser_new.argtypes = (ctypes.c_int,)
|
|
|
|
F_cmark_parser_feed = cmark.cmark_parser_feed
|
|
F_cmark_parser_feed.restype = None
|
|
F_cmark_parser_feed.argtypes = (ctypes.c_void_p, ctypes.c_char_p, ctypes.c_size_t)
|
|
|
|
F_cmark_parser_finish = cmark.cmark_parser_finish
|
|
F_cmark_parser_finish.restype = ctypes.c_void_p
|
|
F_cmark_parser_finish.argtypes = (ctypes.c_void_p,)
|
|
|
|
F_cmark_parser_attach_syntax_extension = cmark.cmark_parser_attach_syntax_extension
|
|
F_cmark_parser_attach_syntax_extension.restype = ctypes.c_int
|
|
F_cmark_parser_attach_syntax_extension.argtypes = (ctypes.c_void_p, ctypes.c_void_p)
|
|
|
|
F_cmark_parser_get_syntax_extensions = cmark.cmark_parser_get_syntax_extensions
|
|
F_cmark_parser_get_syntax_extensions.restype = ctypes.c_void_p
|
|
F_cmark_parser_get_syntax_extensions.argtypes = (ctypes.c_void_p,)
|
|
|
|
F_cmark_parser_free = cmark.cmark_parser_free
|
|
F_cmark_parser_free.restype = None
|
|
F_cmark_parser_free.argtypes = (ctypes.c_void_p,)
|
|
|
|
F_cmark_node_free = cmark.cmark_node_free
|
|
F_cmark_node_free.restype = None
|
|
F_cmark_node_free.argtypes = (ctypes.c_void_p,)
|
|
|
|
F_cmark_find_syntax_extension = cmark.cmark_find_syntax_extension
|
|
F_cmark_find_syntax_extension.restype = ctypes.c_void_p
|
|
F_cmark_find_syntax_extension.argtypes = (ctypes.c_char_p,)
|
|
|
|
F_cmark_render_html = cmark.cmark_render_html
|
|
F_cmark_render_html.restype = ctypes.c_char_p
|
|
F_cmark_render_html.argtypes = (ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p)
|
|
|
|
|
|
# Set up the libcmark-gfm library and its extensions
|
|
F_register = cmark_ext.cmark_gfm_core_extensions_ensure_registered
|
|
F_register.restype = None
|
|
F_register.argtypes = ( )
|
|
F_register()
|
|
|
|
|
|
def md2html(text):
|
|
"Use cmark-gfm to render the Markdown into an HTML fragment."
|
|
|
|
parser = F_cmark_parser_new(OPTS)
|
|
assert parser
|
|
for name in EXTENSIONS:
|
|
ext = F_cmark_find_syntax_extension(name)
|
|
assert ext
|
|
rv = F_cmark_parser_attach_syntax_extension(parser, ext)
|
|
assert rv
|
|
exts = F_cmark_parser_get_syntax_extensions(parser)
|
|
|
|
F_cmark_parser_feed(parser, text, len(text))
|
|
doc = F_cmark_parser_finish(parser)
|
|
assert doc
|
|
|
|
output = F_cmark_render_html(doc, OPTS, exts)
|
|
|
|
F_cmark_parser_free(parser)
|
|
F_cmark_node_free(doc)
|
|
|
|
return output
|
|
|
|
|
|
sys.stdout.write(md2html(sys.stdin.read()))
|