stackage-server/Handler/Haddock.hs
2016-05-25 17:53:38 +03:00

61 lines
1.7 KiB
Haskell

module Handler.Haddock
( getHaddockR
, getHaddockBackupR
) where
import Import
import Stackage.Database
import Text.HTML.DOM (eventConduit)
import Text.XML (fromEvents)
import Data.XML.Types (Event (..), Content (..))
makeURL :: SnapName -> [Text] -> Text
makeURL slug rest = concat
$ "https://s3.amazonaws.com/haddock.stackage.org/"
: toPathPiece slug
: map (cons '/') rest
shouldRedirect :: Bool
shouldRedirect = False
getHaddockR :: SnapName -> [Text] -> Handler TypedContent
getHaddockR slug rest
| shouldRedirect = redirect $ makeURL slug rest
| final:_ <- reverse rest, ".html" `isSuffixOf` final = do
render <- getUrlRender
let stylesheet = render' $ StaticR haddock_style_css
script = render' $ StaticR haddock_script_js
render' = return . ContentText . render
addExtra t@(EventEndElement "head") =
[ EventBeginElement "link"
[ ("rel", [ContentText "stylesheet"])
, ("href", stylesheet)
]
, EventEndElement "link"
, EventBeginElement "script"
[ ("src", script)
]
, EventEndElement "script"
, t
]
addExtra t = [t]
req <- parseUrl $ unpack $ makeURL slug rest
(_, res) <- acquireResponse req >>= allocateAcquire
doc <- responseBody res
$$ eventConduit
=$ concatMapC addExtra
=$ mapC (Nothing, )
=$ fromEvents
sendResponse $ toHtml doc
| otherwise = redirect $ makeURL slug rest
getHaddockBackupR :: [Text] -> Handler ()
getHaddockBackupR rest = redirect $ concat
$ "https://s3.amazonaws.com/haddock.stackage.org"
: map (cons '/') rest