tangle-doc
Version:
Tangle.js for the modern web
2 lines (1 loc) • 44.3 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Tangle=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){(function(){this.MooTools={version:"1.5.2",build:"ed01297a1a19de0675404640e7377cf97694e131"};var typeOf=this.typeOf=function(item){if(item==null)return"null";if(item.$family!=null)return item.$family();if(item.nodeName){if(item.nodeType==1)return"element";if(item.nodeType==3)return/\S/.test(item.nodeValue)?"textnode":"whitespace"}else if(typeof item.length=="number"){if("callee"in item)return"arguments";if("item"in item)return"collection"}return typeof item};var instanceOf=this.instanceOf=function(item,object){if(item==null)return false;var constructor=item.$constructor||item.constructor;while(constructor){if(constructor===object)return true;constructor=constructor.parent}return item instanceof object};var hasOwnProperty=Object.prototype.hasOwnProperty;var Function=this.Function;Function.prototype.overloadSetter=function(usePlural){var self=this;return function(a,b){if(a==null)return this;if(usePlural||typeof a!="string"){for(var k in a)self.call(this,k,a[k])}else{self.call(this,a,b)}return this}};Function.prototype.overloadGetter=function(usePlural){var self=this;return function(a){var args,result;if(typeof a!="string")args=a;else if(arguments.length>1)args=arguments;else if(usePlural)args=[a];if(args){result={};for(var i=0;i<args.length;i++)result[args[i]]=self.call(this,args[i])}else{result=self.call(this,a)}return result}};Function.prototype.extend=function(key,value){this[key]=value}.overloadSetter();Function.prototype.implement=function(key,value){this.prototype[key]=value}.overloadSetter();var slice=Array.prototype.slice;Function.from=function(item){return typeOf(item)=="function"?item:function(){return item}};Array.from=function(item){if(item==null)return[];return Type.isEnumerable(item)&&typeof item!="string"?typeOf(item)=="array"?item:slice.call(item):[item]};Number.from=function(item){var number=parseFloat(item);return isFinite(number)?number:null};String.from=function(item){return item+""};Function.implement({hide:function(){this.$hidden=true;return this},protect:function(){this.$protected=true;return this}});var Type=this.Type=function(name,object){if(name){var lower=name.toLowerCase();var typeCheck=function(item){return typeOf(item)==lower};Type["is"+name]=typeCheck;if(object!=null){object.prototype.$family=function(){return lower}.hide()}}if(object==null)return null;object.extend(this);object.$constructor=Type;object.prototype.$constructor=object;return object};var toString=Object.prototype.toString;Type.isEnumerable=function(item){return item!=null&&typeof item.length=="number"&&toString.call(item)!="[object Function]"};var hooks={};var hooksOf=function(object){var type=typeOf(object.prototype);return hooks[type]||(hooks[type]=[])};var implement=function(name,method){if(method&&method.$hidden)return;var hooks=hooksOf(this);for(var i=0;i<hooks.length;i++){var hook=hooks[i];if(typeOf(hook)=="type")implement.call(hook,name,method);else hook.call(this,name,method)}var previous=this.prototype[name];if(previous==null||!previous.$protected)this.prototype[name]=method;if(this[name]==null&&typeOf(method)=="function")extend.call(this,name,function(item){return method.apply(item,slice.call(arguments,1))})};var extend=function(name,method){if(method&&method.$hidden)return;var previous=this[name];if(previous==null||!previous.$protected)this[name]=method};Type.implement({implement:implement.overloadSetter(),extend:extend.overloadSetter(),alias:function(name,existing){implement.call(this,name,this.prototype[existing])}.overloadSetter(),mirror:function(hook){hooksOf(this).push(hook);return this}});new Type("Type",Type);var force=function(name,object,methods){var isType=object!=Object,prototype=object.prototype;if(isType)object=new Type(name,object);for(var i=0,l=methods.length;i<l;i++){var key=methods[i],generic=object[key],proto=prototype[key];if(generic)generic.protect();if(isType&&proto)object.implement(key,proto.protect())}if(isType){var methodsEnumerable=prototype.propertyIsEnumerable(methods[0]);object.forEachMethod=function(fn){if(!methodsEnumerable)for(var i=0,l=methods.length;i<l;i++){fn.call(prototype,prototype[methods[i]],methods[i])}for(var key in prototype)fn.call(prototype,prototype[key],key)}}return force};force("String",String,["charAt","charCodeAt","concat","contains","indexOf","lastIndexOf","match","quote","replace","search","slice","split","substr","substring","trim","toLowerCase","toUpperCase"])("Array",Array,["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice","indexOf","lastIndexOf","filter","forEach","every","map","some","reduce","reduceRight","contains"])("Number",Number,["toExponential","toFixed","toLocaleString","toPrecision"])("Function",Function,["apply","call","bind"])("RegExp",RegExp,["exec","test"])("Object",Object,["create","defineProperty","defineProperties","keys","getPrototypeOf","getOwnPropertyDescriptor","getOwnPropertyNames","preventExtensions","isExtensible","seal","isSealed","freeze","isFrozen"])("Date",Date,["now"]);Object.extend=extend.overloadSetter();Date.extend("now",function(){return+new Date});new Type("Boolean",Boolean);Number.prototype.$family=function(){return isFinite(this)?"number":"null"}.hide();Number.extend("random",function(min,max){return Math.floor(Math.random()*(max-min+1)+min)});Array.implement({each:function(fn,bind){Array.forEach(this,fn,bind);return this}});Object.extend({keys:function(object){var keys=[];for(var k in object){if(hasOwnProperty.call(object,k))keys.push(k)}return keys},forEach:function(object,fn,bind){Object.keys(object).forEach(function(key){fn.call(bind,object[key],key,object)})}});Object.each=Object.forEach;var cloneOf=function(item){switch(typeOf(item)){case"array":return item.clone();case"object":return Object.clone(item);default:return item}};Array.implement("clone",function(){var i=this.length,clone=new Array(i);while(i--)clone[i]=cloneOf(this[i]);return clone});var mergeOne=function(source,key,current){switch(typeOf(current)){case"object":if(typeOf(source[key])=="object")Object.merge(source[key],current);else source[key]=Object.clone(current);break;case"array":source[key]=current.clone();break;default:source[key]=current}return source};Object.extend({merge:function(source,k,v){if(typeOf(k)=="string")return mergeOne(source,k,v);for(var i=1,l=arguments.length;i<l;i++){var object=arguments[i];for(var key in object)mergeOne(source,key,object[key])}return source},clone:function(object){var clone={};for(var key in object)clone[key]=cloneOf(object[key]);return clone},append:function(original){for(var i=1,l=arguments.length;i<l;i++){var extended=arguments[i]||{};for(var key in extended)original[key]=extended[key]}return original}});["Object","WhiteSpace","TextNode","Collection","Arguments"].each(function(name){new Type(name)});var UID=Date.now();String.extend("uniqueID",function(){return(UID++).toString(36)})})();Array.implement({clean:function(){return this.filter(function(item){return item!=null})},invoke:function(methodName){var args=Array.slice(arguments,1);return this.map(function(item){return item[methodName].apply(item,args)})},associate:function(keys){var obj={},length=Math.min(this.length,keys.length);for(var i=0;i<length;i++)obj[keys[i]]=this[i];return obj},link:function(object){var result={};for(var i=0,l=this.length;i<l;i++){for(var key in object){if(object[key](this[i])){result[key]=this[i];delete object[key];break}}}return result},contains:function(item,from){return this.indexOf(item,from)!=-1},append:function(array){this.push.apply(this,array);return this},getLast:function(){return this.length?this[this.length-1]:null},getRandom:function(){return this.length?this[Number.random(0,this.length-1)]:null},include:function(item){if(!this.contains(item))this.push(item);return this},combine:function(array){for(var i=0,l=array.length;i<l;i++)this.include(array[i]);return this},erase:function(item){for(var i=this.length;i--;){if(this[i]===item)this.splice(i,1)}return this},empty:function(){this.length=0;return this},flatten:function(){var array=[];for(var i=0,l=this.length;i<l;i++){var type=typeOf(this[i]);if(type=="null")continue;array=array.concat(type=="array"||type=="collection"||type=="arguments"||instanceOf(this[i],Array)?Array.flatten(this[i]):this[i])}return array},pick:function(){for(var i=0,l=this.length;i<l;i++){if(this[i]!=null)return this[i]}return null},hexToRgb:function(array){if(this.length!=3)return null;var rgb=this.map(function(value){if(value.length==1)value+=value;return parseInt(value,16)});return array?rgb:"rgb("+rgb+")"},rgbToHex:function(array){if(this.length<3)return null;if(this.length==4&&this[3]==0&&!array)return"transparent";var hex=[];for(var i=0;i<3;i++){var bit=(this[i]-0).toString(16);hex.push(bit.length==1?"0"+bit:bit)}return array?hex:"#"+hex.join("")}});String.implement({contains:function(string,index){return(index?String(this).slice(index):String(this)).indexOf(string)>-1},test:function(regex,params){return(typeOf(regex)=="regexp"?regex:new RegExp(""+regex,params)).test(this)},trim:function(){return String(this).replace(/^\s+|\s+$/g,"")},clean:function(){return String(this).replace(/\s+/g," ").trim()},camelCase:function(){return String(this).replace(/-\D/g,function(match){return match.charAt(1).toUpperCase()})},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(match){return"-"+match.charAt(0).toLowerCase()})},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(match){return match.toUpperCase()})},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1")},toInt:function(base){return parseInt(this,base||10)},toFloat:function(){return parseFloat(this)},hexToRgb:function(array){var hex=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return hex?hex.slice(1).hexToRgb(array):null},rgbToHex:function(array){var rgb=String(this).match(/\d{1,3}/g);return rgb?rgb.rgbToHex(array):null},substitute:function(object,regexp){return String(this).replace(regexp||/\\?\{([^{}]+)\}/g,function(match,name){if(match.charAt(0)=="\\")return match.slice(1);return object[name]!=null?object[name]:""})}});Number.implement({limit:function(min,max){return Math.min(max,Math.max(min,this))},round:function(precision){precision=Math.pow(10,precision||0).toFixed(precision<0?-precision:0);return Math.round(this*precision)/precision},times:function(fn,bind){for(var i=0;i<this;i++)fn.call(bind,i,this)},toFloat:function(){return parseFloat(this)},toInt:function(base){return parseInt(this,base||10)}});Number.alias("each","times");(function(math){var methods={};math.each(function(name){if(!Number[name])methods[name]=function(){return Math[name].apply(null,[this].concat(Array.from(arguments)))}});Number.implement(methods)})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);Function.extend({attempt:function(){for(var i=0,l=arguments.length;i<l;i++){try{return arguments[i]()}catch(e){}}return null}});Function.implement({attempt:function(args,bind){try{return this.apply(bind,Array.from(args))}catch(e){}return null},pass:function(args,bind){var self=this;if(args!=null)args=Array.from(args);return function(){return self.apply(bind,args||arguments)}},delay:function(delay,bind,args){return setTimeout(this.pass(args==null?[]:args,bind),delay)},periodical:function(periodical,bind,args){return setInterval(this.pass(args==null?[]:args,bind),periodical)}});(function(){var hasOwnProperty=Object.prototype.hasOwnProperty;Object.extend({subset:function(object,keys){var results={};for(var i=0,l=keys.length;i<l;i++){var k=keys[i];if(k in object)results[k]=object[k]}return results},map:function(object,fn,bind){var results={};var keys=Object.keys(object);for(var i=0;i<keys.length;i++){var key=keys[i];results[key]=fn.call(bind,object[key],key,object)}return results},filter:function(object,fn,bind){var results={};var keys=Object.keys(object);for(var i=0;i<keys.length;i++){var key=keys[i],value=object[key];if(fn.call(bind,value,key,object))results[key]=value}return results},every:function(object,fn,bind){var keys=Object.keys(object);for(var i=0;i<keys.length;i++){var key=keys[i];if(!fn.call(bind,object[key],key))return false}return true},some:function(object,fn,bind){var keys=Object.keys(object);for(var i=0;i<keys.length;i++){var key=keys[i];if(fn.call(bind,object[key],key))return true}return false},values:function(object){var values=[];var keys=Object.keys(object);for(var i=0;i<keys.length;i++){var k=keys[i];values.push(object[k])}return values},getLength:function(object){return Object.keys(object).length},keyOf:function(object,value){var keys=Object.keys(object);for(var i=0;i<keys.length;i++){var key=keys[i];if(object[key]===value)return key}return null},contains:function(object,value){return Object.keyOf(object,value)!=null},toQueryString:function(object,base){var queryString=[];Object.each(object,function(value,key){if(base)key=base+"["+key+"]";var result;switch(typeOf(value)){case"object":result=Object.toQueryString(value,key);break;case"array":var qs={};value.each(function(val,i){qs[i]=val});result=Object.toQueryString(qs,key);break;default:result=key+"="+encodeURIComponent(value)}if(value!=null)queryString.push(result)});return queryString.join("&")}})})();(function(){var Class=this.Class=new Type("Class",function(params){if(instanceOf(params,Function))params={initialize:params};var newClass=function(){reset(this);if(newClass.$prototyping)return this;this.$caller=null;this.$family=null;var value=this.initialize?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;return value}.extend(this).implement(params);newClass.$constructor=Class;newClass.prototype.$constructor=newClass;newClass.prototype.parent=parent;return newClass});var parent=function(){if(!this.$caller)throw new Error('The method "parent" cannot be called.');var name=this.$caller.$name,parent=this.$caller.$owner.parent,previous=parent?parent.prototype[name]:null;if(!previous)throw new Error('The method "'+name+'" has no parent.');return previous.apply(this,arguments)};var reset=function(object){for(var key in object){var value=object[key];switch(typeOf(value)){case"object":var F=function(){};F.prototype=value;object[key]=reset(new F);break;case"array":object[key]=value.clone();break}}return object};var wrap=function(self,key,method){if(method.$origin)method=method.$origin;var wrapper=function(){if(method.$protected&&this.$caller==null)throw new Error('The method "'+key+'" cannot be called.');var caller=this.caller,current=this.$caller;this.caller=current;this.$caller=wrapper;var result=method.apply(this,arguments);this.$caller=current;this.caller=caller;return result}.extend({$owner:self,$origin:method,$name:key});return wrapper};var implement=function(key,value,retain){if(Class.Mutators.hasOwnProperty(key)){value=Class.Mutators[key].call(this,value);if(value==null)return this}if(typeOf(value)=="function"){if(value.$hidden)return this;this.prototype[key]=retain?value:wrap(this,key,value)}else{Object.merge(this.prototype,key,value)}return this};var getInstance=function(klass){klass.$prototyping=true;var proto=new klass;delete klass.$prototyping;return proto};Class.implement("implement",implement.overloadSetter());Class.Mutators={Extends:function(parent){this.parent=parent;this.prototype=getInstance(parent)},Implements:function(items){Array.from(items).each(function(item){var instance=new item;for(var key in instance)implement.call(this,key,instance[key],true)},this)}}})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments));return this},callChain:function(){return this.$chain.length?this.$chain.shift().apply(this,arguments):false},clearChain:function(){this.$chain.empty();return this}});var removeOn=function(string){return string.replace(/^on([A-Z])/,function(full,first){return first.toLowerCase()})};this.Events=new Class({$events:{},addEvent:function(type,fn,internal){type=removeOn(type);this.$events[type]=(this.$events[type]||[]).include(fn);if(internal)fn.internal=true;return this},addEvents:function(events){for(var type in events)this.addEvent(type,events[type]);return this},fireEvent:function(type,args,delay){type=removeOn(type);var events=this.$events[type];if(!events)return this;args=Array.from(args);events.each(function(fn){if(delay)fn.delay(delay,this,args);else fn.apply(this,args)},this);return this},removeEvent:function(type,fn){type=removeOn(type);var events=this.$events[type];if(events&&!fn.internal){var index=events.indexOf(fn);if(index!=-1)delete events[index]}return this},removeEvents:function(events){var type;if(typeOf(events)=="object"){for(type in events)this.removeEvent(type,events[type]);return this}if(events)events=removeOn(events);for(type in this.$events){if(events&&events!=type)continue;var fns=this.$events[type];for(var i=fns.length;i--;)if(i in fns){this.removeEvent(type,fns[i])}}return this}});this.Options=new Class({setOptions:function(){var options=this.options=Object.merge.apply(null,[{},this.options].append(arguments));if(this.addEvent)for(var option in options){if(typeOf(options[option])!="function"||!/^on[A-Z]/.test(option))continue;this.addEvent(option,options[option]);delete options[option]}return this}})})();if(typeof JSON=="undefined")this.JSON={};(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4)};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"");return/^[\],:{}\s]*$/.test(string)};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj)}:function(obj){if(obj&&obj.toJSON)obj=obj.toJSON();switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[];Object.each(obj,function(value,key){var json=JSON.encode(value);if(json)string.push(JSON.encode(key)+":"+json)});return"{"+string+"}";case"number":case"boolean":return""+obj;case"null":return"null"}return null};JSON.secure=true;JSON.decode=function(string,secure){if(!string||typeOf(string)!="string")return null;if(secure==null)secure=JSON.secure;if(secure){if(JSON.parse)return JSON.parse(string);if(!JSON.validate(string))throw new Error("JSON could not decode the input; security is enabled and the value is not secure.")}return eval("("+string+")")}})()},{}],2:[function(require,module,exports){!function(){"use strict";var re={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function sprintf(key){return sprintf_format(sprintf_parse(key),arguments)}function vsprintf(fmt,argv){return sprintf.apply(null,[fmt].concat(argv||[]))}function sprintf_format(parse_tree,argv){var cursor=1,tree_length=parse_tree.length,arg,output="",i,k,ph,pad,pad_character,pad_length,is_positive,sign;for(i=0;i<tree_length;i++){if(typeof parse_tree[i]==="string"){output+=parse_tree[i]}else if(typeof parse_tree[i]==="object"){ph=parse_tree[i];if(ph.keys){arg=argv[cursor];for(k=0;k<ph.keys.length;k++){if(arg==undefined){throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"',ph.keys[k],ph.keys[k-1]))}arg=arg[ph.keys[k]]}}else if(ph.param_no){arg=argv[ph.param_no]}else{arg=argv[cursor++]}if(re.not_type.test(ph.type)&&re.not_primitive.test(ph.type)&&arg instanceof Function){arg=arg()}if(re.numeric_arg.test(ph.type)&&(typeof arg!=="number"&&isNaN(arg))){throw new TypeError(sprintf("[sprintf] expecting number but found %T",arg))}if(re.number.test(ph.type)){is_positive=arg>=0}switch(ph.type){case"b":arg=parseInt(arg,10).toString(2);break;case"c":arg=String.fromCharCode(parseInt(arg,10));break;case"d":case"i":arg=parseInt(arg,10);break;case"j":arg=JSON.stringify(arg,null,ph.width?parseInt(ph.width):0);break;case"e":arg=ph.precision?parseFloat(arg).toExponential(ph.precision):parseFloat(arg).toExponential();break;case"f":arg=ph.precision?parseFloat(arg).toFixed(ph.precision):parseFloat(arg);break;case"g":arg=ph.precision?String(Number(arg.toPrecision(ph.precision))):parseFloat(arg);break;case"o":arg=(parseInt(arg,10)>>>0).toString(8);break;case"s":arg=String(arg);arg=ph.precision?arg.substring(0,ph.precision):arg;break;case"t":arg=String(!!arg);arg=ph.precision?arg.substring(0,ph.precision):arg;break;case"T":arg=Object.prototype.toString.call(arg).slice(8,-1).toLowerCase();arg=ph.precision?arg.substring(0,ph.precision):arg;break;case"u":arg=parseInt(arg,10)>>>0;break;case"v":arg=arg.valueOf();arg=ph.precision?arg.substring(0,ph.precision):arg;break;case"x":arg=(parseInt(arg,10)>>>0).toString(16);break;case"X":arg=(parseInt(arg,10)>>>0).toString(16).toUpperCase();break}if(re.json.test(ph.type)){output+=arg}else{if(re.number.test(ph.type)&&(!is_positive||ph.sign)){sign=is_positive?"+":"-";arg=arg.toString().replace(re.sign,"")}else{sign=""}pad_character=ph.pad_char?ph.pad_char==="0"?"0":ph.pad_char.charAt(1):" ";pad_length=ph.width-(sign+arg).length;pad=ph.width?pad_length>0?pad_character.repeat(pad_length):"":"";output+=ph.align?sign+arg+pad:pad_character==="0"?sign+pad+arg:pad+sign+arg}}}return output}var sprintf_cache=Object.create(null);function sprintf_parse(fmt){if(sprintf_cache[fmt]){return sprintf_cache[fmt]}var _fmt=fmt,match,parse_tree=[],arg_names=0;while(_fmt){if((match=re.text.exec(_fmt))!==null){parse_tree.push(match[0])}else if((match=re.modulo.exec(_fmt))!==null){parse_tree.push("%")}else if((match=re.placeholder.exec(_fmt))!==null){if(match[2]){arg_names|=1;var field_list=[],replacement_field=match[2],field_match=[];if((field_match=re.key.exec(replacement_field))!==null){field_list.push(field_match[1]);while((replacement_field=replacement_field.substring(field_match[0].length))!==""){if((field_match=re.key_access.exec(replacement_field))!==null){field_list.push(field_match[1])}else if((field_match=re.index_access.exec(replacement_field))!==null){field_list.push(field_match[1])}else{throw new SyntaxError("[sprintf] failed to parse named argument key")}}}else{throw new SyntaxError("[sprintf] failed to parse named argument key")}match[2]=field_list}else{arg_names|=2}if(arg_names===3){throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported")}parse_tree.push({placeholder:match[0],param_no:match[1],keys:match[2],sign:match[3],pad_char:match[4],align:match[5],width:match[6],precision:match[7],type:match[8]})}else{throw new SyntaxError("[sprintf] unexpected placeholder")}_fmt=_fmt.substring(match[0].length)}return sprintf_cache[fmt]=parse_tree}if(typeof exports!=="undefined"){exports["sprintf"]=sprintf;exports["vsprintf"]=vsprintf}if(typeof window!=="undefined"){window["sprintf"]=sprintf;window["vsprintf"]=vsprintf;if(typeof define==="function"&&define["amd"]){define(function(){return{sprintf:sprintf,vsprintf:vsprintf}})}}}()},{}],3:[function(require,module,exports){const{addEvents,removeEvents}=require("./shim.js");require("mootools");var BVTouchable=this.BVTouchable=new Class({initialize:function(el,delegate){this.element=el;this.delegate=delegate;this.setTouchable(true)},setTouchable:function(isTouchable){if(this.touchable===isTouchable){return}this.touchable=isTouchable;this.element.style.pointerEvents=this.touchable||this.hoverable?"auto":"none";if(isTouchable){if(!this._mouseBound){this._mouseBound={mouseDown:this._mouseDown.bind(this),mouseMove:this._mouseMove.bind(this),mouseUp:this._mouseUp.bind(this),touchStart:this._touchStart.bind(this),touchMove:this._touchMove.bind(this),touchEnd:this._touchEnd.bind(this),touchCancel:this._touchCancel.bind(this)}}this.element.addEventListener("mousedown",this._mouseBound.mouseDown);this.element.addEventListener("touchstart",this._mouseBound.touchStart)}else{this.element.removeEvents("mousedown");this.element.removeEvents("touchstart")}},touchDidGoDown:function(touches){this.delegate.touchDidGoDown(touches)},touchDidMove:function(touches){this.delegate.touchDidMove(touches)},touchDidGoUp:function(touches){this.delegate.touchDidGoUp(touches)},_mouseDown:function(event){event.stopPropagation();event.preventDefault();addEvents({mousemove:this._mouseBound.mouseMove,mouseup:this._mouseBound.mouseUp})(document);this.touches=new BVTouches(event);this.touchDidGoDown(this.touches)},_mouseMove:function(event){event.stopPropagation();event.preventDefault();this.touches._updateWithEvent(event);this.touchDidMove(this.touches)},_mouseUp:function(event){event.stopPropagation();event.preventDefault();this.touches._goUpWithEvent(event);this.touchDidGoUp(this.touches);delete this.touches;removeEvents({mousemove:this._mouseBound.mouseMove,mouseup:this._mouseBound.mouseUp})(document)},_touchStart:function(event){event.stopPropagation();event.preventDefault();if(this.touches){this._touchCancel(event);return}addEvents({touchmove:this._mouseBound.touchMove,touchend:this._mouseBound.touchEnd,touchcancel:this._mouseBound.touchCancel})(document);this.touches=new BVTouches(event);this.touchDidGoDown(this.touches)},_touchMove:function(event){event.stopPropagation();event.preventDefault();if(!this.touches){return}this.touches._updateWithEvent(event);this.touchDidMove(this.touches)},_touchEnd:function(event){event.stopPropagation();event.preventDefault();if(!this.touches){return}this.touches._goUpWithEvent(event);this.touchDidGoUp(this.touches);delete this.touches;removeEvents({touchmove:this._mouseBound.touchMove,touchend:this._mouseBound.touchEnd,touchcancel:this._mouseBound.touchCancel})(document)},_touchCancel:function(event){this._touchEnd(event)}});var BVTouches=this.BVTouches=new Class({initialize:function(event){this.globalPoint={x:event.clientX,y:-event.clientY};this.translation={x:0,y:0};this.deltaTranslation={x:0,y:0};this.velocity={x:0,y:0};this.count=1;this.event=event;this.timestamp=Date.now();this.downTimestamp=this.timestamp},_updateWithEvent:function(event,isRemoving){this.event=event;if(!isRemoving){var dx=event.clientX-this.globalPoint.x;var dy=-event.clientY-this.globalPoint.y;this.translation.x+=dx;this.translation.y+=dy;this.deltaTranslation.x+=dx;this.deltaTranslation.y+=dy;this.globalPoint.x=event.clientX;this.globalPoint.y=-event.clientY}var timestamp=Date.now();var dt=timestamp-this.timestamp;var isSamePoint=isRemoving||dx===0&&dy===0;var isStopped=isSamePoint&&dt>150;this.velocity.x=isStopped?0:isSamePoint||dt===0?this.velocity.x:dx/dt*1e3;this.velocity.y=isStopped?0:isSamePoint||dt===0?this.velocity.y:dy/dt*1e3;this.timestamp=timestamp},_goUpWithEvent:function(event){this._updateWithEvent(event,true);this.count=0;var didMove=Math.abs(this.translation.x)>10||Math.abs(this.translation.y)>10;var wasMoving=Math.abs(this.velocity.x)>400||Math.abs(this.velocity.y)>400;this.wasTap=!didMove&&!wasMoving&&this.getTimeSinceGoingDown()<300},getTimeSinceGoingDown:function(){return this.timestamp-this.downTimestamp},resetDeltaTranslation:function(){this.deltaTranslation.x=0;this.deltaTranslation.y=0}});module.exports=BVTouchable},{"./shim.js":5,mootools:1}],4:[function(require,module,exports){const BVTouchable=require("./BVTouchable.js");require("sprintf-js");const{removeClass,addClass,setStyles}=require("./shim.js");var Tangle=this.Tangle=function(rootElement,modelClass){var tangle=this;tangle.element=rootElement;tangle.setModel=setModel;tangle.getValue=getValue;tangle.setValue=setValue;tangle.setValues=setValues;var _model;var _nextSetterID=0;var _setterInfosByVariableName={};var _varargConstructorsByArgCount=[];initializeElements();setModel(modelClass);return tangle;function initializeElements(){var elements=rootElement.getElementsByTagName("*");var interestingElements=[];for(var i=0,length=elements.length;i<length;i++){var element=elements[i];if(element.getAttribute("class")||element.getAttribute("data-var")){interestingElements.push(element)}}for(var i=0,length=interestingElements.length;i<length;i++){var element=interestingElements[i];var varNames=null;var varAttribute=element.getAttribute("data-var");if(varAttribute){varNames=varAttribute.split(" ")}var views=null;var classAttribute=element.getAttribute("class");if(classAttribute){var classNames=classAttribute.split(" ");views=getViewsForElement(element,classNames,varNames)}if(!varNames){continue}var didAddSetter=false;if(views){for(var j=0;j<views.length;j++){if(!views[j].update){continue}addViewSettersForElement(element,varNames,views[j]);didAddSetter=true}}if(!didAddSetter){var formatAttribute=element.getAttribute("data-format");var formatter=getFormatterForFormat(formatAttribute,varNames);addFormatSettersForElement(element,varNames,formatter)}}}function getViewsForElement(element,classNames,varNames){var views=null;for(var i=0,length=classNames.length;i<length;i++){var clas=Tangle.classes[classNames[i]];if(!clas){continue}var options=getOptionsForElement(element);var args=[element,options,tangle];if(varNames){args=args.concat(varNames)}var view=constructClass(clas,args);if(!views){views=[]}views.push(view)}return views}function getOptionsForElement(element){var options={};var attributes=element.attributes;var regexp=/^data-[\w\-]+$/;for(var i=0,length=attributes.length;i<length;i++){var attr=attributes[i];var attrName=attr.name;if(!attrName||!regexp.test(attrName)){continue}options[attrName.substr(5)]=attr.value}return options}function constructClass(clas,args){if(typeof clas!=="function"){var View=function(){};View.prototype=clas;var view=new View;if(view.initialize){view.initialize.apply(view,args)}return view}else{var ctor=_varargConstructorsByArgCount[args.length];if(!ctor){var ctorArgs=[];for(var i=0;i<args.length;i++){ctorArgs.push("args["+i+"]")}var ctorString="(function (clas,args) { return new clas("+ctorArgs.join(",")+"); })";ctor=eval(ctorString);_varargConstructorsByArgCount[args.length]=ctor}return ctor(clas,args)}}function getFormatterForFormat(formatAttribute,varNames){if(!formatAttribute){formatAttribute="default"}var formatter=getFormatterForCustomFormat(formatAttribute,varNames);if(!formatter){formatter=getFormatterForSprintfFormat(formatAttribute,varNames)}if(!formatter){log("Tangle: unknown format: "+formatAttribute);formatter=getFormatterForFormat(null,varNames)}return formatter}function getFormatterForCustomFormat(formatAttribute,varNames){var components=formatAttribute.split(" ");var formatName=components[0];if(!formatName){return null}var format=Tangle.formats[formatName];if(!format){return null}var formatter;var params=components.slice(1);if(varNames.length<=1&¶ms.length===0){formatter=format}else if(varNames.length<=1){formatter=function(value){var args=[value].concat(params);return format.apply(null,args)}}else{formatter=function(){var values=getValuesForVariables(varNames);var args=values.concat(params);return format.apply(null,args)}}return formatter}function getFormatterForSprintfFormat(formatAttribute,varNames){if(!sprintf||!formatAttribute.test(/\%/)){return null}var formatter;if(varNames.length<=1){formatter=function(value){return sprintf(formatAttribute,value)}}else{formatter=function(value){var values=getValuesForVariables(varNames);var args=[formatAttribute].concat(values);return sprintf.apply(null,args)}}return formatter}function addViewSettersForElement(element,varNames,view){var setter;if(varNames.length<=1){setter=function(value){view.update(element,value)}}else{setter=function(){var values=getValuesForVariables(varNames);var args=[element].concat(values);view.update.apply(view,args)}}addSetterForVariables(setter,varNames)}function addFormatSettersForElement(element,varNames,formatter){var span=null;var setter=function(value){if(!span){span=document.createElement("span");element.insertBefore(span,element.firstChild)}span.innerHTML=formatter(value)};addSetterForVariables(setter,varNames)}function addSetterForVariables(setter,varNames){var setterInfo={setterID:_nextSetterID,setter:setter};_nextSetterID++;for(var i=0;i<varNames.length;i++){var varName=varNames[i];if(!_setterInfosByVariableName[varName]){_setterInfosByVariableName[varName]=[]}_setterInfosByVariableName[varName].push(setterInfo)}}function applySettersForVariables(varNames){var appliedSetterIDs={};for(var i=0,ilength=varNames.length;i<ilength;i++){var varName=varNames[i];var setterInfos=_setterInfosByVariableName[varName];if(!setterInfos){continue}var value=_model[varName];for(var j=0,jlength=setterInfos.length;j<jlength;j++){var setterInfo=setterInfos[j];if(setterInfo.setterID in appliedSetterIDs){continue}appliedSetterIDs[setterInfo.setterID]=true;setterInfo.setter(value)}}}function getValue(varName){var value=_model[varName];if(value===undefined){log("Tangle: unknown variable: "+varName);return 0}return value}function setValue(varName,value){var obj={};obj[varName]=value;setValues(obj)}function setValues(obj){var changedVarNames=[];for(var varName in obj){var value=obj[varName];var oldValue=_model[varName];if(oldValue===undefined){log("Tangle: setting unknown variable: "+varName);continue}if(oldValue===value){continue}_model[varName]=value;changedVarNames.push(varName)}if(changedVarNames.length){applySettersForVariables(changedVarNames);updateModel()}}function getValuesForVariables(varNames){var values=[];for(var i=0,length=varNames.length;i<length;i++){values.push(getValue(varNames[i]))}return values}function setModel(modelClass){var ModelClass=function(){};ModelClass.prototype=modelClass;_model=new ModelClass;updateModel(true)}function updateModel(shouldInitialize){var ShadowModel=function(){};ShadowModel.prototype=_model;var shadowModel=new ShadowModel;if(shouldInitialize){shadowModel.initialize()}shadowModel.update();var changedVarNames=[];for(var varName in shadowModel){if(!shadowModel.hasOwnProperty(varName)){continue}if(_model[varName]===shadowModel[varName]){continue}_model[varName]=shadowModel[varName];changedVarNames.push(varName)}applySettersForVariables(changedVarNames)}function log(msg){if(window.console){window.console.log(msg)}}};Tangle.classes={};Tangle.formats={};Tangle.formats["default"]=function(value){return""+value};Tangle.classes.TKIf={initialize:function(element,options,tangle,variable){this.isInverted=!!options.invert},update:function(element,value){if(this.isInverted){value=!value}if(value){element.style.removeProperty("display")}else{element.style.display="none"}}};Tangle.classes.TKSwitch={update:function(element,value){element.getChildren().each(function(child,index){if(index!=value){child.style.display="none"}else{child.style.removeProperty("display")}})}};Tangle.classes.TKSwitchPositiveNegative={update:function(element,value){Tangle.classes.TKSwitch.update(element,value<0)}};Tangle.classes.TKToggle={initialize:function(element,options,tangle,variable){element.addEventListener("click",function(event){var isActive=tangle.getValue(variable);tangle.setValue(variable,isActive?0:1)})}};Tangle.classes.TKNumberField={initialize:function(element,options,tangle,variable){this.input=document.createElement("input");this.input.className="TKNumberFieldInput";this.input.type="text";this.input.size=options.size||6;this.input.children=[element,...this.input.children];var inputChanged=function(){var value=this.getValue();tangle.setValue(variable,value)}.bind(this);this.input.addEventListener("keyup",inputChanged);this.input.addEventListener("blur",inputChanged);this.input.addEventListener("change",inputChanged)},getValue:function(){var value=Number.parseFloat(this.input.value);return isNaN(value)?0:value},update:function(element,value){var currentValue=this.getValue();if(value!==currentValue){this.input.set("value",""+value)}}};var isAnyAdjustableNumberDragging=false;Tangle.classes.TKAdjustableNumber={initialize:function(element,options,tangle,variable){this.element=element;this.tangle=tangle;this.variable=variable;this.min=options.min!==undefined?parseFloat(options.min):0;this.max=options.max!==undefined?parseFloat(options.max):1e100;this.step=options.step!==undefined?parseFloat(options.step):1;this.initializeHover();this.initializeHelp();this.initializeDrag()},initializeHover:function(){this.isHovering=false;this.element.addEventListener("mouseenter",function(){this.isHovering=true;this.updateRolloverEffects()}.bind(this));this.element.addEventListener("mouseleave",function(){this.isHovering=false;this.updateRolloverEffects()}.bind(this))},updateRolloverEffects:function(){this.updateStyle();this.updateCursor();this.updateHelp()},isActive:function(){return this.isDragging||this.isHovering&&!isAnyAdjustableNumberDragging},updateStyle:function(){if(this.isDragging){addClass("TKAdjustableNumberDown")(this.element)}else{removeClass("TKAdjustableNumberDown")(this.element)}if(!this.isDragging&&this.isActive()){addClass("TKAdjustableNumberHover")(this.element)}else{removeClass("TKAdjustableNumberHover")(this.element)}},updateCursor:function(){var body=document.body;if(this.isActive()){addClass("TKCursorDragHorizontal")(body)}else{removeClass("TKCursorDragHorizontal")(body)}},initializeHelp:function(){this.helpElement=document.createElement("div");this.helpElement.className="TKAdjustableNumberHelp";this.helpElement.innerHTML="drag";setStyles({display:"none"})(this.helpElement);this.element.prepend(this.helpElement)},updateHelp:function(){var rect=this.element.getBoundingClientRect();var size={x:rect.width,y:rect.height};var top=-size.y+7;var left=Math.round(.5*(size.x-20));var display=this.isHovering&&!isAnyAdjustableNumberDragging?"block":"none";setStyles({left:`${left}px`,top:`${top}px`,display:display})(this.helpElement)},initializeDrag:function(){this.isDragging=false;new BVTouchable(this.element,this)},touchDidGoDown:function(touches){this.valueAtMouseDown=this.tangle.getValue(this.variable);this.isDragging=true;isAnyAdjustableNumberDragging=true;this.updateRolloverEffects();this.updateStyle()},touchDidMove:function(touches){var value=this.valueAtMouseDown+touches.translation.x/5*this.step;value=((value/this.step).round()*this.step).limit(this.min,this.max);this.tangle.setValue(this.variable,value);this.updateHelp()},touchDidGoUp:function(touches){this.isDragging=false;isAnyAdjustableNumberDragging=false;this.updateRolloverEffects();this.updateStyle();setStyles({display:touches.wasTap?"block":"none"})(this.helpElement)}};var isAnyAdjustableNumberDragging=false;Tangle.classes.TKLogAdjustableNumber={initialize:function(element,options,tangle,variable){this.element=element;this.tangle=tangle;this.variable=variable;this.min=options.min!==undefined?parseFloat(options.min):1;this.max=options.max!==undefined?parseFloat(options.max):1e100;this.step=options.step!==undefined?parseFloat(options.step):.02;this.initializeHover();this.initializeHelp();this.initializeDrag()},initializeHover:function(){this.isHovering=false;this.element.addEventListener("mouseenter",function(){this.isHovering=true;this.updateRolloverEffects()}.bind(this));this.element.addEventListener("mouseleave",function(){this.isHovering=false;this.updateRolloverEffects()}.bind(this))},updateRolloverEffects:function(){this.updateStyle();this.updateCursor();this.updateHelp()},isActive:function(){return this.isDragging||this.isHovering&&!isAnyAdjustableNumberDragging},updateStyle:function(){if(this.isDragging){addClass("TKAdjustableNumberDown")(this.element)}else{removeClass("TKAdjustableNumberDown")(this.element)}if(!this.isDragging&&this.isActive()){addClass("TKAdjustableNumberHover")(this.element)}else{removeClass("TKAdjustableNumberHover")(this.element)}},updateCursor:function(){var body=document.body;if(this.isActive()){addClass("TKCursorDragHorizontal")(body)}else{removeClass("TKCursorDragHorizontal")(body)}},initializeHelp:function(){this.helpElement=document.createElement("div");this.helpElement.className="TKAdjustableNumberHelp";this.helpElement.innerHTML="drag";setStyles({display:"none"})(this.helpElement);this.element.prepend(this.helpElement)},updateHelp:function(){var rect=this.element.getBoundingClientRect();var size={x:rect.width,y:rect.height};var top=-size.y+7;var left=Math.round(.5*(size.x-20));var display=this.isHovering&&!isAnyAdjustableNumberDragging?"block":"none";setStyles({left:`${left}px`,top:`${top}px`,display:display})(this.helpElement)},initializeDrag:function(){this.isDragging=false;new BVTouchable(this.element,this)},touchDidGoDown:function(touches){this.valueAtMouseDown=this.tangle.getValue(this.variable);this.isDragging=true;isAnyAdjustableNumberDragging=true;this.updateRolloverEffects();this.updateStyle()},touchDidMove:function(touches){var logValue=Math.log10(this.valueAtMouseDown)+touches.translation.x/5*this.step;logValue=(logValue/this.step).round()*this.step;var value=Math.pow(10,logValue);value=value.limit(this.min,this.max);this.tangle.setValue(this.variable,value);this.updateHelp()},touchDidGoUp:function(touches){this.isDragging=false;isAnyAdjustableNumberDragging=false;this.updateRolloverEffects();this.updateStyle();setStyles({display:touches.wasTap?"block":"none"})(this.helpElement)}};function formatValueWithPrecision(value,precision){if(Math.abs(value)>=100){precision--}if(Math.abs(value)>=10){precision--}return""+value.round(Math.max(precision,0))}Tangle.formats.p3=function(value){return formatValueWithPrecision(value,3)};Tangle.formats.neg_p3=function(value){return formatValueWithPrecision(-value,3)};Tangle.formats.p2=function(value){return formatValueWithPrecision(value,2)};Tangle.formats.e6=function(value){return""+(value*1e-6).round()};Tangle.formats.abs_e6=function(value){return""+(Math.abs(value)*1e-6).round()};Tangle.formats.freq=function(value){if(value<100){return""+value.round(1)+" Hz"}if(value<1e3){return""+value.round(0)+" Hz"}return""+(value/1e3).round(2)+" KHz"};Tangle.formats.dollars=function(value){var numPart=value.round(0);numPart=String(numPart).split("").reverse().reduce((a,v,i)=>i&&i%3===0?v+","+a:v+a,"");return"$"+numPart};Tangle.formats.free=function(value){return value?"$"+value.round(0):"free"};Tangle.formats.percent=function(value){return""+(100*value).round(0)+"%"};module.exports=Tangle},{"./BVTouchable.js":3,"./shim.js":5,"sprintf-js":2}],5:[function(require,module,exports){function removeClass(name){return element=>{const classString=element.className;var classes=classString.split(" ");if(classes.includes(name)){classes=classes.reduce((a,v)=>v===name?a:a.concat(v),[])}const newString=classes.join(" ");element.className=newString}}function addClass(name){return element=>{const classString=element.className;const classes=classString.split(" ");if(!classes.includes(name)){classes.push(name)}const newString=classes.join(" ");element.className=newString}}function addEvents(obj){return element=>{Object.keys(obj).forEach(key=>{element.addEventListener(key,obj[key])})}}function removeEvents(obj,store){return element=>{Object.keys(obj).forEach(key=>{element.removeEventListener(key,obj[key])})}}function setStyles(obj){return element=>{Object.keys(obj).forEach(key=>{element.style[key]=obj[key]})}}module.exports={removeClass:removeClass,addClass:addClass,addEvents:addEvents,removeEvents:removeEvents,setStyles:setStyles}},{}]},{},[4])(4)});