-- (c) Josef Svenningsson, 2005
-- Licence: No licence, public domain

-- Inspired by the following page:
-- http://www.microsoft.com/athome/security/children/kidtalk.mspx
module Lambdabot.Plugin.Novelty.Elite (elitePlugin) where

import Lambdabot.Plugin
import Lambdabot.Util

import Control.Arrow
import Control.Monad
import Data.Char
import Data.Maybe
import Text.Regex.TDFA

elitePlugin :: Module ()
elitePlugin :: Module ()
elitePlugin = forall st. Module st
newModule
    { moduleCmds :: ModuleT () LB [Command (ModuleT () LB)]
moduleCmds = forall (m :: * -> *) a. Monad m => a -> m a
return
        [ (String -> Command Identity
command String
"elite")
            { aliases :: [String]
aliases = [String
"leet", String
"l33t", String
"1337"]
            , help :: Cmd (ModuleT () LB) ()
help = forall (m :: * -> *). Monad m => String -> Cmd m ()
say String
"elite <phrase>. Translate English to elitespeak"
            , process :: String -> Cmd (ModuleT () LB) ()
process = \String
args -> case String -> [String]
words String
args of
                 [] -> forall (m :: * -> *). Monad m => String -> Cmd m ()
say String
"Say again?"
                 [String]
wds -> do let instr :: String
instr = forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower ([String] -> String
unwords [String]
wds)
                           forall (m :: * -> *). Monad m => String -> Cmd m ()
say forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (String -> IO String
translateLine String
instr)
            }
        ]
    }

translateLine :: String -> IO String
translateLine :: String -> IO String
translateLine = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace) forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO String
translate forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
' 'forall a. a -> [a] -> [a]
:)
-- extra space allows whole-word patterns to match at start

translate :: String -> IO String
translate :: String -> IO String
translate []  = forall (m :: * -> *) a. Monad m => a -> m a
return []
translate String
str = do
    let alts :: [(String, String)]
alts = [ (String -> String
subst String
match',String
rest)
               | (Regex
re, String -> String
subst) <- [(Regex, String -> String)]
ruleList
               , MatchResult String
mr <- forall a. Maybe a -> [a]
maybeToList (forall regex source target (m :: * -> *).
(RegexContext regex source target, MonadFail m) =>
regex -> source -> m target
matchM Regex
re String
str)
               , forall (t :: * -> *) a. Foldable t => t a -> Bool
null (forall a. MatchResult a -> a
mrBefore MatchResult String
mr)
               , let match' :: String
match' = forall a. MatchResult a -> a
mrMatch MatchResult String
mr
                     rest :: String
rest   = forall a. MatchResult a -> a
mrAfter MatchResult String
mr
               ]
    (String
subst,String
rest) <- forall (m :: * -> *) a. MonadIO m => [a] -> m a
random [(String, String)]
alts
    forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (String
subst forall a. [a] -> [a] -> [a]
++) (String -> IO String
translate String
rest)

ruleList :: [(Regex, String -> String)]
ruleList :: [(Regex, String -> String)]
ruleList = forall a b. (a -> b) -> [a] -> [b]
map (forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first forall regex compOpt execOpt source.
RegexMaker regex compOpt execOpt source =>
source -> regex
makeRegex)
    [ (String
".",     forall a. a -> a
id            )
    , (String
".",     forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toUpper   )
    , (String
"a",     forall a b. a -> b -> a
const String
"4"     )
    , (String
"b",     forall a b. a -> b -> a
const String
"8"     )
    , (String
" be ",  forall a b. a -> b -> a
const String
" b "   )
    , (String
"c",     forall a b. a -> b -> a
const String
"("     )
    , (String
"ck",    forall a b. a -> b -> a
const String
"xx"    )
    , (String
"cks ",  forall a b. a -> b -> a
const String
"x "    )
    , (String
"cks ",  forall a b. a -> b -> a
const String
"x0rs " )
    , (String
"cks ",  forall a b. a -> b -> a
const String
"x0rz " )
    , (String
" cool ",forall a b. a -> b -> a
const String
" kewl ")
    , (String
"e",     forall a b. a -> b -> a
const String
"3"     )
    , (String
"elite", forall a b. a -> b -> a
const String
"1337"  )
    , (String
"elite", forall a b. a -> b -> a
const String
"leet"  )
    , (String
"f",     forall a b. a -> b -> a
const String
"ph"    )
    , (String
" for ", forall a b. a -> b -> a
const String
" 4 "   )
    , (String
"g",     forall a b. a -> b -> a
const String
"9"     )
    , (String
"h",     forall a b. a -> b -> a
const String
"|-|"   )
    , (String
"k",     forall a b. a -> b -> a
const String
"x"     )
    , (String
"l",     forall a b. a -> b -> a
const String
"|"     )
    , (String
"l",     forall a b. a -> b -> a
const String
"1"     )
    , (String
"m",     forall a b. a -> b -> a
const String
"/\\/\\")
    , (String
"o",     forall a b. a -> b -> a
const String
"0"     )
    , (String
"ph",    forall a b. a -> b -> a
const String
"f"     )
    , (String
"s",     forall a b. a -> b -> a
const String
"z"     )
    , (String
"s",     forall a b. a -> b -> a
const String
"$"     )
    , (String
"s",     forall a b. a -> b -> a
const String
"5"     )
    , (String
"s ",    forall a b. a -> b -> a
const String
"z0rz " )
    , (String
"t",     forall a b. a -> b -> a
const String
"7"     )
    , (String
"t",     forall a b. a -> b -> a
const String
"+"     )
    , (String
" the ", forall a b. a -> b -> a
const String
" teh " )
    , (String
" to ",  forall a b. a -> b -> a
const String
" 2 "   )
    , (String
" to ",  forall a b. a -> b -> a
const String
" too " )
    , (String
" to ",  forall a b. a -> b -> a
const String
" tu "  )
    , (String
" too ", forall a b. a -> b -> a
const String
" to "  )
    , (String
"v",     forall a b. a -> b -> a
const String
"\\/"   )
    , (String
"w",     forall a b. a -> b -> a
const String
"\\/\\/")
    , (String
" you ", forall a b. a -> b -> a
const String
" u "   )
    , (String
" you ", forall a b. a -> b -> a
const String
" yu "  )
    , (String
" you ", forall a b. a -> b -> a
const String
" joo " )
    , (String
"z",     forall a b. a -> b -> a
const String
"s"     )
    ]