diff options
Diffstat (limited to 'unicode.hs')
-rw-r--r-- | unicode.hs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/unicode.hs b/unicode.hs new file mode 100644 index 0000000..cd58fec --- /dev/null +++ b/unicode.hs @@ -0,0 +1,37 @@ +{-# 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.Environment.Blank +import System.IO.Unsafe + +unicodeDataPath = (getEnv "XDG_DATA_HOME") >>= \s -> return ( + (case s of + Nothing -> "~/.local/share" + Just x -> if x == "" then "~/.local/share" else x) + ++ "/pickme/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 |