/
ingredients-parser.js
1 lines (1 loc) · 16.4 KB
/
ingredients-parser.js
1
INGREDIENTS=function(){function peg$subclass(child,parent){function ctor(){this.constructor=child}ctor.prototype=parent.prototype;child.prototype=new ctor}function SyntaxError(message,expected,found,offset,line,column){this.message=message;this.expected=expected;this.found=found;this.offset=offset;this.line=line;this.column=column;this.name="SyntaxError"}peg$subclass(SyntaxError,Error);function parse(input){var options=arguments.length>1?arguments[1]:{},peg$FAILED={},peg$startRuleFunctions={start:peg$parsestart},peg$startRuleFunction=peg$parsestart,peg$c0=[],peg$c1={type:"any",description:"any character"},peg$c2=function(parts){return parts.join("")},peg$c3=peg$FAILED,peg$c4=null,peg$c5=function(amount,unit,ingredient){return Math.round(amount*unit*ingredient[0])+"g "+ingredient[1]},peg$c6=function(whole,fraction){return whole+fraction},peg$c7="ml",peg$c8={type:"literal",value:"mL",description:'"mL"'},peg$c9=function(){return 1},peg$c10="C",peg$c11={type:"literal",value:"C",description:'"C"'},peg$c12="cup",peg$c13={type:"literal",value:"cup",description:'"cup"'},peg$c14="s",peg$c15={type:"literal",value:"s",description:'"s"'},peg$c16=function(){return 236.588},peg$c17="T",peg$c18={type:"literal",value:"T",description:'"T"'},peg$c19="tbsp",peg$c20={type:"literal",value:"tbsp",description:'"tbsp"'},peg$c21=function(){return 14.7868},peg$c22="t",peg$c23={type:"literal",value:"t",description:'"t"'},peg$c24="tsp",peg$c25={type:"literal",value:"tsp",description:'"tsp"'},peg$c26=function(){return 4.92892},peg$c27="all-purpose",peg$c28={type:"literal",value:"all-purpose",description:'"all-purpose"'},peg$c29="ap",peg$c30={type:"literal",value:"ap",description:'"ap"'},peg$c31="a-p",peg$c32={type:"literal",value:"a-p",description:'"a-p"'},peg$c33="flour",peg$c34={type:"literal",value:"flour",description:'"flour"'},peg$c35=function(){return[.528,text()]},peg$c36="brown sugar",peg$c37={type:"literal",value:"brown sugar",description:'"brown sugar"'},peg$c38=function(){return[.93,text()]},peg$c39="butter",peg$c40={type:"literal",value:"butter",description:'"butter"'},peg$c41=function(){return[.959,text()]},peg$c42="chopped walnuts or pecans",peg$c43={type:"literal",value:"chopped walnuts or pecans",description:'"chopped walnuts or pecans"'},peg$c44=function(){return[.461,text()]},peg$c45="granulated",peg$c46={type:"literal",value:"granulated",description:'"granulated"'},peg$c47="sugar",peg$c48={type:"literal",value:"sugar",description:'"sugar"'},peg$c49=function(){return[.849,text()]},peg$c50="semisweet",peg$c51={type:"literal",value:"semisweet",description:'"semisweet"'},peg$c52="milk",peg$c53={type:"literal",value:"milk",description:'"milk"'},peg$c54="dark",peg$c55={type:"literal",value:"dark",description:'"dark"'},peg$c56="chocolate chips",peg$c57={type:"literal",value:"chocolate chips",description:'"chocolate chips"'},peg$c58=function(){return[.725,text()]},peg$c59=/^[0-9]/,peg$c60={type:"class",value:"[0-9]",description:"[0-9]"},peg$c61=".",peg$c62={type:"literal",value:".",description:'"."'},peg$c63=function(digits){return parseFloat(digits.join(""))},peg$c64=function(digits){return parseInt(digits.join(""),10)},peg$c65="/",peg$c66={type:"literal",value:"/",description:'"/"'},peg$c67=function(numerator,denominator){return numerator/denominator},peg$c68=/^[ \t]/,peg$c69={type:"class",value:"[ \\t]",description:"[ \\t]"},peg$currPos=0,peg$reportedPos=0,peg$cachedPos=0,peg$cachedPosDetails={line:1,column:1,seenCR:false},peg$maxFailPos=0,peg$maxFailExpected=[],peg$silentFails=0,peg$result;if("startRule"in options){if(!(options.startRule in peg$startRuleFunctions)){throw new Error("Can't start parsing from rule \""+options.startRule+'".')}peg$startRuleFunction=peg$startRuleFunctions[options.startRule]}function text(){return input.substring(peg$reportedPos,peg$currPos)}function offset(){return peg$reportedPos}function line(){return peg$computePosDetails(peg$reportedPos).line}function column(){return peg$computePosDetails(peg$reportedPos).column}function expected(description){throw peg$buildException(null,[{type:"other",description:description}],peg$reportedPos)}function error(message){throw peg$buildException(message,null,peg$reportedPos)}function peg$computePosDetails(pos){function advance(details,startPos,endPos){var p,ch;for(p=startPos;p<endPos;p++){ch=input.charAt(p);if(ch==="\n"){if(!details.seenCR){details.line++}details.column=1;details.seenCR=false}else if(ch==="\r"||ch==="\u2028"||ch==="\u2029"){details.line++;details.column=1;details.seenCR=true}else{details.column++;details.seenCR=false}}}if(peg$cachedPos!==pos){if(peg$cachedPos>pos){peg$cachedPos=0;peg$cachedPosDetails={line:1,column:1,seenCR:false}}advance(peg$cachedPosDetails,peg$cachedPos,pos);peg$cachedPos=pos}return peg$cachedPosDetails}function peg$fail(expected){if(peg$currPos<peg$maxFailPos){return}if(peg$currPos>peg$maxFailPos){peg$maxFailPos=peg$currPos;peg$maxFailExpected=[]}peg$maxFailExpected.push(expected)}function peg$buildException(message,expected,pos){function cleanupExpected(expected){var i=1;expected.sort(function(a,b){if(a.description<b.description){return-1}else if(a.description>b.description){return 1}else{return 0}});while(i<expected.length){if(expected[i-1]===expected[i]){expected.splice(i,1)}else{i++}}}function buildMessage(expected,found){function stringEscape(s){function hex(ch){return ch.charCodeAt(0).toString(16).toUpperCase()}return s.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(ch){return"\\x0"+hex(ch)}).replace(/[\x10-\x1F\x80-\xFF]/g,function(ch){return"\\x"+hex(ch)}).replace(/[\u0180-\u0FFF]/g,function(ch){return"\\u0"+hex(ch)}).replace(/[\u1080-\uFFFF]/g,function(ch){return"\\u"+hex(ch)})}var expectedDescs=new Array(expected.length),expectedDesc,foundDesc,i;for(i=0;i<expected.length;i++){expectedDescs[i]=expected[i].description}expectedDesc=expected.length>1?expectedDescs.slice(0,-1).join(", ")+" or "+expectedDescs[expected.length-1]:expectedDescs[0];foundDesc=found?'"'+stringEscape(found)+'"':"end of input";return"Expected "+expectedDesc+" but "+foundDesc+" found."}var posDetails=peg$computePosDetails(pos),found=pos<input.length?input.charAt(pos):null;if(expected!==null){cleanupExpected(expected)}return new SyntaxError(message!==null?message:buildMessage(expected,found),expected,found,pos,posDetails.line,posDetails.column)}function peg$parsestart(){var s0,s1,s2;s0=peg$currPos;s1=[];s2=peg$parsemeasuredIngredient();if(s2===peg$FAILED){if(input.length>peg$currPos){s2=input.charAt(peg$currPos);peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c1)}}}while(s2!==peg$FAILED){s1.push(s2);s2=peg$parsemeasuredIngredient();if(s2===peg$FAILED){if(input.length>peg$currPos){s2=input.charAt(peg$currPos);peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c1)}}}}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c2(s1)}s0=s1;return s0}function peg$parsemeasuredIngredient(){var s0,s1,s2,s3,s4,s5;s0=peg$currPos;s1=peg$parseamount();if(s1!==peg$FAILED){s2=peg$parsewhitespace();if(s2===peg$FAILED){s2=peg$c4}if(s2!==peg$FAILED){s3=peg$parseunit();if(s3!==peg$FAILED){s4=peg$parsewhitespace();if(s4!==peg$FAILED){s5=peg$parseingredient();if(s5!==peg$FAILED){peg$reportedPos=s0;s1=peg$c5(s1,s3,s5);s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}return s0}function peg$parseamount(){var s0,s1,s2,s3;s0=peg$parsedecimal();if(s0===peg$FAILED){s0=peg$currPos;s1=peg$parseinteger();if(s1!==peg$FAILED){s2=peg$parsewhitespace();if(s2!==peg$FAILED){s3=peg$parsefraction();if(s3!==peg$FAILED){peg$reportedPos=s0;s1=peg$c6(s1,s3);s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}if(s0===peg$FAILED){s0=peg$parsefraction();if(s0===peg$FAILED){s0=peg$parseinteger()}}}return s0}function peg$parseunit(){var s0,s1,s2,s3;s0=peg$currPos;if(input.substr(peg$currPos,2).toLowerCase()===peg$c7){s1=input.substr(peg$currPos,2);peg$currPos+=2}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c8)}}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c9()}s0=s1;if(s0===peg$FAILED){s0=peg$currPos;s1=peg$currPos;if(input.charCodeAt(peg$currPos)===67){s2=peg$c10;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c11)}}if(s2!==peg$FAILED){s3=peg$parsedot();if(s3===peg$FAILED){s3=peg$c4}if(s3!==peg$FAILED){s2=[s2,s3];s1=s2}else{peg$currPos=s1;s1=peg$c3}}else{peg$currPos=s1;s1=peg$c3}if(s1===peg$FAILED){s1=peg$currPos;if(input.substr(peg$currPos,3).toLowerCase()===peg$c12){s2=input.substr(peg$currPos,3);peg$currPos+=3}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c13)}}if(s2!==peg$FAILED){if(input.substr(peg$currPos,1).toLowerCase()===peg$c14){s3=input.charAt(peg$currPos);peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c15)}}if(s3===peg$FAILED){s3=peg$c4}if(s3!==peg$FAILED){s2=[s2,s3];s1=s2}else{peg$currPos=s1;s1=peg$c3}}else{peg$currPos=s1;s1=peg$c3}}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c16()}s0=s1;if(s0===peg$FAILED){s0=peg$currPos;if(input.charCodeAt(peg$currPos)===84){s1=peg$c17;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c18)}}if(s1===peg$FAILED){if(input.substr(peg$currPos,4).toLowerCase()===peg$c19){s1=input.substr(peg$currPos,4);peg$currPos+=4}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c20)}}}if(s1!==peg$FAILED){s2=peg$parsedot();if(s2===peg$FAILED){s2=peg$c4}if(s2!==peg$FAILED){peg$reportedPos=s0;s1=peg$c21();s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}if(s0===peg$FAILED){s0=peg$currPos;if(input.charCodeAt(peg$currPos)===116){s1=peg$c22;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c23)}}if(s1===peg$FAILED){if(input.substr(peg$currPos,3).toLowerCase()===peg$c24){s1=input.substr(peg$currPos,3);peg$currPos+=3}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c25)}}}if(s1!==peg$FAILED){s2=peg$parsedot();if(s2===peg$FAILED){s2=peg$c4}if(s2!==peg$FAILED){peg$reportedPos=s0;s1=peg$c26();s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}}}}return s0}function peg$parseingredient(){var s0,s1,s2,s3;s0=peg$currPos;s1=peg$currPos;if(input.substr(peg$currPos,11).toLowerCase()===peg$c27){s2=input.substr(peg$currPos,11);peg$currPos+=11}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c28)}}if(s2===peg$FAILED){if(input.substr(peg$currPos,2).toLowerCase()===peg$c29){s2=input.substr(peg$currPos,2);peg$currPos+=2}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c30)}}if(s2===peg$FAILED){if(input.substr(peg$currPos,3).toLowerCase()===peg$c31){s2=input.substr(peg$currPos,3);peg$currPos+=3}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c32)}}}}if(s2!==peg$FAILED){s3=peg$parsewhitespace();if(s3!==peg$FAILED){s2=[s2,s3];s1=s2}else{peg$currPos=s1;s1=peg$c3}}else{peg$currPos=s1;s1=peg$c3}if(s1===peg$FAILED){s1=peg$c4}if(s1!==peg$FAILED){if(input.substr(peg$currPos,5).toLowerCase()===peg$c33){s2=input.substr(peg$currPos,5);peg$currPos+=5}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c34)}}if(s2!==peg$FAILED){peg$reportedPos=s0;s1=peg$c35();s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}if(s0===peg$FAILED){s0=peg$currPos;if(input.substr(peg$currPos,11).toLowerCase()===peg$c36){s1=input.substr(peg$currPos,11);peg$currPos+=11}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c37)}}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c38()}s0=s1;if(s0===peg$FAILED){s0=peg$currPos;if(input.substr(peg$currPos,6).toLowerCase()===peg$c39){s1=input.substr(peg$currPos,6);peg$currPos+=6}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c40)}}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c41()}s0=s1;if(s0===peg$FAILED){s0=peg$currPos;if(input.substr(peg$currPos,25)===peg$c42){s1=peg$c42;peg$currPos+=25}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c43)}}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c44()}s0=s1;if(s0===peg$FAILED){s0=peg$currPos;s1=peg$currPos;if(input.substr(peg$currPos,10).toLowerCase()===peg$c45){s2=input.substr(peg$currPos,10);peg$currPos+=10}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c46)}}if(s2!==peg$FAILED){s3=peg$parsewhitespace();if(s3!==peg$FAILED){s2=[s2,s3];s1=s2}else{peg$currPos=s1;s1=peg$c3}}else{peg$currPos=s1;s1=peg$c3}if(s1===peg$FAILED){s1=peg$c4}if(s1!==peg$FAILED){if(input.substr(peg$currPos,5).toLowerCase()===peg$c47){s2=input.substr(peg$currPos,5);peg$currPos+=5}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c48)}}if(s2!==peg$FAILED){peg$reportedPos=s0;s1=peg$c49();s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}if(s0===peg$FAILED){s0=peg$currPos;s1=peg$currPos;if(input.substr(peg$currPos,9)===peg$c50){s2=peg$c50;peg$currPos+=9}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c51)}}if(s2===peg$FAILED){if(input.substr(peg$currPos,4)===peg$c52){s2=peg$c52;peg$currPos+=4}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c53)}}if(s2===peg$FAILED){if(input.substr(peg$currPos,4)===peg$c54){s2=peg$c54;peg$currPos+=4}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c55)}}}}if(s2!==peg$FAILED){s3=peg$parsewhitespace();if(s3!==peg$FAILED){s2=[s2,s3];s1=s2}else{peg$currPos=s1;s1=peg$c3}}else{peg$currPos=s1;s1=peg$c3}if(s1===peg$FAILED){s1=peg$c4}if(s1!==peg$FAILED){if(input.substr(peg$currPos,15)===peg$c56){s2=peg$c56;peg$currPos+=15}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c57)}}if(s2!==peg$FAILED){peg$reportedPos=s0;s1=peg$c58();s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}}}}}}return s0}function peg$parsedecimal(){var s0,s1,s2,s3,s4,s5;s0=peg$currPos;s1=peg$currPos;s2=[];if(peg$c59.test(input.charAt(peg$currPos))){s3=input.charAt(peg$currPos);peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c60)}}if(s3!==peg$FAILED){while(s3!==peg$FAILED){s2.push(s3);if(peg$c59.test(input.charAt(peg$currPos))){s3=input.charAt(peg$currPos);peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c60)}}}}else{s2=peg$c3}if(s2===peg$FAILED){s2=peg$c4}if(s2!==peg$FAILED){if(input.charCodeAt(peg$currPos)===46){s3=peg$c61;peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c62)}}if(s3!==peg$FAILED){s4=[];if(peg$c59.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c60)}}if(s5!==peg$FAILED){while(s5!==peg$FAILED){s4.push(s5);if(peg$c59.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c60)}}}}else{s4=peg$c3}if(s4!==peg$FAILED){s2=[s2,s3,s4];s1=s2}else{peg$currPos=s1;s1=peg$c3}}else{peg$currPos=s1;s1=peg$c3}}else{peg$currPos=s1;s1=peg$c3}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c63(s1)}s0=s1;return s0}function peg$parseinteger(){var s0,s1,s2;s0=peg$currPos;s1=[];if(peg$c59.test(input.charAt(peg$currPos))){s2=input.charAt(peg$currPos);peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c60)}}if(s2!==peg$FAILED){while(s2!==peg$FAILED){s1.push(s2);if(peg$c59.test(input.charAt(peg$currPos))){s2=input.charAt(peg$currPos);peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c60)}}}}else{s1=peg$c3}if(s1!==peg$FAILED){peg$reportedPos=s0;s1=peg$c64(s1)}s0=s1;return s0}function peg$parsefraction(){var s0,s1,s2,s3;s0=peg$currPos;s1=peg$parseinteger();if(s1!==peg$FAILED){if(input.charCodeAt(peg$currPos)===47){s2=peg$c65;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c66)}}if(s2!==peg$FAILED){s3=peg$parseinteger();if(s3!==peg$FAILED){peg$reportedPos=s0;s1=peg$c67(s1,s3);s0=s1}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}}else{peg$currPos=s0;s0=peg$c3}return s0}function peg$parsewhitespace(){var s0,s1;s0=[];if(peg$c68.test(input.charAt(peg$currPos))){s1=input.charAt(peg$currPos);peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c69)}}if(s1!==peg$FAILED){while(s1!==peg$FAILED){s0.push(s1);if(peg$c68.test(input.charAt(peg$currPos))){s1=input.charAt(peg$currPos);peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c69)}}}}else{s0=peg$c3}return s0}function peg$parsedot(){var s0;if(input.charCodeAt(peg$currPos)===46){s0=peg$c61;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c62)}}return s0}peg$result=peg$startRuleFunction();if(peg$result!==peg$FAILED&&peg$currPos===input.length){return peg$result}else{if(peg$result!==peg$FAILED&&peg$currPos<input.length){peg$fail({type:"end",description:"end of input"})}throw peg$buildException(null,peg$maxFailExpected,peg$maxFailPos)}}return{SyntaxError:SyntaxError,parse:parse}}();