source and use humanized tag names
This commit is contained in:
parent
d792ed815e
commit
8fd47d38bb
3
Types.hs
3
Types.hs
|
@ -39,6 +39,8 @@ data SiteState =
|
|||
-- | Map of tags, assigning to each tag sequence a list of tagged page
|
||||
-- mounts. This one is expanded (tags imply parent categories).
|
||||
, _ehtags :: M.Map [String] [FilePath]
|
||||
-- | Map of "short" tags to expanded human-friendly names
|
||||
, _tagNames :: M.Map String String
|
||||
-- | List of installed files (enables sharing)
|
||||
, _installs :: S.Set (String, FilePath)
|
||||
-- | List of installed files (prevents overwriting)
|
||||
|
@ -131,6 +133,7 @@ siteOptions' = do
|
|||
, _redirects = M.empty
|
||||
, _htags = M.empty
|
||||
, _ehtags = M.empty
|
||||
, _tagNames = M.empty
|
||||
, _installs = S.empty
|
||||
, _targets = S.empty
|
||||
, _templates = M.empty
|
||||
|
|
|
@ -132,6 +132,11 @@ blockquote {
|
|||
text-align: right;
|
||||
}
|
||||
|
||||
li.sidebox-tag {
|
||||
padding-left: 1em;
|
||||
text-indent: -1em;
|
||||
}
|
||||
|
||||
/* search form and related stuff */
|
||||
|
||||
.search-form-wrap {
|
||||
|
|
|
@ -13,8 +13,7 @@ redirects:
|
|||
- internal/internal/publication/codeCheck
|
||||
tags:
|
||||
- publication/ppc/code
|
||||
- it/conventions
|
||||
- it/licensing
|
||||
- it/license
|
||||
---
|
||||
|
||||
# How-to: Pass a PPC code check
|
||||
|
|
8
cards/tagnames.yml
Normal file
8
cards/tagnames.yml
Normal file
|
@ -0,0 +1,8 @@
|
|||
"": "All"
|
||||
publication: "Publication"
|
||||
code: "Code"
|
||||
about: "About"
|
||||
license: "Licensing"
|
||||
privacy: "Privacy"
|
||||
it: "IT"
|
||||
ppc: "Pre-Publication Check"
|
56
site.hs
56
site.hs
|
@ -7,6 +7,7 @@ import Control.Monad ((>=>), unless, when)
|
|||
import Control.Monad.Extra (whenM)
|
||||
import Control.Monad.Trans.State.Lazy
|
||||
import qualified Data.Aeson as AE
|
||||
import qualified Data.Aeson.Key as K
|
||||
import qualified Data.Aeson.KeyMap as KM
|
||||
import qualified Data.ByteString.Lazy as B
|
||||
import Data.Digest.Pure.SHA (sha256, showDigest)
|
||||
|
@ -265,6 +266,42 @@ installAssets =
|
|||
use assetDir >>=
|
||||
(io . getRecursiveContents (pure . const False) >=> traverse_ installAsset)
|
||||
|
||||
-- | Load tag names from a directory and add them to `tagNames`.
|
||||
sourceTagnames :: FilePath -> Site ()
|
||||
sourceTagnames fp =
|
||||
io
|
||||
(map (fp </>) . filter ((== "tagnames.yml") . last . splitPath) <$>
|
||||
getRecursiveContents (pure . const False) fp) >>=
|
||||
traverse_ sourceTagnameFile
|
||||
|
||||
-- | Single item for `sourceTagnames`
|
||||
sourceTagnameFile :: FilePath -> Site ()
|
||||
sourceTagnameFile fp = do
|
||||
yml' <-
|
||||
io $ do
|
||||
putStrLn $ "# <- " ++ fp
|
||||
Y.decodeFileEither fp
|
||||
case yml' of
|
||||
Left err ->
|
||||
error $ "Failed to load tagnames from " ++ fp ++ ": " ++ show err
|
||||
Right yml -> traverse_ add $ KM.toList (yml :: KM.KeyMap String)
|
||||
where add :: (KM.Key, String) -> Site ()
|
||||
add (k, v) =
|
||||
let go (Just ov) =
|
||||
if v == ov
|
||||
then Just ov
|
||||
else error
|
||||
("conflicting tag names for tag " ++ K.toString k)
|
||||
go Nothing = Just v
|
||||
in tagNames %= M.alter go (K.toString k)
|
||||
|
||||
-- | Find the humanized name for a tag piece
|
||||
getTagName :: String -> Site String
|
||||
getTagName t = handleEmpty . maybe t id <$> use (tagNames . to (M.!? t))
|
||||
where
|
||||
handleEmpty "" = "all"
|
||||
handleEmpty x = x
|
||||
|
||||
-- | Get all tags from the pages of the site.
|
||||
sourceTags :: Site ()
|
||||
sourceTags = do
|
||||
|
@ -314,10 +351,13 @@ listLink = rootUrl . ("list" </>) . tagPath
|
|||
-- | Make metadata for printing out a single hierarchical tag (all levels clickable)
|
||||
makeHTagMeta :: ([String] -> Site FilePath) -> [String] -> Site Y.Value
|
||||
makeHTagMeta lf tag = do
|
||||
links <-
|
||||
zip (Y.Null : map fromString tag) . map fromString <$>
|
||||
traverse lf (inits tag)
|
||||
pure . Y.array $ map (\(t, p) -> Y.object [("tag", t), ("href", p)]) links
|
||||
links <- traverse lf (inits tag)
|
||||
tags <- traverse getTagName ("" : tag)
|
||||
pure . Y.array $
|
||||
zipWith
|
||||
(\t l -> Y.object [("tag", fromString t), ("href", fromString l)])
|
||||
tags
|
||||
links
|
||||
|
||||
-- | Make metadata for printing out a link to a page
|
||||
makePageLinkMeta :: FilePath -> Site Y.Value
|
||||
|
@ -339,10 +379,11 @@ makeTagMeta tag = do
|
|||
pagesMeta <- Y.array <$> traverse makePageLinkMeta taggedPages
|
||||
link <- tagLink tag
|
||||
listlink <- listLink tag
|
||||
tags <- Y.array . map fromString <$> traverse getTagName tag
|
||||
addGlobalMeta $
|
||||
Y.object
|
||||
[ ("href", fromString link)
|
||||
, ("tags", Y.array $ map fromString tag)
|
||||
, ("tags", tags)
|
||||
, ("htag", htagMeta)
|
||||
, ("subtags", subtagsMeta)
|
||||
, ("pages", pagesMeta)
|
||||
|
@ -353,8 +394,8 @@ makeTagMeta tag = do
|
|||
makeHTagLinkMeta :: [String] -> Site Y.Value
|
||||
makeHTagLinkMeta tag = do
|
||||
link <- listLink tag
|
||||
pure $
|
||||
Y.object [("href", fromString link), ("tags", Y.array $ map fromString tag)]
|
||||
tags <- Y.array . map fromString <$> traverse getTagName tag
|
||||
pure $ Y.object [("href", fromString link), ("tags", tags)]
|
||||
|
||||
-- | Create the structure for rendering a complete listing of one hierarchical tag.
|
||||
makeListMeta :: [String] -> Site Y.Value
|
||||
|
@ -448,6 +489,7 @@ main = do
|
|||
flip runStateT init $ do
|
||||
installAssets
|
||||
use sourceDirs >>= traverse sourcePages
|
||||
use sourceDirs >>= traverse sourceTagnames
|
||||
sourceTags
|
||||
use templateDir >>= sourceTemplates
|
||||
use pages >>= traverse (uncurry installPage) . M.assocs
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
<div class="sidebox-values">
|
||||
<ul>
|
||||
{{#htags}}
|
||||
<li>{{#.}}<a href="{{href}}">{{^tag}}all{{/tag}}{{?tag}} » {{tag}}{{/tag}}{{/.}}</a></li>
|
||||
<li class="sidebox-tag">{{#.}}<a href="{{href}}">{{^tag}}all{{/tag}}{{?tag}} » {{tag}}{{/tag}}{{/.}}</a></li>
|
||||
{{/htags}}
|
||||
</ul>
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue