UNPKG

commonmark

Version:

a strongly specified, highly compatible variant of Markdown

78 lines (62 loc) 1.76 kB
"use strict"; var C_BACKSLASH = 92; var entityToChar = require('./html5-entities.js').entityToChar; var ENTITY = "&(?:#x[a-f0-9]{1,8}|#[0-9]{1,8}|[a-z][a-z0-9]{1,31});"; var reBackslashOrAmp = /[\\&]/; var ESCAPABLE = '[!"#$%&\'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]'; var reEntityOrEscapedChar = new RegExp('\\\\' + ESCAPABLE + '|' + ENTITY, 'gi'); var XMLSPECIAL = '[&<>"]'; var reXmlSpecial = new RegExp(XMLSPECIAL, 'g'); var reXmlSpecialOrEntity = new RegExp(ENTITY + '|' + XMLSPECIAL, 'gi'); var unescapeChar = function(s) { if (s.charCodeAt(0) === C_BACKSLASH) { return s.charAt(1); } else { return entityToChar(s); } }; // Replace entities and backslash escapes with literal characters. var unescapeString = function(s) { if (reBackslashOrAmp.test(s)) { return s.replace(reEntityOrEscapedChar, unescapeChar); } else { return s; } }; var normalizeURI = function(uri) { try { return encodeURI(decodeURI(uri)); } catch(err) { return uri; } }; var replaceUnsafeChar = function(s) { switch (s) { case '&': return '&amp;'; case '<': return '&lt;'; case '>': return '&gt;'; case '"': return '&quot;'; default: return s; } }; var escapeXml = function(s, preserve_entities) { if (reXmlSpecial.test(s)) { if (preserve_entities) { return s.replace(reXmlSpecialOrEntity, replaceUnsafeChar); } else { return s.replace(reXmlSpecial, replaceUnsafeChar); } } else { return s; } }; module.exports = { unescapeString: unescapeString, normalizeURI: normalizeURI, escapeXml: escapeXml };