deb-python-misaka/misaka/callbacks.py

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,
}