jwebsite/syntax/page-variables.md

12 KiB

@def hascode=true

Page variables

\blurb{Page variables offer a straightforward way to interact with the HTML templating from the markdown.}

\lineskip

\toc

Overview

The general syntax to define a page variable is to write @def varname = value on a new line e.g.:

@def author = "Septimia Zenobia"

where you could set the variable to a string, a number, a date,... anything. Definitions can span multiple lines but if they do, the subsequent lines must be indented e.g.:

@def some_str = """A string
    on several lines is ok
    but lines must be indented"""

These variables can serve multiple purposes but, primarily, they can be accessed from the HTML template blocks e.g.:

<footer>
  This is the footer. &copy; {{fill author}}.
</footer>

which could be useful as footer on all pages.

The syntax {{ ... }} indicates a HTML function, fill is the function name and the rest of the bracket elements are page variables (here author) serving as arguments of the function.

Local page variables denote variables that are defined on a single page and accessible on that page only by contrast to global page variables which are set globally (in the config.md file) and accessible on all pages.

In both cases there are default page variables with default values which you can change and use. You can also define your own variables, both global and local.

Using page variables

Both local and global page variables are meant for essentially two purposes:

@@tlist

  1. control the HTML template from the markdown,
  2. modify how Franklin generates HTML. @@

The second one is a bit less prevalent but, for instance, you can specify the default programming language for all code blocks so that code blocks that don't specify a language would use the default language for highlighting:

@def lang = "julia"

In the first case, you can access variables in your HTML template via one of the HTML functions such as the fill function shown above.

HTML functions

