mirror of
				https://github.com/fooflington/selfdefined.git
				synced 2025-10-31 14:18:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			276 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Utilities
 | |
| //
 | |
| 'use strict';
 | |
| 
 | |
| 
 | |
| function _class(obj) { return Object.prototype.toString.call(obj); }
 | |
| 
 | |
| function isString(obj) { return _class(obj) === '[object String]'; }
 | |
| 
 | |
| var _hasOwnProperty = Object.prototype.hasOwnProperty;
 | |
| 
 | |
| function has(object, key) {
 | |
|   return _hasOwnProperty.call(object, key);
 | |
| }
 | |
| 
 | |
| // Merge objects
 | |
| //
 | |
| function assign(obj /*from1, from2, from3, ...*/) {
 | |
|   var sources = Array.prototype.slice.call(arguments, 1);
 | |
| 
 | |
|   sources.forEach(function (source) {
 | |
|     if (!source) { return; }
 | |
| 
 | |
|     if (typeof source !== 'object') {
 | |
|       throw new TypeError(source + 'must be object');
 | |
|     }
 | |
| 
 | |
|     Object.keys(source).forEach(function (key) {
 | |
|       obj[key] = source[key];
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| // Remove element from array and put another array at those position.
 | |
| // Useful for some operations with tokens
 | |
| function arrayReplaceAt(src, pos, newElements) {
 | |
|   return [].concat(src.slice(0, pos), newElements, src.slice(pos + 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 UNESCAPE_MD_RE  = /\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g;
 | |
| var ENTITY_RE       = /&([a-z#][a-z0-9]{1,31});/gi;
 | |
| var UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');
 | |
| 
 | |
| var DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;
 | |
| 
 | |
| var entities = require('./entities');
 | |
| 
 | |
| function replaceEntityPattern(match, name) {
 | |
|   var code = 0;
 | |
| 
 | |
|   if (has(entities, name)) {
 | |
|     return entities[name];
 | |
|   }
 | |
| 
 | |
|   if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {
 | |
|     code = name[1].toLowerCase() === 'x' ?
 | |
|       parseInt(name.slice(2), 16)
 | |
|     :
 | |
|       parseInt(name.slice(1), 10);
 | |
|     if (isValidEntityCode(code)) {
 | |
|       return fromCodePoint(code);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return match;
 | |
| }
 | |
| 
 | |
| /*function replaceEntities(str) {
 | |
|   if (str.indexOf('&') < 0) { return str; }
 | |
| 
 | |
|   return str.replace(ENTITY_RE, replaceEntityPattern);
 | |
| }*/
 | |
| 
 | |
| function unescapeMd(str) {
 | |
|   if (str.indexOf('\\') < 0) { return str; }
 | |
|   return str.replace(UNESCAPE_MD_RE, '$1');
 | |
| }
 | |
| 
 | |
| function unescapeAll(str) {
 | |
|   if (str.indexOf('\\') < 0 && str.indexOf('&') < 0) { return str; }
 | |
| 
 | |
|   return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {
 | |
|     if (escaped) { return escaped; }
 | |
|     return replaceEntityPattern(match, entity);
 | |
|   });
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| var HTML_ESCAPE_TEST_RE = /[&<>"]/;
 | |
| var HTML_ESCAPE_REPLACE_RE = /[&<>"]/g;
 | |
| var HTML_REPLACEMENTS = {
 | |
|   '&': '&',
 | |
|   '<': '<',
 | |
|   '>': '>',
 | |
|   '"': '"'
 | |
| };
 | |
| 
 | |
| function replaceUnsafeChar(ch) {
 | |
|   return HTML_REPLACEMENTS[ch];
 | |
| }
 | |
| 
 | |
| function escapeHtml(str) {
 | |
|   if (HTML_ESCAPE_TEST_RE.test(str)) {
 | |
|     return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);
 | |
|   }
 | |
|   return str;
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| var REGEXP_ESCAPE_RE = /[.?*+^$[\]\\(){}|-]/g;
 | |
| 
 | |
| function escapeRE(str) {
 | |
|   return str.replace(REGEXP_ESCAPE_RE, '\\$&');
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| function isSpace(code) {
 | |
|   switch (code) {
 | |
|     case 0x09:
 | |
|     case 0x20:
 | |
|       return true;
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| // Zs (unicode class) || [\t\f\v\r\n]
 | |
| function isWhiteSpace(code) {
 | |
|   if (code >= 0x2000 && code <= 0x200A) { return true; }
 | |
|   switch (code) {
 | |
|     case 0x09: // \t
 | |
|     case 0x0A: // \n
 | |
|     case 0x0B: // \v
 | |
|     case 0x0C: // \f
 | |
|     case 0x0D: // \r
 | |
|     case 0x20:
 | |
|     case 0xA0:
 | |
|     case 0x1680:
 | |
|     case 0x202F:
 | |
|     case 0x205F:
 | |
|     case 0x3000:
 | |
|       return true;
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| /*eslint-disable max-len*/
 | |
| var UNICODE_PUNCT_RE = require('uc.micro/categories/P/regex');
 | |
| 
 | |
| // Currently without astral characters support.
 | |
| function isPunctChar(ch) {
 | |
|   return UNICODE_PUNCT_RE.test(ch);
 | |
| }
 | |
| 
 | |
| 
 | |
| // Markdown ASCII punctuation characters.
 | |
| //
 | |
| // !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~
 | |
| // http://spec.commonmark.org/0.15/#ascii-punctuation-character
 | |
| //
 | |
| // Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.
 | |
| //
 | |
| function isMdAsciiPunct(ch) {
 | |
|   switch (ch) {
 | |
|     case 0x21/* ! */:
 | |
|     case 0x22/* " */:
 | |
|     case 0x23/* # */:
 | |
|     case 0x24/* $ */:
 | |
|     case 0x25/* % */:
 | |
|     case 0x26/* & */:
 | |
|     case 0x27/* ' */:
 | |
|     case 0x28/* ( */:
 | |
|     case 0x29/* ) */:
 | |
|     case 0x2A/* * */:
 | |
|     case 0x2B/* + */:
 | |
|     case 0x2C/* , */:
 | |
|     case 0x2D/* - */:
 | |
|     case 0x2E/* . */:
 | |
|     case 0x2F/* / */:
 | |
|     case 0x3A/* : */:
 | |
|     case 0x3B/* ; */:
 | |
|     case 0x3C/* < */:
 | |
|     case 0x3D/* = */:
 | |
|     case 0x3E/* > */:
 | |
|     case 0x3F/* ? */:
 | |
|     case 0x40/* @ */:
 | |
|     case 0x5B/* [ */:
 | |
|     case 0x5C/* \ */:
 | |
|     case 0x5D/* ] */:
 | |
|     case 0x5E/* ^ */:
 | |
|     case 0x5F/* _ */:
 | |
|     case 0x60/* ` */:
 | |
|     case 0x7B/* { */:
 | |
|     case 0x7C/* | */:
 | |
|     case 0x7D/* } */:
 | |
|     case 0x7E/* ~ */:
 | |
|       return true;
 | |
|     default:
 | |
|       return false;
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Hepler to unify [reference labels].
 | |
| //
 | |
| function normalizeReference(str) {
 | |
|   // use .toUpperCase() instead of .toLowerCase()
 | |
|   // here to avoid a conflict with Object.prototype
 | |
|   // members (most notably, `__proto__`)
 | |
|   return str.trim().replace(/\s+/g, ' ').toUpperCase();
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| // Re-export libraries commonly used in both markdown-it and its plugins,
 | |
| // so plugins won't have to depend on them explicitly, which reduces their
 | |
| // bundled size (e.g. a browser build).
 | |
| //
 | |
| exports.lib                 = {};
 | |
| exports.lib.mdurl           = require('mdurl');
 | |
| exports.lib.ucmicro         = require('uc.micro');
 | |
| 
 | |
| exports.assign              = assign;
 | |
| exports.isString            = isString;
 | |
| exports.has                 = has;
 | |
| exports.unescapeMd          = unescapeMd;
 | |
| exports.unescapeAll         = unescapeAll;
 | |
| exports.isValidEntityCode   = isValidEntityCode;
 | |
| exports.fromCodePoint       = fromCodePoint;
 | |
| // exports.replaceEntities     = replaceEntities;
 | |
| exports.escapeHtml          = escapeHtml;
 | |
| exports.arrayReplaceAt      = arrayReplaceAt;
 | |
| exports.isSpace             = isSpace;
 | |
| exports.isWhiteSpace        = isWhiteSpace;
 | |
| exports.isMdAsciiPunct      = isMdAsciiPunct;
 | |
| exports.isPunctChar         = isPunctChar;
 | |
| exports.escapeRE            = escapeRE;
 | |
| exports.normalizeReference  = normalizeReference;
 | 
