KiBot/kibot/PcbDraw/mistune/directives/include.py

72 lines
2.1 KiB
Python

import os
from mistune.markdown import preprocess
from .base import Directive
class DirectiveInclude(Directive):
def parse(self, block, m, state):
source_file = state.get('__file__')
if not source_file:
return {
'type': 'block_error',
'raw': 'Missing source file configuration',
}
relpath = m.group('value')
options = self.parse_options(m)
dest = os.path.join(os.path.dirname(source_file), relpath)
dest = os.path.normpath(dest)
if dest == source_file:
return {
'type': 'block_error',
'raw': 'Could not include self: ' + relpath,
}
if not os.path.isfile(dest):
return {
'type': 'block_error',
'raw': 'Could not find file: ' + relpath,
}
with open(dest, 'rb') as f:
content = f.read()
text = content.decode('utf-8')
if not options:
ext = os.path.splitext(relpath)[1]
if ext in {'.md', '.markdown', '.mkd'}:
text, state = preprocess(text, {'__file__': dest})
return block.parse(text, state)
if ext in {'.html', '.xhtml', '.htm'}:
return {'type': 'block_html', 'text': text}
return {
'type': 'include',
'raw': text,
'params': (relpath, dest, options)
}
def __call__(self, md):
self.register_directive(md, 'include')
if md.renderer.NAME == 'html':
md.renderer.register('include', render_html_include)
elif md.renderer.NAME == 'ast':
md.renderer.register('include', render_ast_include)
def render_ast_include(text, relpath, abspath=None, options=None):
return {
'type': 'include',
'text': text,
'relpath': relpath,
'abspath': abspath,
'options': options,
}
def render_html_include(text, relpath, abspath=None, options=None):
html = '<section class="directive-include" data-relpath="'
return html + relpath + '">\n' + text + '</section>\n'