scribble-math/katex-convert-unicode.rkt

95 lines
3.1 KiB
Racket

#lang racket/base
(require racket/string)
(provide katex-convert-unicode)
(define (literal-alternatives→regexp literal-alternatives)
(string-append "("
(string-join (map regexp-quote literal-alternatives) "|")
")"))
(define (string-replace* str sym→*)
(define →* (map (λ (x)
(cons (symbol->string (car x))
(cadr x)))
sym→*))
(define hash→* (make-immutable-hash →*))
(regexp-replace* (literal-alternatives→regexp (map car →*))
str
(λ (found . _)
(hash-ref hash→* found))))
(define (katex-convert-unicode str)
(if (string? str)
(string-replace*
str
'([ "_0"]
[ "_1"]
[ "_2"]
[ "_3"]
[ "_4"]
[ "_5"]
[ "_6"]
[ "_7"]
[ "_8"]
[ "_9"]
[ "_i"]
[ "_j"]
[ "_k"]
[ "_l"]
[ "_m"]
[ "_n"]
[ "_o"]
[ "^0"]
[¹ "^1"]
[² "^2"]
[³ "^3"]
[ "^4"]
[ "^5"]
[ "^6"]
[ "^7"]
[ "^8"]
[ "^9"]
[ "^i"]
[ʲ "^j"]
[ "^k"]
[ˡ "^l"]
[ "^m"]
[ "^n"]
[ "^o"]
[ "\\subseteq" "\\ensuremath{\\subseteq}"]
[ "\\subset" "\\ensuremath{\\subset}"]
[ "\\supseteq" "\\ensuremath{\\supseteq}"]
[ "\\supset" "\\ensuremath{\\supset}"]
[ "\\rightarrow" "\\ensuremath{\\rightarrow}"]
[ "\\Rightarrow" "\\ensuremath{\\Rightarrow}"]
[ "\\leftarrow" "\\ensuremath{\\leftarrow}"]
[ "\\Leftarrow" "\\ensuremath{\\Leftarrow}"]
[ "\\leftrightarrow" "\\ensuremath{\\leftrightarrow}"]
[ "\\Leftrightarrow" "\\ensuremath{\\Leftrightarrow}"]
;; Partially extracted from my .XCompose generator
[ñ "\\tilde{n}" "{\\ifmmode\\tilde{n}\\else\\~{n}\\fi}"]
[Ñ "\\tilde{N}" "{\\ifmmode\\tilde{N}\\else\\~{N}\\fi}"]
[ "\\star" "\\ensuremath{\\star}"]
[ "\\ddot{\\star}}" "\\ensuremath{\\ddot{\\star}}"]
[ "^*" "^*"]
[ "\\langle" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\langle}}}"]
[ "\\rangle" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\rangle}}}"]
[ "\\cdots"]
[ "\\vdots"]
[ "\\iddots"]
[ "\\ddots"]
[ "\\mathbin{+\\mkern-6.5mu+}" "\\ensuremath{\\mathbin{+\\mkern-6.5mu+}}"]
[ "\\emptyset" "\\ensuremath{\\emptyset}"]
[ı⃗ "\\vec{\\i}}" "\\ensuremath{\\vec{\\i}"]
[ "\\oplus" "\\ensuremath{\\oplus}"]
[ "\\ominus" "\\ensuremath{\\ominus}"]
[ "\\Cup" "\\ensuremath{\\Cup}"]
;[ₗ "\\ensuremath{_{l}}"]
[ "::"]
[Λ "\\Lambda" "\\ensuremath{\\Lambda}"]
[ "\\forall"]
[ "\\exists"]
[ "\\equiv"]
[ "\not\\equiv"]))
str))