{ hunk ./happstack-blog.cabal 31 - Build-Depends: base, applicative-extras, bytestring, containers, formlets, happstack-extra, happstack-data, happstack-ixset, happstack-server, happstack-state, happstack-util, hslogger, hsp, hsx, mtl, network, old-time, old-locale, MIME, happstack, time, xml, feed, utf8-string, filepath, pandoc, URLT, formlets-hsp, QuickCheck, Consumer, imagegallery + Build-Depends: base, applicative-extras, bytestring, containers, formlets, happstack-extra, happstack-data, happstack-ixset, happstack-server, happstack-state, happstack-util, hslogger, hsp, hsx, mtl, network, old-time, old-locale, MIME, happstack, time, xml, feed, utf8-string, filepath, pandoc, URLT, formlets-hsp, QuickCheck, Consumer hunk ./happstack-blog.cabal 28 - Other-Modules: hunk ./happstack-blog.cabal 27 + Other-Modules: hunk ./demo/Main.hs 166 + hunk ./demo/Main.hs 112 - httpTid <- forkIO $ simpleHTTP (httpConf appConf) - (msum [ dir "static" $ fileServe [] (static appConf) - , implSite "/urlt/" (blogSpec (mytheme (("/urlt" ++) . toURL . SGallery . Common)) filterChan) - , seeOther "/urlt/" (toResponse "/urlt/") - ]) + httpTid <- forkIO $ simpleHTTP (httpConf appConf) (appHandler (static appConf)) hunk ./demo/Main.hs 106 - - -- start the image thumbnailing loop - -- FIXME: image/cache directories are hardcoded - (filterId, filterChan) <- startIOThread applyTransforms hunk ./demo/Main.hs 49 -data SiteURL - = SBlog BlogURL - | SGallery GalleryTL -$(deriveAsURL ''SiteURL) - --- blogSpec :: Theme (URLT BlogURL (ServerPartT IO)) -> Site SiteURL Link (ServerPartT IO) Response -blogSpec theme ioThread = - Site { handleLink = site theme ioThread - , defaultPage = SBlog TopStories - , formatLink = toURL - , parseLink = Just . fromURL - } - --- site :: Theme (URLT BlogURL (ServerPartT IO)) -> IOSiteURL -> URLT SiteURL (ServerPartT IO) Response -site theme _ioThread (SBlog blogURL) = nestURL SBlog $ blog theme blogURL -site _theme ioThread (SGallery gcURL) = nestURL SGallery $ gallery ioThread gcURL -xo --- blogHandler :: Theme (URLT BlogURL (ServerPartT IO)) -> ServerPartT IO Response --- blogHandler theme = implSite "/urlt/" (blogSpec theme) -{- -appHandler :: (GalleryCommon -> String) -> FilePath -> ServerPartT IO Response -appHandler galleryCommonURL staticDir = - msum - [ blogHandler (mytheme galleryCommonURL) - , dir "static" $ fileServe [] staticDir -- FIXME: static files have hardcode location - ] --} - --- mytheme :: (GalleryCommon -> String) -> Theme (URLT.URLT BlogURL (ServerPartT IO)) -mytheme galleryCommonURL = mkTheme galleryCommonURL Nothing "Another Haskell Blog" "All Haskell, All the Time!" template - where - template = - (nullRSS "happstack blog" "/") - { rssChannel = (nullChannel "happstack blog" "/") - { rssDescription = "Another blog" - , rssCopyright = Nothing - , rssItems = [] - } - } - - hunk ./demo/Main.hs 40 -import Text.RSS.Syntax (RSS(..), RSSChannel(..), nullRSS, nullChannel) -import URLT -import URLTH -import URLT.HandleT -import URLT.Happstack +import App.Logger (LogMode(Development),setupLogger) +import App.State (AppState(..)) +import App.Control (appHandler) hunk ./demo/Main.hs 24 --} -import Happstack.Server.URLT hunk ./demo/Main.hs 16 -import Happstack.Server hiding (parseConfig) -{- +import Happstack.Server hunk ./demo/Main.hs 8 -import Control.Monad(msum) -import Extra.IOThread -import Happstack.Blog -- (BlogURL(..), Theme(..)) -import Happstack.Blog.DefaultTheme -import Happstack.Gallery.Common -import Happstack.Gallery.Gallery hunk ./demo/Main.hs 4 -import App.Logger (LogMode(Development),setupLogger) -import App.State (AppState(..)) --- import App.Control (appHandler) hunk ./demo/Main.hs 1 -o{-# LANGUAGE TemplateHaskell #-} hunk ./demo/App/State.hs 26 - type Dependencies AppState = Blog :+: ImageStore :+: End + type Dependencies AppState = Blog :+: End hunk ./demo/App/State.hs 10 -import Happstack.Gallery.Queries -import Happstack.Gallery.Types hunk ./demo/App/Control.hs 11 + +mytheme :: Theme (URLT.URLT BlogURL (ServerPartT IO)) +mytheme = mkTheme Nothing "Another Haskell Blog" "All Haskell, All the Time!" template + where + template = + (nullRSS "happstack blog" "/") + { rssChannel = (nullChannel "happstack blog" "/") + { rssDescription = "Another blog" + , rssCopyright = Nothing + , rssItems = [] + } + } + +appHandler :: FilePath -> ServerPartT IO Response +appHandler staticDir = msum + [ blogHandler mytheme + , dir "static" $ fileServe [] staticDir -- static files + ] hunk ./demo/App/Control.hs 7 -import Happstack.Gallery.Common hunk ./Happstack/Blog/View.hs 77 - , topStories :: (XMLGenerator m) => XMLGenT m (HSX.XML m) hunk ./Happstack/Blog/View.hs 70 + hunk ./Happstack/Blog/View.hs 40 - imageF = label "image" *> - input (fmap (show . unImageId) . entryImage =<< mBlogEntry) `check` - (\str -> case str of - "" -> Success Nothing - _ -> (Just . ImageId) <$> (asInteger str)) - <* br hunk ./Happstack/Blog/View.hs 29 - (BlogEntry <$> entryIdF <*> authorF <*> titleF <*> permalinkF <*> messageF <*> dateF <*> tagsF <*> publishedF <*> imageF) <* submit "post it" + (BlogEntry <$> entryIdF <*> authorF <*> titleF <*> permalinkF <*> messageF <*> dateF <*> tagsF <*> publishedF) <* submit "post it" hunk ./Happstack/Blog/View.hs 10 -import Happstack.Gallery.Types(ImageId(..)) hunk ./Happstack/Blog/View.hs 7 -import Control.Applicative.Error hunk ./Happstack/Blog/Types/Types_000.hs 28 - { entryId :: EntryId - , author :: String - , title :: String - , permalink :: String - , message :: String - , date :: ClockTime - , tags :: [String] - , published :: Bool - , entryImage :: Maybe ImageId + { entryId :: EntryId + , author :: String + , title :: String + , permalink :: String + , message :: String + , date :: ClockTime + , tags :: [String] + , published :: Bool hunk ./Happstack/Blog/Types/Types_000.hs 10 -import Happstack.Gallery.Types (ImageId(..)) hunk ./Happstack/Blog/DefaultTheme.hs 96 - , renderEntry = renderEntry' galleryCommonURL - , renderEntries = renderEntries' galleryCommonURL + , renderEntry = renderEntry' + , renderEntries = renderEntries' hunk ./Happstack/Blog/DefaultTheme.hs 93 -mkTheme :: (Monad m) => (GalleryCommon -> String) -> Maybe UACCT -> String -> String -> RSS -> Theme (URLT BlogURL m) -mkTheme galleryCommonURL uacct blogName' siteDescription rss = +mkTheme :: (Monad m) => Maybe UACCT -> String -> String -> RSS -> Theme (URLT BlogURL m) +mkTheme uacct blogName' siteDescription rss = hunk ./Happstack/Blog/DefaultTheme.hs 58 - <% map (renderEntry' galleryCommonURL) $ sortBy ((flip compare) `on` date) (toList blogEntries) %> + <% map renderEntry' $ sortBy ((flip compare) `on` date) (toList blogEntries) %> hunk ./Happstack/Blog/DefaultTheme.hs 56 -renderEntries' galleryCommonURL blogEntries = +renderEntries' blogEntries = hunk ./Happstack/Blog/DefaultTheme.hs 44 - <% case mImage of - Nothing -> [] - (Just image) -> [
] - %> hunk ./Happstack/Blog/DefaultTheme.hs 37 -renderEntry' galleryCommonURL (BlogEntry _entryId author title permalink message postedDate _tags _published mImage) = +renderEntry' (BlogEntry _entryId author title permalink message postedDate _tags _published) = hunk ./Happstack/Blog/DefaultTheme.hs 11 -import Happstack.Gallery.View -import Happstack.Gallery.Common hunk ./Happstack/Blog/Control.hs 140 +blogSpec :: Theme (URLT BlogURL (ServerPartT IO)) -> Site BlogURL Link (ServerPartT IO) Response +blogSpec theme = + Site { handleLink = blog theme + , defaultPage = TopStories + , formatLink = toURL + , parseLink = Just . fromURL + } + +blogHandler :: Theme (URLT BlogURL (ServerPartT IO)) -> ServerPartT IO Response +blogHandler theme = implSite "/urlt/" (blogSpec theme) + hunk ./Happstack/Blog/Control.hs 103 -blog theme TopStories = - do xml <- unXMLGenT (topStories theme) - ok =<< webHSP (withMetaData html4Strict $ return xml) - +blog theme TopStories = ok =<< renderFromBody (blogName theme) (pageFromBody theme) =<< (getEntries theme) hunk ./Happstack/Blog/Control.hs 20 -import Happstack.Server.HSP.HTML (webHSP) hunk ./Happstack/Blog/Control.hs 14 -import Happstack.Blog.View (Theme(blogName, pageFromBody, renderEntry, renderEntries, rssTemplate, topStories), blogPostForm,renderFromBody) +import Happstack.Blog.View (Theme(blogName, pageFromBody, renderEntry, renderEntries, rssTemplate), blogPostForm,renderFromBody) }