|
|
|
// Utilities
|
|
|
|
//
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
|
|
function _class(obj) { return Object.prototype.toString.call(obj); }
|
|
|
|
|
|
|
|
function isString(obj) { return _class(obj) === '[object String]'; }
|
|
|
|
|
|
|
|
// Merge objects
|
|
|
|
//
|
|
|
|
function assign(obj /*from1, from2, from3, ...*/) {
|
|
|
|
var sources = Array.prototype.slice.call(arguments, 1);
|
|
|
|
while (sources.length) {
|
|
|
|
var source = sources.shift();
|
|
|
|
if (!source) { continue; }
|
|
|
|
|
|
|
|
if (typeof(source) !== 'object') {
|
|
|
|
throw new TypeError(source + 'must be non-object');
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var p in source) {
|
|
|
|
if (source.hasOwnProperty(p)) {
|
|
|
|
obj[p] = source[p];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var UNESCAPE_MD_RE = /\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;
|
|
|
|
|
|
|
|
function unescapeMd(str) {
|
|
|
|
if (str.indexOf('\\') < 0) { return str; }
|
|
|
|
return str.replace(UNESCAPE_MD_RE, '$1');
|
|
|
|
}
|
|
|
|
|
|
|
|
function isValidEntityCode(c) {
|
|
|
|
/*eslint no-bitwise:0*/
|
|
|
|
// broken sequence
|
|
|
|
if (c >= 0xD800 && c <= 0xDFFF) { return false; }
|
|
|
|
// never used
|
|
|
|
if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }
|
|
|
|
if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }
|
|
|
|
// control codes
|
|
|
|
if (c >= 0x00 && c <= 0x08) { return false; }
|
|
|
|
if (c === 0x0B) { return false; }
|
|
|
|
if (c >= 0x0E && c <= 0x1F) { return false; }
|
|
|
|
if (c >= 0x7F && c <= 0x9F) { return false; }
|
|
|
|
// out of range
|
|
|
|
if (c > 0x10FFFF) { return false; }
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function fromCodePoint(c) {
|
|
|
|
/*eslint no-bitwise:0*/
|
|
|
|
if (c > 0xffff) {
|
|
|
|
c -= 0x10000;
|
|
|
|
var surrogate1 = 0xd800 + (c >> 10),
|
|
|
|
surrogate2 = 0xdc00 + (c & 0x3ff);
|
|
|
|
|
|
|
|
return String.fromCharCode(surrogate1, surrogate2);
|
|
|
|
}
|
|
|
|
return String.fromCharCode(c);
|
|
|
|
}
|
|
|
|
|
|
|
|
var NAMED_ENTITY_RE = /&([a-z][a-z0-9]{1,31});/gi;
|
|
|
|
var entities = require('./entities');
|
|
|
|
|
|
|
|
function replaceEntities(str) {
|
|
|
|
if (str.indexOf('&') < 0) { return str; }
|
|
|
|
|
|
|
|
return str.replace(NAMED_ENTITY_RE, function(match, name) {
|
|
|
|
if (entities.hasOwnProperty(name)) {
|
|
|
|
return entities[name];
|
|
|
|
}
|
|
|
|
return match;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
exports.assign = assign;
|
|
|
|
exports.isString = isString;
|
|
|
|
exports.unescapeMd = unescapeMd;
|
|
|
|
exports.isValidEntityCode = isValidEntityCode;
|
|
|
|
exports.fromCodePoint = fromCodePoint;
|
|
|
|
exports.replaceEntities = replaceEntities;
|