1 | 'use strict';
|
2 |
|
3 |
|
4 | var has = require('has');
|
5 | var xtend = require('xtend');
|
6 |
|
7 |
|
8 | module.exports = encode;
|
9 |
|
10 | encode.escape = escape;
|
11 |
|
12 |
|
13 | var defaultEscapes = {
|
14 | '#': '\\#',
|
15 | '$': '\\$',
|
16 | '%': '\\%',
|
17 | '&': '\\&',
|
18 | '\\': '\\textbackslash{}',
|
19 | '^': '\\textasciicircum{}',
|
20 | '_': '\\_',
|
21 | '{': '\\{',
|
22 | '}': '\\}',
|
23 | '~': '\\textasciitilde{}'
|
24 |
|
25 |
|
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 |
|
40 | function one(char, next, escapes) {
|
41 | if (has(escapes, char)) {
|
42 | return escapes[char];
|
43 | }
|
44 |
|
45 | return char;
|
46 | }
|
47 |
|
48 |
|
49 | function toExpression(characters) {
|
50 | var pattern = characters.map(escapeRegExp).join('|');
|
51 |
|
52 | return new RegExp('[' + pattern + ']', 'g');
|
53 | }
|
54 |
|
55 | function escapeRegExp(str) {
|
56 | return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
|
57 | } |
\ | No newline at end of file |