packages feed

ampersand-3.0.0: src/lib/DatabaseDesign/Ampersand/Misc/Languages.hs

{-# OPTIONS_GHC -Wall #-}
-- | This module does some string manipulation based on natural languages
module DatabaseDesign.Ampersand.Misc.Languages
              (  Lang(English,Dutch)
               , allLangs
               , plural
              ) where
   import Data.Char (toLower)
   import Data.List (isSuffixOf)
   import DatabaseDesign.Ampersand.Core.ParseTree      (Lang(..))
   
   allLangs :: [Lang]
   allLangs = [Dutch,English] -- All supported natural languages in Ampersand


   -- | Returns the plural of a given word based on a specific language
   plural :: Lang -> String -> String
   plural English str
    | null str = str
    | last str=='y' = init str++"ies"
    | last str=='s' = str++"es"
    | last str=='x' = str++"es"
    | last str=='f' = init str++"ves"
    | otherwise     = head ([p |(s,p)<-exceptions, s==str]++[str++"s"])
    where exceptions = [("child","children"),("Child","Children"),("mouse","mice"),("Mouse","Mice"),("sheep","sheep"),("Sheep","Sheep")]
   plural Dutch str
    | null str = str
    | not (null matches)    = head matches
    | take 3 (reverse str)== reverse "ium" = (reverse.drop 3.reverse) str++"ia"
    | take 2 (reverse str) `elem` map reverse ["el", "em", "en", "er", "um", "ie"] = str++"s"
    | "ij" `isSuffixOf` str = str++"en"
    | "io" `isSuffixOf` str = str++"'s"
    | klinker (last str)    = str++"s"
    | (take 2.drop 1.reverse) str `elem` ["aa","oo","ee","uu"] = (reverse.drop 2.reverse) str++mede (drop (length str-1) str)++"en"
    | otherwise                  = str++"en"
    where mede "f" = "v"
          mede "s" = "z"
          mede x = x
          klinker c = c `elem` "aeiou"
          matches = [(reverse.drop (length s).reverse) str++p |(s,p) <-exceptions, (map toLower.reverse.take (length s).reverse) str==s]
          exceptions = [ ("aanbod", "aanbiedingen")
                       , ("beleg", "belegeringen")
                       , ("dank", "dankbetuigingen")
                       , ("gedrag", "gedragingen")
                       , ("genot", "genietingen")
                       , ("lof", "loftuitingen")
                       , ("lende", "lendenen")
                       , ("onderzoek", "onderzoekingen")
                       , ("archiefstuk", "archiefbescheiden")
                       , ("titel", "titels")
                       , ("plan", "plannen")
                       , ("kind", "kinderen")
                       ]