86 lines
2.8 KiB
Python
86 lines
2.8 KiB
Python
"""Convert a HECKformat file to a markdown stream."""
|
|
|
|
import io
|
|
import os
|
|
|
|
from typing import Dict, Iterable, Optional
|
|
|
|
import heckformat.parse
|
|
|
|
from .processors import Processor, NoOutputException
|
|
|
|
|
|
class HECKformatProcessor(Processor):
|
|
"""Convert a HECKformat file to a markdown stream."""
|
|
|
|
def filename(self, oldname: str, ctx: Optional[Dict] = None) -> str:
|
|
"""Return the filename of the post-processed file.
|
|
|
|
Arguments:
|
|
oldname (str): the previous name for the file.
|
|
ctx (dict, optional): A context object generated from the processor configuration
|
|
|
|
Returns:
|
|
str: the new name for the file
|
|
|
|
"""
|
|
if ctx and 'heck_filename' in ctx:
|
|
return ctx['heck_filename']
|
|
|
|
return os.path.splitext(oldname)[0] + this.extension(oldname, ctx)
|
|
|
|
def mime_type(self, oldname: str, ctx: Optional[Dict] = None) -> str:
|
|
"""Return the mimetype of the post-processed file.
|
|
|
|
Arguments:
|
|
oldname (str): the input filename
|
|
ctx (dict, optional): A context object generated from the processor configuration
|
|
|
|
Returns:
|
|
str: the new mimetype of the file after processing
|
|
|
|
"""
|
|
if ctx and 'heck_mime' in ctx:
|
|
return ctx['heck_mime']
|
|
|
|
return "text/x-markdown"
|
|
|
|
def extension(self, oldname: str, ctx: Optional[Dict] = None) -> str:
|
|
"""Return the mimetype of the post-processed file.
|
|
|
|
Arguments:
|
|
oldname (str): the input filename
|
|
ctx (dict, optional): A context object generated from the processor configuration
|
|
|
|
Returns:
|
|
str: the new extension of the file after processing
|
|
|
|
"""
|
|
if ctx and 'heck_extension' in ctx:
|
|
return ctx['heck_extension']
|
|
|
|
return "md"
|
|
|
|
def process(self, input_file: Iterable, ctx: Optional[Dict] = None) -> Iterable:
|
|
"""Return an iterable object of the post-processed file.
|
|
|
|
Arguments:
|
|
input_file (iterable): An input stream
|
|
ctx (dict, optional): A context object generated from the processor configuration
|
|
|
|
Returns:
|
|
iterable: The post-processed output stream
|
|
"""
|
|
|
|
elm = heckformat.parse.load_heck(input_file).flatten_replace()
|
|
for key in elm:
|
|
if key.startswith(heckformat.parse.UNPARSED_MARKER):
|
|
# fixme later we should use the doclabel to choose which output processor somehow~
|
|
doclabel = key.split(' ')[-1]
|
|
# we'll just assume the first unparsed part of the document is the page
|
|
return elm[key]
|
|
# No documents in the input heck, we just prevent output
|
|
raise NoOutputException()
|
|
|
|
processor = HECKformatProcessor # pylint: disable=invalid-name
|