jwebsite/menu3.md

100 lines
3.3 KiB
Markdown

@def title = "Menu 3"
# Working with tags
**Example**:
* page with tag [`syntax`](/tag/syntax/)
* page with tag [`image`](/tag/image/)
* page with tag [`code`](/tag/code/)
\toc
## Indicating tags
To mark a page with tags, add:
```markdown
@def tags = ["tag1", "tag2"]
```
then that page, along with all others that have the tag `tag1` will be listed at `/tag/tag1/`.
## Customising tag pages
You can change how a `/tag/...` page looks like by modifying the `_layout/tag.html`. An important note is that you can **only** use **global** page variables (defined in `config.md`).
There are three "exceptions":
1. you can still use `{{ispage /tag/tagname/}} ... {{end}}` (or `{{isnotpage ...}}`) to have a different layout depending on the tag,
1. you can use the `fd_tag` variable which contains the name of the tag so `{{fill fd_tag}}` will input the tag string as is,
1. you can use `{{fill varname path/to/page}}` to exploit a page variable defined in a specific page.
## Customising tag lists
By default the tag list is very simple: it just collects all pages that match the tags and it shows them in a simple list by anti-chronological order (more recent at the top).
You can customise this by defining your own `hfun_custom_taglist` function in the `utils.jl` file. The commented blueprint for the simple default setting is below and should give you an idea of how to write your own generator.
Assuming you've defined such a function, don't forget to use `{{custom_taglist}}` in the `_layout/tag.html` instead of the default `{{taglist}}`.
```julia
function hfun_custom_taglist()::String
# -----------------------------------------
# Part1: Retrieve all pages associated with
# the tag & sort them
# -----------------------------------------
# retrieve the tag string
tag = locvar(:fd_tag)
# recover the relative paths to all pages that have that
# tag, these are paths like /blog/page1
rpaths = globvar("fd_tag_pages")[tag]
# you might want to sort these pages by chronological order
# you could also only show the most recent 5 etc...
sorter(p) = begin
# retrieve the "date" field of the page if defined, otherwise
# use the date of creation of the file
pvd = pagevar(p, :date)
if isnothing(pvd)
return Date(Dates.unix2datetime(stat(p * ".md").ctime))
end
return pvd
end
sort!(rpaths, by=sorter, rev=true)
# --------------------------------
# Part2: Write the HTML to plug in
# --------------------------------
# instantiate a buffer in which we will write the HTML
# to plug in the tag page
c = IOBuffer()
write(c, "...1...")
# go over all paths
for rpath in rpaths
# recover the url corresponding to the rpath
url = get_url(rpath)
# recover the title of the page if there is one defined,
# if there isn't, fallback on the path to the page
title = pagevar(rpath, "title")
if isnothing(title)
title = "/$rpath/"
end
# write some appropriate HTML
write(c, "...2...")
end
# finish the HTML
write(c, "...3...")
# return the HTML string
return String(take!(c))
end
```
For instance the default uses:
```html
<!-- 1, 3: simple list-->
<ul>...</ul>
<!-- 2: simple list item plugging in path + title -->
<li><a href="/$rpath/">$title</a></li>
```