1
0
forked from GitHub/gf-core

Added first version of the GF FastCGI server.

This commit is contained in:
bjorn
2008-08-14 09:06:26 +00:00
parent 77270a010a
commit a7aa8fb981
5 changed files with 537 additions and 0 deletions

53
src/server/MainFastCGI.hs Normal file
View File

@@ -0,0 +1,53 @@
import PGF
import FastCGIUtils
import Network.CGI hiding (Language)
import Text.JSON
import qualified Codec.Binary.UTF8.String as UTF8 (encodeString)
import Data.Maybe
grammarFile :: FilePath
grammarFile = "grammar.pgf"
newtype Record a = Record { unRecord :: [(String,a)] }
type Translation = Record [Record String]
instance JSON a => JSON (Record a) where
readJSON = fmap (Record . fromJSObject) . readJSON
showJSON = showJSON . toJSObject . unRecord
main :: IO ()
main = do initFastCGI
r <- newDataRef
loopFastCGI (fcgiMain r)
fcgiMain :: DataRef PGF -> CGI CGIResult
fcgiMain ref = getData readPGF ref grammarFile >>= cgiMain
cgiMain :: PGF -> CGI CGIResult
cgiMain pgf =
do path <- pathInfo
case path of
"/translate" -> do input <- fmap (fromMaybe "") $ getInput "input"
mcat <- getInput "cat"
mfrom <- getInput "from"
mto <- getInput "to"
outputJSON $ translate pgf input mcat mfrom mto
_ -> outputNotFound path
outputJSON :: JSON a => a -> CGI CGIResult
outputJSON x = do setHeader "Content-Type" "text/json; charset=utf-8"
output $ UTF8.encodeString $ encode x
translate :: PGF -> String -> Maybe Category -> Maybe Language -> Maybe Language -> Translation
translate pgf input mcat mfrom mto =
Record [(from, [Record [(to, linearize pgf to tree) | to <- toLangs] | tree <- parse pgf from cat input])
| from <- fromLangs]
where cat = fromMaybe (startCat pgf) mcat
fromLangs = maybe (languages pgf) (:[]) mfrom
toLangs = maybe (languages pgf) (:[]) mfrom