diff --git a/CHANGELOG.md b/CHANGELOG.md index df7241dc..72d33f1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * CA (Catalan) * AmountOfMoney: **new!** * Distance: **new!** + * Temperature: **new!** * EN (English) * Time: Allow latent match for \ \ diff --git a/Duckling/Dimensions/CA.hs b/Duckling/Dimensions/CA.hs index 7f3b0e1f..2dbcce1c 100644 --- a/Duckling/Dimensions/CA.hs +++ b/Duckling/Dimensions/CA.hs @@ -17,4 +17,5 @@ allDimensions = , Seal Distance , Seal Numeral , Seal Ordinal + , Seal Temperature ] diff --git a/Duckling/Rules/CA.hs b/Duckling/Rules/CA.hs index cb7abd18..bd7fc27a 100644 --- a/Duckling/Rules/CA.hs +++ b/Duckling/Rules/CA.hs @@ -21,6 +21,7 @@ import qualified Duckling.AmountOfMoney.CA.Rules as AmountOfMoney import qualified Duckling.Distance.CA.Rules as Distance import qualified Duckling.Numeral.CA.Rules as Numeral import qualified Duckling.Ordinal.CA.Rules as Ordinal +import qualified Duckling.Temperature.CA.Rules as Temperature import Duckling.Types defaultRules :: Seal Dimension -> [Rule] @@ -41,7 +42,7 @@ langRules (Seal Ordinal) = Ordinal.rules langRules (Seal PhoneNumber) = [] langRules (Seal Quantity) = [] langRules (Seal RegexMatch) = [] -langRules (Seal Temperature) = [] +langRules (Seal Temperature) = Temperature.rules langRules (Seal Time) = [] langRules (Seal TimeGrain) = [] langRules (Seal Url) = [] diff --git a/Duckling/Temperature/CA/Corpus.hs b/Duckling/Temperature/CA/Corpus.hs new file mode 100644 index 00000000..1ff03446 --- /dev/null +++ b/Duckling/Temperature/CA/Corpus.hs @@ -0,0 +1,54 @@ +-- Copyright (c) 2016-present, Facebook, Inc. +-- All rights reserved. +-- +-- This source code is licensed under the BSD-style license found in the +-- LICENSE file in the root directory of this source tree. + + +{-# LANGUAGE OverloadedStrings #-} + +module Duckling.Temperature.CA.Corpus + ( corpus ) where + +import Prelude +import Data.String + +import Duckling.Locale +import Duckling.Resolve +import Duckling.Temperature.Types +import Duckling.Testing.Types + +corpus :: Corpus +corpus = (testContext {locale = makeLocale CA Nothing}, testOptions, allExamples) + +allExamples :: [Example] +allExamples = concat + [ examples (simple Celsius 37) + [ "37°C" + , "37 ° celsius" + , "37 graus Celsius" + , "37 graus C" + , "37 centígrads" + , "37 graus centígrads" + , "37 Celsius" + ] + , examples (simple Fahrenheit 70) + [ "70°F" + , "70 ° Fahrenheit" + , "70 graus F" + , "setanta Fahrenheit" + ] + , examples (simple Degree 45) + [ "45°" + , "45 graus" + ] + , examples (simple Degree 37) + [ "trenta-set graus" + , "37 grads" + ] + , examples (simple Degree (-10)) + [ "-10°" + , "- deu graus" + , "10 sota zero" + ] + ] diff --git a/Duckling/Temperature/CA/Rules.hs b/Duckling/Temperature/CA/Rules.hs new file mode 100644 index 00000000..cead4fc2 --- /dev/null +++ b/Duckling/Temperature/CA/Rules.hs @@ -0,0 +1,85 @@ +-- Copyright (c) 2016-present, Facebook, Inc. +-- All rights reserved. +-- +-- This source code is licensed under the BSD-style license found in the +-- LICENSE file in the root directory of this source tree. + + +{-# LANGUAGE GADTs #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} + +module Duckling.Temperature.CA.Rules + ( rules ) where + +import Prelude +import Data.String + +import Duckling.Dimensions.Types +import Duckling.Temperature.Helpers +import Duckling.Temperature.Types (TemperatureData (..)) +import qualified Duckling.Temperature.Types as TTemperature +import Duckling.Types + +ruleLatentTempTemp :: Rule +ruleLatentTempTemp = Rule + { name = " temp" + , pattern = + [ Predicate $ isValueOnly False + , regex "(gra(d|u)s?|°)" + ] + , prod = \case + (Token Temperature td:_) -> + Just $ Token Temperature $ withUnit TTemperature.Degree td + _ -> Nothing + } + +ruleTempCelsius :: Rule +ruleTempCelsius = Rule + { name = " Celsius" + , pattern = + [ Predicate $ isValueOnly True + , regex "(cent(i|í)gra(d|u)s?|(C|c)(el[cs]?(ius)?)?\\.?)" + ] + , prod = \case + (Token Temperature td:_) -> + Just $ Token Temperature $ withUnit TTemperature.Celsius td + _ -> Nothing + } + +ruleTempFahrenheit :: Rule +ruleTempFahrenheit = Rule + { name = " Fahrenheit" + , pattern = + [ Predicate $ isValueOnly True + , regex "f(ah?reh?n(h?eit)?)?\\.?" + ] + , prod = \case + (Token Temperature td:_) -> Just $ Token Temperature $ + withUnit TTemperature.Fahrenheit td + _ -> Nothing + } + +ruleLatentTempTempBajoCero :: Rule +ruleLatentTempTempBajoCero = Rule + { name = " temp bajo zero" + , pattern = + [ Predicate $ isValueOnly True + , regex "sota zero" + ] + , prod = \case + (Token Temperature td@TemperatureData{TTemperature.value = Just v}:_) -> + case TTemperature.unit td of + Nothing -> Just $ Token Temperature $ withUnit TTemperature.Degree $ + td {TTemperature.value = Just (- v)} + _ -> Just $ Token Temperature $ td {TTemperature.value = Just (- v)} + _ -> Nothing + } + +rules :: [Rule] +rules = + [ ruleLatentTempTemp + , ruleLatentTempTempBajoCero + , ruleTempCelsius + , ruleTempFahrenheit + ] diff --git a/duckling.cabal b/duckling.cabal index b5032f5e..6582ffaf 100644 --- a/duckling.cabal +++ b/duckling.cabal @@ -650,6 +650,8 @@ library -- Temperature , Duckling.Temperature.AR.Corpus , Duckling.Temperature.AR.Rules + , Duckling.Temperature.CA.Corpus + , Duckling.Temperature.CA.Rules , Duckling.Temperature.EN.Corpus , Duckling.Temperature.EN.Rules , Duckling.Temperature.ES.Corpus @@ -1105,6 +1107,7 @@ test-suite duckling-test -- Temperature , Duckling.Temperature.AR.Tests + , Duckling.Temperature.CA.Tests , Duckling.Temperature.EN.Tests , Duckling.Temperature.ES.Tests , Duckling.Temperature.FR.Tests diff --git a/tests/Duckling/Temperature/CA/Tests.hs b/tests/Duckling/Temperature/CA/Tests.hs new file mode 100644 index 00000000..bafffdcd --- /dev/null +++ b/tests/Duckling/Temperature/CA/Tests.hs @@ -0,0 +1,22 @@ +-- Copyright (c) 2016-present, Facebook, Inc. +-- All rights reserved. +-- +-- This source code is licensed under the BSD-style license found in the +-- LICENSE file in the root directory of this source tree. + + +module Duckling.Temperature.CA.Tests + ( tests ) where + +import Data.String +import Prelude +import Test.Tasty + +import Duckling.Temperature.CA.Corpus +import Duckling.Dimensions.Types +import Duckling.Testing.Asserts + +tests :: TestTree +tests = testGroup "CA Tests" + [ makeCorpusTest [Seal Temperature] corpus + ]