Greasy Fork

vanilla-lib

Vanilla JS library

目前为 2018-06-13 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.icu/scripts/369430/605188/vanilla-lib.js

/* vanilla-lib */
var  mapFlat = ( array,func ) => array.map( x => func(x) ).reduce( (a,b) => a.concat(b) ),
     parenth = ( elem,nth ) => traverse(elem, ifndef(nth, 1), 0), //( ! elem ? null : elem.parentNode ),
     ifndef  = ( expr,value ) => ( ndef(expr) ? value : expr ),
     ifnan   = ( expr,value ) => ( isNaN(expr) ? value : expr ),
     isobj   = expr => ( 'object' === typeof expr ),
     isarr   = expr => ( isobj(expr) && Array === expr.constructor ),
     isfn    = expr => ( 'function' === typeof expr ),
     ndef    = expr => ( 'undefined' === typeof expr ),
     test    = ( expr,func,other ) => ( !! expr ? func(expr) : isfn(other) ? other(expr) : other ),
     log     = console.debug,
     on      = ( elem,event,func ) => elem.addEventListener(event, func),
     $$      = ( sel,elem ) => Array.slice((elem || document).querySelectorAll(sel)),
     $       = ( sel,elem ) => (elem || document).querySelector(sel);

var  aggRate = ( amount,rate,periods ) => ( ! periods ? amount : aggRate(amount * rate, rate, periods - 1) ),
     toDec   = expr => ( Math.round(parseFloat((expr +'').replace(/\$|,/g, '')) * 100) / 100 );

//Array.prototype.mapFlat = function( func ) { return  mapFlat(this, func); };


function  appendTo( element, parent, reference ) {
	if ( !! reference ) {
		parent    = reference.parentNode;
		reference = reference.nextSibling;
	}

	if ( !! reference ) {
		return  prependTo(element, parent, reference);
	} else  if ( !! parent ) {
		parent.append(element);
	} else {
		console.warn('*** appendTo() could not add element: Neither a parent nor a reference element was provided');
	}

	return  element;
}

function  attr( elem, name, value ) {
	if ( isarr(elem) ) {
		return  elem.map( el => attr(el, name, value) );
	}

	keysAndValues(name, value, ( n,v ) => ( null === v ? elem.removeAttribute(n) : elem.setAttribute(n, v) ) );
	return  elem;
}

function  create( html, containerType ) {
	let  container = null,
	     result    = null,
	     attrs, style;

	if ( isobj(containerType) ) {
		attrs         = containerType.attrs;
		style         = containerType.style;
		containerType = containerType.container;
	}

	containerType = containerType || 'div';
	create[ containerType ] =
	container               = create[ containerType ] || document.createElement(containerType);
	container.innerHTML = html;
	result = Array.slice(container.childNodes)
	         	.map( elem => (elem.remove(), elem) );

	if ( !! attrs ) {
		attr(result, attrs);
	}
	if ( !! style ) {
		css(result, style);
	}

	if ( 1 == result.length ) {
		result = result[ 0 ];
	}
	return  result;
}

function  css( element, key, value ) {
	if ( isarr(element) ) {
		return  element.map( el => keysAndValues(key, value, ( k,v ) => el.style[ k ] = v ) );
	}

	keysAndValues(key, value, ( k,v ) => element.style[ k ] = v );
	return  element;
}

function  keysAndValues( key, value, action ) {
	// Case 1: key is an object (and there is no value)
	if ( isobj(key) && ndef(value) ) {
		return  Object.keys(key)
		        	.map( k => action(k, key[ k ]) );
	// Case 2: key is an array
	} else if ( isarr(key) ) {
		// Case 1.a: value is an array of the same length
		if ( isarr(value) && key.length === value.length ) {
			return  key.map( ( k,i ) => action(k, value[ i ]) );
		// Case 1.b: value is considered a simple, plain value
		} else {
			return  key.map( k => action(k, value) );
		}
	// Default Case: key and value considered as simple, plain values
	} else {
		return  action(key, value);
	}
}

function  prependTo( element, parent, reference ) {
	if ( ! reference && !! parent ) {
		reference = parent.childNodes[ 0 ];
	}

	if ( !! reference ) {
		reference.parentNode.insertBefore(element, reference);
	} else if ( !! parent ) {
		parent.append(element);
	} else {
		console.warn('*** prependTo() could not add element: Neither a parent nor a reference element was provided');
	}

	return  element;
}

function  toDec2( amount ) {
	amount = toDec(amount);
	if ( isNaN(amount) ) {
		return  null;
	}
	let  segs = (amount +'').split('.');
	return  segs[ 0 ] +'.'+ ((segs[ 1 ] || 0) +'0').slice(0, 2);
}

function  toMoney( amount ) {
	let  dec2 = toDec2(amount);
	return  ( isNaN(dec2) ? null : dec2 < 0 ? '-$ '+ (-dec2) : '$ '+ dec2 );
}

function  traverse( elem, up, sideways, elementsOnly, lastIfNull ) {
	let  last = elem;
	while ( !! elem && up -- > 0 )  elem = (last = elem, elem.parentNode);

	let  prop = ( elementsOnly ? 'Element' : '' ) +'Sibling';
	if ( sideways < 0 ) {
		while ( !! elem && sideways ++ < 0 )  elem = (last = elem, elem[ 'previous'+ prop ]);
	} else if ( sideways > 0 ) {
		while ( !! elem && sideways -- > 0 )  elem = (last = elem, elem[ 'next'+ prop ]);
	}

	return  ( ! lastIfNull ? elem : elem || last );
}