X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FWiki%2FEngine.hs;h=b6969cc4b60c3bf9aca16fe32961ce229ee68bc8;hb=605a843e408a7ef475fbb5a26f408271ab315cc8;hp=aa897e841e01b6429d9dd9fd1d5d81ebedb9f532;hpb=b3c3f333cd48bc74eb33f0f21d56a9d1bc65e0ea;p=Rakka.git diff --git a/Rakka/Wiki/Engine.hs b/Rakka/Wiki/Engine.hs index aa897e8..b6969cc 100644 --- a/Rakka/Wiki/Engine.hs +++ b/Rakka/Wiki/Engine.hs @@ -6,7 +6,6 @@ module Rakka.Wiki.Engine import Control.Arrow import Control.Arrow.ArrowIO -import Control.Arrow.ArrowTree import Data.Encoding import Data.Encoding.UTF8 import Data.Generics @@ -29,66 +28,72 @@ formatPage :: (ArrowXml a, ArrowChoice a, ArrowIO a) => -> a Page XmlTree formatPage env = proc page - -> do tree <- case pageType page of - MIMEType "text" "x-rakka" _ - -> do let source = decodeLazy UTF8 (pageContent page) - formatWikiPage env -< (pageName page, source) - attachXHtmlNs -< tree + -> do BaseURI baseURI <- getSysConfA (envSysConf env) -< () + wiki <- wikifyPage env -< page + xs <- interpretCommandsA env -< (pageName page, (Just (page, wiki), wiki)) + formatWikiBlocks -< (baseURI, xs) formatSubPage :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment - -> a (PageName, Page) XmlTree + -> a (PageName, (Maybe Page, Page)) XmlTree formatSubPage env - = proc (mainPageName, subPage) - -> do tree <- case pageType subPage of - MIMEType "text" "x-rakka" _ - -> do let source = decodeLazy UTF8 (pageContent subPage) - formatWikiPage env -< (mainPageName, source) - attachXHtmlNs -< tree - - -formatWikiPage :: (ArrowXml a, ArrowChoice a, ArrowIO a) => - Environment - -> a (PageName, String) XmlTree -formatWikiPage env - = proc (name, source) - -> do BaseURI baseURI <- getSysConfA (envSysConf env) (BaseURI undefined) -< () - interpTable <- getInterpTableA env -< () - - let parser = wikiPage (tableToFunc interpTable) - - case parse parser "" source of - Left err - -> formatParseError -< err - - Right blocks - -> do xs <- interpretCommandsA env -< (interpTable, (name, blocks)) - formatWikiBlocks -< (baseURI, xs) + = proc (mainPageName, (mainPage, subPage)) + -> do BaseURI baseURI <- getSysConfA (envSysConf env) -< () + mainWiki <- case mainPage of + Just page + -> do wiki <- wikifyPage env -< page + returnA -< Just (page, wiki) + Nothing + -> returnA -< Nothing + subWiki <- wikifyPage env -< subPage + xs <- interpretCommandsA env -< (mainPageName, (mainWiki, subWiki)) + formatWikiBlocks -< (baseURI, xs) + + +wikifyPage :: (ArrowXml a, ArrowChoice a, ArrowIO a) => + Environment + -> a Page WikiPage +wikifyPage env + = proc page + -> case pageType page of + MIMEType "text" "x-rakka" _ + -> do let source = decodeLazy UTF8 (pageContent page) + parser = wikiPage tableToFunc + + case parse parser "" source of + Left err + -> wikifyParseError -< err + + Right xs + -> returnA -< xs where - tableToFunc :: InterpTable -> String -> Maybe CommandType - tableToFunc table name - = fmap commandType (M.lookup name table) + tableToFunc :: String -> Maybe CommandType + tableToFunc name + = fmap commandType (M.lookup name (envInterpTable env)) interpretCommandsA :: ArrowIO a => Environment - -> a (InterpTable, (PageName, WikiPage)) WikiPage + -> a (PageName, (Maybe (Page, WikiPage), WikiPage)) WikiPage interpretCommandsA = arrIO3 . interpretCommands -interpretCommands :: Environment -> InterpTable -> PageName -> WikiPage -> IO WikiPage -interpretCommands _ _ _ [] = return [] -interpretCommands env table name blocks = everywhereM' (mkM interpBlockCmd) blocks - >>= - everywhereM' (mkM interpInlineCmd) +interpretCommands :: Environment -> PageName -> Maybe (Page, WikiPage) -> WikiPage -> IO WikiPage +interpretCommands _ _ _ [] = return [] +interpretCommands env name mainPageAndTree targetTree + = everywhereM' (mkM interpBlockCmd) targetTree + >>= + everywhereM' (mkM interpInlineCmd) where ctx :: InterpreterContext ctx = InterpreterContext { - ctxPageName = name - , ctxTree = blocks - , ctxStorage = envStorage env - , ctxSysConf = envSysConf env + ctxPageName = name + , ctxMainPage = fmap fst mainPageAndTree + , ctxMainTree = fmap snd mainPageAndTree + , ctxTargetTree = targetTree + , ctxStorage = envStorage env + , ctxSysConf = envSysConf env } interpBlockCmd :: BlockElement -> IO BlockElement @@ -97,7 +102,7 @@ interpretCommands env table name blocks = everywhereM' (mkM interpBlockCmd) bloc interpBlockCmd' :: BlockCommand -> IO BlockElement interpBlockCmd' cmd - = case M.lookup (bCmdName cmd) table of + = case M.lookup (bCmdName cmd) (envInterpTable env) of Nothing -> fail ("no such interpreter: " ++ bCmdName cmd) @@ -111,7 +116,7 @@ interpretCommands env table name blocks = everywhereM' (mkM interpBlockCmd) bloc interpInlineCmd' :: InlineCommand -> IO InlineElement interpInlineCmd' cmd - = case M.lookup (iCmdName cmd) table of + = case M.lookup (iCmdName cmd) (envInterpTable env) of Nothing -> fail ("no such interpreter: " ++ iCmdName cmd) @@ -124,16 +129,7 @@ everywhereM' :: Monad m => GenericM m -> GenericM m everywhereM' f x = f x >>= gmapM (everywhereM' f) -formatParseError :: ArrowXml a => a ParseError XmlTree -formatParseError - = proc err -> (eelem "pre" += txt (show err)) -<< () - - -attachXHtmlNs :: ArrowXml a => a XmlTree XmlTree -attachXHtmlNs = processBottomUp (changeQName attach') - where - attach' :: QName -> QName - attach' qn = qn { - namePrefix = "xhtml" - , namespaceUri = "http://www.w3.org/1999/xhtml" - } +wikifyParseError :: ArrowXml a => a ParseError WikiPage +wikifyParseError + = proc err -> returnA -< [Div [("class", "error")] + [ Preformatted [Text (show err)] ]]