{-# LANGUAGE QuasiQuotes, TypeFamilies #-} module Nirum.Targets.Docs ( Docs , blockToHtml , makeFilePath , makeUri , moduleTitle ) where import Data.Maybe (mapMaybe) import GHC.Exts (IsList (fromList, toList)) import qualified Data.ByteString as BS import Data.ByteString.Lazy (toStrict) import qualified Text.Email.Parser as E import Data.Map.Strict (Map, union) import qualified Data.Text as T import qualified Data.Text.Lazy as TL import Data.Text.Encoding (decodeUtf8, encodeUtf8) import System.FilePath ((>)) import Text.Blaze (ToMarkup (preEscapedToMarkup)) import Text.Blaze.Html.Renderer.Utf8 (renderHtml) import Text.Cassius import Text.Hamlet (Html, shamlet) import Nirum.Constructs (Construct (toCode)) import Nirum.Constructs.Declaration (Documented (docsBlock)) import qualified Nirum.Constructs.Declaration as DE import qualified Nirum.Constructs.DeclarationSet as DES import qualified Nirum.Constructs.Docs as D import Nirum.Constructs.Identifier ( Identifier , toNormalizedString , toNormalizedText ) import Nirum.Constructs.Module (Module (Module, docs)) import Nirum.Constructs.ModulePath (ModulePath) import Nirum.Constructs.Name (Name (facialName)) import qualified Nirum.Constructs.Service as S import qualified Nirum.Constructs.TypeDeclaration as TD import qualified Nirum.Constructs.TypeExpression as TE import Nirum.Docs ( Block (Heading) , filterReferences , trimTitle ) import Nirum.Docs.Html (render, renderInlines) import Nirum.Package import Nirum.Package.Metadata ( Author (Author, email, name, uri) , Metadata (authors) , Target ( CompileError , CompileResult , compilePackage , parseTarget , showCompileError , targetName , toByteString ) , stringField ) import qualified Nirum.Package.ModuleSet as MS import Nirum.TypeInstance.BoundModule import Nirum.Version (versionText) newtype Docs = Docs { docsTitle :: T.Text } deriving (Eq, Ord, Show) type Error = T.Text data CurrentPage = IndexPage | ModulePage ModulePath deriving (Eq, Show) makeFilePath :: ModulePath -> FilePath makeFilePath modulePath' = foldl (>) "" $ map toNormalizedString (toList modulePath') ++ ["index.html"] -- FIXME: remove trailing index.html on production makeUri :: ModulePath -> T.Text makeUri modulePath' = T.intercalate "/" $ map toNormalizedText (toList modulePath') ++ ["index.html"] layout :: ToMarkup m => Package Docs -> Int -> CurrentPage -> m -> Html -> Html layout pkg dirDepth currentPage title body = layout' pkg dirDepth currentPage title body Nothing layout' :: ToMarkup m => Package Docs -> Int -> CurrentPage -> m -> Html -> Maybe Html -> Html layout' pkg@Package { metadata = md, modules = ms } dirDepth currentPage title body footer = [shamlet| $doctype 5