subslate
Version:
configurable template string replacement
207 lines (149 loc) • 5.94 kB
Markdown
# subslate
A configurable template string replacement
<br />
<!-- cspell: disable bracketsstartstop -->
[](https://github.com/josh-hemphill/subslate/releases)
[](https://npmjs.org/package/subslate)
[](https://deno.land/x/subslate/mod.ts)
[](https://doc.deno.land/https/deno.land/x/subslate/mod.ts)
<!-- [](https://josh-hemphill.github.io/subslate/#/) -->
[](https://travis-ci.org/josh-hemphill/subslate)
[](https://codecov.io/gh/josh-hemphill/subslate)
[](https://libraries.io/npm/subslate)
[](https://openbase.io/js/subslate?utm_source=embedded&utm_medium=badge&utm_campaign=rate-badge)
## Install
### Node.js & Browser
```bash
npm install subslate
```
```js
/* ES Module / Typescript */ import { subslate } from "subslate";
/* CommonJS */ const { subslate } = require("subslate");
```
### Deno
```js
import subslate from "https://deno.land/x/subslate/mod.ts"
```
### Import in HTML
```html
<script type="text/javascript" src="dist/subslate.js"></script> <!-- For UMD module -->
<script type="text/javascript" src="dist/subslate.poly.iife.js"></script> <!-- For global IIFE with polyfills -->
<script type="module" src="dist/subslate.esm.js"></script> <!-- For ES Module -->
```
### From CDN
```html
<script type="text/javascript" src="https://unpkg.com/subslate"></script>
```
## Examples
For a full list see the [examples directory](./example/) (coming)
### Play with it
[CodePen (suggested)](##) (coming soon)
[JSFiddle](##) (coming soon)
## Usage
Create a template with any kind of start and stop characters and configurable object path indicators; or by default just use JS style template characters (don't forget to escape them in a JS template if you want them there to replace later)
### Basic Usage
```js
import { subslate } from "subslate";
const template = '${A} world ${x["y"].0.z}'
const context = {A: 'hi', x:{y:[{z:', hello'}]}}
const compiled = subslate(template,context)
compiled === 'hi world, hello'
```
## Options
`subslate(template,context,options)`
- [`options.startStopPairs`: `string | (string | [string, string])[]`](#with-custom-bracketsstartstop)
- [`options.escapeSep`: `{[K in 'json' | 'html' | 'url' | 'js']?: boolean`](#with-escaped-object-property-indicators)
- [`options.allowUnquotedProps`: `boolean`](#with-root-and-unquoted-brackets)
- [`options.allowRootBracket`: `boolean`](#with-root-and-unquoted-brackets)
- [`options.sanitizer`: `(v: SanitizerOptions) => string`](#with-sanitizer)
- `options.maxNameLength`: `number` (maximum character length between start and stop)
### With Custom Brackets/Start-Stop
```js
import { subslate } from "subslate";
const template = `
SELECT * FROM ![tables.table]
`
const context = {tables: {table: 'myTable'}}
const compiled = subslate(template,context,{
startStopPairs: ['![',']']
// startStopPairs gets normalized to an array of pairs, so
// ['![',']'] gets turned into [['![',']']]
// and '||' would get turned into [['||','||']]
// or even mixed ['||',['${','}']] = [['||','||'],['${','}']]
})
compiled === `
SELECT * FROM myTable
`
```
### With Escaped Object Property Indicators
```js
import { subslate } from "subslate";
const template = `
<p>
<% x%5B%22y%22%5D\\u2E0.z %>
</p>
`
const context = {x:{y:[{z:'hello'}]}}
const compiled = subslate(template,context,{
startStopPairs: ['<%','%>'],
escapeSep: {
json: true
html: true
url: true
js: true
}
})
compiled === `
<p>
hello
</p>
`
```
### With Sanitizer
The sanitizer recieves all errors and empty fields as well as successful values. So you have a chance to to correct how you want the final string to be injected. A sanitizer must allways return a string, otherwise the library throws an error.
```ts
import { subslate } from "subslate";
const template = 'SELECT * FROM ${myTable}${blabla}'
const context = {myTable:'hello'}
type SanitizerOptions = {
// If there was no characters between the start and stop
isEmpty: boolean,
// The full id that was between start and stop
id: string,
// The index in the id where parsing stopped if there was a problem
at?: number,
// The value that was successfully found for a givin id
value?: unknown,
}
function sanitizer: string (opts: SanitizerOptions) {
if (opts.isEmpty || opts.at !== undefined) return ''; // to silence errors from resulting in the stringified "undefined" being injected.
return opts.value;
}
const compiled = subslate(template,context,{sanitizer})
compiled === 'SELECT * FROM hello'
```
### With Root and Unquoted Brackets
```js
import { subslate } from "subslate";
const template = `
<p>
<% [x].y %>
</p>
`
const context = {x:{y:'hello'}}
const compiled = subslate(template,context,{
startStopPairs: ['<%','%>'],
allowUnquotedProps: true
allowRootBracket: true
})
compiled === `
<p>
hello
</p>
`
```
<!-- markdownlint-disable-next-line-->
## Reademe rewrite in progress...
## Contributors
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- ALL-CONTRIBUTORS-LIST:END -->