UNPKG

parse-ingredient

Version:

Recipe ingredient parser with support for mixed numbers and vulgar fractions

2 lines 7.84 kB
"use strict";var ParseIngredient=(()=>{var C=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var S=(a,n)=>{for(var t in n)C(a,t,{get:n[t],enumerable:!0})},G=(a,n,t,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of B(n))!Q.call(a,o)&&o!==t&&C(a,o,{get:()=>n[o],enumerable:!(c=j(n,o))||c.enumerable});return a};var P=a=>G(C({},"__esModule",{value:!0}),a);var is={};S(is,{defaultOptions:()=>E,firstWordRegEx:()=>D,fors:()=>A,forsRegEx:()=>v,fromRegEx:()=>w,froms:()=>_,ofRegEx:()=>b,ofs:()=>T,parseIngredient:()=>rs,rangeSeparatorRegEx:()=>$,rangeSeparatorWords:()=>W,trailingQuantityRegEx:()=>O,unitsOfMeasure:()=>V});var L={"\xBC":"1/4","\xBD":"1/2","\xBE":"3/4","\u2150":"1/7","\u2151":"1/9","\u2152":"1/10","\u2153":"1/3","\u2154":"2/3","\u2155":"1/5","\u2156":"2/5","\u2157":"3/5","\u2158":"4/5","\u2159":"1/6","\u215A":"5/6","\u215B":"1/8","\u215C":"3/8","\u215D":"5/8","\u215E":"7/8","\u215F":"1/"},N=/^(?=-?\s*\.\d|-?\s*\d)(-)?\s*((?:\d(?:[\d,_]*\d)?)*)(([eE][+-]?\d(?:[\d,_]*\d)?)?|\.\d(?:[\d,_]*\d)?([eE][+-]?\d(?:[\d,_]*\d)?)?|(\s+\d(?:[\d,_]*\d)?\s*)?\s*\/\s*\d(?:[\d,_]*\d)?)?$/,H=new RegExp(N.source.replace(/\$$/,"(?:\\s*[^\\.\\d\\/].*)?")),J=new RegExp(`(${Object.keys(L).join("|")})`),M={MMM:3e3,MM:2e3,M:1e3,CM:900,DCCC:800,DCC:700,DC:600,D:500,CD:400,CCC:300,CC:200,C:100,XC:90,LXXX:80,LXX:70,LX:60,L:50,XL:40,XXX:30,XX:20,XII:12,XI:11,X:10,IX:9,VIII:8,VII:7,VI:6,V:5,IV:4,III:3,II:2,I:1},U={"\u2160":"I","\u2161":"II","\u2162":"III","\u2163":"IV","\u2164":"V","\u2165":"VI","\u2166":"VII","\u2167":"VIII","\u2168":"IX","\u2169":"X","\u216A":"XI","\u216B":"XII","\u216C":"L","\u216D":"C","\u216E":"D","\u216F":"M","\u2170":"I","\u2171":"II","\u2172":"III","\u2173":"IV","\u2174":"V","\u2175":"VI","\u2176":"VII","\u2177":"VIII","\u2178":"IX","\u2179":"X","\u217A":"XI","\u217B":"XII","\u217C":"L","\u217D":"C","\u217E":"D","\u217F":"M"},K=new RegExp(`(${Object.keys(U).join("|")})`,"gi"),Y=/^(?=[MDCLXVI])(M{0,3})(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$/i,q={round:3,allowTrailingInvalid:!1,romanNumerals:!1},Z=a=>{let n=`${a}`.replace(K,(p,s)=>U[s]).toUpperCase(),t=Y.exec(n);if(!t)return NaN;let[,c,o,d,h]=t;return(M[c]??0)+(M[o]??0)+(M[d]??0)+(M[h]??0)},ss=/^\s*\//,f=(a,n=q)=>{if(typeof a=="number"||typeof a=="bigint")return a;let t=NaN,c=`${a}`.replace(J,(r,i)=>` ${L[i]}`).replace("\u2044","/").trim();if(c.length===0)return NaN;let o={...q,...n},d=(o.allowTrailingInvalid?H:N).exec(c);if(!d)return o.romanNumerals?Z(c):NaN;let[,h,p,s]=d,m=p.replace(/[,_]/g,""),u=s==null?void 0:s.replace(/[,_]/g,"");if(!m&&u&&u.startsWith(".")?t=0:t=parseInt(m),!u)return h?t*-1:t;let e=o.round===!1?NaN:parseFloat(`1e${Math.floor(Math.max(0,o.round))}`);if(u.startsWith(".")||u.startsWith("e")||u.startsWith("E")){let r=parseFloat(`${t}${u}`);t=isNaN(e)?r:Math.round(r*e)/e}else if(ss.test(u)){let r=parseInt(m),i=parseInt(u.replace("/",""));t=isNaN(e)?r/i:Math.round(r*e/i)/e}else{let r=u.split("/"),[i,l]=r.map(g=>parseInt(g));t+=isNaN(e)?i/l:Math.round(i*e/l)/e}return h?t*-1:t};var E={additionalUOMs:{},allowLeadingOf:!1,normalizeUOM:!1,ignoreUOMs:[]},A=["For"],v=new RegExp(`^(?:${A.join("|")})\\s`,"i"),W=["or","to"],F=`(-|\u2013|\u2014|(?:${W.join("|")})\\s)`,$=new RegExp(`^${F}`,"i"),D=/^(fl(?:uid)?(?:\s+|-)(?:oz|ounces?)|\w+[-.]?)(.+)?/,z=N.source.replace(/^\^/,"").replace(/\$$/,""),O=new RegExp(`(,|:|-|\u2013|\u2014|x|\u2A2F)?\\s*((${z})\\s*(${F}))?\\s*(${z})\\s*(fl(?:uid)?(?:\\s+|-)(?:oz|ounces?)|\\w+)?$`,"i"),T=["of"],b=new RegExp(`^(?:${T.join("|")})\\s+`,"i"),_=["from","of"],w=new RegExp(`\\s+(?:${_.join("|")})$`,"i"),V={bag:{short:"bag",plural:"bags",alternates:[]},box:{short:"box",plural:"boxes",alternates:[]},bunch:{short:"bunch",plural:"bunches",alternates:[]},can:{short:"can",plural:"cans",alternates:[]},carton:{short:"carton",plural:"cartons",alternates:[]},centimeter:{short:"cm",plural:"centimeters",alternates:["cm."]},clove:{short:"clove",plural:"cloves",alternates:[]},container:{short:"container",plural:"containers",alternates:[]},cup:{short:"c",plural:"cups",alternates:["c.","C"]},dash:{short:"dash",plural:"dashes",alternates:[]},drop:{short:"drop",plural:"drops",alternates:[]},ear:{short:"ear",plural:"ears",alternates:[]},"fluid ounce":{short:"fl oz",plural:"fluid ounces",alternates:["fluidounce","floz","fl-oz","fluid-ounce","fluid-ounces","fluidounces","fl ounce","fl ounces","fl-ounce","fl-ounces","fluid oz","fluid-oz"]},foot:{short:"ft",plural:"feet",alternates:["ft."]},gallon:{short:"gal",plural:"gallons",alternates:["gal."]},gram:{short:"g",plural:"grams",alternates:["g."]},head:{short:"head",plural:"heads",alternates:[]},inch:{short:"in",plural:"inches",alternates:["in."]},kilogram:{short:"kg",plural:"kilograms",alternates:["kg."]},large:{short:"lg",plural:"large",alternates:["lg","lg."]},liter:{short:"l",plural:"liters",alternates:["l."]},medium:{short:"md",plural:"medium",alternates:["med","med.","md."]},meter:{short:"m",plural:"meters",alternates:["m."]},milligram:{short:"mg",plural:"milligrams",alternates:["mg."]},milliliter:{short:"ml",plural:"milliliters",alternates:["mL","ml.","mL."]},millimeter:{short:"mm",plural:"millimeters",alternates:["mm."]},ounce:{short:"oz",plural:"ounces",alternates:["oz."]},pack:{short:"pack",plural:"packs",alternates:[]},package:{short:"pkg",plural:"packages",alternates:["pkg.","pkgs","pkgs."]},piece:{short:"piece",plural:"pieces",alternates:["pc","pc.","pcs","pcs."]},pinch:{short:"pinch",plural:"pinches",alternates:[]},pint:{short:"pt",plural:"pints",alternates:["pt."]},pound:{short:"lb",plural:"pounds",alternates:["lb.","lbs","lbs."]},quart:{short:"qt",plural:"quarts",alternates:["qt.","qts","qts."]},small:{short:"sm",plural:"small",alternates:["sm."]},sprig:{short:"sprig",plural:"sprigs",alternates:[]},stick:{short:"stick",plural:"sticks",alternates:[]},tablespoon:{short:"tbsp",plural:"tablespoons",alternates:["tbsp.","T","Tbsp.","Tbsp"]},teaspoon:{short:"tsp",plural:"teaspoons",alternates:["tsp.","t"]},yard:{short:"yd",plural:"yards",alternates:["yd.","yds."]}};var es=/\r?\n/,ts=([a,n])=>({id:a,...n}),rs=(a,n=E)=>{let t={...E,...n},c={...V,...t.additionalUOMs},o=Object.entries(c).map(ts),d=o.length;return a.split(es).map(p=>p.trim()).filter(Boolean).map(p=>{let s={quantity:null,quantity2:null,unitOfMeasureID:null,unitOfMeasure:null,description:"",isGroupHeader:!1};if(isNaN(f(p[0]))){let e=O.exec(p);if(e&&t.ignoreUOMs.includes(e.at(-1)??""))s.description=p;else if(e){s.description=p.replace(O,"").trim();let r=e[3],i=e[12];r?(s.quantity=f(r),s.quantity2=f(i)):s.quantity=f(i);let l=e.at(-1);if(l){let g="",I="",x=-1;for(;++x<d&&!g;){let{alternates:y,id:R,short:k,plural:X}=o[x];[...y,R,k,X].includes(l)&&(g=l,I=R)}g?(s.unitOfMeasureID=I,s.unitOfMeasure=t.normalizeUOM?I:g):s.description.match(w)&&(s.description+=` ${l}`)}}else s.description=p,(s.description.endsWith(":")||v.test(s.description))&&(s.isGroupHeader=!0)}else{let e=6,r=NaN;for(;e>0&&isNaN(r);)r=f(p.substring(0,e).trim()),r>-1&&(s.quantity=r,s.description=p.substring(e).trim()),e--}let m=$.exec(s.description);if(m){let e=m[1].length,r=f(s.description.substring(e).trim()[0]);if(!isNaN(r)){let i=7,l=NaN;for(;--i>0&&isNaN(l);)l=f(s.description.substring(e,i)),isNaN(l)||(s.quantity2=l,s.description=s.description.substring(i).trim())}}let u=D.exec(s.description);if(u){let e=u[1].replace(/\s+/g," "),r=(u[2]??"").trim();if(r){let i="",l="",g=-1;for(;++g<d&&!i;){let{alternates:I,id:x,short:y,plural:R}=o[g];[...I,x,y,R].filter(X=>!t.ignoreUOMs.includes(X)).includes(e)&&(i=e,l=x)}i&&(s.unitOfMeasureID=l,s.unitOfMeasure=t.normalizeUOM?l:i,s.description=r)}}return!t.allowLeadingOf&&s.description.match(b)&&(s.description=s.description.replace(b,"")),s})};return P(is);})(); //# sourceMappingURL=parse-ingredient.umd.min.js.map