jwebsite/styling/templates.md

248 lines
7.6 KiB
Markdown

@def hascode = true
<!--
reviewed: 22/12/19
-->
# Templates
\blurb{Start from one of the template or build your own.}
\lineskip
\toc
\lineskip
The pre-defined templates that are currently available in Franklin with the `newsite` function can be viewed ~~~<a href="https://tlienart.github.io/FranklinTemplates.jl/" target="_blank" rel="noopener noreferrer">here</a>~~~ (_opens in a new tab_).
## Adapting a theme to Franklin
\note{If you end up doing this, please consider making a PR to [FranklinTemplates](https://github.com/tlienart/FranklinTemplates.jl)!}
On this page, I'll take [Jemdoc's website layout](http://jemdoc.jaboc.net/) and show how it can be adapted to be a working Franklin template.
This will hopefully also show you how to adapt / modify an existing template.
Jemdoc's layout looks like this:
![](/assets/jemdoc/jemdoc1.png)
### Getting started
In order to get a blueprint for the folder etc, let's first create a Franklin site with the `basic` template:
```julia-repl
julia> newsite("jemdoc", template="basic")
```
You can serve the site in order to see the modifications directly in your browser which can be useful to fine tune the port of the layout.
We will need to provide the appropriate stylesheet in `_css/` and adjust the layout part in `_layout/`.
### Adapting the head and foot
The file `_html_parts/head.html` is the most important one you will have to adjust.
Let us first change the name of the main stylesheet `_css/basic.css` to `_css/jemdoc.css` which is more appropriate.
The reference to the stylesheet in `head.html` consequently has to be changed to mention `jemdoc.css` instead of `basic.css`:
```html
<link rel="stylesheet" href="/css/jemdoc.css">
```
The following step is fairly simple:
@@tlist
1. look at the original html code,
2. copy whatever is relevant that comes before the content into `head.html`.
@@
Let's do this gradually.
The top of the original HTML can be ignored at this point so we can start modifying starting after `</head>`.
Jemdoc's body starts with a Google analytics script which I'll ignore as well.
We then have effectively one big table element.
Stripped from its content and simplified it looks like:
```html
<table id="tlayout">
<tr valign="top">
<td id="layout-menu">
<div class="menu-category">jemdoc</div>
<div class="menu-item"><a href="/" class="current">home</a></div>
<div class="menu-category">topics</div>
<div class="menu-item"><a href="/menu1/">Menu 1</a></div>
<div class="menu-item"><a href="/menu2/">Menu 2</a></div>
<div class="menu-item"><a href="/menu3/">Menu 3</a></div>
</td>
<td id="layout-content">
<p> CONTENT HERE </p>
<div id="footer">
<div id="footer-text">
Page generated by <a href="http://jemdoc.jaboc.net/">jemdoc</a>.
</div>
</div>
</td>
</tr>
</table>
```
Note that I've already filled in the `href=` in the links to sub-menus.
The "`CONTENT HERE`" part is where what Franklin generates from Markdown will go.
Therefore, anything that is *after* that should go in `foot.html`; in our current case:
```html
<!-- ... -->
<div id="footer">
<div id="footer-text">
Page generated by <a href="http://jemdoc.jaboc.net/">jemdoc</a>.
</div>
</div>
</td>
</tr>
</table>
```
That's basically it (though we still have to modify the stylesheet of course).
The `head.html` should be adapted to:
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
{{if hasmath}} {{insert head_katex.html }} {{end}}
{{if hascode}} {{insert head_highlight.html }} {{end}}
<link rel="stylesheet" href="/css/franklin.css">
<link rel="stylesheet" href="/css/jemdoc.css">
<link rel="icon" href="/assets/infra/favicon.png">
{{isdef title}} <title>{{fill title}}</title> {{end}}
</head>
<body>
<table id="tlayout">
<tr valign="top">
<td id="layout-menu">
<div class="menu-category">jemdoc</div>
<div class="menu-item"><a href="index.html" class="current">home</a></div>
<div class="menu-category">topics</div>
<div class="menu-item"><a href="/menu1/">Menu 1</a></div>
<div class="menu-item"><a href="/menu2/">Menu 2</a></div>
<div class="menu-item"><a href="/menu3/">Menu 3</a></div>
</td>
<td id="layout-content">
<!-- Content appended here -->
```
and the `foot.html` should be adapted to:
```html
<!-- CONTENT ENDS HERE -->
</td>
</tr>
</table>
{{ if hasmath }}
{{ insert foot_katex.html }}
{{ end }}
{{ if hascode }}
{{ insert foot_highlight.html }}
{{ end }}
</body>
</html>
```
### Adapting the stylesheet
By now the page looks pretty bad:
![](/assets/jemdoc/jemdoc2.png)
the content is not centred in its box and overflows on the right, the menu looks ridiculous, time to do some CSS styling!
Let's start by removing everything from `_css/jemdoc.css`.
Most of what's in there was used for the styling of the top navbar which we don't have anymore (note that the styling of the content itself is in `franklin.css`, don't change that for now; note also that `jemdoc.css` is loaded *after* `franklin.css` so that you can overwrite the styles there).
Let's now just copy paste the content of the [two](http://jemdoc.jaboc.net/jemdoc.css) [original](http://jemdoc.jaboc.net/jacob.css) stylesheets into ours and hope for the best, we may have some fine-tuning to do after this.
Doing nothing else than copy pasting already helps a lot:
![](/assets/jemdoc/jemdoc3.png)
A few things should be fixed:
@@tlist
1. there's too little space at the top
1. the menu is a bit too narrow and there's a bit too much space between the menu and the content
1. there's not enough space after `<pre>` blocks
@@
#### Fixing spacing
Firefox or Chrome/ium's excellent dev-tools are super helpful to fine tune stylesheets.
Here things are pretty straightforward though.
First, we need to add vertical padding above `<h1>` level title:
```css
h1 { padding-top: 2em; }
```
Then, let's widen the menu a little
```css
td#layout-menu {
padding-left: 15px;
padding-right: 25px;
}
```
and let's reduce the padding on the left of the `franklin-content` element:
```css
.franklin-content { padding-left: 5%; }
```
Finally, in the original stylesheet there is this element:
```css
pre {
padding: 0;
margin: 0;
}
```
which you can just remove to have a bit more space around code blocks.
There's probably still things that could be done to improve the layout overall (and make it more responsive!) but we'll leave it at that.
![](/assets/jemdoc/jemdoc4.png)
### Adjusting other files
Here we don't need to adjust anything else but, in general, you might want to adjust the other pages:
@@tlist
* `head_highlight`, `head_katex`, `foot_highlight` and `foot_katex` are probably best left as they are, they will be appended if need be to pages (see in `head` and `foot` the `{{if hasmath}}` and `{{if hascode}}` blocks)
* `page_foot` you may want to change, it defines what goes at the bottom of the `.franklin-content` div.
@@
By default `page_foot` looks like
```html
<div class="page-foot">
<div class="copyright">
&copy; {{ fill author }}. Last modified: {{ fill fd_mtime }}. Website built with <a href="https://github.com/tlienart/Franklin.jl">Franklin.jl</a>.
</div>
</div>
```
It should be fairly straightforward to adapt that to your needs.
## Making a PR to the theme repo
Let's say you've built your own template and are pretty happy with the result and you'd like to share it for other users, great, thanks!
Please follow [these instructions](https://github.com/tlienart/FranklinTemplates.jl#fixingadding-a-template).