www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

katex-convert-unicode.rkt (4456B)


      1 #lang at-exp racket/base
      2 (require racket/string)
      3 
      4 (provide katex-convert-unicode
      5          string-replace*)
      6 
      7 (define (literal-alternatives→regexp literal-alternatives)
      8   (string-append "("
      9                  (string-join (map regexp-quote literal-alternatives) "|")
     10                  ")"))
     11 
     12 (define (string-replace* str mathmode? sym→*)
     13   (define →* (map (λ (x)
     14                     (cons (symbol->string (car x))
     15                           (cadr x)))
     16                   sym→*))
     17   (define hash→* (make-immutable-hash →*))
     18   (regexp-replace* (literal-alternatives→regexp (map car →*))
     19                    str
     20                    (λ (found . _)
     21                      (let ([replacement (hash-ref hash→* found)])
     22                        (if mathmode?
     23                            replacement
     24                            (string-append "$" replacement "$"))))))
     25 
     26 (define (katex-convert-unicode str mathmode? [more-sym→* '()])
     27   (define sym→*
     28     `([₀ "{}_0"]
     29       [₁ "{}_1"]
     30       [₂ "{}_2"]
     31       [₃ "{}_3"]
     32       [₄ "{}_4"]
     33       [₅ "{}_5"]
     34       [₆ "{}_6"]
     35       [₇ "{}_7"]
     36       [₈ "{}_8"]
     37       [₉ "{}_9"]
     38       [ᵢ "{}_i"]
     39       [ⱼ "{}_j"]
     40       [ₖ "{}_k"]
     41       [ₗ "{}_l"]
     42       [ₘ "{}_m"]
     43       [ₙ "{}_n"]
     44       [ₒ "{}_o"]
     45       [ₓ "{}_x"]
     46       [⁰ "{}^0"]
     47       [¹ "{}^1"]
     48       [² "{}^2"]
     49       [³ "{}^3"]
     50       [⁴ "{}^4"]
     51       [⁵ "{}^5"]
     52       [⁶ "{}^6"]
     53       [⁷ "{}^7"]
     54       [⁸ "{}^8"]
     55       [⁹ "{}^9"]
     56       [ⁱ "{}^i"]
     57       [ʲ "{}^j"]
     58       [ᵏ "{}^k"]
     59       [ˡ "{}^l"]
     60       [ᵐ "{}^m"]
     61       [ⁿ "{}^n"]
     62       [ᵒ "{}^o"]
     63       [⊆ "\\subseteq{}" "\\ensuremath{\\subseteq}"]
     64       [⊂ "\\subset{}" "\\ensuremath{\\subset}"]
     65       [⊇ "\\supseteq{}" "\\ensuremath{\\supseteq}"]
     66       [⊃ "\\supset{}" "\\ensuremath{\\supset}"]
     67       [→ "\\rightarrow{}" "\\ensuremath{\\rightarrow}"]
     68       [⇒ "\\Rightarrow{}" "\\ensuremath{\\Rightarrow}"]
     69       [← "\\leftarrow{}" "\\ensuremath{\\leftarrow}"]
     70       [⇐ "\\Leftarrow{}" "\\ensuremath{\\Leftarrow}"]
     71       [↔ "\\leftrightarrow{}" "\\ensuremath{\\leftrightarrow}"]
     72       [⇔ "\\Leftrightarrow{}" "\\ensuremath{\\Leftrightarrow}"]
     73       ;; Partially extracted from my .XCompose generator
     74       [ñ "\\tilde{n}" "{\\ifmmode\\tilde{n}\\else\\~{n}\\fi}"]
     75       [Ñ "\\tilde{N}" "{\\ifmmode\\tilde{N}\\else\\~{N}\\fi}"]
     76       [⋆ "\\star{}" "\\ensuremath{\\star}"]
     77       [⍣ "\\ddot{\\star}}" "\\ensuremath{\\ddot{\\star}}"]
     78       [⃰ "^*" "^*"]
     79       [⟨ "\\langle{}" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\langle}}}"]
     80       [⟩ "\\rangle{}" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\rangle}}}"]
     81       [⋯ "\\cdots{}"]
     82       [⋮ "\\vdots{}"]
     83       [⋰ "\\iddots{}"]
     84       [⋱ "\\ddots{}"]
     85       [⧺ "\\mathbin{+\\mkern-6.5mu+}" "\\ensuremath{\\mathbin{+\\mkern-6.5mu+}}"]
     86       [∅ "\\emptyset{}" "\\ensuremath{\\emptyset}"]
     87       [ı⃗ "\\vec{\\i}}" "\\ensuremath{\\vec{\\i}"]
     88       [⊕ "\\oplus{}" "\\ensuremath{\\oplus}"]
     89       [⊖ "\\ominus{}" "\\ensuremath{\\ominus}"]
     90       [⋓ "\\Cup{}" "\\ensuremath{\\Cup}"]
     91       ;[ₗ "\\ensuremath{_{l}}"]
     92       [∷ "::"]
     93       [Λ "\\Lambda{}" "\\ensuremath{\\Lambda}"]
     94       [κ "\\kappa" "\\ensuremath{\\kappa}"]
     95       [ι "\\iota" "\\ensuremath{\\iota}"]
     96       [ν "\\nu" "\\ensuremath{\\nu}"]
     97       [υ "\\upsilon" "\\ensuremath{\\upsilon}"]
     98       [ς "\\varsigma" "\\ensuremath{\\varsigma}"]
     99       [∀ "\\forall{}"]
    100       [∃ "\\exists{}"]
    101       [≡ "\\equiv{}"]
    102       [≢ "\\not\\equiv{}"]
    103       [… "\\ldots{}"]
    104       [⋯ "\\cdots{}"]
    105       [⋰ "\\uddots{}"] ;; or \iddots from package mathdots, see http://tex.stackexchange.com/a/17650
    106       [⋱ "\\ddots{}"]
    107       [∌ "\\notni{}"]
    108       [ℰ "\\mathcal{E}"]
    109       [𝒮 "\\mathcal{S}"]
    110       [• "\\bullet{}"]
    111       [|'| "{}'"]
    112       [′ "{}'"]
    113       [″ "{}''"]
    114       [‴ "{}'''"]
    115       [⁗ "{}''''"]
    116       [∪ "\\cup"]
    117       [∩ "\\cap"]
    118       [⋃ "\\bigcup{}"]
    119       [⋂ "\\bigcap{}"]
    120       [⋀ "\\bigwedge{}"]
    121       [⋁ "\\bigvee{}"]
    122       [± "\\pm{}"]
    123       [≟ "\\stackrel{?}{=}"]
    124       [≛ "\\stackrel{*}{=}"]
    125       [≝ "\\stackrel{\\scriptscriptstyle\\mathsf{def}}{=}"]
    126       [∃ "\\exists{}" "\\ensuremath{\\exists}"]
    127       [⋅ "\\cdot{}" "\\ensuremath{\\cdot}"]
    128       [ϱ "\\varrho{}" "\\ensuremath{\\varrho}"]
    129       ))
    130   (if (string? str)
    131       (string-replace*
    132        str
    133        mathmode?
    134        (append more-sym→* sym→*))
    135       str))