diff --git a/HyperNerd.cabal b/HyperNerd.cabal index 989ef13..8b11ba1 100644 --- a/HyperNerd.cabal +++ b/HyperNerd.cabal @@ -108,6 +108,7 @@ executable HyperNerd , Bot.Asciify , Free , OrgMode + , Bot.Flip -- LANGUAGE extensions used by modules in this package. other-extensions: OverloadedStrings diff --git a/src/Bot/CustomCommand.hs b/src/Bot/CustomCommand.hs index 4adb912..d4f85b1 100644 --- a/src/Bot/CustomCommand.hs +++ b/src/Bot/CustomCommand.hs @@ -12,6 +12,7 @@ module Bot.CustomCommand ) where import Bot.Expr +import Bot.Flip import Bot.Replies import Command import Control.Monad @@ -179,6 +180,8 @@ evalExpr vars (FunCallExpr "or" args) = fromMaybe "" $ listToMaybe $ dropWhile T.null $ map (evalExpr vars) args evalExpr vars (FunCallExpr "urlencode" args) = T.concat $ map (T.pack . URI.encode . T.unpack . evalExpr vars) args +evalExpr vars (FunCallExpr "flip" args) = + T.concat $ map (flipText . evalExpr vars) args evalExpr vars (FunCallExpr funame _) = fromMaybe "" $ M.lookup funame vars expandVars :: M.Map T.Text T.Text -> [Expr] -> T.Text diff --git a/src/Bot/Flip.hs b/src/Bot/Flip.hs new file mode 100644 index 0000000..b0581b6 --- /dev/null +++ b/src/Bot/Flip.hs @@ -0,0 +1,72 @@ +module Bot.Flip where + +import qualified Data.Map as M +import Data.Maybe +import qualified Data.Text as T + +-- https://github.com/doherty/Text-UpsideDown/blob/master/lib/Text/UpsideDown.pm +-- http://www.fileformat.info/convert/text/upside-down-map.htm +flipText :: T.Text -> T.Text +flipText = T.map (\x -> fromMaybe x $ M.lookup x table) . T.reverse + +table :: M.Map Char Char +table = + M.fromList + [ ('\x0021', '\x00A1') + , ('\x0022', '\x201E') + , ('\x0026', '\x214B') + , ('\x0027', '\x002C') + , ('\x0028', '\x0029') + , ('\x002E', '\x02D9') + , ('\x0033', '\x0190') + , ('\x0034', '\x152D') + , ('\x0036', '\x0039') + , ('\x0037', '\x2C62') + , ('\x003B', '\x061B') + , ('\x003C', '\x003E') + , ('\x003F', '\x00BF') + , ('\x0041', '\x2200') + , ('\x0042', '\x10412') + , ('\x0043', '\x2183') + , ('\x0044', '\x25D6') + , ('\x0045', '\x018E') + , ('\x0046', '\x2132') + , ('\x0047', '\x2141') + , ('\x004A', '\x017F') + , ('\x004B', '\x22CA') + , ('\x004C', '\x2142') + , ('\x004D', '\x0057') + , ('\x004E', '\x1D0E') + , ('\x0050', '\x0500') + , ('\x0051', '\x038C') + , ('\x0052', '\x1D1A') + , ('\x0054', '\x22A5') + , ('\x0055', '\x2229') + , ('\x0056', '\x1D27') + , ('\x0059', '\x2144') + , ('\x005B', '\x005D') + , ('\x005F', '\x203E') + , ('\x0061', '\x0250') + , ('\x0062', '\x0071') + , ('\x0063', '\x0254') + , ('\x0064', '\x0070') + , ('\x0065', '\x01DD') + , ('\x0066', '\x025F') + , ('\x0067', '\x0183') + , ('\x0068', '\x0265') + , ('\x0069', '\x0131') + , ('\x006A', '\x027E') + , ('\x006B', '\x029E') + , ('\x006C', '\x0283') + , ('\x006D', '\x026F') + , ('\x006E', '\x0075') + , ('\x0072', '\x0279') + , ('\x0074', '\x0287') + , ('\x0076', '\x028C') + , ('\x0077', '\x028D') + , ('\x0079', '\x028E') + , ('\x007B', '\x007D') + , ('\x203F', '\x2040') + , ('\x2045', '\x2046') + , ('\x2234', '\x2235') + ]