Security News
The Unpaid Backbone of Open Source: Solo Maintainers Face Increasing Security Demands
Solo open source maintainers face burnout and security challenges, with 60% unpaid and 60% considering quitting.
render-cli
Advanced tools
Render HTML from Jade, Handlebars, Swig and most other kinds of templates on the command line. Uses the consolidate.js template engine consolidation library for all heavy lifting.
Render is an advanced command-line interface that renders HTML from Jade templates, Handlebars templates, Swig templates and pretty much any other kind of templates you can think of.
Install with NPM (bundled with node.js):
npm install render-cli -g
Render comes with an ISC license.
Pass context variables to your templates over stdin
or with --context <file>...
for dynamic rendering. Context can be YAML or JSON.
# no context
render page.jade
# context from stdin
cat page.json | render page.jade
# context from a single file
render page.jade \
--input page.json
# context from multiple files which will be
# merged (if objects) or appended (if arrays)
render page.jade \
--input globals.json,page.json
Render a single page:
render page.jade
Render a single page with context:
# one template, one rendered html file
render page.jade \
--input page.json
Render multiple pages, one for each item in an array:
render tableofcontents.jade \
--input pages.json
--output 'pages/{permalink}'
--many
If the array to iterate over is not at the root of the JSON file but is an property on an object, specify the key to that property:
render tableofcontents.jade \
--input pages.json
--many pages
If you'd like to iterate over the keys and values of an object instead, e.g. a url-to-title mapping, use:
render tableofcontents.jade \
--input links.json
--many-pairs
Each key will be available as key
, each value as value
.
You can pass more than one file to render
. Objects will be merged, arrays will be appended to.
When merging different inputs would result in name clashes, you have the option of namespacing the data from each input file.
Namespaces come in three flavors:
Type | Description | Flag |
---|---|---|
explicit | you pick the namespace | --input (namespace):(filename) |
automatic | the basename of the file | --namespaced |
automatic | the full path to the file | --fully-namespaced |
Explicit namespaces: put globals.json
in a globals
key rather than at the root of the context object.
render page.jade \
--input globals:globals.json,page.json
{
"globals": {
...
},
"title": "data from page.json, not namespaced",
...
}
Automatic namespaces: inside of the context object, globals.json
data will be available under globals
and page.json
data under page
.
render page.jade \
--input globals.json,page.json
--namespaced
{
"globals": {
...
},
"page": {
...
}
}
Automatic namespaces using the full path: helpers/globals.json
will be accessible at helpers.globals
and page.json
will be under page
.
render page.jade \
--input helpers/globals.json,page.json
--fully-namespaced
{
"helpers": {
"globals": {
...
}
},
"page": {
...
}
}
Explicit namespaces take preference over automatic ones, so these globals will be available under globals
rather than helpers.globals
:
render page.jade \
--input globals:helpers/globals.json,page.json
--fully-namespaced
{
"globals": {
...
},
"page": {
...
}
}
Output paths can contain placeholders that will be interpolated to determine the final path to which to write the HTML for each rendered set of context. Think of your output path as a little template of its own.
If you're a web developer, this is similar to the kind of URL routing you see in web frameworks.
In a path like build/{date}/{permalink}
, the date
and permalink
keys in your data determine where the final HTML ends up. This is especially useful when you ask render to iterate over your context data with --many
, which will render and save each set of data separately.
Paths are interpolated using the exact same context data that was used to render your template.
Not just the output path, even the path to your template can be dynamic and based on the data. For example, templates/{layout}.swig
will figure out which layout to use by looking for a layout
key in your context variables. This means a single render
command isn't limited to rendering just a single template.
Output paths that end in a slash will get /index.html
tacked on the end.
Pattern | Context | Output |
---|---|---|
posts/{permalink}.html | permalink: hello-world | posts/hello-world.html |
posts/{permalink}/ | permalink: hello-world | posts/hello-world/index.html |
posts/{permalink}/index.html | permalink: hello-world | posts/hello-world/index.html |
Render uses the consolidate.js template engine consolidation library for all template rendering. Its documentation contains a list of all supported templating languages.
If your context data includes a date in ISO format, you're in luck. Using the --newer-than <key>
flag, you can tell render to only re-render if the context data is newer than the HTML that's already there.
The key flag indicates where in your data render
can find the modified date.
This is particularly useful when iterating over multiple context sets: two or three sets of data might have changed but nothing else, and you shouldn't have to rerender all of it.
The speed of render
will depend on the complexity of your templates, the template engine and the speed of your CPU and hard drive. You can reasonably expect to be able to render about 10 to 20 pages per second.
IO is usually the bottleneck, even on machines with solid state drives, so render
processes content serially to avoid filesystem contention.
FAQs
Render HTML from Jade, Handlebars, Swig and most other kinds of templates on the command line. Uses the consolidate.js template engine consolidation library for all heavy lifting.
The npm package render-cli receives a total of 17 weekly downloads. As such, render-cli popularity was classified as not popular.
We found that render-cli demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Solo open source maintainers face burnout and security challenges, with 60% unpaid and 60% considering quitting.
Security News
License exceptions modify the terms of open source licenses, impacting how software can be used, modified, and distributed. Developers should be aware of the legal implications of these exceptions.
Security News
A developer is accusing Tencent of violating the GPL by modifying a Python utility and changing its license to BSD, highlighting the importance of copyleft compliance.