vanilla-lib

Vanilla JS library

当前为 2018-06-15 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/369430/605965/vanilla-lib.js

  1. function VanillaLib( ) {
  2. let self = Object.create({});
  3.  
  4. self.mapFlat = ( array,func ) => array.map( x => func(x) ).reduce( (a,b) => a.concat(b) );
  5. self.parenth = ( elem,nth ) => traverse(elem, self.ifndef(nth, 1), 0);
  6. self.ifndef = ( expr,value ) => ( self.ndef(expr) ? value : expr );
  7. self.ispojo = expr => self.isobj(expr, Object);
  8. self.export = ( source,target,members ) => ( Object.keys(source).filter( key => ! members || members.includes(key) )
  9. .forEach( key => target[ key ] = source[ key ] ) );
  10. self.ifnan = ( expr,value ) => ( isNaN(expr) ? value : expr );
  11. self.isobj = ( expr,type ) => ( 'object' === typeof expr && ( ! type || self.isfn(expr.constructor)
  12. && type === ( self.isfn(type) ? expr.constructor : expr.constructor.name ) ) );
  13. self.isarr = expr => self.isobj(expr, Array);
  14. self.isstr = expr => ( 'string' === typeof expr );
  15. self.isfn = expr => ( 'function' === typeof expr );
  16. self.ndef = expr => ( 'undefined' === typeof expr );
  17. self.test = ( expr,func,other ) => ( !! expr ? func(expr) : self.isfn(other) ? other(expr) : other );
  18. self.fire = ( elem,event,args ) => elem.dispatchEvent( self.isobj(event) ? even
  19. : new Event( event, self.ifndef(args, { 'bubbles':true, 'cancelable':true }) ) );
  20. self.warn = console.warn;
  21. self.log = console.debug;
  22. self.on = ( elem,event,func ) => elem.addEventListener(event, func);
  23. self.$$ = ( sel,elem ) => Array.slice((elem || document).querySelectorAll(sel));
  24. self.$ = ( sel,elem ) => (elem || document).querySelector(sel);
  25.  
  26. self.aggRate = ( amount,rate,periods ) => ( ! periods ? amount : self.aggRate(amount * rate, rate, periods - 1) ),
  27. self.toDec = expr => ( Math.round(parseFloat((expr +'').replace(/\$|,/g, '')) * 100) / 100 );
  28.  
  29.  
  30. self.appendTo = function( element, parent, reference ) {
  31. if ( !! reference ) {
  32. parent = reference.parentNode;
  33. reference = reference.nextSibling;
  34. }
  35.  
  36. if ( !! reference ) {
  37. return self.prependTo(element, parent, reference);
  38. } else if ( !! parent ) {
  39. parent.append(element);
  40. } else {
  41. self.warn('*** appendTo() could not add element: No parent or reference element provided');
  42. }
  43.  
  44. return element;
  45. };
  46.  
  47. self.attr = function( elem, name, value ) {
  48. if ( self.isarr(elem) ) {
  49. return elem.map( el => self.attr(el, name, value) );
  50. }
  51.  
  52. self.keysAndValues(name, value, ( n,v ) => ( null === v ? elem.removeAttribute(n) : elem.setAttribute(n, v) ) );
  53. return elem;
  54. };
  55.  
  56. self.create = function( html, containerType ) {
  57. let container = null,
  58. result = null,
  59. attrs, style;
  60.  
  61. if ( self.isobj(containerType) ) {
  62. attrs = containerType.attrs;
  63. style = containerType.style;
  64. containerType = containerType.container;
  65. }
  66.  
  67. containerType = containerType || 'div';
  68. create[ containerType ] =
  69. container = create[ containerType ] || document.createElement(containerType);
  70. container.innerHTML = html;
  71. result = Array.slice(container.childNodes)
  72. .map( elem => (elem.remove(), elem) );
  73.  
  74. if ( !! attrs ) {
  75. self.attr(result, attrs);
  76. }
  77. if ( !! style ) {
  78. self.css(result, style);
  79. }
  80.  
  81. if ( 1 == result.length ) {
  82. result = result[ 0 ];
  83. }
  84. return result;
  85. };
  86.  
  87. self.css = function( element, key, value ) {
  88. if ( isarr(element) ) {
  89. return element.map( el => css(el, key, value) );
  90. }
  91.  
  92. keysAndValues(key, value, ( k,v ) => element.style[ k ] = v );
  93. return element;
  94. };
  95.  
  96. self.keysAndValues = function( key, value, action ) {
  97. // Case 1: key is an object (and there is no value)
  98. if ( self.isobj(key) && ! value ) {
  99. return Object.keys(key)
  100. .map( k => action(k, key[ k ]) );
  101. // Case 2: key is an array
  102. } else if ( self.isarr(key) ) {
  103. // Case 1.a: value is an array of the same length
  104. if ( self.isarr(value) && key.length === value.length ) {
  105. return key.map( ( k,i ) => action(k, value[ i ]) );
  106. // Case 1.b: value is considered a simple, plain value
  107. } else {
  108. return key.map( k => action(k, value) );
  109. }
  110. // Default Case: key and value considered as simple, plain values
  111. } else {
  112. return action(key, value);
  113. }
  114. };
  115.  
  116. self.prependTo = function( element, parent, reference ) {
  117. if ( ! reference && !! parent ) {
  118. reference = parent.childNodes[ 0 ];
  119. }
  120.  
  121. if ( !! reference ) {
  122. reference.parentNode.insertBefore(element, reference);
  123. } else if ( !! parent ) {
  124. parent.append(element);
  125. } else {
  126. self.warn('*** prependTo() could not add element: No parent or reference element provided');
  127. }
  128.  
  129. return element;
  130. };
  131.  
  132. self.toDec2 = function( amount ) {
  133. amount = self.toDec(amount);
  134. if ( isNaN(amount) ) {
  135. return null;
  136. }
  137. let segs = (amount +'').split('.');
  138. return segs[ 0 ] +'.'+ ((segs[ 1 ] || 0) +'0').slice(0, 2);
  139. };
  140.  
  141. self.toMoney = function( amount ) {
  142. let dec2 = self.toDec2(amount);
  143. return ( isNaN(dec2) ? null : dec2 < 0 ? '-$ '+ (-dec2) : '$ '+ dec2 );
  144. };
  145.  
  146. self.traverse = function( elem, up, sideways, elementsOnly, lastIfNull ) {
  147. let last = elem;
  148. while ( !! elem && up -- > 0 ) elem = (last = elem, elem.parentNode);
  149.  
  150. let prop = ( elementsOnly ? 'Element' : '' ) +'Sibling';
  151. if ( sideways < 0 ) {
  152. while ( !! elem && sideways ++ < 0 ) elem = (last = elem, elem[ 'previous'+ prop ]);
  153. } else if ( sideways > 0 ) {
  154. while ( !! elem && sideways -- > 0 ) elem = (last = elem, elem[ 'next'+ prop ]);
  155. }
  156.  
  157. return ( ! lastIfNull ? elem : elem || last );
  158. };
  159.  
  160.  
  161. self.copyMembers = function( source, target, members, preserve ) {
  162. //self.log('* Copying from', source, '\n\tto', target, '\n\t'+ members, preserve);
  163. if ( ! self.isobj(source) || ! self.isobj(target) ) {
  164. self.warn('=> Cannot copy from/to non-objects');
  165. return false;
  166. }
  167.  
  168. let names = Object.keys(source);
  169. preserve = ( self.isobj(preserve) ? preserve : false );
  170. //self.log('- Full list of members:', names);
  171.  
  172. if ( self.isstr(members) ) {
  173. members = members.split(',').map( nm => nm.trim() );
  174. }
  175. if ( self.isarr(members) ) {
  176. //self.log('* Member filter:', members);
  177. names = names.filter( nm => members.includes(nm) );
  178. } else if ( self.isfn(members) ) {
  179. names = names.filter(members);
  180. }
  181. //self.log('- Filtered list of members:', names);
  182.  
  183. names.forEach( nm => {
  184. if ( !! target[ nm ] && !! preserve ) {
  185. preserve[ nm ] = target[ nm ];
  186. }
  187. target[ nm ] = source[ nm ];
  188. //self.log('- Target members', nm, target[ nm ]);
  189. } );
  190. //self.log('=>', target);
  191. return (preserve || target);
  192. };
  193.  
  194. self.export = function( scope, members, overwriten ) {
  195. if ( ! scope ) {
  196. return false;
  197. }
  198. return self.copyMembers(this, scope, members, overwriten);
  199. };
  200.  
  201. // Avoid needing a 'new' operator; this is just a wrapper
  202. return self;
  203. }