UNPKG

1.27 kBJavaScriptView Raw
1'use strict';
2
3/* Dependencies. */
4var has = require('has');
5var xtend = require('xtend');
6
7/* Expose. */
8module.exports = encode;
9
10encode.escape = escape;
11
12/* List of enforced escapes. */
13var defaultEscapes = {
14 '#': '\\#',
15 '$': '\\$',
16 '%': '\\%',
17 '&': '\\&',
18 '\\': '\\textbackslash{}',
19 '^': '\\textasciicircum{}',
20 '_': '\\_',
21 '{': '\\{',
22 '}': '\\}',
23 '~': '\\textasciitilde{}'
24
25 /* Encode special characters in `value`. */
26};function encode(value) {
27 var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
28
29 var escapes = xtend(defaultEscapes, opts);
30 var set = toExpression(Object.keys(escapes));
31
32 value = value.replace(set, function (char, pos, val) {
33 return one(char, val.charAt(pos + 1), escapes);
34 });
35
36 return value;
37}
38
39/* Encode `char` according to `options`. */
40function one(char, next, escapes) {
41 if (has(escapes, char)) {
42 return escapes[char];
43 }
44
45 return char;
46}
47
48/* Create an expression for `characters`. */
49function toExpression(characters) {
50 var pattern = characters.map(escapeRegExp).join('|');
51
52 return new RegExp('[' + pattern + ']', 'g');
53}
54
55function escapeRegExp(str) {
56 return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); // eslint-disable-line no-useless-escape
57}
\No newline at end of file