corebot-bliki-0.2: src/Yesod/CoreBot/Bliki.hs
module Yesod.CoreBot.Bliki ( mk_bliki
, default_blog_entry
, indirect_load
, Bliki_(..)
, module Yesod.CoreBot.Bliki.Config
, module Yesod.CoreBot.Bliki.Resources.Base
) where
import Yesod.CoreBot.Bliki.Prelude
import Yesod.CoreBot.Bliki.Base
import Yesod.CoreBot.Bliki.Config
import Yesod.CoreBot.Bliki.Resources.Base
import qualified Yesod.CoreBot.Bliki.Resources.Blog as Blog
import qualified Yesod.CoreBot.Bliki.Resources.Data as Data
import qualified Yesod.CoreBot.Bliki.Resources.Static as Static
import qualified Yesod.CoreBot.Bliki.Resources.Wiki as Wiki
import qualified Data.Text as Text
import qualified Data.Text.Encoding
-- | Constructs a Bliki component given the config.
--
-- This is parameterised by the Yesod app. Represented by the "master" type variable. With this type
-- and the routes in Config the Bliki can coordinate between other subsites of the app. The other
-- subsites support the resources required by the bliki.
--
-- This would not need the routes in Config and the master type if a Bliki was entirely represented
-- by a single Yesod subsite. I did not find that this provided the flexibility I wanted to
-- supported both the the REST URIs for corebotllc.com and the URIs other people might want.
--
-- For an example of how a Bliki is constructed and integrated into a Yesod app see DefaultMain.hs
mk_bliki :: Yesod master
=> Config master
-> IO ( Bliki_ master )
mk_bliki config = do
src_data <- Data.mk_data config
blog <- Blog.mk_blog src_data
wiki <- Wiki.mk_wiki src_data
return Bliki { data_res = src_data
, blog_res = blog
, wiki_res = wiki
}
getMainR = do
bliki <- getYesodSub
defaultLayout $ do
default_blog_entry bliki
indirect_load bliki data_R = do
let cfg = config $ data_res bliki
base_URL <- approot <$> ( lift getYesod )
let wiki_node_URL = render_absolute_URL base_URL $ data_routes cfg $ EntryLatestR []
addScript $ static_routes cfg $ FileR "jquery.min.js"
addScript $ static_routes cfg $ FileR "indirect_load.js"
-- XXX: the $(.blog_content) is not specific enough. Needs to be exactly the element tied to
-- this data_R
addHamletHead [hamlet|
<script>
\$(document).ready( function()
{
\$.get ( "@{data_R}"
, function( data )
{
\$(".blog_content").html(data);
process_HTML_for_wiki(data, $(".blog_content"), "#{wiki_node_URL}");
}
, 'html'
);
} );
|]
default_blog_entry bliki = do
let cfg = config $ data_res bliki
data_R = data_routes cfg $ LatestR
indirect_load bliki data_R
[whamlet|
<div .blog_content>
Loading
<a href=@{data_R}>
latest blog entry
\ HTML content.
|]
mkYesodSubDispatch "Bliki_ master" [] [parseRoutes|
/ MainR GET
|]