JAVASCRIPT   7

general.js

Guest on 20th July 2021 03:30:06 PM

  1. 'use strict';
  2.  
  3. import mejs from '../core/mejs';
  4.  
  5. /**
  6.  *
  7.  * @param {String} input
  8.  * @return {string}
  9.  */
  10. export function escapeHTML (input) {
  11.  
  12.         if (typeof input !== 'string') {
  13.                 throw new Error('Argument passed must be a string');
  14.         }
  15.  
  16.         const map = {
  17.                 '&': '&',
  18.                 '<': '&lt;',
  19.                 '>': '&gt;',
  20.                 '"': '&quot;'
  21.         };
  22.  
  23.         return input.replace(/[&<>"]/g, (c) => {
  24.                 return map[c];
  25.         });
  26. }
  27.  
  28. // taken from underscore
  29. export function debounce (func, wait, immediate = false) {
  30.  
  31.         if (typeof func !== 'function') {
  32.                 throw new Error('First argument must be a function');
  33.         }
  34.  
  35.         if (typeof wait !== 'number') {
  36.                 throw new Error('Second argument must be a numeric value');
  37.         }
  38.  
  39.         let timeout;
  40.         return () => {
  41.                 const context = this, args = arguments;
  42.                 const later = () => {
  43.                         timeout = null;
  44.                         if (!immediate) {
  45.                                 func.apply(context, args);
  46.                         }
  47.                 };
  48.                 const callNow = immediate && !timeout;
  49.                 clearTimeout(timeout);
  50.                 timeout = setTimeout(later, wait);
  51.  
  52.                 if (callNow) {
  53.                         func.apply(context, args);
  54.                 }
  55.         };
  56. }
  57.  
  58. /**
  59.  * Determine if an object contains any elements
  60.  *
  61.  * @see http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object
  62.  * @param {Object} instance
  63.  * @return {Boolean}
  64.  */
  65. export function isObjectEmpty (instance) {
  66.         return (Object.getOwnPropertyNames(instance).length <= 0);
  67. }
  68.  
  69. /**
  70.  * Group a string of events into `document` (d) and `window` (w) events
  71.  *
  72.  * @param {String} events  List of space separated events
  73.  * @param {String} id      Namespace appended to events
  74.  * @return {{d: Array, w: Array}}
  75.  */
  76. export function splitEvents (events, id) {
  77.         // Global events
  78.         const rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
  79.         // add player ID as an event namespace so it's easier to unbind them all later
  80.         const ret = {d: [], w: []};
  81.         (events || '').split(' ').forEach((v) => {
  82.                 const eventName = `${v}${(id ? `.${id}` : '')}`;
  83.  
  84.                 if (eventName.startsWith('.')) {
  85.                         ret.d.push(eventName);
  86.                         ret.w.push(eventName);
  87.                 }
  88.                 else {
  89.                         ret[rwindow.test(v) ? 'w' : 'd'].push(eventName);
  90.                 }
  91.         });
  92.  
  93.         ret.d = ret.d.join(' ');
  94.         ret.w = ret.w.join(' ');
  95.         return ret;
  96. }
  97.  
  98. /**
  99.  *
  100.  * @param {string} eventName
  101.  * @param {*} target
  102.  * @return {Event|Object}
  103.  */
  104. export function createEvent (eventName, target) {
  105.  
  106.         if (typeof eventName !== 'string') {
  107.                 throw new Error('Event name must be a string');
  108.         }
  109.  
  110.         const
  111.                 eventFrags = eventName.match(/([a-z]+\.([a-z]+))/i),
  112.                 detail = {
  113.                         target: target
  114.                 }
  115.         ;
  116.  
  117.         if (eventFrags !== null) {
  118.                 eventName = eventFrags[1];
  119.                 detail.namespace = eventFrags[2];
  120.         }
  121.  
  122.         return new window.CustomEvent(eventName, {
  123.                 detail: detail
  124.         });
  125. }
  126.  
  127. /**
  128.  * Returns true if targetNode appears after sourceNode in the dom.
  129.  * @param {HTMLElement} sourceNode - the source node for comparison
  130.  * @param {HTMLElement} targetNode - the node to compare against sourceNode
  131.  */
  132. export function isNodeAfter (sourceNode, targetNode) {
  133.  
  134.         return !!(
  135.                 sourceNode &&
  136.                 targetNode &&
  137.                 sourceNode.compareDocumentPosition(targetNode) & 2 // 2 : Node.DOCUMENT_POSITION_PRECEDING
  138.         );
  139. }
  140.  
  141. /**
  142.  * Determines if a value is a string
  143.  *
  144.  * @param {*} value to check
  145.  * @returns {Boolean} True if a value is a string
  146.  */
  147. export function isString (value) {
  148.         return typeof value === 'string';
  149. }
  150.  
  151. mejs.Utils = mejs.Utils || {};
  152. mejs.Utils.escapeHTML = escapeHTML;
  153. mejs.Utils.debounce = debounce;
  154. mejs.Utils.isObjectEmpty = isObjectEmpty;
  155. mejs.Utils.splitEvents = splitEvents;
  156. mejs.Utils.createEvent = createEvent;
  157. mejs.Utils.isNodeAfter = isNodeAfter;
  158. mejs.Utils.isString = isString;

Raw Paste


Login or Register to edit or fork this paste. It's free.