Compare commits
	
		
			No commits in common. "6de4ea2743ca86f044b585c5c4ddf68704102868" and "a7963ba824e684c4c1dbbca098f070a7a295637d" have entirely different histories.
		
	
	
		
			6de4ea2743
			...
			a7963ba824
		
	
		
					 7 changed files with 109 additions and 139 deletions
				
			
		| 
						 | 
					@ -14,7 +14,7 @@ from .katex import KatexClient
 | 
				
			||||||
from .html import html
 | 
					from .html import html
 | 
				
			||||||
from .tex import tex
 | 
					from .tex import tex
 | 
				
			||||||
from .images import ImageProcessor
 | 
					from .images import ImageProcessor
 | 
				
			||||||
from .output_generator import OutputGenerator, FormatitkoRecursiveError
 | 
					from .output_generator import OutputGenerator
 | 
				
			||||||
from .html_generator import HTMLGenerator
 | 
					from .html_generator import HTMLGenerator
 | 
				
			||||||
from .transform_processor import TransformProcessor
 | 
					from .transform_processor import TransformProcessor
 | 
				
			||||||
from .pandoc_processor import PandocProcessor
 | 
					from .pandoc_processor import PandocProcessor
 | 
				
			||||||
| 
						 | 
					@ -54,15 +54,9 @@ def main():
 | 
				
			||||||
	doc = import_md(open(args.input_filename, "r").read())
 | 
						doc = import_md(open(args.input_filename, "r").read())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if args.debug:
 | 
						if args.debug:
 | 
				
			||||||
		try:
 | 
					 | 
				
			||||||
		OutputGenerator(sys.stdout).generate(doc)
 | 
							OutputGenerator(sys.stdout).generate(doc)
 | 
				
			||||||
		except FormatitkoRecursiveError as e:
 | 
					 | 
				
			||||||
			e.pretty_print()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	try:
 | 
					 | 
				
			||||||
	doc = TransformProcessor(args.input_filename).transform(doc)
 | 
						doc = TransformProcessor(args.input_filename).transform(doc)
 | 
				
			||||||
	except FormatitkoRecursiveError as e:
 | 
					 | 
				
			||||||
		e.pretty_print()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Initialize the image processor (this just keeps some basic state)
 | 
						# Initialize the image processor (this just keeps some basic state)
 | 
				
			||||||
	imageProcessor = ImageProcessor(args.img_public_dir, args.img_web_path, args.img_cache_dir, *args.img_lookup_dirs)
 | 
						imageProcessor = ImageProcessor(args.img_public_dir, args.img_web_path, args.img_cache_dir, *args.img_lookup_dirs)
 | 
				
			||||||
| 
						 | 
					@ -71,18 +65,11 @@ def main():
 | 
				
			||||||
		# Initialize KaTeX client (this runs the node app and connects to a unix socket)
 | 
							# Initialize KaTeX client (this runs the node app and connects to a unix socket)
 | 
				
			||||||
		with KatexClient(socket=args.katex_socket) as katexClient:
 | 
							with KatexClient(socket=args.katex_socket) as katexClient:
 | 
				
			||||||
			with open(args.output_html, "w") as file:
 | 
								with open(args.output_html, "w") as file:
 | 
				
			||||||
				try:
 | 
					 | 
				
			||||||
				HTMLGenerator(file, katexClient, imageProcessor).generate(doc)
 | 
									HTMLGenerator(file, katexClient, imageProcessor).generate(doc)
 | 
				
			||||||
				except FormatitkoRecursiveError as e:
 | 
					 | 
				
			||||||
					e.pretty_print()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if args.output_tex is not None:
 | 
						if args.output_tex is not None:
 | 
				
			||||||
		with open(args.output_tex, "w") as file:
 | 
							with open(args.output_tex, "w") as file:
 | 
				
			||||||
			try:
 | 
					 | 
				
			||||||
			UCWTexGenerator(file, imageProcessor).generate(doc)
 | 
								UCWTexGenerator(file, imageProcessor).generate(doc)
 | 
				
			||||||
			except FormatitkoRecursiveError as e:
 | 
					 | 
				
			||||||
				e.pretty_print()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if args.output_md is not None:
 | 
						if args.output_md is not None:
 | 
				
			||||||
		with open(args.output_md, "w") as file:
 | 
							with open(args.output_md, "w") as file:
 | 
				
			||||||
| 
						 | 
					@ -96,10 +83,7 @@ def main():
 | 
				
			||||||
		if args.output_tex is None:
 | 
							if args.output_tex is None:
 | 
				
			||||||
			fd = tempfile.NamedTemporaryFile(dir=".", suffix=".tex")
 | 
								fd = tempfile.NamedTemporaryFile(dir=".", suffix=".tex")
 | 
				
			||||||
			with open(fd.name, "w") as file:
 | 
								with open(fd.name, "w") as file:
 | 
				
			||||||
				try:
 | 
					 | 
				
			||||||
				UCWTexGenerator(file, imageProcessor).generate(doc)
 | 
									UCWTexGenerator(file, imageProcessor).generate(doc)
 | 
				
			||||||
				except FormatitkoRecursiveError as e:
 | 
					 | 
				
			||||||
					e.pretty_print()
 | 
					 | 
				
			||||||
			filename = fd.name
 | 
								filename = fd.name
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			filename = args.output_tex
 | 
								filename = args.output_tex
 | 
				
			||||||
