Compare commits

...

6 commits

6 changed files with 98 additions and 27 deletions

View file

@ -1,4 +1,4 @@
from panflute import Doc, Element, Div, Span, Header from panflute import Doc, Element, Div, Span, Header, Figure
from typing import Union, Callable from typing import Union, Callable
from types import ModuleType from types import ModuleType
@ -19,12 +19,21 @@ CommandCallable = Callable[[Command, 'Context', 'NOPProcessor'], list[Element]]
# #
# This class is basically an extension to panflute's doc, this is why metadata # This class is basically an extension to panflute's doc, this is why metadata
# is read directly from it. # is read directly from it.
def default_number_generator(e: Header, context: 'Context') -> str: def default_section_number_generator(e: Header, context: 'Context') -> list[Union[str, int]]:
l = e.level l = e.level
context.section_counters[l-1] += 1 section_counters = context.get_data("section_counters")
for i in range(l, len(context.section_counters)): section_counters[l-1] += 1
context.section_counters[i] = 0 for i in range(l, len(section_counters)):
return ".".join(map(str, context.section_counters[:l])) section_counters[i] = 0
return list(section_counters[:l])
def default_figure_number_generator(e: Figure, context: 'Context') -> Union[str, int]:
figure_type = e.attributes.get("type", "img")
figure_counters = context.get_data("figure_counters")
figure_counters.setdefault(figure_type, 0)
figure_counters[figure_type] += 1
return figure_counters[figure_type]
class Context: class Context:
@ -58,8 +67,11 @@ class Context:
self.add_dep(path) self.add_dep(path)
if self.get_metadata("flags", immediate=True) is None: if self.get_metadata("flags", immediate=True) is None:
self.set_metadata("flags", {}) self.set_metadata("flags", {})
self.number_generator = default_number_generator if not parent:
self.section_counters = [0 for i in range(6)] self.set_data('section_number_generator', default_section_number_generator)
self.set_data('figure_number_generator', default_figure_number_generator)
self.set_data('section_counters', [0 for i in range(6)])
self.set_data('figure_counters', {})
def get_command(self, command: str) -> Union[CommandCallable, None]: def get_command(self, command: str) -> Union[CommandCallable, None]:
if command in self._commands: if command in self._commands:

View file

@ -134,3 +134,60 @@
\def\mod{\mathrel{\rm mod}} \def\mod{\mathrel{\rm mod}}
\settextsize{12} \settextsize{12}
\def\unparskip{\vskip-\parskip}
\def\floatinsert#1{\par{
\setbox0=\vbox{\boxmaxdepth=2pt\relax #1}
\dimen0=\dimexpr \ht0 + \dp0 + \baselineskip + \pagetotal - \pageshrink \relax
\ifdim\dimen0 > \pagegoal
\insert\topins{
\penalty 100
\splittopskip=0pt
\splitmaxdepth=\maxdimen
\floatingpenalty=0
\box0
\nobreak\bigskip\medskip
}
\else
\goodbreak\bigskip
\box0
\goodbreak\bigskip
\unparskip
\fi
}}
% Obecny plovouci objekt: \float{objekt}{popisek}{optional-id}
\def\float#1#2#3{\floatinsert{
\medskip
\centerline{#1}
\medskip
\smallskip
{
\setbox0=\hbox{#2}
\ifdim\wd0 < 0.8\hsize
\centerline{\box0}
\else
\centerline{\vtop{
\hsize=0.8\hsize
\parindent=0pt
\leftskip=0pt plus 0.3\hsize
\rightskip=0pt plus 0.3\hsize
\parfillskip=0pt
\spaceskip=0.3333em
#2
}}
\fi
}}}
% Dva floaty vedle sebe: \float{objekt1}{popisek1}{id1}{objekt2}{popisek2}{id2}
\def\twofloats#1#2#3#4#5#6{\floatinsert{
\medskip
\centerline{\vbox{\halign{\hss##\hss&\qquad\hss##\hss\cr
#1&#4\cr
\noalign{\medskip\smallskip}
#2&#5\cr
}}}
}}

@ -1 +1 @@
Subproject commit 953b44e942282375ac369af233c123b28146713e Subproject commit 211cb2010e23265be599819c5f79f66f0abd62d1

View file

