packages feed

panda-0.0.0.3: Panda/Controller/Application.hs

{-# OPTIONS -fno-monomorphism-restriction #-}

module Panda.Controller.Application where

import qualified Data.Map as Map

-- env
import Panda.Helper.Env
import Prelude hiding ((.), (/), id)
import Panda.Type.State hiding (pager)
import qualified Panda.Config.Global as Config
import qualified Panda.Type.Pager as Pager

-- model
import qualified Panda.Model.Post as Post
import qualified Panda.Model.Tag as Tag

-- view
import qualified Panda.View.Theme.BluePrint.Post as PostV
import qualified Panda.View.Theme.BluePrint.Template.Template as T
import qualified Panda.View.Theme.BluePrint.Static as StaticV
import qualified Panda.View.Theme.BluePrint.Tag as TagV
import qualified Panda.View.Theme.BluePrint.Search as SearchV
import qualified Panda.View.RSS as RSSV



blog_regex = "^/[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
  
pages = 
  [ ("^/$"                  ,index             )
  , ("^/([?].+$)?$"         ,index             )
  , ("^/rss.xml$"           ,index_feed        )
  , (blog_regex             ,blog              )
  , ("^/static/."           ,static            )
  , ("^/tag/.*/rss.xml$"    ,tag_feed          )
  , ("^/tag/."              ,tag               )
  , ("^/search"             ,search            )
  ]

per_page = Config.per_page

index = do
  blogs <- Post.list.liftIO
  p <- pager per_page $ blogs.length
  tags <- Tag.list.liftIO
  let nav = if p.Pager.current == 1 then Home else Other
  let state = State Config.blog_id p tags nav
  
  blogs.map (Tag.fill_tag tags) .PostV.list state .output_html

index_feed = do
  blogs <- Post.list.liftIO
  blogs.RSSV.rss.output


blog = do
  id <- uri <.> ("blog/" ++)
  blog <- Post.get id .liftIO
  tags <- Tag.list.liftIO
  
  let state = State id Pager.empty tags Other
  blog.Tag.fill_tag tags .PostV.view state .output_html

static = do
  id <- uri
  tags <- Tag.list.liftIO
  
  let nav = if id.split "/" .tail.join "/" == "about" then About else Other
  let state = State id Pager.empty tags nav
  (Config.flat_uri / id) .readFile .liftIO <.> StaticV.view state >>= output_html

tag = do
  id <- uri
  tags <- Tag.list.liftIO
  let tag_name = Tag.id_to_name id
  case Tag.tag_map' tags .Map.lookup tag_name of
    Nothing -> "page not found" .output
    Just blog_set -> do
      blogs <- blog_set.to_list.rsort.mapM (Post.get) .liftIO <.> map (Tag.fill_tag tags)
      p <- pager per_page $ blogs.length
      let state = State id p tags Other
      blogs.TagV.view state.output_html

tag_feed = do
  id <- uri <.> (split "/" >>> init >>> join "/")
  tags <- Tag.list.liftIO
  let tag_name = Tag.id_to_name id
  case Tag.tag_map' tags .Map.lookup tag_name of
    Nothing -> "page not found" .output
    Just blog_set -> do
      blogs <- blog_set.to_list.rsort.mapM (Post.get) .liftIO <.> map (Tag.fill_tag tags)
      blogs.RSSV.rss.output

search = do
  s <- param_with_default "s" ""
  blogs <- Post.search s .liftIO

  p <- pager per_page $ blogs.length
  tags <- Tag.list.liftIO
  query <- uri
  let state = State query p tags Other

  blogs.map (Tag.fill_tag tags) .SearchV.view state s.output_html