support special pages that are not concatenations of posts
This commit is contained in:
parent
c91de20ef1
commit
b47bf7ceb9
@ -36,3 +36,4 @@ executables:
|
|||||||
- mtl
|
- mtl
|
||||||
- megaparsec
|
- megaparsec
|
||||||
- text
|
- text
|
||||||
|
- network-uri
|
||||||
|
|||||||
62
special/imprint.md
Normal file
62
special/imprint.md
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
title: Impressum
|
||||||
|
---
|
||||||
|
# Recessu sumus se aliquem foliis saetigeri vult
|
||||||
|
|
||||||
|
## Navit quod auras
|
||||||
|
|
||||||
|
Lorem markdownum ut *flamina* et mensura fracta, unius rubra. Manibus per rex
|
||||||
|
pondere, lucoque dotaliaque non festa cera, et. Mercurio dabantur cernens.
|
||||||
|
Vixque stabat Aeetias Zetesque scrutantur nisi, *tu quam* nec, in sit oculos.
|
||||||
|
Ille suo ad fecit rector auras hiemsque Thebas illi nunc constitit crinem
|
||||||
|
Dictaeaque utiliter eras duorum.
|
||||||
|
|
||||||
|
1. Commenta periuria quaeque fuit
|
||||||
|
2. Quicquid aut essent ora fuit Hiberi oblitus
|
||||||
|
3. Per est atque ambitione increpor violentam
|
||||||
|
4. Semineces sedit
|
||||||
|
5. Iam usus levavit satis nocens
|
||||||
|
|
||||||
|
## Latique volvuntur gnatae
|
||||||
|
|
||||||
|
Inpediunt in remisit miserabile patrem cervix sonantibus
|
||||||
|
[talia](http://nec.org/) nec *deieci capitis* retraxi mediocris in deos, *sub*.
|
||||||
|
Addere spelunca, Achilleos: est orbe comminus tangere, nec deus ventos sumptae.
|
||||||
|
Prius de fuit, dum manibus rubor mitis Denique et inpedientibus sole.
|
||||||
|
Adpellatque dubio Ericthonium tanto terras, tendebat vulgus divitibusque suarum.
|
||||||
|
Corpus huic portans Oceanum multiplicique passa quodcumque tu omnes; Chimaera
|
||||||
|
non verba contentus tellus, tellus tibi.
|
||||||
|
|
||||||
|
- Minos sonat datis celare illic balteus
|
||||||
|
- Hymettia Neptunus genitore stridentibus longa quoque limine
|
||||||
|
- Vidit viro vices
|
||||||
|
- Non insula liquida herbis turba fumabant presso
|
||||||
|
- Ter laqueosque vices aliter ait femina concipit
|
||||||
|
|
||||||
|
Elice studioque in Eurytidos molimine passu vulgi passim partique ait inprudens
|
||||||
|
pontum. Titan est en quamvis manibus incubuit iuvenale erat lapis thalamosque
|
||||||
|
nymphas gaudetque educta ignibus, Troiaeque ait verba quod timor. Digitique
|
||||||
|
pennas Trachasque errabat cava, sed limina oculos est, carne, et huius triplex
|
||||||
|
esse; ipse. **Interea sibi** terras; pellant mittit exclamant, lumina prosilit,
|
||||||
|
matura.
|
||||||
|
|
||||||
|
## Omnibus deos nec lacrimas nec est
|
||||||
|
|
||||||
|
Moriri **temporis** galeae super vestigia nec istis arida: revocantis viroque
|
||||||
|
excidit et cornua tabellae ferrea. Est dona placent novissimus qui canisve
|
||||||
|
cumque tu quaerit avari virgis metuitque hominum de duabus undas Hyantius.
|
||||||
|
Recessit succede forsitan nubere mihi exsistunt iugulo germanam lanas.
|
||||||
|
|
||||||
|
- Quater nisi tumidi
|
||||||
|
- Ument illam vir Talibus placet vulnera longius
|
||||||
|
- Nubila ignarus
|
||||||
|
|
||||||
|
In est quid aequora iam clipei, ab gutture Arachnes nymphae inpete, per tamen
|
||||||
|
saevit. Ego sed animo potiatur, esset, quam sed vinces fuga. **Te** saevus,
|
||||||
|
parva adhuc gravitas nebulas. Triplici et Niseia domitamque: iussus miles.
|
||||||
|
|
||||||
|
Non nunc! Volventia excussit da quae, mihi accipit sidera flexere aurora
|
||||||
|
Polydegmona ascensu. Rerum vultus, referebat exiluit urnam, inmiti gener,
|
||||||
|
laborem, quod date natura quodcumque. Calidi fortunaeque faces, quod ipsa
|
||||||
|
cultusque illi. Has barba viscera, hospes vera communia munus tremit inque
|
||||||
|
praemia terrae.
|
||||||
100
src/Main.hs
100
src/Main.hs
@ -37,6 +37,8 @@ import System.IO.Error
|
|||||||
|
|
||||||
import Data.Void
|
import Data.Void
|
||||||
|
|
||||||
|
import Network.URI
|
||||||
|
|
||||||
config :: Configuration
|
config :: Configuration
|
||||||
config =
|
config =
|
||||||
defaultConfiguration
|
defaultConfiguration
|
||||||
@ -53,6 +55,15 @@ stripPathPrefix (splitDirectories -> prefix) =
|
|||||||
handleIf :: Exception e => (e -> Bool) -> (e -> IO a) -> IO a -> IO a
|
handleIf :: Exception e => (e -> Bool) -> (e -> IO a) -> IO a -> IO a
|
||||||
handleIf predicate handler = handle $ \exc -> bool throwIO handler (predicate exc) exc
|
handleIf predicate handler = handle $ \exc -> bool throwIO handler (predicate exc) exc
|
||||||
|
|
||||||
|
metadataSort :: [Item w] -> Compiler [Item w]
|
||||||
|
metadataSort = sortOnM $ \Item{itemIdentifier} -> maybe (0 :: Integer) read <$> getMetadataField itemIdentifier "sort"
|
||||||
|
where
|
||||||
|
sortOnM :: forall m a b. (Monad m, Ord b) => (a -> m b) -> [a] -> m [a]
|
||||||
|
sortOnM f = fmap (map snd . List.sortOn fst) . mapM (\x -> (,x) <$> f x)
|
||||||
|
|
||||||
|
unwrapped :: Snapshot
|
||||||
|
unwrapped = "unwrapped"
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = hakyllWith config $ do
|
main = hakyllWith config $ do
|
||||||
frontendManifest <-
|
frontendManifest <-
|
||||||
@ -142,15 +153,62 @@ main = hakyllWith config $ do
|
|||||||
| "/" `List.isPrefixOf` x && not ("//" `List.isPrefixOf` x) ->
|
| "/" `List.isPrefixOf` x && not ("//" `List.isPrefixOf` x) ->
|
||||||
toSiteRoot r ++ x
|
toSiteRoot r ++ x
|
||||||
_other -> x
|
_other -> x
|
||||||
return $ withUrls (relativizeUrls' . renderRoute) <$> item
|
overPath f str = case parseURIReference str of
|
||||||
|
Nothing -> f str
|
||||||
|
Just uri@URI{uriPath} -> uriToString id uri{uriPath = f uriPath} mempty
|
||||||
|
return $ withUrls (relativizeUrls' . overPath renderRoute) <$> item
|
||||||
|
|
||||||
tags <- buildTags "content/**" $ fromCapture "tags/*.html"
|
tags <- buildTags "content/**" $ fromCapture "tags/*.html"
|
||||||
|
|
||||||
|
let
|
||||||
|
applySiteLayout = loadAndApplyTemplate "templates/site-layout.html" . (<> ctx')
|
||||||
|
where
|
||||||
|
ctx' =
|
||||||
|
mconcat
|
||||||
|
[ listField "tags-nav" defaultContext (metadataSort <=< mapM (uncurry renderTagNav) $ tagsMap tags)
|
||||||
|
, listField "special-nav" defaultContext $ metadataSort =<< mapM (flip loadSnapshot unwrapped) =<< getMatches (fromGlob "special/**")
|
||||||
|
, frontendContext
|
||||||
|
, defaultContext
|
||||||
|
]
|
||||||
|
renderTagNav tag' ids = do
|
||||||
|
tagItems' <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag') -<.> "*"
|
||||||
|
let
|
||||||
|
tagItem' = return $ Item (fromMaybe (tagsMakeId tags tag') $ listToMaybe tagItems') (mempty :: String)
|
||||||
|
|
||||||
|
navRoute = "/" <> tag' <> ".html"
|
||||||
|
|
||||||
|
tagNavCtx =
|
||||||
|
mconcat
|
||||||
|
[ constField "tag" tag'
|
||||||
|
, field "title" . const $
|
||||||
|
fmap (fromMaybe tag') . runMaybeT . asum $
|
||||||
|
map (\itemId -> MaybeT $ getMetadataField itemId "title") tagItems'
|
||||||
|
, constField "route" navRoute
|
||||||
|
, listField "posts" (constField "tag" tag' <> constField "route" navRoute <> postContext) (metadataSort =<< mapM load ids)
|
||||||
|
]
|
||||||
|
tagItem'
|
||||||
|
>>= loadAndApplyTemplate "templates/tag-nav.html" tagNavCtx
|
||||||
|
>>= normalizeUrls
|
||||||
|
postContext =
|
||||||
|
mconcat
|
||||||
|
[ field "identifier" (return . takeBaseName . toFilePath . itemIdentifier)
|
||||||
|
, defaultContext
|
||||||
|
]
|
||||||
|
specialContext = defaultContext
|
||||||
|
|
||||||
match "content/**" $ do
|
match "content/**" $ do
|
||||||
compile $ do
|
compile $
|
||||||
pandocCompiler
|
pandocCompiler
|
||||||
>>= normalizeUrls
|
>>= normalizeUrls
|
||||||
|
|
||||||
|
match "special/**" $ do
|
||||||
|
route . routeAsFilePath $ (-<.> "html") . stripPathPrefix "special"
|
||||||
|
compile $
|
||||||
|
pandocCompiler
|
||||||
|
>>= saveSnapshot unwrapped
|
||||||
|
>>= applySiteLayout specialContext
|
||||||
|
>>= normalizeUrls
|
||||||
|
|
||||||
forM_ (tagsMap tags) $ \(tag, fromList -> posts) ->
|
forM_ (tagsMap tags) $ \(tag, fromList -> posts) ->
|
||||||
rulesExtraDependencies [tagsDependency tags] $ do
|
rulesExtraDependencies [tagsDependency tags] $ do
|
||||||
tagItems <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag) -<.> "*"
|
tagItems <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag) -<.> "*"
|
||||||
@ -165,47 +223,13 @@ main = hakyllWith config $ do
|
|||||||
let
|
let
|
||||||
ctx =
|
ctx =
|
||||||
mconcat
|
mconcat
|
||||||
[ listField "tags-nav" defaultContext (metadataSort <=< mapM (uncurry renderTagNav) $ tagsMap tags)
|
[ listField "posts" postContext (metadataSort =<< loadAll posts)
|
||||||
, listField "posts" postContext (metadataSort =<< loadAll posts)
|
|
||||||
, frontendContext
|
|
||||||
, defaultContext
|
, defaultContext
|
||||||
]
|
]
|
||||||
|
|
||||||
renderTagNav tag' ids = do
|
|
||||||
tagItems' <- getMatches . fromGlob $ toFilePath (tagsMakeId tags tag') -<.> "*"
|
|
||||||
let
|
|
||||||
tagItem' = return $ Item (fromMaybe (tagsMakeId tags tag') $ listToMaybe tagItems') (mempty :: String)
|
|
||||||
|
|
||||||
navRoute = renderRoute $ "/" <> tag' <> ".html"
|
|
||||||
|
|
||||||
tagNavCtx =
|
|
||||||
mconcat
|
|
||||||
[ constField "tag" tag'
|
|
||||||
, field "title" . const $
|
|
||||||
fmap (fromMaybe tag') . runMaybeT . asum $
|
|
||||||
map (\itemId -> MaybeT $ getMetadataField itemId "title") tagItems'
|
|
||||||
, constField "route" navRoute
|
|
||||||
, listField "posts" (constField "tag" tag' <> constField "route" navRoute <> postContext) (metadataSort =<< mapM load ids)
|
|
||||||
]
|
|
||||||
tagItem'
|
|
||||||
>>= loadAndApplyTemplate "templates/tag-nav.html" tagNavCtx
|
|
||||||
>>= normalizeUrls
|
|
||||||
|
|
||||||
postContext =
|
|
||||||
mconcat
|
|
||||||
[ field "identifier" (return . takeBaseName . toFilePath . itemIdentifier)
|
|
||||||
, defaultContext
|
|
||||||
]
|
|
||||||
|
|
||||||
metadataSort :: [Item w] -> Compiler [Item w]
|
|
||||||
metadataSort = sortOnM $ \Item{itemIdentifier} -> maybe (0 :: Integer) read <$> getMetadataField itemIdentifier "sort"
|
|
||||||
where
|
|
||||||
sortOnM :: forall m a b. (Monad m, Ord b) => (a -> m b) -> [a] -> m [a]
|
|
||||||
sortOnM f = fmap (map snd . List.sortOn fst) . mapM (\x -> (,x) <$> f x)
|
|
||||||
|
|
||||||
tagItem
|
tagItem
|
||||||
>>= loadAndApplyTemplate "templates/tag.html" ctx
|
>>= loadAndApplyTemplate "templates/tag.html" ctx
|
||||||
>>= loadAndApplyTemplate "templates/site-layout.html" ctx
|
>>= applySiteLayout ctx
|
||||||
>>= normalizeUrls
|
>>= normalizeUrls
|
||||||
|
|
||||||
match "frontend/dist/wp-*/**" $ do
|
match "frontend/dist/wp-*/**" $ do
|
||||||
|
|||||||
@ -7,13 +7,33 @@
|
|||||||
$for(css)$
|
$for(css)$
|
||||||
<link rel="stylesheet" href="$url$">
|
<link rel="stylesheet" href="$url$">
|
||||||
$endfor$
|
$endfor$
|
||||||
<title>UniWorX Systems</title>
|
<title>UniWorX Systems$if(title)$ - $title$$endif$</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<header>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
$for(tags-nav)$
|
||||||
|
$body$
|
||||||
|
$endfor$
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
<main>
|
<main>
|
||||||
$body$
|
$body$
|
||||||
</main>
|
</main>
|
||||||
|
<footer>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
$for(special-nav)$
|
||||||
|
<li>
|
||||||
|
<a href="$url$">$title$</a>
|
||||||
|
</li>
|
||||||
|
$endfor$
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</footer>
|
||||||
$for(js)$
|
$for(js)$
|
||||||
<script src="$url$"></script>
|
<script src="$url$"></script>
|
||||||
$endfor$
|
$endfor$
|
||||||
|
|||||||
@ -1,10 +1,3 @@
|
|||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
$for(tags-nav)$
|
|
||||||
$body$
|
|
||||||
$endfor$
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
$for(posts)$
|
$for(posts)$
|
||||||
<article id="$identifier$">
|
<article id="$identifier$">
|
||||||
$body$
|
$body$
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user