| 
						 | 
					@ -109,10 +93,7 @@ def main():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if args.debug:
 | 
						if args.debug:
 | 
				
			||||||
		print("-----------------------------------")
 | 
							print("-----------------------------------")
 | 
				
			||||||
		try:
 | 
					 | 
				
			||||||
		OutputGenerator(sys.stdout).generate(doc)
 | 
							OutputGenerator(sys.stdout).generate(doc)
 | 
				
			||||||
		except FormatitkoRecursiveError as e:
 | 
					 | 
				
			||||||
			e.pretty_print()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == "__main__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,10 +29,10 @@ class HTMLGenerator(OutputGenerator):
 | 
				
			||||||
		self.imageProcessor = imageProcessor
 | 
							self.imageProcessor = imageProcessor
 | 
				
			||||||
		super().__init__(output_file, *args, **kwargs)
 | 
							super().__init__(output_file, *args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate(self, e: Union[Element, ListContainer]):
 | 
						def _generate(self, e: Union[Element, ListContainer]):
 | 
				
			||||||
		if hasattr(e, "attributes") and "only" in e.attributes and e.attributes["only"] != "html":
 | 
							if hasattr(e, "attributes") and "only" in e.attributes and e.attributes["only"] != "html":
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		super().generate(e)
 | 
							super()._generate(e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def escape_special_chars(self, text: str) -> str:
 | 
						def escape_special_chars(self, text: str) -> str:
 | 
				
			||||||
		text = text.replace("&", "&")
 | 
							text = text.replace("&", "&")
 | 
				
			||||||
| 
						 | 
					@ -190,7 +190,7 @@ class HTMLGenerator(OutputGenerator):
 | 
				
			||||||
			attributes["alt"] = e.title
 | 
								attributes["alt"] = e.title
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			fake_out = io.StringIO()
 | 
								fake_out = io.StringIO()
 | 
				
			||||||
			HTMLGenerator(fake_out, self.katexClient, self.imageProcessor).generate(e.content)
 | 
								HTMLGenerator(fake_out, self.katexClient, self.imageProcessor)._generate(e.content)
 | 
				
			||||||
			attributes["alt"] = fake_out.getvalue()
 | 
								attributes["alt"] = fake_out.getvalue()
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if len(srcset) != 0:
 | 
							if len(srcset) != 0:
 | 
				
			||||||
| 
						 | 
					@ -202,7 +202,7 @@ class HTMLGenerator(OutputGenerator):
 | 
				
			||||||
		img = RawInline(self.single_tag("img", attributes))
 | 
							img = RawInline(self.single_tag("img", attributes))
 | 
				
			||||||
		link = Link(img, url=url)
 | 
							link = Link(img, url=url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		self.generate(link)
 | 
							self._generate(link)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_InlineGroup(self, e: InlineGroup):
 | 
						def generate_InlineGroup(self, e: InlineGroup):
 | 
				
			||||||
		self.generate_Group(e)
 | 
							self.generate_Group(e)
 | 
				
			||||||
| 
						 | 
					@ -216,10 +216,10 @@ class HTMLGenerator(OutputGenerator):
 | 
				
			||||||
		self.katexClient.endgroup()
 | 
							self.katexClient.endgroup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Plain(self, e: Plain):
 | 
						def generate_Plain(self, e: Plain):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_LineItem(self, e: LineItem):
 | 
						def generate_LineItem(self, e: LineItem):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.write("<br>")
 | 
							self.write("<br>")
 | 
				
			||||||
		self.endln()
 | 
							self.endln()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -229,12 +229,12 @@ class HTMLGenerator(OutputGenerator):
 | 
				
			||||||
		tag = self.tagname(e)
 | 
							tag = self.tagname(e)
 | 
				
			||||||
		if inline is not None:
 | 
							if inline is not None:
 | 
				
			||||||
			self.write(self.start_tag(tag)+" (")
 | 
								self.write(self.start_tag(tag)+" (")
 | 
				
			||||||
			self.generate(inline)
 | 
								self._generate(inline)
 | 
				
			||||||
			self.write(") "+self.end_tag(tag))
 | 
								self.write(") "+self.end_tag(tag))
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			self.writeln(self.start_tag(tag) + "(")
 | 
								self.writeln(self.start_tag(tag) + "(")
 | 
				
			||||||
			self.indent_more()
 | 
								self.indent_more()
 | 
				
			||||||
			self.generate(e.content)
 | 
								self._generate(e.content)
 | 
				
			||||||
			self.indent_less()
 | 
								self.indent_less()
 | 
				
			||||||
			self.writeln(self.end_tag(tag) + ")")
 | 
								self.writeln(self.end_tag(tag) + ")")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,10 +17,10 @@ class LaTeXGenerator(OutputGenerator):
 | 
				
			||||||
		self.imageProcessor = imageProcessor
 | 
							self.imageProcessor = imageProcessor
 | 
				
			||||||
		super().__init__(output_file, *args, **kwargs)
 | 
							super().__init__(output_file, *args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate(self, e: Union[Element, ListContainer]):
 | 
						def _generate(self, e: Union[Element, ListContainer]):
 | 
				
			||||||
		if hasattr(e, "attributes") and "only" in e.attributes and e.attributes["only"] != "tex":
 | 
							if hasattr(e, "attributes") and "only" in e.attributes and e.attributes["only"] != "tex":
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		super().generate(e)
 | 
							super()._generate(e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def escape_special_chars(self, text: str) -> str:
 | 
						def escape_special_chars(self, text: str) -> str:
 | 
				
			||||||
		text = text.replace("&", "\\&")
 | 
							text = text.replace("&", "\\&")
 | 
				
			||||||
| 
						 | 
					@ -58,14 +58,14 @@ class LaTeXGenerator(OutputGenerator):
 | 
				
			||||||
		self.endln()
 | 
							self.endln()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Para(self, e: Para):
 | 
						def generate_Para(self, e: Para):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.writeln("") # This ensures an empty line
 | 
							self.writeln("") # This ensures an empty line
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Plain(self, e: Plain):
 | 
						def generate_Plain(self, e: Plain):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Span(self, e: Plain):
 | 
						def generate_Span(self, e: Plain):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Header(self, e: Header):
 | 
						def generate_Header(self, e: Header):
 | 
				
			||||||
		tag = {
 | 
							tag = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,20 +7,15 @@ from typing import Union, Callable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .whitespace import NBSP
 | 
					from .whitespace import NBSP
 | 
				
			||||||
from .elements import FQuoted
 | 
					from .elements import FQuoted
 | 
				
			||||||
from .context import Group, InlineGroup, BlockGroup, Context
 | 
					from .context import Group, InlineGroup, BlockGroup
 | 
				
			||||||
from .whitespace import Whitespace
 | 
					from .whitespace import Whitespace
 | 
				
			||||||
from .command import BlockCommand, InlineCommand, CodeCommand, Command
 | 
					from .command import BlockCommand, InlineCommand, CodeCommand, Command
 | 
				
			||||||
from .output_generator import FormatitkoRecursiveError
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ELCl = Union[Element, ListContainer, list[Union[Element, ListContainer]]]
 | 
					ELCl = Union[Element, ListContainer, list[Union[Element, ListContainer]]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DoubleDocError(Exception):
 | 
					 | 
				
			||||||
	"TransformProcessor should only ever see a single Doc."
 | 
					 | 
				
			||||||
	pass
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class NOPProcessor:
 | 
					class NOPProcessor:
 | 
				
			||||||
	TYPE_DICT: dict[type, Callable]
 | 
						TYPE_DICT: dict[type, Callable]
 | 
				
			||||||
	context: Union[Context, None] = None
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class UnknownElementError(Exception):
 | 
						class UnknownElementError(Exception):
 | 
				
			||||||
		f"An unknown Element has been passed to the NOPProcessor, probably because panflute introduced a new one."
 | 
							f"An unknown Element has been passed to the NOPProcessor, probably because panflute introduced a new one."
 | 
				
			||||||
| 
						 | 
					@ -101,7 +96,6 @@ class NOPProcessor:
 | 
				
			||||||
		return []
 | 
							return []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def transform(self, e: ELCl) -> ELCl:
 | 
						def transform(self, e: ELCl) -> ELCl:
 | 
				
			||||||
		try:
 | 
					 | 
				
			||||||
		if isinstance(e, list):
 | 
							if isinstance(e, list):
 | 
				
			||||||
			return self.transform_list(e)
 | 
								return self.transform_list(e)
 | 
				
			||||||
		elif isinstance(e, ListContainer):
 | 
							elif isinstance(e, ListContainer):
 | 
				
			||||||
| 
						 | 
					@ -119,12 +113,6 @@ class NOPProcessor:
 | 
				
			||||||
			e = transformer(e)
 | 
								e = transformer(e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return e
 | 
							return e
 | 
				
			||||||
		except FormatitkoRecursiveError as err:
 | 
					 | 
				
			||||||
			if not isinstance(e, ListContainer):
 | 
					 | 
				
			||||||
				err.add_element(e)
 | 
					 | 
				
			||||||
			raise err
 | 
					 | 
				
			||||||
		except Exception as err:
 | 
					 | 
				
			||||||
			raise FormatitkoRecursiveError(e, self.context.filename) from err
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def transform_list(self, e: list[Union[Element, ListContainer]]) -> list[Union[Element, ListContainer]]:
 | 
						def transform_list(self, e: list[Union[Element, ListContainer]]) -> list[Union[Element, ListContainer]]:
 | 
				
			||||||
		for i in range(len(e)):
 | 
							for i in range(len(e)):
 | 
				
			||||||
| 
						 | 
					@ -305,9 +293,6 @@ class NOPProcessor:
 | 
				
			||||||
		return e
 | 
							return e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def transform_Doc(self, e: Doc) -> Doc:
 | 
						def transform_Doc(self, e: Doc) -> Doc:
 | 
				
			||||||
		if self.context is not None:
 | 
					 | 
				
			||||||
			raise DoubleDocError()
 | 
					 | 
				
			||||||
		self.context = Context(e, self.root_file_path)
 | 
					 | 
				
			||||||
		e.content = self.transform(e.content)
 | 
							e.content = self.transform(e.content)
 | 
				
			||||||
		return e
 | 
							return e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,43 +10,24 @@ from .whitespace import NBSP
 | 
				
			||||||
from .elements import FQuoted
 | 
					from .elements import FQuoted
 | 
				
			||||||
from .context import Group, InlineGroup, BlockGroup, Context
 | 
					from .context import Group, InlineGroup, BlockGroup, Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import re, sys
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UnknownElementError(Exception):
 | 
					class UnknownElementError(Exception):
 | 
				
			||||||
	"An unknown Element has been passed to the OutputGenerator, probably because panflute introduced a new one."
 | 
						"An unknown Element has been passed to the OutputGenerator, probably because panflute introduced a new one."
 | 
				
			||||||
	pass
 | 
						pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FormatitkoRecursiveError(Exception):
 | 
					class OutputGeneratorError(Exception):
 | 
				
			||||||
	"A generic exception which wraps other exceptions and adds element-based traceback"
 | 
						"A generic exception which wraps other exceptions and adds element-based traceback"
 | 
				
			||||||
	elements: list[Union[Element, ListContainer, list[Union[Element, ListContainer]]]]
 | 
						elements: list[Union[Element, ListContainer, list[Union[Element, ListContainer]]]]
 | 
				
			||||||
	file: str
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def __init__(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]], file: str, *args):
 | 
						def __init__(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]], *args):
 | 
				
			||||||
		self.elements = [e]
 | 
							self.elements = [e]
 | 
				
			||||||
		self.file = file
 | 
					 | 
				
			||||||
		super().__init__(args)
 | 
							super().__init__(args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def add_element(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]]):
 | 
						def add_element(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]]):
 | 
				
			||||||
		self.elements.append(e)
 | 
							self.elements.append(e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def pretty_print(self):
 | 
					 | 
				
			||||||
		def eprint(*args, **kwargs):
 | 
					 | 
				
			||||||
			print(*args, file=sys.stderr, **kwargs)
 | 
					 | 
				
			||||||
		eprint(f"Error occured in file {self.file} in ", end="")
 | 
					 | 
				
			||||||
		for i in range(len(self.elements)-1, 0, -1):
 | 
					 | 
				
			||||||
			if hasattr(self.elements[i], "content") and isinstance(self.elements[i].content[0], Inline):
 | 
					 | 
				
			||||||
				eprint()
 | 
					 | 
				
			||||||
				eprint('on line: "' + stringify(self.elements[i]) + '"', end="")
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			eprint(type(self.elements[i]).__name__ + "[" + str(self.elements[i-1].index) + "]", end=": ")
 | 
					 | 
				
			||||||
		eprint()
 | 
					 | 
				
			||||||
		eprint("in element: " + str(self.elements[0]))
 | 
					 | 
				
			||||||
		sys.tracebacklimit = 0
 | 
					 | 
				
			||||||
		raise self.__cause__ from None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class OutputGenerator:
 | 
					class OutputGenerator:
 | 
				
			||||||
	_empty_lines: int
 | 
						_empty_lines: int
 | 
				
			||||||
	context: Union[Context, None]
 | 
						context: Union[Context, None]
 | 
				
			||||||
| 
						 | 
					@ -133,6 +114,24 @@ class OutputGenerator:
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]]):
 | 
						def generate(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]]):
 | 
				
			||||||
 | 
							try:
 | 
				
			||||||
 | 
								self._generate(e)
 | 
				
			||||||
 | 
							except OutputGeneratorError as err:
 | 
				
			||||||
 | 
								def eprint(*args, **kwargs):
 | 
				
			||||||
 | 
									print(*args, file=sys.stderr, **kwargs)
 | 
				
			||||||
 | 
								eprint("Error occured in ", end="")
 | 
				
			||||||
 | 
								for i in range(len(err.elements)-1, 0, -1):
 | 
				
			||||||
 | 
									if hasattr(err.elements[i], "content") and isinstance(err.elements[i].content[0], Inline):
 | 
				
			||||||
 | 
										eprint()
 | 
				
			||||||
 | 
										eprint('on line: "' + stringify(err.elements[i]) + '"', end="")
 | 
				
			||||||
 | 
										break
 | 
				
			||||||
 | 
									eprint(type(err.elements[i]).__name__ + "[" + str(err.elements[i-1].index) + "]", end=": ")
 | 
				
			||||||
 | 
								eprint()
 | 
				
			||||||
 | 
								eprint("in element: " + str(err.elements[0]))
 | 
				
			||||||
 | 
								sys.tracebacklimit = 0
 | 
				
			||||||
 | 
								raise err.__cause__ from None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def _generate(self, e: Union[Element, ListContainer, list[Union[Element, ListContainer]]]):
 | 
				
			||||||
		try:
 | 
							try:
 | 
				
			||||||
			if isinstance(e, Group):
 | 
								if isinstance(e, Group):
 | 
				
			||||||
				old_context = self.context
 | 
									old_context = self.context
 | 
				
			||||||
