Figures and misc.
TODO: - Custom implementation of attributes, classes and functions for math - Image processing - Tables for TeX - KaTeX math context (defs work in subsequent math blocks)
This commit is contained in:
parent
241e001023
commit
da30967d12
5 changed files with 48 additions and 11 deletions
|
@ -15,9 +15,11 @@
|
|||
\it{}#1%
|
||||
}}
|
||||
|
||||
|
||||
\def\superscript#1{\leavevmode\raise3pt\hbox{\fiverm#1}}
|
||||
\newcount\fncount
|
||||
\fncount=1
|
||||
\def\fnmark{\leavevmode\raise3pt\hbox{\fiverm\the\fncount}}
|
||||
\def\fnmark{\superscript{\the\fncount}}
|
||||
\def\fn#1{\footnote\fnmark{#1}\advance\fncount by 1}
|
||||
|
||||
\def\hA#1{{\parskip1em\settextsize{14}\bf #1}}
|
||||
|
@ -27,8 +29,12 @@
|
|||
\long\def\blockquote#1{\vskip\lineskip\vskip\parskip\hbox{\vrule\hskip5pt\vbox{#1}}}
|
||||
\def\code#1{{\tt #1}}
|
||||
\let\codeblock\verbatim
|
||||
\def\figure#1{#1}
|
||||
\def\image#1{#1}
|
||||
\def\subscript#1{\leavevmode\lower1pt\hbox{\fiverm#1}}
|
||||
\def\strikeout#1{FIXME: Strikeout not implemented}
|
||||
\def\underline#1{FIXME: Underline not implemented}
|
||||
\def\figure#1#2{\vskip5pt\centerline{#1}\centerline{#2}\vskip5pt}
|
||||
\def\caption#1{{\it #1}}
|
||||
\let\image\putimage
|
||||
\def\table#1{#1}
|
||||
\def\tablebody#1{#1}
|
||||
\def\tablerow#1{#1}
|
||||
|
|
7
html.py
7
html.py
|
@ -7,6 +7,7 @@ from pygments.util import ClassNotFound
|
|||
from whitespace import NBSP
|
||||
from transform import FQuoted
|
||||
from katex import KatexClient
|
||||
from util import inlinify
|
||||
|
||||
def html(e: Element, k: KatexClient, indent_level: int=0, indent_str: str="\t") -> str:
|
||||
|
||||
|
@ -74,6 +75,8 @@ def html(e: Element, k: KatexClient, indent_level: int=0, indent_str: str="\t")
|
|||
if hasattr(e, "classes") and len(e.classes) != 0:
|
||||
attributes += f' class="{" ".join(e.classes)}"'
|
||||
|
||||
# TODO: Pass attributes down to HTML too
|
||||
|
||||
if isinstance(e, CodeBlock):
|
||||
if e.attributes["highlight"] == True or e.attributes["highlight"] == 'True':
|
||||
for cl in e.classes:
|
||||
|
@ -115,8 +118,8 @@ def html(e: Element, k: KatexClient, indent_level: int=0, indent_str: str="\t")
|
|||
if isinstance(e, Note):
|
||||
content_head = "("
|
||||
content_foot = ")"
|
||||
if len(e.content) == 1 and isinstance(e.content[0], Para):
|
||||
return f' <note>({html(e.content[0].content, k, 0, "")})</note>'
|
||||
if inlinify(e) is not None:
|
||||
return f' <note>({html(inlinify(e), k, 0, "")})</note>'
|
||||
|
||||
if isinstance(e, OrderedList):
|
||||
tag = "ol"
|
||||
|
|
12
test.md
12
test.md
|
@ -46,7 +46,13 @@ This should only be shown to cats the second time
|
|||
|
||||
# [$are_we_there_yet]{}
|
||||
|
||||
![This is a figure, go figure...](/this/image/does/not/exist.jpg)
|
||||
![This is a figure, go figure...](/tmp/logo.pdf){width=10em}
|
||||
|
||||
![This is a figure, go figure...](/tmp/logo.jpg){width=10em}
|
||||
|
||||
![This is a figure, go figure...](/tmp/logo.png){width=10em}
|
||||
|
||||
![This is a figure, go figure...](/tmp/logo.svg){width=10em}
|
||||
|
||||
```python {.run}
|
||||
ctx.set_metadata("language", "cs")
|
||||
|
@ -74,7 +80,11 @@ A lot of spaces
|
|||
|
||||
A text with some inline math: $\sum_{i=1}^nn^2$. Plus some display math:
|
||||
|
||||
A link with the link in the link: <https://bruh.com>
|
||||
|
||||
H~2~O is a liquid. 2^10^ is 1024.
|
||||
|
||||
[Underline]{.underline}
|
||||
|
||||
:::{only=tex}
|
||||
$$
|
||||
|
|
22
tex.py
22
tex.py
|
@ -2,6 +2,7 @@ from panflute import *
|
|||
|
||||
from whitespace import NBSP
|
||||
from transform import FQuoted
|
||||
from util import inlinify
|
||||
|
||||
# Heavily inspired by: git://git.ucw.cz/labsconf2022.git
|
||||
def tex(e, indent_level: int=0, indent_str: str="\t") -> str:
|
||||
|
@ -103,12 +104,25 @@ def tex(e, indent_level: int=0, indent_str: str="\t") -> str:
|
|||
close = "\\endlist"
|
||||
# FIXME: Starting number of list
|
||||
|
||||
if isinstance(e, Image):
|
||||
return f'\\image{{width {e.attributes["width"] if "width" in e.attributes else ""}}}{{{e.url}}}'
|
||||
|
||||
if isinstance(e, Figure):
|
||||
return f'\\figure{{{tex(e.content, indent_level+1, indent_str)}}}{{{tex(e.caption, indent_level+1, indent_str)}}}\n\n'
|
||||
|
||||
if isinstance(e, Caption):
|
||||
if inlinify(e) is not None:
|
||||
return f'\\caption{{{tex(e.content, 0, "")}}}'
|
||||
|
||||
if isinstance(e, ListItem):
|
||||
tag = ":"
|
||||
|
||||
if isinstance(e, Link):
|
||||
tag = "linkurl"
|
||||
arguments = f'{{{e.url}}}'
|
||||
if len(e.content) == 1 and isinstance(e.content[0], Str) and e.content[0].text == e.url:
|
||||
tag = "url"
|
||||
else:
|
||||
tag = "linkurl"
|
||||
arguments = f'{{{e.url}}}'
|
||||
|
||||
if isinstance(e, Math):
|
||||
if e.format == "DisplayMath":
|
||||
|
@ -118,8 +132,8 @@ def tex(e, indent_level: int=0, indent_str: str="\t") -> str:
|
|||
|
||||
if isinstance(e, Note):
|
||||
tag = "fn"
|
||||
if len(e.content) == 1 and isinstance(e.content[0], Para):
|
||||
return f'\\fn{{{tex(e.content[0].content, 0, "")}}}'
|
||||
if inlinify(e) is not None:
|
||||
return f'\\fn{{{tex(inlinify(e), 0, "")}}}'
|
||||
|
||||
if isinstance(e, RawInline):
|
||||
if e.format == "tex":
|
||||
|
|
6
util.py
6
util.py
|
@ -1,6 +1,10 @@
|
|||
from panflute import Element, Block, Inline, Null, Str, Doc, convert_text
|
||||
from panflute import Element, Block, Inline, Null, Str, Doc, convert_text, Para, Plain
|
||||
import re
|
||||
|
||||
def inlinify(e: Element) -> Element:
|
||||
if len(e.content) == 1 and (isinstance(e.content[0], Para) or isinstance(e.content[0], Plain)):
|
||||
return e.content[0].content
|
||||
|
||||
def replaceEl(e: Element, r: Element) -> Element:
|
||||
parent = e.parent
|
||||
parent.content[e.index] = r
|
||||
|
|
Loading…
Reference in a new issue