Skip to content

bwowsersource/btick

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

btick

btick is a JavaScript template-literal preprocessor for Node.js.

It evaluates .jsml templates and produces rendered text (example: HTML), while supporting:

  • inline JavaScript expressions
  • async template values
  • mutable and immutable template scope (const)
  • capture groups for custom block rendering (loops/repetition)

Installation

Global CLI

npm install -g btick

Local project dependency

npm install btick

CLI usage

The package exposes the CLI command btick:

btick <template-file> [args-json]
  • <template-file>: required path to your template (for example, .jsml)
  • [args-json]: optional JSON file whose content becomes template globals

Examples

Minimal example:

btick resources/minimal.jsml resources/minimal.args.json

resources/minimal.jsml:

<h1>Hello ${name}</h1>
<p>2 + 3 = ${2 + 3}</p>

resources/minimal.args.json:

{
	"name": "World"
}

Render the bundled sample:

btick resources/example.jsml resources/args.json

Write output to a file:

btick resources/example.jsml resources/args.json > output.html

Run without global install:

node ./bin/index.js resources/example.jsml resources/args.json

Stream args through stdin

echo '{"name": "echo"}' | node ./bin/index.js resources/example.jsml

Template basics

Templates are plain text with ${...} expressions.

<h1>Hello ${args.name}</h1>
<p>Time: ${new Date().toISOString()}</p>

Expressions can return:

  • strings/numbers/booleans (rendered as text)
  • promises (awaited)
  • objects (used to update template scope)

Scope updates

Return an object to set scope variables:

${{ title: "Welcome" }}
<h1>${({ title }) => title}</h1>

Return { const: {...} } to define immutable scope values:

${{ const: { appName: "btick" } }}
<p>${({ appName }) => appName}</p>

Attempting to reassign a const key throws an error.

Node API

const fs = require('fs');
const btick = require('btick');

async function main() {
	const template = fs.readFileSync('./resources/example.jsml', 'utf8');
	const globals = { args: { name: { morning: 'Akash', evening: 'Webcrafti' } } };

	const { text, ctx, render } = await btick(template, globals);

	console.log(text);
	console.log(ctx);

	// Re-render with updated context state
	const rerendered = await render({ ...ctx, extra: 'value' });
	console.log(rerendered.text);
}

main();

Exported helpers

  • btick.groom(str): escapes raw backticks in template text
  • btick.createCaptureGroup(handler?): create custom capture group markers
  • btick.captureGroupEnd: helper marker for capture group termination

Local example server

Start the included demo server:

npm run serve

Then open:

http://localhost:8083/example

The server reads templates from resources/*.jsml.

Project structure

  • bin/index.js: CLI entrypoint (btick)
  • code/index.js: main compiler/renderer API
  • code/server.js: demo HTTP server
  • resources/example.jsml: sample template
  • resources/args.json: sample input args

About

A javascript hypertext preprocessor using nodejs

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published