{-# LANGUAGE QuasiQuotes, TypeFamilies #-} module Nirum.Targets.Docs ( Docs (..) , blockToHtml , makeFilePath , makeUri , moduleTitle ) where import Data.Char import qualified Data.List import Data.Maybe 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, mapKeys, mapWithKey, unions) import qualified Data.Text as T import qualified Data.Text.Lazy as TL import Data.Text.Encoding (decodeUtf8, encodeUtf8) import qualified Data.SemVer import System.FilePath import Text.Blaze (ToMarkup (preEscapedToMarkup)) import Text.Blaze.Html.Renderer.Utf8 (renderHtml) import Text.Cassius import Text.Hamlet (Html, shamlet) import Text.InterpolatedString.Perl6 (q) import Text.Julius 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 (..) , Inline (..) , extractTitle , filterReferences , transformReferences , trimTitle ) import Nirum.Docs.Html (render, renderInlines, renderLinklessInlines) import Nirum.Package import Nirum.Package.Metadata hiding (target) import qualified Nirum.Package.ModuleSet as MS import Nirum.TypeInstance.BoundModule import Nirum.Version (versionText) data Docs = Docs { docsTitle :: T.Text , docsOpenGraph :: [OpenGraph] , docsStyle :: T.Text , docsHeader :: T.Text , docsFooter :: T.Text } deriving (Eq, Ord, Show) type Error = T.Text data CurrentPage = IndexPage | ModulePage ModulePath | DocumentPage FilePath deriving (Eq, Show) data OpenGraph = OpenGraph { ogTag :: T.Text , ogContent :: T.Text } deriving (Eq, Ord, 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 :: Package Docs -> Int -> CurrentPage -> T.Text -> Html -> Html layout pkg dirDepth currentPage title body = layout' pkg dirDepth currentPage title body Nothing layout' :: Package Docs -> Int -> CurrentPage -> T.Text -> Html -> Maybe Html -> Html layout' pkg@Package { metadata = md, modules = ms } dirDepth currentPage title body footer = [shamlet| $doctype 5