3 var xtend = require('xtend');
4 var encode = require('stringify-entities');
5 var defaults = require('./defaults');
6 var escapeFactory = require('./escape');
7 var returner = require('./util/returner');
9 module.exports = setOptions;
11 /* Map of applicable enum's. */
13 entities: {true: true, false: true, numbers: true, escape: true},
14 bullet: {'*': true, '-': true, '+': true},
15 rule: {'-': true, _: true, '*': true},
16 listItemIndent: {tab: true, mixed: true, 1: true},
17 emphasis: {_: true, '*': true},
18 strong: {_: true, '*': true},
19 fence: {'`': true, '~': true}
22 /* Expose `validate`. */
24 boolean: validateBoolean,
25 string: validateString,
26 number: validateNumber,
27 function: validateFunction
30 /* Set options. Does not overwrite previously set
32 function setOptions(options) {
34 var current = self.options;
38 if (options == null) {
40 } else if (typeof options === 'object') {
41 options = xtend(options);
43 throw new Error('Invalid value `' + options + '` for setting `options`');
46 for (key in defaults) {
47 validate[typeof defaults[key]](options, key, current[key], maps[key]);
50 ruleRepetition = options.ruleRepetition;
52 if (ruleRepetition && ruleRepetition < 3) {
53 raise(ruleRepetition, 'options.ruleRepetition');
56 self.encode = encodeFactory(String(options.entities));
57 self.escape = escapeFactory(options);
59 self.options = options;
64 /* Throw an exception with in its `message` `value`
66 function raise(value, name) {
67 throw new Error('Invalid value `' + value + '` for setting `' + name + '`');
70 /* Validate a value to be boolean. Defaults to `def`.
71 * Raises an exception with `context[name]` when not
73 function validateBoolean(context, name, def) {
74 var value = context[name];
80 if (typeof value !== 'boolean') {
81 raise(value, 'options.' + name);
84 context[name] = value;
87 /* Validate a value to be boolean. Defaults to `def`.
88 * Raises an exception with `context[name]` when not
90 function validateNumber(context, name, def) {
91 var value = context[name];
98 raise(value, 'options.' + name);
101 context[name] = value;
104 /* Validate a value to be in `map`. Defaults to `def`.
105 * Raises an exception with `context[name]` when not
107 function validateString(context, name, def, map) {
108 var value = context[name];
114 value = String(value);
116 if (!(value in map)) {
117 raise(value, 'options.' + name);
120 context[name] = value;
123 /* Validate a value to be function. Defaults to `def`.
124 * Raises an exception with `context[name]` when not
126 function validateFunction(context, name, def) {
127 var value = context[name];
133 if (typeof value !== 'function') {
134 raise(value, 'options.' + name);
137 context[name] = value;
140 /* Factory to encode HTML entities.
141 * Creates a no-operation function when `type` is
142 * `'false'`, a function which encodes using named
143 * references when `type` is `'true'`, and a function
144 * which encodes using numbered references when `type` is
146 function encodeFactory(type) {
149 if (type === 'false') {
153 if (type === 'true') {
154 options.useNamedReferences = true;
157 if (type === 'escape') {
158 options.escapeOnly = true;
159 options.useNamedReferences = true;
164 /* Encode HTML entities using the bound options. */
165 function wrapped(value) {
166 return encode(value, options);