diff --git a/package-lock.json b/package-lock.json index b7be4009..55c63183 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "diet-diary", - "version": "2.26.4", + "version": "2.27.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "diet-diary", - "version": "2.26.4", + "version": "2.27.0", "workspaces": [ "packages/parser" ], diff --git a/package.json b/package.json index 7de1a760..a327d4cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "diet-diary", - "version": "2.26.4", + "version": "2.27.0", "private": true, "homepage": ".", "dependencies": { diff --git a/src/features/suggestions/generate/calculateServing.ts b/src/features/suggestions/generate/calculateServing.ts index 7b1f8535..41496080 100644 --- a/src/features/suggestions/generate/calculateServing.ts +++ b/src/features/suggestions/generate/calculateServing.ts @@ -4,26 +4,36 @@ import { multiply } from '../../../model/servingFunction'; import parseAmount, { DecomposedAmount } from '../parser/DecomposedAmount'; import convert, { isMeasurementConvertible, Unit } from '../convert'; -function measurementFor(unit: Unit, { measurement, alternateMeasurement }: DecomposedAmount) { - if (unit === "unknown") { - if (alternateMeasurement && alternateMeasurement.unit === "unknown") { - return alternateMeasurement; +function measurementFor(unit: Unit, { measurement, alternateMeasurement }: DecomposedAmount, prepMethod?: string) { + const isUnitConvertibleTo = _.partial(isMeasurementConvertible, unit); + const allMeasurements = alternateMeasurement ? [measurement, alternateMeasurement] : [measurement]; + const canBeConverted = _.filter(allMeasurements, isUnitConvertibleTo); + + if (prepMethod) { + const containsPrepMethod = (m: typeof measurement) => { + const words = _.words(_.lowerCase(m.unitText)); + return _.includes(words, prepMethod); } - return measurement; - }; + const matchedPrepMethod = _.filter(canBeConverted, containsPrepMethod); + if (matchedPrepMethod) { + return _.defaultTo(_.head(matchedPrepMethod), measurement); + } + } + return _.defaultTo(_.head(canBeConverted), measurement); +} - const isUnitConvertibleTo = _.partial(isMeasurementConvertible, unit); - if (isUnitConvertibleTo(measurement)) { - return measurement; - } else if (alternateMeasurement && isUnitConvertibleTo(alternateMeasurement)) { - return alternateMeasurement; +function prepMethod(unitText: string | undefined) { + const words = _.words(_.lowerCase(unitText)); + if (_.size(words) > 1) { + return words[1]; + } else { + return undefined; } - return measurement; } function servingFor(unitServing: Serving, servingAmount: DecomposedAmount, amount: string) { const from = parseAmount(amount).measurement; - const to = measurementFor(from.unit, servingAmount); + const to = measurementFor(from.unit, servingAmount, prepMethod(from.unitText)); try { const normalizedQuantity = convert(from.quantity, from.unit, to.unit); diff --git a/src/features/suggestions/generate/generateSuggestion.test.ts b/src/features/suggestions/generate/generateSuggestion.test.ts index fc443a7f..06be08e8 100644 --- a/src/features/suggestions/generate/generateSuggestion.test.ts +++ b/src/features/suggestions/generate/generateSuggestion.test.ts @@ -311,3 +311,28 @@ test("diameter size calculation", () => { generateSuggestions(new MockRefObject("cheese pizza 1/8 of 12-inch "), assert); }) + +test("use prep method -- word after unit e.g. 1 cup cooked to determine the measurement", () => { + const assert = (suggestions: Suggestion[]) => { + expect(_.size(suggestions)).toBeGreaterThanOrEqual(2); + // the input + expect(suggestions[0]).toEqual( + { + foodName: "cabbage, green or red", + amount: "1 cup cooked", + } + ); + expect(suggestions[1]).toMatchObject( + { + foodName: "cabbage, green or red", + amount: "1 cup cooked", + serving: { + "vegetable": 2, + } + } + ); + + } + generateSuggestions(new MockRefObject("cabbage, green or red 1 cup cooked"), assert); + +})