content: {-# LANGUAGE OverloadedStrings #-}
  {-
  Copyright (C) 2009-2022 John MacFarlane <jgm@berkeley.edu>
  
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  -}
  
  {- | Lookup tables for TeX commands.
  -}
  
  module Text.TeXMath.Readers.TeX.Commands
    ( styleOps
    , textOps
    , enclosures
    , operators
    , symbols
    , siUnitMap
    )
  where
  
  import qualified Data.Map as M
  import Text.TeXMath.Types
  import Text.TeXMath.Unicode.ToTeX (symbolMap)
  import Data.Text (Text)
  import Data.Ratio ((%))
  
  -- Note: cal and scr are treated the same way, as unicode is lacking such two different sets for those.
  styleOps :: M.Map Text ([Exp] -> Exp)
  styleOps = M.fromList
            [ ("\\mathrm",     EStyled TextNormal)
            , ("\\mathup",     EStyled TextNormal)
            , ("\\mathbf",     EStyled TextNormal . (:[]) . EStyled TextBold)
            , ("\\boldsymbol", EStyled TextBold)
            , ("\\bm",         EStyled TextBold)
            , ("\\symbf",      EStyled TextBold)
            , ("\\mathbold",   EStyled TextBold)
            , ("\\pmb",        EStyled TextBold)
            , ("\\mathbfup",   EStyled TextBold)
            , ("\\mathit",     EStyled TextItalic)
            , ("\\mathtt",     EStyled TextMonospace)
            , ("\\texttt",     EStyled TextMonospace)
            , ("\\mathsf",     EStyled TextSansSerif)
            , ("\\mathsfup",   EStyled TextSansSerif)
            , ("\\mathbb",     EStyled TextDoubleStruck)
            , ("\\mathds",     EStyled TextDoubleStruck) -- mathds package
            , ("\\mathcal",    EStyled TextScript)
            , ("\\mathscr",    EStyled TextScript)
            , ("\\mathfrak",   EStyled TextFraktur)
            , ("\\mathbfit",   EStyled TextBoldItalic)
            , ("\\mathbfsfup", EStyled TextSansSerifBold)
            , ("\\mathbfsfit", EStyled TextSansSerifBoldItalic)
            , ("\\mathbfscr",  EStyled TextBoldScript)
            , ("\\mathbffrak", EStyled TextBoldFraktur)
            , ("\\mathbfcal",  EStyled TextBoldScript)
            , ("\\mathsfit",   EStyled TextSansSerifItalic)
            ]
  
  textOps :: M.Map Text (Text -> Exp)
  textOps = M.fromList
            [ ("\\textrm", (EText TextNormal))
            , ("\\text",   (EText TextNormal))
            , ("\\textbf", (EText TextBold))
            , ("\\textit", (EText TextItalic))
            , ("\\texttt", (EText TextMonospace))
            , ("\\textsf", (EText TextSansSerif))
            , ("\\mbox",   (EText TextNormal))
            ]
  
  enclosures :: M.Map Text Exp
  enclosures = M.fromList
    [ ("(", ESymbol Open "(")
    , (")", ESymbol Close ")")
    , ("[", ESymbol Open "[")
    , ("]", ESymbol Close "]")
    , ("\\{", ESymbol Open "{")
    , ("\\}", ESymbol Close "}")
    , ("\\lbrack", ESymbol Open "[")
    , ("\\lbrace", ESymbol Open "{")
    , ("\\rbrack", ESymbol Close "]")
    , ("\\rbrace", ESymbol Close "}")
    , ("\\llbracket", ESymbol Open "\x27E6")
    , ("\\rrbracket", ESymbol Close "\x27E7")
    , ("\\langle", ESymbol Open "\x27E8")
    , ("\\rangle", ESymbol Close "\x27E9")
    , ("\\lfloor", ESymbol Open "\x230A")
    , ("\\rfloor", ESymbol Close "\x230B")
    , ("\\lceil", ESymbol Open "\x2308")
    , ("\\rceil", ESymbol Close "\x2309")
    , ("|", ESymbol Close "|")
    , ("|", ESymbol Open "|")
    , ("\\|", ESymbol Open "\x2225")
    , ("\\|", ESymbol Close "\x2225")
    , ("\\lvert", ESymbol Open "\x7C")
    , ("\\rvert", ESymbol Close "\x7C")
    , ("\\vert", ESymbol Close "\x7C")
    , ("\\lVert", ESymbol Open "\x2225")
    , ("\\rVert", ESymbol Close "\x2225")
    , ("\\Vert", ESymbol Close "\x2016")
    , ("\\ulcorner", ESymbol Open "\x231C")
    , ("\\urcorner", ESymbol Close "\x231D")
    ]
  
  operators :: M.Map Text Exp
  operators = M.fromList [
               ("+", ESymbol Bin "+")
             , ("-", ESymbol Bin "\x2212")
             , ("*", ESymbol Bin "*")
             , ("@", ESymbol Ord "@")
             , (",", ESymbol Pun ",")
             , (".", ESymbol Ord ".")
             , (";", ESymbol Pun ";")
             , (":", ESymbol Rel ":")
             , ("?", ESymbol Ord "?")
             , (">", ESymbol Rel ">")
             , ("<", ESymbol Rel "<")
             , ("!", ESymbol Ord "!")
             , ("'", ESymbol Ord "\x2032")
             , ("''", ESymbol Ord "\x2033")
             , ("'''", ESymbol Ord "\x2034")
             , ("''''", ESymbol Ord "\x2057")
             , ("=", ESymbol Rel "=")
             , (":=", ESymbol Rel ":=")
             , ("/", ESymbol Ord "/")
             , ("~", ESpace (4/18)) ]
  
  symbols :: M.Map Text Exp
  symbols = symbolMapOverrides <> symbolMap
  
  -- These are the cases where texmath historically diverged
  -- from symbolMap.  We may want to remove some of these overrides,
  -- but for now we keep them so behavior doesn't change.
  symbolMapOverrides ::  M.Map Text Exp
  symbolMapOverrides = M.fromList
    [ ("\\\n",ESpace (2 % 9))
    , ("\\ ",ESpace (2 % 9))
    , ("\\!",ESpace ((-1) % 6))
    , ("\\,",ESpace (1 % 6))
    , ("\\:",ESpace (2 % 9))
    , ("\\;",ESpace (5 % 18))
    , ("\\>",ESpace (2 % 9))
    , ("\\AC",ESymbol Ord "\9190")
    , ("\\Box",ESymbol Op "\9633")
    , ("\\Delta",EIdentifier "\916")
    , ("\\Diamond",ESymbol Op "\9671")
    , ("\\Alpha",EIdentifier "\913")
    , ("\\Beta",EIdentifier "\914")
    , ("\\Gamma",EIdentifier "\915")
    , ("\\Epsilon",EIdentifier "\917")
    , ("\\Zeta",EIdentifier "\918")
    , ("\\Eta",EIdentifier "\919")
    , ("\\Iota",EIdentifier "\921")
    , ("\\Kappa",EIdentifier "\922")
    , ("\\Mu",EIdentifier "\924")
    , ("\\Nu",EIdentifier "\925")
    , ("\\Omicron",EIdentifier "\927")
    , ("\\omicron",EIdentifier "\959")
    , ("\\Rho",EIdentifier "\929")
    , ("\\Tau",EIdentifier "\932")
    , ("\\Chi",EIdentifier "\935")
    , ("\\Im",ESymbol Ord "\8465")
    , ("\\Join",ESymbol Rel "\8904")
    , ("\\Lambda",EIdentifier "\923")
    , ("\\Lbrbrak",ESymbol Open "\12312")
    , ("\\Longleftarrow",ESymbol Rel "\8656")
    , ("\\Longleftrightarrow",ESymbol Rel "\8660")
    , ("\\Longrightarrow",ESymbol Rel "\8658")
    , ("\\Omega",EIdentifier "\937")
    , ("\\Phi",EIdentifier "\934")
    , ("\\Pi",EIdentifier "\928")
    , ("\\Pr",EMathOperator "Pr")
    , ("\\Psi",EIdentifier "\936")
    , ("\\Rbrbrak",ESymbol Close "\12313")
    , ("\\Re",ESymbol Ord "\8476")
    , ("\\Sigma",EIdentifier "\931")
    , ("\\Theta",EIdentifier "\920")
    , ("\\Upsilon",EIdentifier "\933")
    , ("\\Xi",EIdentifier "\926")
    , ("\\^",ESymbol Ord "^")
    , ("\\alpha",EIdentifier "\945")
    , ("\\amalg",ESymbol Bin "\8720")
    , ("\\arccos",EMathOperator "arccos")
    , ("\\arcsin",EMathOperator "arcsin")
    , ("\\arctan",EMathOperator "arctan")
    , ("\\arg",EMathOperator "arg")
    , ("\\ast",ESymbol Bin "*")
    , ("\\backslash",ESymbol Bin "\8726")
    , ("\\bar",ESymbol Accent "\8254")
    , ("\\barwedge",ESymbol Bin "\8965")
    , ("\\beta",EIdentifier "\946")
    , ("\\bigcirc",ESymbol Bin "\9675")
    , ("\\blacklozenge",ESymbol Ord "\11047")
    , ("\\blacksquare",ESymbol Ord "\9724")
    , ("\\blacktriangleleft",ESymbol Bin "\9666")
    , ("\\blacktriangleright",ESymbol Bin "\9656")
    , ("\\cdot",ESymbol Bin "\8901")
    , ("\\chi",EIdentifier "\967")
    , ("\\cos",EMathOperator "cos")
    , ("\\cosh",EMathOperator "cosh")
    , ("\\cot",EMathOperator "cot")
    , ("\\coth",EMathOperator "coth")
    , ("\\csc",EMathOperator "csc")
    , ("\\dag",ESymbol Bin "\8224")
    , ("\\ddag",ESymbol Bin "\8225")
    , ("\\deg",EMathOperator "deg")
    , ("\\delta",EIdentifier "\948")
    , ("\\det",EMathOperator "det")
    , ("\\diamond",ESymbol Op "\8900")
    , ("\\digamma",ESymbol Alpha "\989")
    , ("\\dim",EMathOperator "dim")
    , ("\\dots",ESymbol Ord "\8230")
    , ("\\dotsb",ESymbol Ord "\8943")
    , ("\\dotsc",ESymbol Ord "\8230")
    , ("\\dotsi",ESymbol Ord "\8943")
    , ("\\dotsm",ESymbol Ord "\8943")
    , ("\\dotso",ESymbol Ord "\8230")
    , ("\\emptyset",ESymbol Ord "\8709")
    , ("\\epsilon",EIdentifier "\1013")
    , ("\\eqcolon",ESymbol Rel "\8789")
    , ("\\eta",EIdentifier "\951")
    , ("\\exists",ESymbol Op "\8707")
    , ("\\exp",EMathOperator "exp")
    , ("\\forall",ESymbol Op "\8704")
    , ("\\gamma",EIdentifier "\947")
    , ("\\gcd",EMathOperator "gcd")
    , ("\\geqslant",ESymbol Rel "\8805")
    , ("\\gt",ESymbol Rel ">")
    , ("\\hbar",ESymbol Ord "\8463")
    , ("\\hdots",ESymbol Ord "\8230")
    , ("\\hom",EMathOperator "hom")
    , ("\\iff",ESymbol Rel "\8660")
    , ("\\inf",EMathOperator "inf")
    , ("\\iota",EIdentifier "\953")
    , ("\\kappa",EIdentifier "\954")
    , ("\\ker",EMathOperator "ker")
    , ("\\lambda",EIdentifier "\955")
    , ("\\lbrbrak",ESymbol Open "\12308")
    , ("\\leqslant",ESymbol Rel "\8804")
    , ("\\lg",EMathOperator "lg")
    , ("\\lhd",ESymbol Bin "\8882")
    , ("\\lim",EMathOperator "lim")
    , ("\\liminf",EMathOperator "liminf")
    , ("\\limsup",EMathOperator "limsup")
    , ("\\llbracket",ESymbol Open "\12314")
    , ("\\ln",EMathOperator "ln")
    , ("\\log",EMathOperator "log")
    , ("\\longleftarrow",ESymbol Rel "\8592")
    , ("\\longleftrightarrow",ESymbol Rel "\8596")
    , ("\\longmapsto",ESymbol Rel "\8614")
    , ("\\longrightarrow",ESymbol Rel "\8594")
    , ("\\lozenge",ESymbol Op "\9674")
    , ("\\lt",ESymbol Rel "<")
    , ("\\max",EMathOperator "max")
    , ("\\mid",ESymbol Bin "\8739")
    , ("\\min",EMathOperator "min")
    , ("\\models",ESymbol Rel "\8872")
    , ("\\mu",EIdentifier "\956")
    , ("\\neg",ESymbol Op "\172")
    , ("\\nu",EIdentifier "\957")
    , ("\\omega",EIdentifier "\969")
    , ("\\overbar",ESymbol Accent "\175")
    , ("\\overline",ESymbol TOver "\175")
    , ("\\overrightarrow",ESymbol Accent "\8407")
    , ("\\phi",EIdentifier "\981")
    , ("\\pi",EIdentifier "\960")
    , ("\\preceq",ESymbol Rel "\8828")
    , ("\\psi",EIdentifier "\968")
    , ("\\qquad",ESpace (2 % 1))
    , ("\\quad",ESpace (1 % 1))
    , ("\\rbrbrak",ESymbol Close "\12309")
    , ("\\rhd",ESymbol Bin "\8883")
    , ("\\rho",EIdentifier "\961")
    , ("\\rrbracket",ESymbol Close "\12315")
    , ("\\sec",EMathOperator "sec")
    , ("\\setminus",ESymbol Bin "\\")
    , ("\\sigma",EIdentifier "\963")
    , ("\\sim",ESymbol Rel "\8764")
    , ("\\sin",EMathOperator "sin")
    , ("\\sinh",EMathOperator "sinh")
    , ("\\square",ESymbol Ord "\9643")
    , ("\\succeq",ESymbol Rel "\8829")
    , ("\\sup",EMathOperator "sup")
    , ("\\tan",EMathOperator "tan")
    , ("\\tanh",EMathOperator "tanh")
    , ("\\tau",EIdentifier "\964")
    , ("\\therefore",ESymbol Pun "\8756")
    , ("\\theta",EIdentifier "\952")
    , ("\\triangle",ESymbol Ord "\9651")
    , ("\\triangleleft",ESymbol Bin "\8882")
    , ("\\triangleright",ESymbol Bin "\8883")
    , ("\\underbar",ESymbol TUnder "\817")
    , ("\\underline",ESymbol TUnder "_")
    , ("\\unlhd",ESymbol Bin "\8884")
    , ("\\unrhd",ESymbol Bin "\8885")
    , ("\\upUpsilon",ESymbol Alpha "\978")
    , ("\\upsilon",EIdentifier "\965")
    , ("\\varDelta",EIdentifier "\120549")
    , ("\\varGamma",EIdentifier "\120548")
    , ("\\varLambda",EIdentifier "\120556")
    , ("\\varOmega",EIdentifier "\120570")
    , ("\\varPhi",EIdentifier "\120567")
    , ("\\varPi",EIdentifier "\120561")
    , ("\\varPsi",EIdentifier "\120569")
    , ("\\varSigma",EIdentifier "\120564")
    , ("\\varTheta",EIdentifier "\120553")
    , ("\\varUpsilon",EIdentifier "\120566")
    , ("\\varXi",EIdentifier "\120559")
    , ("\\varepsilon",EIdentifier "\949")
    , ("\\varnothing",ESymbol Ord "\8960")
    , ("\\varphi",EIdentifier "\966")
    , ("\\varrho",ESymbol Alpha "\120602")
    , ("\\varsigma",ESymbol Alpha "\120589")
    , ("\\vartheta",EIdentifier "\977")
    , ("\\vdots",ESymbol Ord "\8942")
    , ("\\vec",ESymbol Accent "\8407")
    , ("\\wp",ESymbol Ord "\8472")
    , ("\\wr",ESymbol Ord "\8768")
    , ("\\xi",EIdentifier "\958")
    , ("\\zeta",EIdentifier "\950")
    ]
  
  siUnitMap :: M.Map Text Exp
  siUnitMap = M.fromList
    [ ("fg", str "fg")
    , ("pg", str "pg")
    , ("ng", str "ng")
    , ("ug", str "μg")
    , ("mg", str "mg")
    , ("g", str "g")
    , ("kg", str "kg")
    , ("amu", str "u")
    , ("pm", str "pm")
    , ("nm", str "nm")
    , ("um", str "μm")
    , ("mm", str "mm")
    , ("cm", str "cm")
    , ("dm", str "dm")
    , ("m", str "m")
    , ("km", str "km")
    , ("as", str "as")
    , ("fs", str "fs")
    , ("ps", str "ps")
    , ("ns", str "ns")
    , ("us", str "μs")
    , ("ms", str "ms")
    , ("s", str "s")
    , ("fmol", str "fmol")
    , ("pmol", str "pmol")
    , ("nmol", str "nmol")
    , ("umol", str "μmol")
    , ("mmol", str "mmol")
    , ("mol", str "mol")
    , ("kmol", str "kmol")
    , ("pA", str "pA")
    , ("nA", str "nA")
    , ("uA", str "μA")
    , ("mA", str "mA")
    , ("A", str "A")
    , ("kA", str "kA")
    , ("ul", str "μl")
    , ("ml", str "ml")
    , ("l", str "l")
    , ("hl", str "hl")
    , ("uL", str "μL")
    , ("mL", str "mL")
    , ("L", str "L")
    , ("hL", str "hL")
    , ("mHz", str "mHz")
    , ("Hz", str "Hz")
    , ("kHz", str "kHz")
    , ("MHz", str "MHz")
    , ("GHz", str "GHz")
    , ("THz", str "THz")
    , ("mN", str "mN")
    , ("N", str "N")
    , ("kN", str "kN")
    , ("MN", str "MN")
    , ("Pa", str "Pa")
    , ("kPa", str "kPa")
    , ("MPa", str "MPa")
    , ("GPa", str "GPa")
    , ("mohm", str "mΩ")
    , ("kohm", str "kΩ")
    , ("Mohm", str "MΩ")
    , ("pV", str "pV")
    , ("nV", str "nV")
    , ("uV", str "μV")
    , ("mV", str "mV")
    , ("V", str "V")
    , ("kV", str "kV")
    , ("W", str "W")
    , ("uW", str "μW")
    , ("mW", str "mW")
    , ("kW", str "kW")
    , ("MW", str "MW")
    , ("GW", str "GW")
    , ("J", str "J")
    , ("uJ", str "μJ")
    , ("mJ", str "mJ")
    , ("kJ", str "kJ")
    , ("eV", str "eV")
    , ("meV", str "meV")
    , ("keV", str "keV")
    , ("MeV", str "MeV")
    , ("GeV", str "GeV")
    , ("TeV", str "TeV")
    , ("kWh", str "kWh")
    , ("F", str "F")
    , ("fF", str "fF")
    , ("pF", str "pF")
    , ("K", str "K")
    , ("dB", str "dB")
    , ("ampere", str "A")
    , ("angstrom", str "Å")
    , ("arcmin", str "′")
    , ("arcminute", str "′")
    , ("arcsecond", str "″")
    , ("astronomicalunit", str "ua")
    , ("atomicmassunit", str "u")
    , ("atto", str "a")
    , ("bar", str "bar")
    , ("barn", str "b")
    , ("becquerel", str "Bq")
    , ("bel", str "B")
    , ("bohr", ESuper (EText TextItalic "a") (ENumber "0"))
    , ("candela", str "cd")
    , ("celsius", str "°C")
    , ("centi", str "c")
    , ("clight", ESuper (EText TextItalic "c") (ENumber "0"))
    , ("coulomb", str "C")
    , ("dalton", str "Da")
    , ("day", str "d")
    , ("deca", str "d")
    , ("deci", str "d")
    , ("decibel", str "db")
    , ("degreeCelsius",str "°C")
    , ("degree", str "°")
    , ("deka", str "d")
    , ("electronmass", ESuper (EText TextItalic "m") (EText TextItalic "e"))
    , ("electronvolt", str "eV")
    , ("elementarycharge", EText TextItalic "e")
    , ("exa", str "E")
    , ("farad", str "F")
    , ("femto", str "f")
    , ("giga", str "G")
    , ("gram", str "g")
    , ("gray", str "Gy")
    , ("hartree", ESuper (EText TextItalic "E") (EText TextItalic "h"))
    , ("hectare", str "ha")
    , ("hecto", str "h")
    , ("henry", str "H")
    , ("hertz", str "Hz")
    , ("hour", str "h")
    , ("joule", str "J")
    , ("katal", str "kat")
    , ("kelvin", str "K")
    , ("kilo", str "k")
    , ("kilogram", str "kg")
    , ("knot", str "kn")
    , ("liter", str "L")
    , ("litre", str "l")
    , ("lumen", str "lm")
    , ("lux", str "lx")
    , ("mega", str "M")
    , ("meter", str "m")
    , ("metre", str "m")
    , ("micro", str "μ")
    , ("milli", str "m")
    , ("minute", str "min")
    , ("mmHg", str "mmHg")
    , ("mole", str "mol")
    , ("nano", str "n")
    , ("nauticalmile", str "M")
    , ("neper", str "Np")
    , ("newton", str "N")
    , ("ohm", str "Ω")
    , ("Pa", str "Pa")
    , ("pascal", str "Pa")
    , ("percent", str "%")
    , ("per", str "/")
    , ("peta", str "P")
    , ("pico", str "p")
    , ("planckbar", EText TextItalic "\x210f")
    , ("radian", str "rad")
    , ("second", str "s")
    , ("siemens", str "S")
    , ("sievert", str "Sv")
    , ("steradian", str "sr")
    , ("tera", str "T")
    , ("tesla", str "T")
    , ("tonne", str "t")
    , ("volt", str "V")
    , ("watt", str "W")
    , ("weber", str "Wb")
    , ("yocto", str "y")
    , ("yotta", str "Y")
    , ("zepto", str "z")
    , ("zetta", str "Z")
    ]
   where
    str = EText TextNormal
  