| 
						 | 
					@ -156,12 +155,12 @@ class OutputGenerator:
 | 
				
			||||||
					raise UnknownElementError(type(e)) from err
 | 
										raise UnknownElementError(type(e)) from err
 | 
				
			||||||
			if isinstance(e, Group):
 | 
								if isinstance(e, Group):
 | 
				
			||||||
				self.context = old_context
 | 
									self.context = old_context
 | 
				
			||||||
		except FormatitkoRecursiveError as err:
 | 
							except OutputGeneratorError as err:
 | 
				
			||||||
			if not isinstance(e, ListContainer):
 | 
								if not isinstance(e, ListContainer):
 | 
				
			||||||
				err.add_element(e)
 | 
									err.add_element(e)
 | 
				
			||||||
			raise err
 | 
								raise err
 | 
				
			||||||
		except Exception as err:
 | 
							except Exception as err:
 | 
				
			||||||
			raise FormatitkoRecursiveError(e, self.context.filename) from err
 | 
								raise OutputGeneratorError(e) from err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def escape_special_chars(self, text: str) -> str:
 | 
						def escape_special_chars(self, text: str) -> str:
 | 
				
			||||||
		return text
 | 
							return text
 | 
				
			||||||
| 
						 | 
					@ -249,13 +248,13 @@ class OutputGenerator:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_simple_inline_tag(self, tag: str, content: Union[ListContainer, Element, list[Union[Element, ListContainer]]], attributes: dict[str,str]={}):
 | 
						def generate_simple_inline_tag(self, tag: str, content: Union[ListContainer, Element, list[Union[Element, ListContainer]]], attributes: dict[str,str]={}):
 | 
				
			||||||
		self.write(self.start_tag(tag, attributes))
 | 
							self.write(self.start_tag(tag, attributes))
 | 
				
			||||||
		self.generate(content)
 | 
							self._generate(content)
 | 
				
			||||||
		self.write(self.end_tag(tag))
 | 
							self.write(self.end_tag(tag))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_simple_block_tag(self, tag: str, content: Union[ListContainer, Element, list[Union[Element, ListContainer]]], attributes: dict[str,str]={}):
 | 
						def generate_simple_block_tag(self, tag: str, content: Union[ListContainer, Element, list[Union[Element, ListContainer]]], attributes: dict[str,str]={}):
 | 
				
			||||||
		self.writeln(self.start_tag(tag, attributes))
 | 
							self.writeln(self.start_tag(tag, attributes))
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.generate(content)
 | 
							self._generate(content)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.writeln(self.end_tag(tag))
 | 
							self.writeln(self.end_tag(tag))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -274,27 +273,27 @@ class OutputGenerator:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_ListContainer(self, e: ListContainer):
 | 
						def generate_ListContainer(self, e: ListContainer):
 | 
				
			||||||
		for child in e:
 | 
							for child in e:
 | 
				
			||||||
			self.generate(child)
 | 
								self._generate(child)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_list(self, e: list):
 | 
						def generate_list(self, e: list):
 | 
				
			||||||
		for el in e:
 | 
							for el in e:
 | 
				
			||||||
			self.generate(el)
 | 
								self._generate(el)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_MetaList(self, e: MetaList):
 | 
						def generate_MetaList(self, e: MetaList):
 | 
				
			||||||
		for child in e:
 | 
							for child in e:
 | 
				
			||||||
			self.generate(child)
 | 
								self._generate(child)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_MetaValue(self, e: MetaValue):
 | 
						def generate_MetaValue(self, e: MetaValue):
 | 
				
			||||||
		try:
 | 
							try:
 | 
				
			||||||
			self.TYPE_DICT_META[type(e)](e)
 | 
								self.TYPE_DICT_META[type(e)](e)
 | 
				
			||||||
		except KeyError:
 | 
							except KeyError:
 | 
				
			||||||
			self.generate(e.content)
 | 
								self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_MetaBlocks(self, e: MetaBlocks):
 | 
						def generate_MetaBlocks(self, e: MetaBlocks):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_MetaInlines(self, e: MetaInlines):
 | 
						def generate_MetaInlines(self, e: MetaInlines):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_MetaBool(self, e: MetaBool):
 | 
						def generate_MetaBool(self, e: MetaBool):
 | 
				
			||||||
		self.generate_simple_tag(e)
 | 
							self.generate_simple_tag(e)
 | 
				
			||||||
