aboutsummaryrefslogtreecommitdiff
path: root/lib/render/escape.mli
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-20 09:53:33 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-20 09:53:49 +0200
commit66543815ae6cbf6e576a889c9291678744243953 (patch)
treec3bc567ee53163abc3cf24bd7cba8038ee14e521 /lib/render/escape.mli
parent99dbddb2106f8a3ca31c7e0c43b7dc1a81652786 (diff)
downloadcolitur-66543815ae6cbf6e576a889c9291678744243953.tar.gz
colitur-66543815ae6cbf6e576a889c9291678744243953.zip
feat(render): Typst as a seventh escaping flavour
Adds Escape.Typst: type, all, to_string ("typst"), of_string, of_extension (.typ), and a per-character expand function, structured identically to the existing latex escaper (one pass, no re-scan, so double-escaping stays impossible by construction). The metacharacter set was verified against the installed typst 0.14.2 binary, not assumed: a probe document escaping each of #, *, _, $, @, <, >, `, \, ~ and - was compiled and pdftotext'd back to confirm the literal character survives, and each was separately confirmed to do something else when left bare (# opens code mode, */_ toggle strong/emph, $ opens math, @ opens a reference -- a bare unresolved @word is a hard compile error, not merely mangled output -- </> can close around a bare word into label syntax that swallows it whole, ` opens raw, ~ is a non-breaking space, and a run of two or three '-' becomes an en/em dash). All ten are backslash-escapable; none needed a non-backslash workaround. '-' is escaped unconditionally rather than only inside a detected run, since this escaper has no lookahead -- a probe confirmed escaping every hyphen independently still typesets as literal hyphens for a run of any length, so the single per-character rule is sufficient. test_escape.ml's new Typst cases were written first and shown to fail against a stubbed identity apply before the real escaper landed, per this project's own regression-test discipline. Comments in both files mark which new tests are genuine regression tests (the per-character escaping, including a real shipped citation and a synthetic markdown-habit overlay name) versus characterisation (to_string/ of_string/of_extension are flat table lookups with no logic to have been wrong).
Diffstat (limited to 'lib/render/escape.mli')
-rw-r--r--lib/render/escape.mli10
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/render/escape.mli b/lib/render/escape.mli
index 97cf050..ee1e20b 100644
--- a/lib/render/escape.mli
+++ b/lib/render/escape.mli
@@ -3,11 +3,11 @@
Knows nothing about calendars. Pure and total: every function is defined on
every string, and none reads the clock, the environment or the filesystem. *)
-(** The six escaping modes. Markdown, AsciiDoc and plain text all use [None_]:
- their metacharacter sets are context-dependent, and escaping them
- aggressively produces worse output than not escaping at all (spec section 5).
- This is a documented limitation of those flavours. *)
-type flavour = Latex | Groff | Html | Xml | Ics | None_
+(** The seven escaping modes. Markdown, AsciiDoc and plain text all use
+ [None_]: their metacharacter sets are context-dependent, and escaping
+ them aggressively produces worse output than not escaping at all (spec
+ section 5). This is a documented limitation of those flavours. *)
+type flavour = Latex | Typst | Groff | Html | Xml | Ics | None_
val all : flavour list
val to_string : flavour -> string