AmountOfMoney

Summary: AmountOfMoney dimension for Croatian.

Reviewed By: niteria

Differential Revision: D4947584

fbshipit-source-id: a20670a
This commit is contained in:
Julien Odent 2017-04-26 09:11:06 -07:00 committed by Facebook Github Bot
parent 0f98a42b03
commit b32696f8eb
8 changed files with 329 additions and 2 deletions

View File

@ -0,0 +1,96 @@
-- 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. An additional grant
-- of patent rights can be found in the PATENTS file in the same directory.
{-# LANGUAGE OverloadedStrings #-}
module Duckling.AmountOfMoney.HR.Corpus
( corpus ) where
import Prelude
import Data.String
import Duckling.Lang
import Duckling.AmountOfMoney.Types
import Duckling.Resolve
import Duckling.Testing.Types
corpus :: Corpus
corpus = (testContext {lang = HR}, allExamples)
allExamples :: [Example]
allExamples = concat
[ examples (AmountOfMoneyValue Dollar 10)
[ "$10"
, "10$"
, "deset dolara"
]
, examples (AmountOfMoneyValue Cent 10)
[ "deset centa"
]
, examples (AmountOfMoneyValue Dollar 10000)
[ "$10.000"
, "10K$"
, "$10k"
]
, examples (AmountOfMoneyValue USD 1.23)
[ "USD1,23"
]
, examples (AmountOfMoneyValue Dollar 2.23)
[ "2 dolara i 23 centa"
, "dva dolara 23 centa"
, "2 dolara 23"
, "dva dolara i 23"
]
, examples (AmountOfMoneyValue HRK 2.23)
[ "2 kune i 23 lipe"
, "dvije kune 23 lipe"
, "2 kune 23"
, "dvije kune i 23"
]
, examples (AmountOfMoneyValue HRK 100)
[ "100 kuna"
, "sto kuna"
]
, examples (AmountOfMoneyValue HRK 200)
[ "200 kuna"
, "dvije stotine kuna"
, "dvjesto kuna"
, "dvjesta kuna"
]
, examples (AmountOfMoneyValue EUR 20)
[ "20€"
, "20 euros"
, "20 Euro"
, "20 Euros"
, "EUR 20"
]
, examples (AmountOfMoneyValue EUR 29.99)
[ "EUR29,99"
]
, examples (AmountOfMoneyValue INR 20)
[ "Rs. 20"
, "Rs 20"
, "20 Rupija"
, "20Rs"
, "Rs20"
]
, examples (AmountOfMoneyValue INR 20.43)
[ "20 Rupija 43"
, "dvadeset rupija 43"
]
, examples (AmountOfMoneyValue INR 33)
[ "INR33"
]
, examples (AmountOfMoneyValue Pound 9)
[ "£9"
, "devet funti"
]
, examples (AmountOfMoneyValue GBP 3.01)
[ "GBP3,01"
, "GBP 3,01"
]
]

View File

@ -0,0 +1,200 @@
-- 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. An additional grant
-- of patent rights can be found in the PATENTS file in the same directory.
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
module Duckling.AmountOfMoney.HR.Rules
( rules ) where
import Data.Maybe
import Data.String
import Data.Text (Text)
import Prelude
import qualified Data.Text as Text
import Duckling.AmountOfMoney.Helpers
import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
import Duckling.Dimensions.Types
import Duckling.Numeral.Types (NumeralData (..))
import Duckling.Regex.Types
import Duckling.Types
import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
import qualified Duckling.Numeral.Types as TNumeral
ruleIntersectAndNumber :: Rule
ruleIntersectAndNumber = Rule
{ name = "intersect (and number)"
, pattern =
[ financeWith TAmountOfMoney.value isJust
, regex "i"
, dimension Numeral
]
, prod = \tokens -> case tokens of
(Token AmountOfMoney fd:
_:
Token Numeral (NumeralData {TNumeral.value = c}):
_) -> Just . Token AmountOfMoney $ withCents c fd
_ -> Nothing
}
ruleSar :: Rule
ruleSar = Rule
{ name = "SAR"
, pattern =
[ regex "saudijskirijal|saudi rijal?"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly SAR
}
ruleDollar :: Rule
ruleDollar = Rule
{ name = "$"
, pattern =
[ regex "dolar(a|i|e)?"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
}
ruleCent :: Rule
ruleCent = Rule
{ name = "cent"
, pattern =
[ regex "cent(i|a)?|penij(i|a)?|c|\x00a2|lp|lip(a|e)"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
}
ruleIntersectIXLipa :: Rule
ruleIntersectIXLipa = Rule
{ name = "intersect (i X lipa)"
, pattern =
[ financeWith TAmountOfMoney.value isJust
, regex "i"
, financeWith TAmountOfMoney.currency (== Cent)
]
, prod = \tokens -> case tokens of
(Token AmountOfMoney fd:
_:
Token AmountOfMoney (AmountOfMoneyData {TAmountOfMoney.value = Just c}):
_) -> Just . Token AmountOfMoney $ withCents c fd
_ -> Nothing
}
ruleIntersectXCents :: Rule
ruleIntersectXCents = Rule
{ name = "intersect (X cents)"
, pattern =
[ financeWith TAmountOfMoney.value isJust
, financeWith TAmountOfMoney.currency (== Cent)
]
, prod = \tokens -> case tokens of
(Token AmountOfMoney fd:
Token AmountOfMoney (AmountOfMoneyData {TAmountOfMoney.value = Just c}):
_) -> Just . Token AmountOfMoney $ withCents c fd
_ -> Nothing
}
rulePound :: Rule
rulePound = Rule
{ name = "£"
, pattern =
[ regex "funt(a|e|i)?"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
}
ruleHrk :: Rule
ruleHrk = Rule
{ name = "HRK"
, pattern =
[ regex "kn|(hrvatsk(a|ih|e) )?kun(a|e)"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly HRK
}
ruleIntersect :: Rule
ruleIntersect = Rule
{ name = "intersect"
, pattern =
[ financeWith TAmountOfMoney.value isJust
, dimension Numeral
]
, prod = \tokens -> case tokens of
(Token AmountOfMoney fd:
Token Numeral (NumeralData {TNumeral.value = c}):
_) -> Just . Token AmountOfMoney $ withCents c fd
_ -> Nothing
}
ruleOtherPounds :: Rule
ruleOtherPounds = Rule
{ name = "other pounds"
, pattern =
[ regex "(egipatska|libanonska) ?funta"
]
, prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
"egipatska" -> Just . Token AmountOfMoney $ currencyOnly EGP
"libanonska" -> Just . Token AmountOfMoney $ currencyOnly LBP
_ -> Nothing
_ -> Nothing
}
ruleInr :: Rule
ruleInr = Rule
{ name = "INR"
, pattern =
[ regex "rupija?"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly INR
}
ruleKwd :: Rule
ruleKwd = Rule
{ name = "KWD"
, pattern =
[ regex "kuvajtski ?dinar"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly KWD
}
ruleQar :: Rule
ruleQar = Rule
{ name = "QAR"
, pattern =
[ regex "katarski(i| )rijal"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly QAR
}
ruleAed :: Rule
ruleAed = Rule
{ name = "AED"
, pattern =
[ regex "drahma?"
]
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly AED
}
rules :: [Rule]
rules =
[ ruleDollar
, rulePound
, ruleOtherPounds
, ruleAed
, ruleCent
, ruleHrk
, ruleInr
, ruleIntersect
, ruleIntersectAndNumber
, ruleIntersectIXLipa
, ruleIntersectXCents
, ruleKwd
, ruleQar
, ruleSar
]

View File

@ -51,6 +51,7 @@ currencies = HashMap.fromList
, ("\x20acuros", EUR)
, ("\x20acurs", EUR)
, ("gbp", GBP)
, ("hrk", HRK)
, ("idr", IDR)
, ("inr", INR)
, ("rs", INR)
@ -83,7 +84,7 @@ ruleCurrencies :: Rule
ruleCurrencies = Rule
{ name = "currencies"
, pattern =
[ regex "(aed|aud|brl|\x00a2|c|\\$|dollars?|egp|(e|\x20ac)uro?s?|\x20ac|gbp|idr|inr|\x00a5|jpy|krw|kwd|lbp|nok|\x00a3|pta?s?|qar|rs\\.?|ron|rupees?|sar|sek|sgb|us(d|\\$)|vnd|yen)"
[ regex "(aed|aud|brl|\x00a2|c|\\$|dollars?|egp|(e|\x20ac)uro?s?|\x20ac|gbp|hrk|idr|inr|\x00a5|jpy|krw|kwd|lbp|nok|\x00a3|pta?s?|qar|rs\\.?|ron|rupees?|sar|sek|sgb|us(d|\\$)|vnd|yen)"
]
, prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (match:_)):_) -> do

View File

@ -37,6 +37,7 @@ data Currency
| EGP
| EUR
| GBP
| HRK
| IDR
| INR
| JPY
@ -65,6 +66,7 @@ instance ToJSON Currency where
toJSON EGP = "EGP"
toJSON EUR = "EUR"
toJSON GBP = "GBP"
toJSON HRK = "HRK"
toJSON IDR = "IDR"
toJSON INR = "INR"
toJSON JPY = "JPY"

View File

@ -15,6 +15,7 @@ module Duckling.Rules.HR
import Duckling.Dimensions.Types
import Duckling.Types
import qualified Duckling.AmountOfMoney.HR.Rules as AmountOfMoney
import qualified Duckling.Numeral.HR.Rules as Numeral
import qualified Duckling.Ordinal.HR.Rules as Ordinal
@ -23,7 +24,7 @@ rules (This Distance) = []
rules (This Duration) = []
rules (This Numeral) = Numeral.rules
rules (This Email) = []
rules (This AmountOfMoney) = []
rules (This AmountOfMoney) = AmountOfMoney.rules
rules (This Ordinal) = Ordinal.rules
rules (This PhoneNumber) = []
rules (This Quantity) = []

View File

@ -138,6 +138,8 @@ library
, Duckling.AmountOfMoney.FR.Rules
, Duckling.AmountOfMoney.GA.Corpus
, Duckling.AmountOfMoney.GA.Rules
, Duckling.AmountOfMoney.HR.Corpus
, Duckling.AmountOfMoney.HR.Rules
, Duckling.AmountOfMoney.ID.Corpus
, Duckling.AmountOfMoney.ID.Rules
, Duckling.AmountOfMoney.KO.Corpus
@ -508,6 +510,7 @@ test-suite duckling-test
, Duckling.AmountOfMoney.ES.Tests
, Duckling.AmountOfMoney.FR.Tests
, Duckling.AmountOfMoney.GA.Tests
, Duckling.AmountOfMoney.HR.Tests
, Duckling.AmountOfMoney.ID.Tests
, Duckling.AmountOfMoney.KO.Tests
, Duckling.AmountOfMoney.NB.Tests

View File

@ -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. An additional grant
-- of patent rights can be found in the PATENTS file in the same directory.
module Duckling.AmountOfMoney.HR.Tests
( tests ) where
import Data.String
import Prelude
import Test.Tasty
import Duckling.Dimensions.Types
import Duckling.AmountOfMoney.HR.Corpus
import Duckling.Testing.Asserts
tests :: TestTree
tests = testGroup "HR Tests"
[ makeCorpusTest [This AmountOfMoney] corpus
]

View File

@ -16,6 +16,7 @@ import qualified Duckling.AmountOfMoney.EN.Tests as EN
import qualified Duckling.AmountOfMoney.ES.Tests as ES
import qualified Duckling.AmountOfMoney.FR.Tests as FR
import qualified Duckling.AmountOfMoney.GA.Tests as GA
import qualified Duckling.AmountOfMoney.HR.Tests as HR
import qualified Duckling.AmountOfMoney.ID.Tests as ID
import qualified Duckling.AmountOfMoney.KO.Tests as KO
import qualified Duckling.AmountOfMoney.NB.Tests as NB
@ -30,6 +31,7 @@ tests = testGroup "AmountOfMoney Tests"
, ES.tests
, FR.tests
, GA.tests
, HR.tests
, ID.tests
, KO.tests
, NB.tests