-- (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 = newModule { moduleCmds = return [ (command "elite") { aliases = ["leet", "l33t", "1337"] , help = say "elite . Translate English to elitespeak" , process = \args -> case words args of [] -> say "Say again?" wds -> do let instr = map toLower (unwords wds) say =<< io (translateLine instr) } ] } translateLine :: String -> IO String translateLine = fmap (dropWhile isSpace) . translate . (' ':) -- extra space allows whole-word patterns to match at start translate :: String -> IO String translate [] = return [] translate str = do let alts = [ (subst match',rest) | (re, subst) <- ruleList , mr <- maybeToList (matchM re str) , null (mrBefore mr) , let match' = mrMatch mr rest = mrAfter mr ] (subst,rest) <- random alts liftM (subst ++) (translate rest) ruleList :: [(Regex, String -> String)] ruleList = map (first makeRegex) [ (".", id ) , (".", map toUpper ) , ("a", const "4" ) , ("b", const "8" ) , (" be ", const " b " ) , ("c", const "(" ) , ("ck", const "xx" ) , ("cks ", const "x " ) , ("cks ", const "x0rs " ) , ("cks ", const "x0rz " ) , (" cool ",const " kewl ") , ("e", const "3" ) , ("elite", const "1337" ) , ("elite", const "leet" ) , ("f", const "ph" ) , (" for ", const " 4 " ) , ("g", const "9" ) , ("h", const "|-|" ) , ("k", const "x" ) , ("l", const "|" ) , ("l", const "1" ) , ("m", const "/\\/\\") , ("o", const "0" ) , ("ph", const "f" ) , ("s", const "z" ) , ("s", const "$" ) , ("s", const "5" ) , ("s ", const "z0rz " ) , ("t", const "7" ) , ("t", const "+" ) , (" the ", const " teh " ) , (" to ", const " 2 " ) , (" to ", const " too " ) , (" to ", const " tu " ) , (" too ", const " to " ) , ("v", const "\\/" ) , ("w", const "\\/\\/") , (" you ", const " u " ) , (" you ", const " yu " ) , (" you ", const " joo " ) , ("z", const "s" ) ]