{-# language OverloadedStrings #-} import Data.Text hiding (concat) import Data.Text.IO import Prelude hiding (putStr) flatten ls = [ (l, r) | (l, rs) <- ls, r <- rs ] convLatex ls = [ (l, replace "\\" "«" r) | (l, r) <- ls ] -- not used, doesn't work well in conjunction with lower greekUpper = convLatex [ ("Α", "\\Alpha") , ("Β", "\\Beta") , ("Γ", "\\Gamma") , ("Δ", "\\Delta") , ("Ε", "\\Epsilon") , ("Ζ", "\\Zeta") , ("Η", "\\Eta") , ("Θ", "\\Theta") , ("Ι", "\\Iota") , ("Κ", "\\Kappa") , ("Λ", "\\Lambda") , ("Μ", "\\Mu") , ("Ν", "\\Nu") , ("Ξ", "\\Xi") , ("Ο", "\\Omikron") , ("Π", "\\Pi") , ("Ρ", "\\Rho") , ("Σ", "\\Sigma") , ("Τ", "\\Tau") , ("Υ", "\\Upsilon") , ("Φ", "\\Phi") , ("Χ", "\\Chi") , ("Ψ", "\\Psi") , ("Ω", "\\Omega") ] greek = convLatex [ ("α", "\\alpha") , ("β", "\\beta") , ("γ", "\\gamma") , ("δ", "\\delta") , ("ε", "\\epsilon") , ("ζ", "\\zeta") , ("η", "\\eta") , ("θ", "\\theta") , ("ι", "\\iota") , ("κ", "\\kappa") , ("λ", "\\lambda") , ("μ", "\\mu") , ("ν", "\\nu") , ("ξ", "\\xi") , ("ο", "\\omikron") , ("π", "\\pi") , ("ρ", "\\rho") , ("σ", "\\sigma") , ("τ", "\\tau") , ("υ", "\\upsilon") , ("φ", "\\phi") , ("χ", "\\chi") , ("ψ", "\\psi") , ("ω", "\\omega") ] logic = (convLatex . flatten) [ ("∧", ["\\wedge", "\\and"]) , ("∨", ["\\vee", "\\vee"]) , ("¬", ["\\not", "\\neg"]) , ("⇔", ["\\iff"]) , ("⇒", ["\\implies"]) , ("⊤", ["\\top"]) , ("⊥", ["\\bottom", "\\perp"]) , ("∃", ["\\exists"]) , ("∀", ["\\forall"]) ] set = (convLatex . flatten) [ ("∅", ["\\emptyset"]) , ("∪", ["\\union", "\\cup"]) , ("∩", ["\\intersection", "\\cap"]) , ("≠", ["\\neq"]) , ("⊂", ["\\subset"]) , ("⊆", ["\\subseteq"]) , ("⊊", ["\\subsetneq"]) , ("∊", ["\\in"]) , ("∉", ["\\notin"]) ] others = convLatex [ ("≈", "\\iso") , ("~", "\\sim") , ("≤", "\\leq") , ("≥", "\\geq") , ("∞", "\\infty") , ("→", "\\to") , ("↦", "\\mapsto") , ("↠", "\\epi") , ("↪", "\\mono") , ("∘", "\\circ") , ("·", "\\cdot") , ("×", "\\times") , ("∑", "\\sum") , ("∏", "\\prod") , ("∐", "\\coprod") , ("⊕", "\\oplus") , ("⊗", "\\otimes") ] mathbb = (convLatex . flatten) [ ("𝔸", ["\\atoms", "\\AA"]) , ("ℕ", ["\\naturals", "\\NN"]) , ("ℚ", ["\\rationals", "\\QQ"]) , ("ℝ", ["\\reals", "\\RR"]) , ("ℤ", ["\\integers", "\\ZZ"]) ] allReplacements :: [(Text, Text)] allReplacements = concat [greek, logic, set, others, mathbb] header = "\n\ \\n\ \\n\ \\n\ \" footer = "\n\ \\n\ \" dict l r = "\t\n\ \\t\tphrase\n\ \\t\t" <> l <> "\n\ \\t\tshortcut\n\ \\t\t" <> r <> "\n\ \\t\n\ \" main = do let allReplacements = (concat [greek, logic, set, others, mathbb]) :: [(Text, Text)] putStr header mapM (putStr . uncurry dict) allReplacements putStr footer