# 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.` ("FixBareNesting", lambda x: re.sub( b'(^|\n)(\\\\(emph|st){)', b'\\1\\\\hspace{0pt}\\2', x)), ("UnicodeApprox", lambda x: re.sub('≈'.encode('utf-8'), b'$\\approx$', x)), ("UnicodeTriangle", lambda x: re.sub('◁'.encode('utf-8'), b'$\\lhd$', 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