HTML functions can be used in any one of your *.html file and in particular in any of the _layout/*.html files such as head.html. They are always called with the syntax {{fname pv1 pv2 ...}} where pv1 pv2 ... are page variable names.

Basic functions

A few functions are available with the {{fill ...}} arguably the most likely to be of use.

@@lalign

Format Role
{{fill vname}} or {{vname}} place the value of page variable vname
{{fill vname rpath}} same but taking the value from the page at rpath where rpath is a relative path like blog/pg1
{{insert fpath}} insert the content of the file at fpath
{{href vname}} inserts a reference (mostly internal use)
{{toc}} places a table of content (mostly internal use)
@@

The {{insert fpath}} can be useful if you want to include specific HTML scaffolding on some pages, for instance in example pages you will see in the head.html:

{{if hasmath}} {{insert head_katex.html}} {{end}}

Conditional blocks

Conditional blocks allow to specify which parts of the HTML template should be active depending on the value of given page variable(s). The format follows this structure:

{{if vname}}
...
{{elseif vname2}}
...
{{else}}
...
{{end}}

where vname and vname2 are expected to be page variable evaluating to a boolean. Of course you don't have to specify the {{elseif ...}} or {{else}} if you don't need them.

\note{ The conditional blocks are fairly basic; in particular operations between page variables are not supported, so you can't write something like {{if hasmath && hascode}}. For more complex use cases, consider defining your own HTML functions using the utils file. }

You can also use some dedicated conditional blocks:

@@lalign

Format Role
{{ispage path/to/page}} whether the current page corresponds to the path
{{isnotpage path/to/page}} opposite of previous
{{isdef vname}} whether vname is defined
{{isnotdef vname}} opposite of previous
@@

The {{ispage ...}} and {{isnotpage ...}} accept * as joker symbol; for instance {{ispage maths/*}} is allowed.

Note: for the C users out there, you can also use ifdef, ifndef.

Consider the following example (very similar to what is used on the current page):

<li class="{{ispage syntax/*}}active{{end}}">• Syntax
<ul>
  <!-- ... -->
  <li class="{{ispage syntax/page-variables}}active{{end}}">Page Variables
  <!-- ... -->
</ul>

This allows a simple, javascript-free, way of having a navigation menu that is styled depending on which page is currently active.

For loops

You can define iterable page variables (array, tuple, ...) and loop over them using the following syntax:

{{for x in vname}}
  ...{{fill x}}...
{{end}}

Only {{fill vname}} and {{fill vname rpath}} are allowed in such a for loop. You can also unpack an iterable like

{{for (x, y) in vname}}
  ...{{fill x}}...{{fill y}}
{{end}}

where vname would refer to something like [(1,2),(3,4)].

Global page variables

The table below list global page variables that you can set. These variables are best defined in your config.md file though you can overwrite the value locally by redefining the variable on a given page (this will then only have an effect on that page).

@@lalign

Name Type(s) Default value Comment
author String, Nothing "THE AUTHOR"
autocode Bool true whether to detect the presence of code blocks and set the local var hascode automatically
automath Bool true whether to detect the presence of math blocks and set the local var hasmath automatically
date_format String "U dd, yyyy" Must be a format recognised by Julia's Dates.format
date_days Vector{String} String[] Names for days of the week (*)
date_shortdays Vector{String} String[] Short names for the days of the week (*)
date_months Vector{String} String[] Names for months (*)
date_shortmonths Vector{String} String[] Short names for months (*)
div_content String "franklin-content" Name of the div that will englobe the processed content between head and foot
ignore Vector{String} String[] Files that should be ignored by Franklin (**)
prepath String "" Use if your website is a project website (***)
website_title String "" (RSS) (****)
website_descr String "" (RSS)
website_url String "" (RSS)
generate_rss Bool true
folder_structure VersionNumber v"0.2" only relevant for users of Franklin < 0.5, see NEWS.md
@@

Notes:\ \smindent{(*)} \smnote{must be in a format recognized by Julia's Dates.DateLocale. Defaults to English. If left unset, the short names are created automatically by using the first three characters of the full names.}\ \smindent{(**)} \smnote{to ignore a file add it's relative path like "path/to/file.md", to ignore a directory end the path with a / like "path/to/dir/".}\ \smindent{(***)} \smnote{say you're using GitHub pages and your username is darth, by default Franklin will assume the root URL to be darth.github.io/. However, if you want to build a project page so that the base URL is darth.github.io/vador/ then use @def prepath = "vador"}.\ \smindent{(****)} \smnote{these must be defined for RSS to be generated for your site (on top of generate_rss being true). See also the RSS subsection below}.

Local page variables

The tables below list local page variables that you can set. These variables are typically set locally on a page. Remember that: @@tlist

  • you can also define your own variables (with different names),
  • you can change the default value of a variable by defining it in your config.md. @@ Note that variables shown below that have a name starting with fd_ are not meant to be defined as their value is typically computed on the fly (but they can be used).

Basic settings

@@lalign

Name Type Default value Comment
title String, Nothing nothing page title (*)
hasmath Bool true whether to activate KaTeX for that page
hascode Bool false whether to activate highlight.js for that page
date String, Date, Nothing Date(1) a date object (e.g. if you want to set a publication date)
lang String julia default highlighting for code on the page
reflinks Bool true whether there are things like [ID]: URL on your page (**)
indented_code Bool false whether indented blocks should be considered as code (***)
mintoclevel Int 1 minimum title level to go in the table of content (often you'll want this to be 2)
maxtoclevel Int 10 maximum title level to go in the table of content
fd_ctime Date time of creation of the markdown file
fd_mtime Date time of last modification of the markdown file
fd_rpath String relative path to file [(...)/thispage.md]
@@

Notes:\ \smindent{(*)} \smnote{if the title is not set, the first header will be used as title}.\ \smindent{(**)} \smnote{there may be cases where you want to literally type ]: in some code without it indicating a link reference. In such case, set reflinks to false to avoid ambiguities}.\ \smindent{(***)} \smnote{it is recommended to fence your code blocks (use backticks) as it's not ambiguous for the parser whereas indented blocks can be. If you do want to use indented blocks as code blocks, it's your responsibility to make sure there are no ambiguities}.

Code evaluation

For more informations on these, see the section on inserting and evaluating code.

@@lalign

Name Type Default value Comment
reeval Bool false whether to reevaluate all code blocks on the page
showall Bool false notebook mode if true where the output of the code block is shown below
fd_eval Bool false internal variable to keep track of whether the scope is stale (in which case all subsequent blocks are re-evaluated)
@@

RSS

These are variables related to RSS 2.0 specifications and must match the format indicated there. If you want proper RSS to be generated, you must define at least the rss_description or rss (which is an alias for rss_description). All these variables expect a String.

@@lalign

Name Default value
rss, rss_description ""
rss_title current page title
rss_author current author
rss_category ""
rss_comments ""
rss_enclosure ""
rss_pubdate ""
@@

To recapitulate, for a working RSS feed to be generated you need:

@@tlist

  • to set the website_* variables in your config.md (see global page variables),
  • on appropriate pages, to define at least rss to a valid description. @@

For an example, see this mirror of the Julia blog posts with:

@@tlist