detokenizer
Replace tokens in a string based on token value map.
Examples
Basic:
const {detokenize} = require('detokenizer');
detokenize('Hello {name}!', {'{name}': 'John'});
Dynamic tokens:
detokenize('Hello {name}! Your email is {emoji:envelope} {email}.', [
['{name}', 'John'],
['{email}', 'john@example.com'],
[/{emoji:(?<id>[a-z0-9]+)}/i, (token, match) => match.groups.id === 'envelope' ? '✉️' : '']
]);
Async:
const {detokenizeAsync} = require('detokenizer');
await detokenizeAsync('Issue #42', [
[
/#(?<id>\d+)/,
async (token, match) => {
const issueTitle = await retrieveIssueTitle(match.groups.id);
return `<a href="..." title="${issueTitle}">#${match.groups.id}</a>`;
}
]
]);
Token escaping:
Add escape sequences to be replaced out as last tokens. (use dynamic tokens (regular expressions) for more advanced replacing)
detokenize('\{foo\} value is {foo}', {
'{foo}': 'bar',
'\\{': '{',
'\\}': '}',
});
API
Exports:
detokenize(input, values)
Parameters:
input: string
A string to run the replacer on.
values: Record<string, string | number | Replacer> | Array<[string | RegExp, string | number | Replacer]>
Values to substitute tokens with.
It can either be a basic key: value
object:
detokenize('...', {
foo: 'value',
bar: (token) => `you used ${token} token`
});
Or if you want the dynamic tokens support, an array of map like entries:
detokenize('...', [
['foo', 'value'],
[/bar/i, (token, match) => `you used ${match[0]} token`]
]);
Replacer
If assigned to a string token, replacer is:
(token: string) => string | number;
If assigned to a RegExp token, it is:
(token: RegExp, match: RegExpExecArray) => string | number;
Example.
const emojis = {
envelope: '✉️',
}
const emojiToken = /{emoji:(?<id>[a-z0-9]+)}/i;
function emojiReplacer(token, match) {
return emojis[match.groups.id] || '';
}
detokenize('{emoji:envelope}', [[emojiToken, emojiReplacer]]);
detokenizeAsync(input, values): Promise<string>
Same API as sync version, but Replacer
can return a promise that resolves with a string
or a number
.
await detokenizeAsync('Issue #42', [
[
/#(?<id>\d+)/,
async (token, match) => {
const issueTitle = await retrieveIssueTitle(match.groups.id);
return `<a href="..." title="${issueTitle}">#${match.groups.id}</a>`;
}
]
]);