463 lines
16 KiB
Python
463 lines
16 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from ._hoedown import lib, ffi
|
|
from .constants import *
|
|
from .utils import to_string
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *text, '
|
|
' const hoedown_buffer *lang, const hoedown_renderer_data *data)')
|
|
def cb_blockcode(ob, text, lang, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
text = to_string(text)
|
|
lang = to_string(lang)
|
|
|
|
result = renderer.blockcode(text, lang)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_blockquote(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.blockquote(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' int level, const hoedown_renderer_data *data)')
|
|
def cb_header(ob, content, level, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
level = int(level)
|
|
result = renderer.header(content, level)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_renderer_data *data)')
|
|
def cb_hrule(ob, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
result = renderer.hrule()
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
# flags: LIST_ORDERED, LI_BLOCK.
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' hoedown_list_flags flags, const hoedown_renderer_data *data)')
|
|
def cb_list(ob, content, flags, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
flags = int(flags)
|
|
is_ordered = flags & LIST_ORDERED != 0
|
|
is_block = flags & LI_BLOCK != 0
|
|
result = renderer.list(content, is_ordered, is_block)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
# flags: LIST_ORDERED, LI_BLOCK.
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' hoedown_list_flags flags, const hoedown_renderer_data *data)')
|
|
def cb_listitem(ob, content, flags, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
flags = int(flags)
|
|
is_ordered = flags & LIST_ORDERED != 0
|
|
is_block = flags & LI_BLOCK != 0
|
|
result = renderer.listitem(content, is_ordered, is_block)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_paragraph(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.paragraph(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_table(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.table(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_table_header(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.table_header(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_table_body(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.table_body(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_table_row(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.table_row(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
# flags: TABLE_ALIGNMASK, TABLE_ALIGN_LEFT, TABLE_ALIGN_RIGHT,
|
|
# TABLE_ALIGN_CENTER, TABLE_HEADER
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' hoedown_table_flags flags, const hoedown_renderer_data *data)')
|
|
def cb_table_cell(ob, content, flags, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
flags = int(flags)
|
|
is_header = flags & TABLE_HEADER != 0
|
|
align_bit = flags & TABLE_ALIGNMASK
|
|
|
|
if align_bit == TABLE_ALIGN_CENTER:
|
|
align = 'center'
|
|
elif align_bit == TABLE_ALIGN_LEFT:
|
|
align = 'left'
|
|
elif align_bit == TABLE_ALIGN_RIGHT:
|
|
align = 'right'
|
|
else:
|
|
align = ''
|
|
|
|
result = renderer.table_cell(content, align, is_header)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_footnotes(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.footnotes(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' unsigned int num, const hoedown_renderer_data *data)')
|
|
def cb_footnote_def(ob, content, num, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
num = int(num)
|
|
result = renderer.footnote_def(content, num)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *text, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_blockhtml(ob, text, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
text = ffi.string(text.data, text.size).decode('utf-8')
|
|
result = renderer.blockhtml(text)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *link, '
|
|
' hoedown_autolink_type type, const hoedown_renderer_data *data)')
|
|
def cb_autolink(ob, link, type, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
link = ffi.string(link.data, link.size).decode('utf-8')
|
|
is_email = int(type) & AUTOLINK_EMAIL != 0
|
|
result = renderer.autolink(link, is_email)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *text, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_codespan(ob, text, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
text = ffi.string(text.data, text.size).decode('utf-8')
|
|
result = renderer.codespan(text)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_double_emphasis(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.double_emphasis(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_emphasis(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.emphasis(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_underline(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.underline(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_highlight(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.highlight(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_quote(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.quote(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *link, '
|
|
' const hoedown_buffer *title, const hoedown_buffer *alt, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_image(ob, link, title, alt, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
link = to_string(link)
|
|
title = to_string(title)
|
|
alt = to_string(alt)
|
|
result = renderer.image(link, title, alt)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_renderer_data *data)')
|
|
def cb_linebreak(ob, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
result = renderer.linebreak()
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_buffer *link, const hoedown_buffer *title, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_link(ob, content, link, title, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
link = to_string(link)
|
|
title = to_string(title)
|
|
result = renderer.link(content, link, title)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_triple_emphasis(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.triple_emphasis(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_strikethrough(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.strikethrough(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *content, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_superscript(ob, content, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
content = to_string(content)
|
|
result = renderer.superscript(content)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, unsigned int num, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_footnote_ref(ob, num, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
num = int(num)
|
|
result = renderer.footnote_ref(num)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *text, '
|
|
' int displaymode, const hoedown_renderer_data *data)')
|
|
def cb_math(ob, text, displaymode, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
text = to_string(text)
|
|
displaymode = int(displaymode)
|
|
result = renderer.math(text, displaymode)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('int(hoedown_buffer *ob, const hoedown_buffer *text, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_raw_html(ob, text, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
text = to_string(text)
|
|
result = renderer.raw_html(text)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
return 1
|
|
return 0
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *text, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_entity(ob, text, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
text = to_string(text)
|
|
result = renderer.entity(text)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, const hoedown_buffer *text, '
|
|
' const hoedown_renderer_data *data)')
|
|
def cb_normal_text(ob, text, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
text = to_string(text)
|
|
result = renderer.normal_text(text)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, int inline_render, const hoedown_renderer_data *data)')
|
|
def cb_doc_header(ob, inline_render, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
inline_render = int(inline_render)
|
|
result = renderer.doc_header(inline_render)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
@ffi.callback('void(hoedown_buffer *ob, int inline_render, const hoedown_renderer_data *data)')
|
|
def cb_doc_footer(ob, inline_render, data):
|
|
renderer = ffi.from_handle(lib.misaka_get_renderer(data))
|
|
inline_render = int(inline_render)
|
|
result = renderer.doc_footer(inline_render)
|
|
if result:
|
|
lib.hoedown_buffer_puts(ob, result.encode('utf-8'))
|
|
|
|
|
|
python_callbacks = {
|
|
# block level callbacks - NULL skips the block
|
|
'blockcode': cb_blockcode,
|
|
'blockquote': cb_blockquote,
|
|
'header': cb_header,
|
|
'hrule': cb_hrule,
|
|
'list': cb_list,
|
|
'listitem': cb_listitem,
|
|
'paragraph': cb_paragraph,
|
|
'table': cb_table,
|
|
'table_header': cb_table_header,
|
|
'table_body': cb_table_body,
|
|
'table_row': cb_table_row,
|
|
'table_cell': cb_table_cell,
|
|
'footnotes': cb_footnotes,
|
|
'footnote_def': cb_footnote_def,
|
|
'blockhtml': cb_blockhtml,
|
|
|
|
# span level callbacks - NULL or return 0 prints the span verbatim
|
|
'autolink': cb_autolink,
|
|
'codespan': cb_codespan,
|
|
'double_emphasis': cb_double_emphasis,
|
|
'emphasis': cb_emphasis,
|
|
'underline': cb_underline,
|
|
'highlight': cb_highlight,
|
|
'quote': cb_quote,
|
|
'image': cb_image,
|
|
'linebreak': cb_linebreak,
|
|
'link': cb_link,
|
|
'triple_emphasis': cb_triple_emphasis,
|
|
'strikethrough': cb_strikethrough,
|
|
'superscript': cb_superscript,
|
|
'footnote_ref': cb_footnote_ref,
|
|
'math': cb_math,
|
|
'raw_html': cb_raw_html,
|
|
|
|
# low level callbacks - NULL copies input directly into the output
|
|
'entity': cb_entity,
|
|
'normal_text': cb_normal_text,
|
|
|
|
# miscellaneous callbacks
|
|
'doc_header': cb_doc_header,
|
|
'doc_footer': cb_doc_footer,
|
|
}
|