{-# LANGUAGE ForeignFunctionInterface,CPP #-} module Unicode where import Data.List import Data.Maybe import qualified Data.Text as T import qualified Data.Text.IO as IO import Foreign.C.String import Numeric import System.Directory import System.Environment.Blank import System.IO import System.IO.Unsafe xdgDataHome :: IO [Char] xdgDataHome = (getEnv "XDG_DATA_HOME") >>= \s-> return ((case s of Nothing -> "~/.local/share" Just x -> if x == "" then "~/.local/share" else x) ++ "/pickme") dataFile :: [Char] -> IO [Char] dataFile name = xdgDataHome >>= (return . flip (++) ("/" ++ name)) unicodeDataPath :: IO [Char] unicodeDataPath = dataFile "UnicodeData.txt" scsvField :: Int -> T.Text -> T.Text scsvField n t = (T.splitOn (T.pack ";") t)!!n unicodeCharacters :: IO [T.Text] unicodeCharacters = unicodeDataPath >>= IO.readFile >>= return . T.lines characterNames :: IO [T.Text] characterNames = unicodeCharacters >>= \cs -> return $ map (scsvField 1) cs searchCharacterByName :: CString -> IO CString searchCharacterByName s = peekCString s >>= \z -> characterNames >>= \cns -> unicodeCharacters >>= \ucs -> newCString $ map (\x -> toEnum . fst . (!!0) . readHex $ T.unpack (ucs!!(fromJust $ elemIndex x cns))) (filter (\s' -> T.isInfixOf ((T.toUpper . T.pack) z) s') cns) foreign export ccall searchCharacterByName :: CString -> IO CString favoritesPath :: IO [Char] favoritesPath = dataFile "favorites" favoriteEmojis :: IO CString favoriteEmojis = favoritesPath >>= doesFileExist >>= \ bool -> case bool of True -> favoritesPath >>= flip openFile ReadMode >>= hGetLine >>= newCString False -> newCString "" foreign export ccall favoriteEmojis :: IO CString