{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -F -pgmFhsx2hs #-}
module Clckwrks.Bugs.PreProcess where
import Control.Monad.Trans
import Control.Applicative
import Clckwrks (ClckT, ClckState)
import Clckwrks.Bugs.URL (BugsURL(..))
import Clckwrks.Bugs.Page.Timeline (timelineWidget)
import Clckwrks.Bugs.Types (BugId(..))
import Clckwrks.Monad (transform, segments)
import Data.Attoparsec.Text.Lazy (Parser, Result(..), char, choice, decimal, parse, skipMany, space, asciiCI, skipMany)
import Data.Monoid (mconcat, mempty)
import Data.Text (Text, pack)
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Data.Text.Lazy.Builder (Builder)
import qualified Data.Text.Lazy.Builder as B
import HSP.HTML4 (renderAsHTML)
import HSP.XML
import HSP.XMLGenerator
import Web.Routes (showURL)
data BugsCmd
= ShowBug BugId
| ShowTimeline
parseAttr :: Text -> Parser ()
parseAttr name =
do skipMany space
asciiCI name
skipMany space
char '='
skipMany space
{-
bugsCmd :: (BugsURL -> [(Text, Maybe Text)] -> Text) -> Parser Builder
bugsCmd showBugsURL =
bugId showBugsURL
bugId :: (BugsURL -> [(Text, Maybe Text)] -> Text) -> Parser Builder
bugId showBugsURL =
do parseAttr "id"
bid <- BugId <$> decimal
let html = evalIdentity $ #<% show $ unBugId bid %>
return $ B.fromString $ concat $ lines $ renderAsHTML html
-}
parseCmd :: Parser BugsCmd
parseCmd =
choice [ parseAttr (pack "id") *> (ShowBug . BugId <$> decimal)
, asciiCI (pack "timeline") *> pure ShowTimeline
]
bugsCmd :: (Functor m, Monad m) =>
(BugsURL -> [(Text, Maybe Text)] -> Text)
-> TL.Text
-> ClckT url m TL.Text
bugsCmd bugsShowURL txt =
case parse (segments "bugs" parseCmd) txt of
(Fail _ _ e) -> return (TL.pack e)
(Done _ segments) ->
do b <- transform (applyCmd bugsShowURL) segments
return $ B.toLazyText b
applyCmd bugsShowURL (ShowBug bid) =
do html <- unXMLGenT $ #<% show $ unBugId bid %>
return $ mconcat $ map B.fromLazyText $ TL.lines $ renderAsHTML html
{-
applyCmd bugsShowURL ShowTimeline =
do html <- unXMLGenT $ timelineWidget
return $ B.fromString $ concat $ lines $ renderAsHTML html
-}
-- timeline ::
-- timeline
{-
parseCmd :: Parser BugsCmd
parseCmd =
choice [ parseAttr (pack "id") *> (ShowBug . BugId <$> decimal)
, stringCI (pack "timeline") *> pure ShowTimeline
]
data BugsCmd
= ShowBug BugId
| ShowTimeline
bugsCmd :: (Functor m, Monad m) => (BugsURL -> [(Text, Maybe Text)] -> Text) -> Text -> ClckT url m Builder
bugsCmd
showURLFn txt =
do let mi = parseOnly parseCmd txt
case mi of
(Left e) ->
return $ B.fromString e -- FIXME: format the error more nicely or something?
(Right (ShowBug bid)) ->
do html <- unXMLGenT $ #<% show $ unBugId bid %>
return $ B.fromString $ concat $ lines $ renderAsHTML html
{-
-- types are not setup to allow us to do this yet :(
(Right ShowTimeline) ->
do html <- unXMLGenT $ timelineWidget
return $ B.fromString $ concat $ lines $ renderAsHTML html
-}
-}