UNPKG

1.25 kBJavaScriptView Raw
1'use strict';
2
3var has = require('has');
4var xtend = require('xtend');
5
6/* Expose. */
7module.exports = encode;
8
9encode.escape = escape;
10
11/* List of enforced escapes. */
12var defaultEscapes = {
13 '#': '\\#',
14 '$': '\\$',
15 '%': '\\%',
16 '&': '\\&',
17 '\\': '\\textbackslash{}',
18 '^': '\\textasciicircum{}',
19 '_': '\\_',
20 '{': '\\{',
21 '}': '\\}',
22 '~': '\\textasciitilde{}'
23};
24
25/* Encode special characters in `value`. */
26function 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