X-Git-Url: http://git.scottworley.com/paperdoorknob/blobdiff_plain/a5f4539c4cc5954515e1256289784f1b174a5a16..131deef1eba442d6e05c2ff6c6f7669b4b9e2b24:/texfilter.py?ds=sidebyside diff --git a/texfilter.py b/texfilter.py new file mode 100644 index 0000000..8103c19 --- /dev/null +++ b/texfilter.py @@ -0,0 +1,32 @@ +# paperdoorknob: Print glowfic +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, version 3. + +import re + +from typing import Callable, List, Tuple + + +TexFilters: List[Tuple[str, Callable[[bytes], bytes]]] = [ + # Work around `Extra }, or forgotten \endgroup.` + ("FixBareEmph", lambda x: re.sub( + b'(^|\n)(\\\\emph{)', b'\\1\\\\hspace{0pt}\\2', x)), +] + + +class TexFilterError(Exception): + pass + + +def ApplyTexFilters(filter_list: str, data: bytes) -> bytes: + for filter_name in filter_list.split(','): + filters = [f for (name, f) in TexFilters if name == filter_name] + if len(filters) == 0: + raise TexFilterError(f"Unknown Tex filter: {filter_name}") + if len(filters) > 1: + raise TexFilterError( + f"Multiple Tex filters with the same name!?: {filter_name}") + data = filters[0](data) + return data