| 
						 | 
					@ -324,33 +323,33 @@ class OutputGenerator:
 | 
				
			||||||
		if e.style == "cs":
 | 
							if e.style == "cs":
 | 
				
			||||||
			if e.quote_type == "SingleQuote":
 | 
								if e.quote_type == "SingleQuote":
 | 
				
			||||||
				self.write("‚")
 | 
									self.write("‚")
 | 
				
			||||||
				self.generate(e.content)
 | 
									self._generate(e.content)
 | 
				
			||||||
				self.write("‘")
 | 
									self.write("‘")
 | 
				
			||||||
			elif e.quote_type == "DoubleQuote":
 | 
								elif e.quote_type == "DoubleQuote":
 | 
				
			||||||
				self.write("„")
 | 
									self.write("„")
 | 
				
			||||||
				self.generate(e.content)
 | 
									self._generate(e.content)
 | 
				
			||||||
				self.write("“")
 | 
									self.write("“")
 | 
				
			||||||
		elif e.style == "en":
 | 
							elif e.style == "en":
 | 
				
			||||||
			if e.quote_type == "SingleQuote":
 | 
								if e.quote_type == "SingleQuote":
 | 
				
			||||||
				self.write("‘")
 | 
									self.write("‘")
 | 
				
			||||||
				self.generate(e.content)
 | 
									self._generate(e.content)
 | 
				
			||||||
				self.write("’")
 | 
									self.write("’")
 | 
				
			||||||
			elif e.quote_type == "DoubleQuote":
 | 
								elif e.quote_type == "DoubleQuote":
 | 
				
			||||||
				self.write("“")
 | 
									self.write("“")
 | 
				
			||||||
				self.generate(e.content)
 | 
									self._generate(e.content)
 | 
				
			||||||
				self.write("”")
 | 
									self.write("”")
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			if e.quote_type == "SingleQuote":
 | 
								if e.quote_type == "SingleQuote":
 | 
				
			||||||
				self.write("'")
 | 
									self.write("'")
 | 
				
			||||||
				self.generate(e.content)
 | 
									self._generate(e.content)
 | 
				
			||||||
				self.write("'")
 | 
									self.write("'")
 | 
				
			||||||
			elif e.quote_type == "DoubleQuote":
 | 
								elif e.quote_type == "DoubleQuote":
 | 
				
			||||||
				self.write("\"")
 | 
									self.write("\"")
 | 
				
			||||||
				self.generate(e.content)
 | 
									self._generate(e.content)
 | 
				
			||||||
				self.write("\"")
 | 
									self.write("\"")
 | 
				
			||||||
			else:
 | 
								else:
 | 
				
			||||||
				self.write("\"")
 | 
									self.write("\"")
 | 
				
			||||||
				self.generate(e.content)
 | 
									self._generate(e.content)
 | 
				
			||||||
				self.write("\"")
 | 
									self.write("\"")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -473,10 +472,10 @@ class OutputGenerator:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Doc(self, e: Doc):
 | 
						def generate_Doc(self, e: Doc):
 | 
				
			||||||
		if "header_content" in e.metadata:
 | 
							if "header_content" in e.metadata:
 | 
				
			||||||
			self.generate(e.metadata["header_content"])
 | 
								self._generate(e.metadata["header_content"])
 | 
				
			||||||
		self.generate_simple_tag(e)
 | 
							self.generate_simple_tag(e)
 | 
				
			||||||
		if "footer_content" in e.metadata:
 | 
							if "footer_content" in e.metadata:
 | 
				
			||||||
			self.generate(e.metadata["footer_content"])
 | 
								self._generate(e.metadata["footer_content"])
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	def generate_BlockGroup(self, e: BlockGroup):
 | 
						def generate_BlockGroup(self, e: BlockGroup):
 | 
				
			||||||
		self.generate_simple_tag(e)
 | 
							self.generate_simple_tag(e)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,10 +41,10 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		text = text.replace("", "")
 | 
							text = text.replace("", "")
 | 
				
			||||||
		return text
 | 
							return text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate(self, e: Union[Element, ListContainer]):
 | 
						def _generate(self, e: Union[Element, ListContainer]):
 | 
				
			||||||
		if hasattr(e, "attributes") and "only" in e.attributes and e.attributes["only"] != "tex":
 | 
							if hasattr(e, "attributes") and "only" in e.attributes and e.attributes["only"] != "tex":
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		super().generate(e)
 | 
							super()._generate(e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def writepar(self, text: str):
 | 
						def writepar(self, text: str):
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Para(self, e: Para):
 | 
						def generate_Para(self, e: Para):
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_HorizontalRule(self, e: HorizontalRule):
 | 
						def generate_HorizontalRule(self, e: HorizontalRule):
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		self.writeln(r"\ucwmodule{verb}")
 | 
							self.writeln(r"\ucwmodule{verb}")
 | 
				
			||||||
		self.writeln(r"\ucwmodule{link}")
 | 
							self.writeln(r"\ucwmodule{link}")
 | 
				
			||||||
		self.writeln(r"\input formatitko.tex")
 | 
							self.writeln(r"\input formatitko.tex")
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.writeln(r"\bye")
 | 
							self.writeln(r"\bye")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def get_language_macro(self, lang: str):
 | 
						def get_language_macro(self, lang: str):
 | 
				
			||||||
| 
						 | 
					@ -88,21 +88,21 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
	def generate_InlineGroup(self, e: InlineGroup):
 | 
						def generate_InlineGroup(self, e: InlineGroup):
 | 
				
			||||||
		self.write(r"{")
 | 
							self.write(r"{")
 | 
				
			||||||
		self.write(self.get_language_macro(self.context.get_metadata("lang")))
 | 
							self.write(self.get_language_macro(self.context.get_metadata("lang")))
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.write(r"}")
 | 
							self.write(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_BlockGroup(self, e: BlockGroup):
 | 
						def generate_BlockGroup(self, e: BlockGroup):
 | 
				
			||||||
		self.writeln(r"\begingroup")
 | 
							self.writeln(r"\begingroup")
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.writeln(self.get_language_macro(self.context.get_metadata("lang")))
 | 
							self.writeln(self.get_language_macro(self.context.get_metadata("lang")))
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.writeln(r"\endgroup")
 | 
							self.writeln(r"\endgroup")
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	def generate_Header(self, e: Header):
 | 
						def generate_Header(self, e: Header):
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
		self.write("\\"+"sub"*(e.level-1)+"section{")
 | 
							self.write("\\"+"sub"*(e.level-1)+"section{")
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.write(r"}")
 | 
							self.write(r"}")
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,12 +156,12 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		self.writeln(r"\vskip5pt")
 | 
							self.writeln(r"\vskip5pt")
 | 
				
			||||||
		self.writeln(r"\centerline{")
 | 
							self.writeln(r"\centerline{")
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.writeln(r"}")
 | 
							self.writeln(r"}")
 | 
				
			||||||
		self.writeln(r"\centerline{")
 | 
							self.writeln(r"\centerline{")
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.generate(e.caption)
 | 
							self._generate(e.caption)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.writeln(r"}")
 | 
							self.writeln(r"}")
 | 
				
			||||||
		self.writeln(r"\vskip5pt{}")
 | 
							self.writeln(r"\vskip5pt{}")
 | 
				
			||||||
| 
						 | 
					@ -173,7 +173,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			self.write(r"{\I{}")
 | 
								self.write(r"{\I{}")
 | 
				
			||||||
		self._italic+=1
 | 
							self._italic+=1
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self._italic-=1
 | 
							self._italic-=1
 | 
				
			||||||
		self.write(r"}")
 | 
							self.write(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,7 +183,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			self.write(r"{\bf{}")
 | 
								self.write(r"{\bf{}")
 | 
				
			||||||
		self._bold+=1
 | 
							self._bold+=1
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self._bold-=1
 | 
							self._bold-=1
 | 
				
			||||||
		self.write(r"}")
 | 
							self.write(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -204,7 +204,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Note(self, e: Note):
 | 
						def generate_Note(self, e: Note):
 | 
				
			||||||
		self.write(r"\fn{")
 | 
							self.write(r"\fn{")
 | 
				
			||||||
		self.generate(inlinify(e))
 | 
							self._generate(inlinify(e))
 | 
				
			||||||
		self.write(r"}")
 | 
							self.write(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Table(self, e: Table):
 | 
						def generate_Table(self, e: Table):
 | 
				
			||||||
| 
						 | 
					@ -217,11 +217,11 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		self.writeln(r"\vskip1em")
 | 
							self.writeln(r"\vskip1em")
 | 
				
			||||||
		self.writeln(r"\halign{\strut"+"&".join([aligns[col[0]] for col in e.colspec])+r"\cr")
 | 
							self.writeln(r"\halign{\strut"+"&".join([aligns[col[0]] for col in e.colspec])+r"\cr")
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.generate(e.head.content)
 | 
							self._generate(e.head.content)
 | 
				
			||||||
		self.writeln(r"\noalign{\hrule}")
 | 
							self.writeln(r"\noalign{\hrule}")
 | 
				
			||||||
		self.generate(e.content[0].content)
 | 
							self._generate(e.content[0].content)
 | 
				
			||||||
		self.writeln(r"\noalign{\hrule}")
 | 
							self.writeln(r"\noalign{\hrule}")
 | 
				
			||||||
		self.generate(e.foot.content)
 | 
							self._generate(e.foot.content)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.writeln("}")
 | 
							self.writeln("}")
 | 
				
			||||||
		self.writeln(r"\vskip1em")
 | 
							self.writeln(r"\vskip1em")
 | 
				
			||||||
| 
						 | 
					@ -230,7 +230,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		for cell in e.content:
 | 
							for cell in e.content:
 | 
				
			||||||
			if cell.colspan > 1:
 | 
								if cell.colspan > 1:
 | 
				
			||||||
				self.write(r"\multispan"+str(cell.colspan)+"{} ")
 | 
									self.write(r"\multispan"+str(cell.colspan)+"{} ")
 | 
				
			||||||
			self.generate(cell.content)
 | 
								self._generate(cell.content)
 | 
				
			||||||
			if cell.next:
 | 
								if cell.next:
 | 
				
			||||||
				self.write(" & ")
 | 
									self.write(" & ")
 | 
				
			||||||
		self.write(r"\cr")
 | 
							self.write(r"\cr")
 | 
				
			||||||
| 
						 | 
					@ -245,10 +245,10 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
			self.writeraw(e.text)
 | 
								self.writeraw(e.text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Plain(self, e: Plain):
 | 
						def generate_Plain(self, e: Plain):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Span(self, e: Span):
 | 
						def generate_Span(self, e: Span):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_CodeBlock(self, e: CodeBlock):
 | 
						def generate_CodeBlock(self, e: CodeBlock):
 | 
				
			||||||
		self.writeln(r"\verbatim{")
 | 
							self.writeln(r"\verbatim{")
 | 
				
			||||||
| 
						 | 
					@ -256,15 +256,15 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		self.writeln(r"}")
 | 
							self.writeln(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Div(self, e: Div):
 | 
						def generate_Div(self, e: Div):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_LineBlock(self, e: LineBlock):
 | 
						def generate_LineBlock(self, e: LineBlock):
 | 
				
			||||||
		self.writeln()
 | 
							self.writeln()
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.writeln()
 | 
							self.writeln()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	def generate_LineItem(self, e: LineItem):
 | 
						def generate_LineItem(self, e: LineItem):
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		if e.next:
 | 
							if e.next:
 | 
				
			||||||
			self.write(r"\\")
 | 
								self.write(r"\\")
 | 
				
			||||||
		self.endln()
 | 
							self.endln()
 | 
				
			||||||
| 
						 | 
					@ -273,7 +273,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
		self.writeln(r"\list{o}")
 | 
							self.writeln(r"\list{o}")
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.write(r"\endlist")
 | 
							self.write(r"\endlist")
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
| 
						 | 
					@ -298,7 +298,7 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
		style = delimiters[e.delimiter]
 | 
							style = delimiters[e.delimiter]
 | 
				
			||||||
		self.writeln(r"\list{"+style+r"}")
 | 
							self.writeln(r"\list{"+style+r"}")
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.writeln(r"\endlist")
 | 
							self.writeln(r"\endlist")
 | 
				
			||||||
		self.ensure_empty(2)
 | 
							self.ensure_empty(2)
 | 
				
			||||||
| 
						 | 
					@ -306,13 +306,13 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
	def generate_ListItem(self, e: ListItem):
 | 
						def generate_ListItem(self, e: ListItem):
 | 
				
			||||||
		self.endln()
 | 
							self.endln()
 | 
				
			||||||
		self.write(r"\:")
 | 
							self.write(r"\:")
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.endln()
 | 
							self.endln()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_BlockQuote(self, e: BlockQuote):
 | 
						def generate_BlockQuote(self, e: BlockQuote):
 | 
				
			||||||
		self.writeln(r"\blockquote{")
 | 
							self.writeln(r"\blockquote{")
 | 
				
			||||||
		self.indent_more()
 | 
							self.indent_more()
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.indent_less()
 | 
							self.indent_less()
 | 
				
			||||||
		self.writeln(r"}")
 | 
							self.writeln(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -321,17 +321,17 @@ class UCWTexGenerator(OutputGenerator):
 | 
				
			||||||
			self.write(r"\url{")
 | 
								self.write(r"\url{")
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			self.write(r"\linkurl{"+e.url+r"}{")
 | 
								self.write(r"\linkurl{"+e.url+r"}{")
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.write(r"}") # }
 | 
							self.write(r"}") # }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Subscript(self, e: Subscript):
 | 
						def generate_Subscript(self, e: Subscript):
 | 
				
			||||||
		self.write(r"\subscript{")
 | 
							self.write(r"\subscript{")
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.write(r"}")
 | 
							self.write(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_Superscript(self, e: Superscript):
 | 
						def generate_Superscript(self, e: Superscript):
 | 
				
			||||||
		self.write(r"\superscript{")
 | 
							self.write(r"\superscript{")
 | 
				
			||||||
		self.generate(e.content)
 | 
							self._generate(e.content)
 | 
				
			||||||
		self.write(r"}")
 | 
							self.write(r"}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def generate_simple_tag(self, e: Union[Element, None] = None, tag: str = "", attributes: Union[dict[str, str], None] = None, content: Union[ListContainer, Element, list[Union[Element, ListContainer]], str, None] = None, inline: Union[bool, None] = None):
 | 
						def generate_simple_tag(self, e: Union[Element, None] = None, tag: str = "", attributes: Union[dict[str, str], None] = None, content: Union[ListContainer, Element, list[Union[Element, ListContainer]], str, None] = None, inline: Union[bool, None] = None):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,10 +20,15 @@ from .context import Context, CommandCallable
 | 
				
			||||||
from .whitespace import Whitespace, bavlna
 | 
					from .whitespace import Whitespace, bavlna
 | 
				
			||||||
from .command import BlockCommand, InlineCommand, CodeCommand, Command
 | 
					from .command import BlockCommand, InlineCommand, CodeCommand, Command
 | 
				
			||||||
from .command_util import handle_command_define, parse_command
 | 
					from .command_util import handle_command_define, parse_command
 | 
				
			||||||
from .nop_processor import NOPProcessor, ELCl, DoubleDocError
 | 
					from .nop_processor import NOPProcessor, ELCl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DoubleDocError(Exception):
 | 
				
			||||||
 | 
						"TransformProcessor should only ever see a single Doc."
 | 
				
			||||||
 | 
						pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TransformProcessor(NOPProcessor):
 | 
					class TransformProcessor(NOPProcessor):
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						context: Union[Context, None] = None
 | 
				
			||||||
	root_file_path: str
 | 
						root_file_path: str
 | 
				
			||||||
	root_highlight_style: str = "default"
 | 
						root_highlight_style: str = "default"
 | 
				
			||||||
	_command_modules: list[tuple[Union[dict[str, CommandCallable], ModuleType], str]] = []
 | 
						_command_modules: list[tuple[Union[dict[str, CommandCallable], ModuleType], str]] = []
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue