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

 
 
 

Contributors