@ -97,7 +97,7 @@ class UCWTexGenerator(OutputGenerator):
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{"+str(e.attributes["number"])+"}{") self.write("\\"+"sub"*(e.level-1)+"section{"+".".join(map(str, e.attributes["number"]))+"}{")
self.generate(e.content) self.generate(e.content)
self.write(r"}") self.write(r"}")
self.ensure_empty(2) self.ensure_empty(2)
@ -155,18 +155,17 @@ class UCWTexGenerator(OutputGenerator):
def generate_Figure(self, e: Figure): def generate_Figure(self, e: Figure):
self.ensure_empty(2) self.ensure_empty(2)
self.writeln(r"\vskip5pt") self.writeln(r"\float{")
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.indent_more() self.indent_more()
if 'number' in e.attributes:
self.writeln(f"Obrázek {e.attributes['number']}:")
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.ensure_empty(2) self.ensure_empty(2)
def generate_Emph(self, e: Emph): def generate_Emph(self, e: Emph):

View file

@ -131,7 +131,6 @@ class TransformProcessor(NOPProcessor):
return super().transform_Para(e) return super().transform_Para(e)
def transform_Div(self, e: Div) -> Union[Div, Group, Null, RawBlock]: def transform_Div(self, e: Div) -> Union[Div, Group, Null, RawBlock]:
e.content = self.transform(e.content)
if "group" in e.classes: if "group" in e.classes:
# `.group` class for Divs # `.group` class for Divs
@ -191,10 +190,9 @@ class TransformProcessor(NOPProcessor):
if "lang" in e.attributes: if "lang" in e.attributes:
warnings.warn("To set language in a way formátítko will understand, this Div has to have the `.group` class and be a Group.", UserWarning) warnings.warn("To set language in a way formátítko will understand, this Div has to have the `.group` class and be a Group.", UserWarning)
return e return super().transform_Div(e)
def transform_Span(self, e: Span) -> Span: def transform_Span(self, e: Span) -> Span:
e.content = self.transform(e.content)
if "group" in e.classes: if "group" in e.classes:
# `.group` class for Spans # `.group` class for Spans
@ -251,7 +249,7 @@ class TransformProcessor(NOPProcessor):
# This is a shorthand for just printing the content of some metadata. # This is a shorthand for just printing the content of some metadata.
elif re.match(r"^\$[\w.]+$", e.content[0].text): elif re.match(r"^\$[\w.]+$", e.content[0].text):
val = self.context.get_metadata(e.content[0].text[1:], False) val = self.context.get_metadata(e.content[0].text[1:], False)
if isinstance(val, MetaInlines): if isinstance(val, MetaInlines): # TODO: Trust transform for this
e = Span(*val.content) e = Span(*val.content)
e = self.transform(e) e = self.transform(e)
elif isinstance(val, MetaString): elif isinstance(val, MetaString):
@ -267,8 +265,7 @@ class TransformProcessor(NOPProcessor):
# Content of Span is enclosed into Slanted (subclass os Emph) # Content of Span is enclosed into Slanted (subclass os Emph)
return self.transform(Slanted(*e.content)) return self.transform(Slanted(*e.content))
return super().transform_Span(e)
return e
def transform_CodeBlock(self, e: CodeBlock) -> Union[CodeBlock, Div, Null]: def transform_CodeBlock(self, e: CodeBlock) -> Union[CodeBlock, Div, Null]:
if "markdown" in e.classes and "group" in e.classes: if "markdown" in e.classes and "group" in e.classes:
@ -319,7 +316,13 @@ class TransformProcessor(NOPProcessor):
if 'unnumbered' in e.classes: if 'unnumbered' in e.classes:
e.attributes["number"] = "" e.attributes["number"] = ""
else: else:
e.attributes["number"] = self.context.number_generator(e, self.context) e.attributes["number"] = self.context.get_data("section_number_generator")(e, self.context)
print("TH", e)
return e return e
def transform_Figure(self, e:Figure) -> Figure:
if "number" not in e.attributes:
if 'unnumbered' in e.classes:
e.attributes["number"] = ""
else:
e.attributes["number"] = self.context.get_data("figure_number_generator")(e, self.context)
return super().transform_Figure(e)

View file

@ -36,9 +36,9 @@ def bavlna(e: Whitespace, c: Context) -> bool:
if prevC in operators and nextC in numbers: if prevC in operators and nextC in numbers:
return True return True
if isinstance(e.prev, Math) or isinstance(e.next, Math): # if isinstance(e.prev, Math) or isinstance(e.next, Math):
# Add no-break spaces around TeX math. # # Add no-break spaces around TeX math.
return True # return True