Compare commits
6 commits
4dd1eb0314
...
a2468b54e1
Author | SHA1 | Date | |
---|---|---|---|
a2468b54e1 | |||
945bb760e8 | |||
88d653af15 | |||
583b3ba010 | |||
9ccd2886b9 | |||
c90e00a1ae |
6 changed files with 98 additions and 27 deletions
|
@ -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:
|
||||||
|
|
|
@ -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\cr
|
||||||
|
\noalign{\medskip\smallskip}
|
||||||
|
#2\cr
|
||||||
|
}}}
|
||||||
|
}}
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 953b44e942282375ac369af233c123b28146713e
|
Subproject commit 211cb2010e23265be599819c5f79f66f0abd62d1
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue