{-# LANGUAGE OverloadedStrings #-} -- | Lists the package page similar to Hackage. module Handler.Package ( getPackageR , getPackageSnapshotsR , packagePage , getPackageBadgeR ) where import Data.Char import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.Text.Lazy as LT import Distribution.Package.ModuleForest import Graphics.Badge.Barrier import Control.Lens import Import import qualified Text.Blaze.Html.Renderer.Text as LT import Text.Email.Validate import Stackage.Database -- | Page metadata package. getPackageR :: PackageName -> Handler Html getPackageR = packagePage Nothing getPackageBadgeR :: PackageName -> SnapshotBranch -> Handler TypedContent getPackageBadgeR pname branch = do cacheSeconds (3 * 60 * 60) snapName <- maybe notFound pure =<< newestSnapshot branch Entity sid _ <- maybe notFound pure =<< lookupSnapshot snapName mVersion <- do mSnapPackage <- lookupSnapshotPackage sid (unPackageName pname) pure (Version . snapshotPackageVersion . entityVal <$> mSnapPackage) mLabel <- lookupGetParam "label" mStyle <- lookupGetParam "style" respond typeSvg $ case mStyle of Just "plastic" -> renderStackageBadge plastic mLabel snapName mVersion Just "flat-square" -> renderStackageBadge flatSquare mLabel snapName mVersion _ -> renderStackageBadge flat mLabel snapName mVersion renderStackageBadge :: (Badge b, HasRightColor b) => b -- ^ Style -> Maybe Text -- ^ Label -> SnapName -> Maybe Version -> LByteString renderStackageBadge style mLabel snapName = \case Nothing -> renderBadge (style & right .~ lightgray) badgeLabel "not available" Just (Version x) -> renderBadge style badgeLabel x where badgeLabel = fromMaybe "stackage" mLabel <> " " <> badgeSnapName snapName badgeSnapName (SNNightly _) = "nightly" badgeSnapName (SNLts x _) = "lts-" <> tshow x packagePage :: Maybe (SnapName, Version) -> PackageName -> Handler Html packagePage mversion pname = do let pname' = toPathPiece pname (deprecated, inFavourOf) <- getDeprecated pname' latests <- getLatests pname' deps' <- getDeps pname' revdeps' <- getRevDeps pname' Entity _ package <- getPackage pname' >>= maybe notFound return mdocs <- case mversion of Just (sname, version) -> do ms <- getPackageModules sname pname' return $ Just (sname, toPathPiece version, ms) Nothing -> case latests of li:_ -> do ms <- getPackageModules (liSnapName li) pname' return $ Just (liSnapName li, liVersion li, ms) [] -> return Nothing let ixInFavourOf = zip [0::Int ..] inFavourOf displayedVersion = maybe (packageLatest package) (toPathPiece . snd) mversion let homepage = case T.strip (packageHomepage package) of x | null x -> Nothing | otherwise -> Just x synopsis = packageSynopsis package deps = enumerate deps' revdeps = enumerate revdeps' authors = enumerate (parseIdentitiesLiberally (packageAuthor package)) maintainers = let ms = enumerate (parseIdentitiesLiberally (packageMaintainer package)) in if ms == authors then [] else ms defaultLayout $ do setTitle $ toHtml pname $(combineScripts 'StaticR [ js_highlight_js ]) $(combineStylesheets 'StaticR [ css_font_awesome_min_css , css_highlight_github_css ]) let pn = pname toPkgVer x y = concat [x, "-", y] $(widgetFile "package") where enumerate = zip [0::Int ..] renderModules sname version = renderForest [] . moduleForest . map moduleName where renderForest _ [] = mempty renderForest pathRev trees = [hamlet|