Static site generator for markdown and handlebars
A simple static site generator with a focus on markdown and handlebars
Prerequisites:
Node v6+
Install:
npm i -g zircon
# Make a folder for the your new site
mkdir my-new-site
cd my-new-site
# Initialize the site using zircon defaults
zircon init .
# Build the site
zircon . ./site
# Serve the site with your favorite static site server
http-server site
static
- Folder that is copied into the buildfavicon.ico
- The sites favicondefaults.yml
- Acts as the default info in each content frontmatterExample:
Site root:
- content
- blog
- exciting-news.md
- update-12-7-17.md
- first-post.md
- about.md
- support-us.hbs
- index.html
- layouts
- index.hbs
- post.hbs
- partials
- header.hbs
- footer.hbs
- helpers
- currentDate.js
- static
- logo.png
- defaults.yml
- favicon.ico
Build command:
zircon . ./site
Final ./site:
- blog
- exciting-news.html
- update-12-7-17.html
- first-post.html
- static
- logo.png
- about.html
- support-us.html
- index.html
- favicon.ico
The content directory is the most important directory in a Zircon site. It is where
all the main content of your site goes. The final site output directly mirrors the
structure of this folder.
Detailed Rules:
.md
files are passed through a markdown compiler, followed by the handlebars
compiler.
.hbs and .md
Are processed by the handlebars compiler. Any handlebars expressions are given a context containing the following data:
.hbs, .md, and .html
Are finally injected into the layout specified by either the
front matter or the defaults.yml
file (if layout is not defined in front matter). Once
handlebars has finished compiling the file it is written to the output directory.
All other files
are coppied exactly as they are to the output dir.
Note. The “front matter” is a plain text metadata specified at the top of a content file
in yaml format and in between two sets of three dashes (--- YAML ---
).
Layouts are handlebars files that define the layout of your content. They live
in the top level layouts folder. Every layout is passed a context with a
content
property. This property contains the text content of the page the
layout is being used to render.
To learn more about the *.hbs (Handlebars) file syntax, visit http://handlebarsjs.com/.
Partials are small pieces of html/hbs that can be included in a layout or content file.
To include a partial in a layout or content file use the following syntax:
{{> partial_file_name}}
To learn more about partials, visit http://handlebarsjs.com/partials.html,
Helpers are javascript functions that can be called from a handlebars file to
generate html with a given set of parameters.
Each helpers file should export a single function like this:
// currentDate.js
module.exports = function currentDate() {
const date = new Date();
const months = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
];
const day = date.getDate();
const monthIndex = date.getMonth();
const year = date.getFullYear();
return day + ' ' + months[monthIndex] + ' ' + year;
}
The file is automatically registered with handlebars and can be accessed with its filename:
<article>
<span class="author">Drew Youngwerth</span>
<span class="date">{{currentDate}}</span>
<article>
<!-- Renders to: -->
<article>
<span class="author">Drew Youngwerth</span>
<span class="date">12 December 2017</span>
<article>
Like partials, helpers can be accessed from both layouts and content files.
For more on handlebars helpers, visit http://handlebarsjs.com/#helpers.
root/content
directory
root/layouts
directory (One level only)root/paritails
directory (One level only)*.js
(One level only)
export =
favicon.ico
and static directories defined in the root are coppied into the build directoryLayouts and Content have access to handlebars contexts with the following
interface:
export interface HandlebarsContentContext {
/** Metadata from the page frontmatter merged with defaults */
metadata: { [key: string]: any };
/** Path of the current page */
absolutePath: string;
/** Folder containing the current page */
folder: HandlebarsFolderContext; // See below for definition
/** filename with extension */
filename: string;
/** Path relative to the root of the page */
path: string;
/** Absolute path to text content of the file without frontmatter */
extractedTextPath: string;
/** Original unmodified extension of the content file */
extension: string;
/** The entire site */
site: HandlebarsFolderContext;
}
export interface HandlebarsLayoutContext extends HandlebarsContentContext {
/** Content for the layout to display */
content: string;
}
export interface HandlebarsFolderContext {
name: string;
absolutePath: string;
/** Path relative to the root of the page */
path: string;
subfolders: HandlebarsFolderContext[];
pages: {
path: string,
/** Absolute path to text content of the file without frontmatter */
extractedTextPath: string,
extension: string,
metadata: { [key: string]: any };
}[];
}
skip: true
to the YAML frontmatter at the top of the page.Gem Icon by Twemoji