Compilers
Night Owl has built‑in support for templates written in many languages. You can override these compilers or add new compilers for unsupported template languages.
Configuring a compiler
Use the compilers
option in your Night Owl configuration to modify the built‑in compilers.
export default {
compilers: {
markdown: {
options: { gfm: false },
ext: [".custom.md"]
}
}
}
options
Provide options
to the external library that compiles the template. The shape of this object depends on the options that the library supports. The table below has more information about which libraries are used by different compilers.
ext
An array of file extension strings associated with this compiler. Any template with a file extension included in this list will use this compiler.
compile
Override the default compiler function.
The function receives the template content
and filename
as arguments, as well as the compiler options
.
The function should return an object with either a content
string or a render
function that will be called with the template data.
The returned object can provide additional data
that is passed to the render
function. Set the default file extension for generated files using ext
. If the template should be recompiled when a dependency changes, add it to the dependencies
array.
const compile = function (content, filename, options) {
return {
content: "Content string...",
render: (data) => doSomethingWith(content, options)(data),
data: { foo: "bar" },
ext: ".js",
dependencies: ["imported-file.js"],
}
}
If a template has front‑matter data, it is extracted from the content
before it is passed to the compile function.
Use content
for templates that are not affected by data, and render
for dynamic templates that depend on template data.
For example, you could replace marked
with markdown-it
for Markdown templates. Because the content is the same regardless of the template data, we use content
, and not render
.
import MarkdownIt from "markdown-it"
const md = new MarkdownIt()
export default {
compilers: {
markdown: {
compile: function (content) {
return { content: md.render(content) }
},
},
},
}
Adding a new compiler
You can also add a completely new compiler using the same compilers
option.
For example, you might want to add support for nunjucks templates. This compiler looks for any file that ends in the .html
, .njk
or .nunjucks
extension in your src
directory. When it finds one, it uses the nunjucks library to compile the template.
import nunjucks from "nunjucks"
export default {
compilers: {
nunjucks: {
ext: [".html", ".njk", ".nunjucks"],
compile: (content, filename, options) => {
return {
ext: ".html",
render: nunjucks.compileString(content).render,
}
},
},
},
}
Built-in compilers
The built‑in compilers will generate HTML, CSS and JavaScript files depending on the file extension.
Compiler | File extensions | Library |
---|---|---|
HTML | ||
templatejs | .template.js , .template.ts | esbuild* |
markdown | .md | marked |
pug | .pug | pug |
handlebars | .hbs , .handlebars | handlebars |
yaml | .yaml , .yml | js‑yaml |
json | .json | JSON.parse |
CSS | ||
css | .css | esbuild |
sass | .sass , .scss | sass |
JavaScript | ||
clientjs | .client.js , .client.ts | esbuild |
* For JavaScript templates, esbuild
is used to reimport dependencies. This helps to avoid stale imports as you update your source files.