    {-# LANGUAGE OverloadedStrings #-}
    {-
    Copyright (C) 2014 Matthew Pickering <matthewtpickering@gmail.com>

    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
    -}

    {- |
       Module      : Text.TeXMath.Unicode.Fonts
       Copyright   : Copyright (C) 2014 Matthew Pickering
       License     : GNU GPL, version 2 or above

       Maintainer  : Matthew Pickering <matthewtpickering@gmail.com>
       Stability   : alpha
       Portability : portable

    Utilities to convert between MS font codepoints and unicode characters.
    -}
    module Text.TeXMath.Unicode.Fonts (getUnicode, Font(..), textToFont) where
    import qualified Data.Map as M
    import qualified Data.Text as T

    -- | Enumeration of recognised fonts
    data Font = Symbol -- ^ <http://en.wikipedia.org/wiki/Symbol_(typeface) Adobe Symbol>
              deriving (Int -> Font -> ShowS
    [Font] -> ShowS
    Font -> String
    (Int -> Font -> ShowS)
    -> (Font -> String) -> ([Font] -> ShowS) -> Show Font
    forall a.
    (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
    $cshowsPrec :: Int -> Font -> ShowS
    showsPrec :: Int -> Font -> ShowS
    $cshow :: Font -> String
    show :: Font -> String
    $cshowList :: [Font] -> ShowS
    showList :: [Font] -> ShowS
    Show, Font -> Font -> Bool
    (Font -> Font -> Bool) -> (Font -> Font -> Bool) -> Eq Font
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: Font -> Font -> Bool
    == :: Font -> Font -> Bool
    $c/= :: Font -> Font -> Bool
    /= :: Font -> Font -> Bool
    Eq)

    -- | Parse font name into Font if possible.
    textToFont :: T.Text -> Maybe Font
    textToFont :: Text -> Maybe Font
    textToFont Text
    "Symbol" = Font -> Maybe Font
    forall a. a -> Maybe a
    Just Font
    Symbol
    textToFont Text
    _ = Maybe Font
    forall a. Maybe a
    Nothing

    -- | Given a font and codepoint, returns the corresponding unicode
    -- character
    getUnicode :: Font -> Char -> Maybe Char
    getUnicode :: Font -> Char -> Maybe Char
    getUnicode Font
    Symbol Char
    c = Char -> Map Char Char -> Maybe Char
    forall k a. Ord k => k -> Map k a -> Maybe a
    M.lookup Char
    c Map Char Char
    symbol

    -- Generated from lib/fonts/symbol.txt
    symbol :: M.Map Char Char
    symbol :: Map Char Char
    symbol = [(Char, Char)] -> Map Char Char
    forall k a. Ord k => [(k, a)] -> Map k a
    M.fromList
      [ (Char
    ' ',Char
    ' ')
      , (Char
    ' ',Char
    '\160')
      , (Char
    '!',Char
    '!')
      , (Char
    '"',Char
    '\8704')
      , (Char
    '#',Char
    '#')
      , (Char
    '$',Char
    '\8707')
      , (Char
    '%',Char
    '%')
      , (Char
    '&',Char
    '&')
      , (Char
    '\'',Char
    '\8715')
      , (Char
    '(',Char
    '(')
      , (Char
    ')',Char
    ')')
      , (Char
    '*',Char
    '\8727')
      , (Char
    '+',Char
    '+')
      , (Char
    ',',Char
    ',')
      , (Char
    '-',Char
    '\8722')
      , (Char
    '.',Char
    '.')
      , (Char
    '/',Char
    '/')
      , (Char
    '0',Char
    '0')
      , (Char
    '1',Char
    '1')
      , (Char
    '2',Char
    '2')
      , (Char
    '3',Char
    '3')
      , (Char
    '4',Char
    '4')
      , (Char
    '5',Char
    '5')
      , (Char
    '6',Char
    '6')
      , (Char
    '7',Char
    '7')
      , (Char
    '8',Char
    '8')
      , (Char
    '9',Char
    '9')
      , (Char
    ':',Char
    ':')
      , (Char
    ';',Char
    ';')
      , (Char
    '<',Char
    '<')
      , (Char
    '=',Char
    '=')
      , (Char
    '>',Char
    '>')
      , (Char
    '?',Char
    '?')
      , (Char
    '@',Char
    '\8773')
      , (Char
    'A',Char
    '\913')
      , (Char
    'B',Char
    '\914')
      , (Char
    'C',Char
    '\935')
      , (Char
    'D',Char
    '\916')
      , (Char
    'D',Char
    '\8710')
      , (Char
    'E',Char
    '\917')
      , (Char
    'F',Char
    '\934')
      , (Char
    'G',Char
    '\915')
      , (Char
    'H',Char
    '\919')
      , (Char
    'I',Char
    '\921')
      , (Char
    'J',Char
    '\977')
      , (Char
    'K',Char
    '\922')
      , (Char
    'L',Char
    '\923')
      , (Char
    'M',Char
    '\924')
      , (Char
    'N',Char
    '\925')
      , (Char
    'O',Char
    '\927')
      , (Char
    'P',Char
    '\928')
      , (Char
    'Q',Char
    '\920')
      , (Char
    'R',Char
    '\929')
      , (Char
    'S',Char
    '\931')
      , (Char
    'T',Char
    '\932')
      , (Char
    'U',Char
    '\933')
      , (Char
    'V',Char
    '\962')
      , (Char
    'W',Char
    '\937')
      , (Char
    'W',Char
    '\8486')
      , (Char
    'X',Char
    '\926')
      , (Char
    'Y',Char
    '\936')
      , (Char
    'Z',Char
    '\918')
      , (Char
    '[',Char
    '[')
      , (Char
    '\\',Char
    '\8756')
      , (Char
    ']',Char
    ']')
      , (Char
    '^',Char
    '\8869')
      , (Char
    '_',Char
    '_')
      , (Char
    '`',Char
    '\63717')
      , (Char
    'a',Char
    '\945')
      , (Char
    'b',Char
    '\946')
      , (Char
    'c',Char
    '\967')
      , (Char
    'd',Char
    '\948')
      , (Char
    'e',Char
    '\949')
      , (Char
    'f',Char
    '\966')
      , (Char
    'g',Char
    '\947')
      , (Char
    'h',Char
    '\951')
      , (Char
    'i',Char
    '\953')
      , (Char
    'j',Char
    '\981')
      , (Char
    'k',Char
    '\954')
      , (Char
    'l',Char
    '\955')
      , (Char
    'm',Char
    '\181')
      , (Char
    'm',Char
    '\956')
      , (Char
    'n',Char
    '\957')
      , (Char
    'o',Char
    '\959')
      , (Char
    'p',Char
    '\960')
      , (Char
    'q',Char
    '\952')
      , (Char
    'r',Char
    '\961')
      , (Char
    's',Char
    '\963')
      , (Char
    't',Char
    '\964')
      , (Char
    'u',Char
    '\965')
      , (Char
    'v',Char
    '\982')
      , (Char
    'w',Char
    '\969')
      , (Char
    'x',Char
    '\958')
      , (Char
    'y',Char
    '\968')
      , (Char
    'z',Char
    '\950')
      , (Char
    '{',Char
    '{')
      , (Char
    '|',Char
    '|')
      , (Char
    '}',Char
    '}')
      , (Char
    '~',Char
    '\8764')
      , (Char
    '\160',Char
    '\8364')
      , (Char
    '\161',Char
    '\978')
      , (Char
    '\162',Char
    '\8242')
      , (Char
    '\163',Char
    '\8804')
      , (Char
    '\164',Char
    '\8260')
      , (Char
    '\164',Char
    '\8725')
      , (Char
    '\165',Char
    '\8734')
      , (Char
    '\166',Char
    '\402')
      , (Char
    '\167',Char
    '\9827')
      , (Char
    '\168',Char
    '\9830')
      , (Char
    '\169',Char
    '\9829')
      , (Char
    '\170',Char
    '\9824')
      , (Char
    '\171',Char
    '\8596')
      , (Char
    '\172',Char
    '\8592')
      , (Char
    '\173',Char
    '\8593')
      , (Char
    '\174',Char
    '\8594')
      , (Char
    '\175',Char
    '\8595')
      , (Char
    '\176',Char
    '\176')
      , (Char
    '\177',Char
    '\177')
      , (Char
    '\178',Char
    '\8243')
      , (Char
    '\179',Char
    '\8805')
      , (Char
    '\180',Char
    '\215')
      , (Char
    '\181',Char
    '\8733')
      , (Char
    '\182',Char
    '\8706')
      , (Char
    '\183',Char
    '\8226')
      , (Char
    '\184',Char
    '\247')
      , (Char
    '\185',Char
    '\8800')
      , (Char
    '\186',Char
    '\8801')
      , (Char
    '\187',Char
    '\8776')
      , (Char
    '\188',Char
    '\8230')
      , (Char
    '\189',Char
    '\63718')
      , (Char
    '\190',Char
    '\63719')
      , (Char
    '\191',Char
    '\8629')
      , (Char
    '\192',Char
    '\8501')
      , (Char
    '\193',Char
    '\8465')
      , (Char
    '\194',Char
    '\8476')
      , (Char
    '\195',Char
    '\8472')
      , (Char
    '\196',Char
    '\8855')
      , (Char
    '\197',Char
    '\8853')
      , (Char
    '\198',Char
    '\8709')
      , (Char
    '\199',Char
    '\8745')
      , (Char
    '\200',Char
    '\8746')
      , (Char
    '\201',Char
    '\8835')
      , (Char
    '\202',Char
    '\8839')
      , (Char
    '\203',Char
    '\8836')
      , (Char
    '\204',Char
    '\8834')
      , (Char
    '\205',Char
    '\8838')
      , (Char
    '\206',Char
    '\8712')
      , (Char
    '\207',Char
    '\8713')
      , (Char
    '\208',Char
    '\8736')
      , (Char
    '\209',Char
    '\8711')
      , (Char
    '\210',Char
    '\63194')
      , (Char
    '\211',Char
    '\63193')
      , (Char
    '\212',Char
    '\63195')
      , (Char
    '\213',Char
    '\8719')
      , (Char
    '\214',Char
    '\8730')
      , (Char
    '\215',Char
    '\8901')
      , (Char
    '\216',Char
    '\172')
      , (Char
    '\217',Char
    '\8743')
      , (Char
    '\218',Char
    '\8744')
      , (Char
    '\219',Char
    '\8660')
      , (Char
    '\220',Char
    '\8656')
      , (Char
    '\221',Char
    '\8657')
      , (Char
    '\222',Char
    '\8658')
      , (Char
    '\223',Char
    '\8659')
      , (Char
    '\224',Char
    '\9674')
      , (Char
    '\225',Char
    '\9001')
      , (Char
    '\226',Char
    '\63720')
      , (Char
    '\227',Char
    '\63721')
      , (Char
    '\228',Char
    '\63722')
      , (Char
    '\229',Char
    '\8721')
      , (Char
    '\230',Char
    '\63723')
      , (Char
    '\231',Char
    '\63724')
      , (Char
    '\232',Char
    '\63725')
      , (Char
    '\233',Char
    '\63726')
      , (Char
    '\234',Char
    '\63727')
      , (Char
    '\235',Char
    '\63728')
      , (Char
    '\236',Char
    '\63729')
      , (Char
    '\237',Char
    '\63730')
      , (Char
    '\238',Char
    '\63731')
      , (Char
    '\239',Char
    '\63732')
      , (Char
    '\241',Char
    '\9002')
      , (Char
    '\242',Char
    '\8747')
      , (Char
    '\243',Char
    '\8992')
      , (Char
    '\244',Char
    '\63733')
      , (Char
    '\245',Char
    '\8993')
      , (Char
    '\246',Char
    '\63734')
      , (Char
    '\247',Char
    '\63735')
      , (Char
    '\248',Char
    '\63736')
      , (Char
    '\249',Char
    '\63737')
      , (Char
    '\250',Char
    '\63738')
      , (Char
    '\251',Char
    '\63739')
      , (Char
    '\252',Char
    '\63740')
      , (Char
    '\253',Char
    '\63741')
      , (Char
    '\254',Char
    '\63742')]