module Text.SpellingSuggest (
PhoneticCoder, SpellingDictionary(FlatFile, WordList),
SearchParams(..), defaultSearchParams,
findPhoneticCoder, defaultPhoneticCoder, defaultWordFilter,
dictionaryIsDB, openDictionary, closeDictionary,
suggest, suggestFromList,
nearbyWordFilter, anyWordFilter,
defaultDB, defaultDictionary
) where
import Data.List
import Text.SpellingSuggest.Dictionary
import Text.SpellingSuggest.LowLevel
import Text.SpellingSuggest.PCDB
data PhoneticCoder = PhoneticCoder {
phoneticCoderName :: String,
phoneticCoderOp :: SpellingWordCoder }
phoneticCoderPhonix :: PhoneticCoder
phoneticCoderPhonix = PhoneticCoder {
phoneticCoderName = "phonix",
phoneticCoderOp = phonix }
phoneticCoderSoundex :: PhoneticCoder
phoneticCoderSoundex = PhoneticCoder {
phoneticCoderName = "soundex",
phoneticCoderOp = soundex True }
phoneticCoders :: [PhoneticCoder]
phoneticCoders =
[phoneticCoderPhonix, phoneticCoderSoundex]
findPhoneticCoder :: String -> Maybe PhoneticCoder
findPhoneticCoder name =
find ((name ==) . phoneticCoderName) phoneticCoders
data SearchParams = SearchParams {
searchParamsFilter :: SpellingWordFilter,
searchParamsCoder :: PhoneticCoder,
searchParamsChoices :: Int }
defaultPhoneticCoder :: PhoneticCoder
defaultPhoneticCoder = phoneticCoderPhonix
defaultWordFilter :: SpellingWordFilter
defaultWordFilter = nearbyWordFilter
defaultSearchParams :: SearchParams
defaultSearchParams = SearchParams {
searchParamsFilter = defaultWordFilter,
searchParamsCoder = defaultPhoneticCoder,
searchParamsChoices = 3 }
data SpellingDictionary = WordList [String] |
FlatFile String |
SpellingDatabase DBConnection
dictionaryIsDB :: SpellingDictionary -> Bool
dictionaryIsDB (SpellingDatabase _) = True
dictionaryIsDB _ = False
openDictionary :: Maybe String -> Maybe String -> IO SpellingDictionary
openDictionary dbPath dictPath = do
mdb <- openDB dbPath
case mdb of
Just db -> return $ SpellingDatabase db
Nothing -> do
dict <- readDictionary dictPath
return $ WordList dict
closeDictionary :: SpellingDictionary -> IO ()
closeDictionary (SpellingDatabase db) = closeDB db
closeDictionary _ = return ()
suggest :: SearchParams -> SpellingDictionary -> String -> IO [String]
suggest parms db word = do
ws <- wordsFromDict db
return $ suggestFromList parms ws word
where
coder = searchParamsCoder parms
wordsFromDict (FlatFile path) =
readFile path >>= return . lines
wordsFromDict (WordList ws) =
return ws
wordsFromDict (SpellingDatabase sdb) =
let cn = phoneticCoderName coder in
matchDB sdb cn $ phoneticCoderOp coder word
suggestFromList :: SearchParams -> [String] -> String -> [String]
suggestFromList parms ws word =
take (searchParamsChoices parms) $
tryWord (searchParamsFilter parms) op word ws
where
op = phoneticCoderOp $ searchParamsCoder parms