module Language.Lojban.Util
(
lujvoSelrafsis
,lujvosSelrafsi
,lujvosSelrafsis
,lujvosSelrafsis'
,findGismu
,findCmavo
,findSelrafsi
,filterSelma'o
,valsiByGloss
,grammar
,translate
,wordType
,lujvoAndRate
,selma'oInfo
,isValidLojban)
where
import Utils
import Language.Lojban.Jbovlaste
import Control.Arrow
import Data.Char
import Data.List
import Text.Regex
import Data.Ord
valsiByGloss :: JboDB -> String -> [JboValsi]
valsiByGloss db s = sortBy (comparing valsiType) $ filterValsi db match where
match e = any (isInfixWord s) (valsiGloss e)
isInfixWord s = any (==s) . words
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 | any isDigit s = lower
| otherwise = 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"
isValidLojban :: String -> IO Bool
isValidLojban line = do
out <- grammar line
case out of
Right (_,"") -> return $ False
_ -> return $ True
lojbanic = filter good where
good c = isLetter c || c == '\'' || c == ' '
lower = map toLower
upper = map toUpper