UNPKG

traindown

Version:

A language to help athletes express their training. Inspired by Markdown.

3 lines (2 loc) 6.58 kB
var e=Object.freeze({EOF:-1,DateTimeToken:"DateTime",FailToken:"Fail",LoadToken:"Load",MetaKeyToken:"Meta Key",MetaValueToken:"Meta Value",MovementToken:"Movement",NoteToken:"Note",RepToken:"Rep",SetToken:"Set",SupersetMovementToken:"Superset Movement"}),t=function(e,t){this.chr=e,this.next=t||null},n=function(){function n(e){this.start=e||null}var s=n.prototype;return s.push=function(e){var n=new t(e);null==this.start||(n.next=this.start),this.start=n},s.pop=function(){if(null==this.start)return e.EOF;var t=this.start;return this.start=t.next,t.chr},s.clear=function(){this.start=null},n}(),s=function(){function e(e,t){this.type=e,this.value=t}return e.prototype.toString=function(){return"["+this.type+"] "+this.value},e}(),a=function(){function t(e,t){this.done=!1,this.errorHandler=function(e){throw e},this.position=0,this.src=e,this.start=0,this.state=t||function(){},this.tokens=[],this.vcr=new n,this._output={}}var a=t.prototype;return a.current=function(){return this.src.slice(this.start,this.position)},a.emit=function(e){var t=new s(e,this.current());this.tokens.push(t),this.start=this.position,this.vcr.clear()},a.error=function(e){this.errorHandler(e)},a.ignore=function(){this.vcr.clear(),this.start=this.position},a.next=function(){var t=e.EOF,n=this.src.slice(this.position,this.src.length);return 0!=n.length&&(t=n[0]),this.position+=1,this.vcr.push(t),t},a.nextToken=function(){return this.tokens.pop()},a.peek=function(){var e=this.next();return this.rewind(),e},a.rewind=function(){this.vcr.pop()!=e.EOF&&(this.position-=1,this.position<this.start&&(this.position=this.start))},a.run=function(e){for(;null!=this.state;)this.state=this.state.call(e,this);this.done=!0},a.take=function(e){for(var t=this.next();e.includes(t);)t=this.next();this.rewind()},t}(),r=function(){function t(e){this.done=!1,this.errors=[],this.tokens=e,this.output={date:null,metadata:{},movements:[],notes:[]},this._process()}var n=t.prototype;return n._process=function(){var t=null,n=0;e:for(var s=0;s<this.tokens.length;++s){var a=this.tokens[s];switch(a.type){case e.DateTimeToken:this.output.date=a.value;break;case e.MetaKeyToken:this.output.metadata[a.value]=null,t=a.value;break;case e.MetaValueToken:this.output.metadata[t]=a.value;break;case e.NoteToken:this.output.notes.push(a.value);break;default:n=s;break e}}if(n!=this.tokens.length-1){for(var r=[this.tokens[0]],i=1;i<this.tokens.length;++i){var o=this.tokens[i];o.type==e.MovementToken||o.type==e.SupersetMovementToken?(this._marshalMovement(r),r=[o]):r.push(o)}r.length>0&&this._marshalMovement(r),this.done=!0}else this.done=!0},n._marshalMovement=function(t){var n={metadata:{},name:"Unknown Movement",notes:[],performances:[],sequence:this.output.movements.length,superset:!1,touched:!1},s=null,a=0;e:for(var r=0;r<t.length;++r){var i=t[r];switch(i.type){case e.SupersetMovementToken:n.superset=!0,n.name=i.value;break;case e.MovementToken:n.name=i.value;break;case e.MetaKeyToken:n.metadata[i.value]=null,s=i.value;break;case e.MetaValueToken:n.metadata[s]=i.value;break;case e.NoteToken:n.notes.push(i.value);break;default:a=r;break e}n.touched=!0}n.touched&&(delete n.touched,n.performances=this._marshalPerformance(t.slice(a)),this.output.movements.push(n))},n._marshalPerformance=function(t){for(var n=[],s=null,a={fails:0,load:0,metadata:{},reps:0,notes:[],sets:1,touched:!1},r=function(e){delete a.touched,a.sequence=n.length,n.push(a),a={fails:0,load:0,metadata:{},reps:0,notes:[],sets:1,touched:!1}},i=0;i<t.length;++i){var o=t[i];if(o.type==e.LoadToken){a.touched&&(0==a.reps&&0==a.fails&&(a.reps=1),0!=a.load&&r());var u=parseFloat(o.value);a.load=isNaN(u)?o.value:u}else switch(o.type){case e.FailToken:a.fails=parseFloat(o.value);break;case e.MetaKeyToken:a.metadata[o.value]=null,s=o.value;break;case e.MetaValueToken:a.metadata[s]=o.value;break;case e.NoteToken:a.notes.push(o.value);break;case e.RepToken:a.reps=parseFloat(o.value);break;case e.SetToken:a.sets=parseInt(o.value,10)}a.touched=!0}return 0==a.reps&&0==a.fails&&(a.reps=1),a.fails>0&&0==a.reps&&(a.reps=a.fails),r(),n},t}();module.exports=function(){function t(e){this.lexer=new a(e,this.idleState)}var n=t.prototype;return n.parse=function(e){if(this.lexer.run(this),!e)return this.lexer.tokens;switch(e){case"json":var t=new r(this.lexer.tokens);return!t.done||t.errors.length>0?{error:!0}:t.output;default:return this.lexer.tokens}},n.idleState=function(t){var n=t.peek();if(n==e.EOF)return null;if(this._isWhitespace(n)||this._isLineTerminator(n))return t.next(),t.ignore(),this.idleState(t);switch(n){case"@":return this.dateTimeState(t);case"#":return this.metaKeyState(t);case"*":return this.noteState(t);default:return this.valueState(t)}},n.dateTimeState=function(t){t.take(["@"," "]),t.ignore();for(var n=t.next();!this._isLineTerminator(n);)n=t.next();return t.rewind(),t.emit(e.DateTimeToken),this.idleState},n.metaKeyState=function(t){t.take(["#"," "]),t.ignore();for(var n=t.next();!this._isColonTerminator(n);)n=t.next();return t.rewind(),t.emit(e.MetaKeyToken),this.metaValueState},n.metaValueState=function(t){t.take([":"," "]),t.ignore();for(var n=t.next();!this._isLineTerminator(n);)n=t.next();return t.rewind(),t.emit(e.MetaValueToken),this.idleState},n.movementState=function(t){var n=!1,s=t.next();for("+"==s&&(n=!0,t.take([" "]),t.ignore(),s=t.next()),"'"==s&&(t.ignore(),s=t.next());!this._isColonTerminator(s);)s=t.next();return t.rewind(),t.emit(n?e.SupersetMovementToken:e.MovementToken),t.take(":"),t.ignore(),this.idleState},n.noteState=function(t){t.take(["*"," "]),t.ignore();for(var n=t.next();!this._isLineTerminator(n);)n=t.next();return t.rewind(),t.emit(e.NoteToken),this.idleState},n.numberState=function(t){switch(t.take(["0","1","2","3","4","5","6","7","8","9","."]),t.peek()){case"f":case"F":t.emit(e.FailToken);break;case"r":case"R":t.emit(e.RepToken);break;case"s":case"S":t.emit(e.SetToken);break;default:t.emit(e.LoadToken)}return t.take(["f","F","r","R","s","S"]),t.ignore(),this.idleState},n.valueState=function(t){var n=t.next();if("+"==n||"'"==n)return t.rewind(),this.movementState(t);if(isNaN(n)){if("b"!=n&&"B"!=n)return t.rewind(),this.movementState(t);var s=t.peek();if("w"!=s&&"W"!=s)return t.rewind(),this.movementState(t);for(;!this._isWhitespace(n);)n=t.next();return t.rewind(),t.emit(e.LoadToken),this.idleState}return this.numberState(t)},n._isColonTerminator=function(t){return t==e.EOF||":"==t},n._isLineTerminator=function(t){return t==e.EOF||";"==t||"\n"==t||"\r"==t},n._isWhitespace=function(e){return/\s/.test(e)},t}(); //# sourceMappingURL=index.js.map