module Language.Lojban.Util
(
lujvoSelrafsis
,lujvosSelrafsi
,lujvosSelrafsis
,lujvosSelrafsis'
,findGismu
,findCmavo
,findSelrafsi
,filterSelma'o
,grammar
,translate
,wordType
,lujvoAndRate
,selma'oInfo)
where
import Utils
import Language.Lojban.Jbovlaste
import Control.Arrow
import Data.Char
import Data.List
import Text.Regex
lujvoSelrafsis :: JboDB -> String -> Maybe [JboValsi]
lujvoSelrafsis db = list Nothing (Just . valsiSelrafsis . head) . valsi db
lujvosSelrafsi :: JboDB
-> String
-> [JboValsi]
lujvosSelrafsi db w = filterValsi db (any ((==w) . valsiWord) . valsiSelrafsis)
lujvosSelrafsis :: JboDB
-> [String]
-> [JboValsi]
lujvosSelrafsis db ws = filterValsi db (any (flip elem ws . valsiWord) . valsiSelrafsis)
lujvosSelrafsis' :: JboDB
-> [String]
-> [JboValsi]
lujvosSelrafsis' db ws = filterValsi db ((==ws) . map valsiWord . valsiSelrafsis)
findGismu :: JboDB -> String -> Maybe JboValsi
findGismu db w = findValsi db gismu where
gismu v = valsiType v == GismuType && valsiWord v == w
findCmavo :: JboDB -> String -> Maybe JboValsi
findCmavo db w = findValsi db cmavo where
cmavo v = valsiType v == CmavoType && valsiWord v == w
findSelrafsi :: JboDB -> String -> Maybe JboValsi
findSelrafsi db w = findValsi db selrafsi where
selrafsi v = (valsiType v == CmavoType || valsiType v == GismuType)
&& (any (==w) (valsiRafsis v)
||
(length w >= 4 &&
valsiType v == GismuType && w `isPrefixOf` valsiWord v))
filterSelma'o :: JboDB -> String -> [JboValsi]
filterSelma'o db s = filterValsi db selma'o where
selma'o v = valsiType v == CmavoType && fmap format (valsiSelma'o v) == Just (format s)
where format = filter isLetter . lower
grammar :: String
-> IO (Either String (String,String))
grammar = run "jbofihe -ie"
translate :: String
-> IO (Either String (String,String))
translate = run "jbofihe -x"
wordType :: String
-> IO (Either String String)
wordType w = do
r <- run ("vlatai \"" ++ (lojbanic w) ++ "\"") ""
case r of
Right ("",v) -> return . Right . unwords . words $ v
Right (e,_) -> return $ Left e
Left e -> return $ Left e
lujvoAndRate :: [String]
-> IO (Either String [(Int,String)])
lujvoAndRate ws = do
let selrafsis = unwords $ map (("\""++) . (++"\"") . lojbanic) ws
r <- run ("jvocuhadju " ++ selrafsis ++ "") ""
case r of
Right ("",g) -> return $ Right $ map (rating . trim) $ dropWhile (not . any isDigit) $ lines $ g
Right (e,_) -> return $ Left e
Left e -> return $ Left e
where rating = (read *** tail) . break isSpace
selma'oInfo :: String -> IO (Either String String)
selma'oInfo s = do
r <- run ("mahotci -i \"" ++ upper (lojbanic s) ++ "\"") ""
case r of
Right ("",good) -> return $ Right (format good)
Right (bad,_) -> return $ Left $ "no entry for \"" ++ s ++ "\""
Left _ -> return $ Left "mahotci pipe error"
where format = flip (subRegex r1) "\n" . flip (subRegex r) "\\1 \\2"
r = mkRegex "([^\n])\n([^\n])"
r1 = mkRegex "\n\n"
lojbanic = filter good where
good c = isLetter c || c == '\'' || c == ' '
lower = map toLower
upper = map toUpper