blob: cd58fec9049c03e56e55fa0d2a13df062ef6fde4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
|