commit
a140efe8f7
|
@ -0,0 +1,131 @@
|
|||
{
|
||||
"decade_format": {
|
||||
"1": {"match": "^1$", "format": "ett"},
|
||||
"2": {"match": "^\\d$", "format": "{x}"},
|
||||
"3": {"match": "^\\d\\d$", "format": "{xx}"},
|
||||
"4": {"match": "^\\d0$", "format": "{x0}"},
|
||||
"default": "{number}"
|
||||
},
|
||||
"hundreds_format": {
|
||||
"1": {"match": "^1\\d{2}$", "format": "ett hundra"},
|
||||
"2": {"match": "^\\d{3}$", "format": "{x_in_x00} hundra"},
|
||||
"default": "{number}"
|
||||
},
|
||||
"thousand_format": {
|
||||
"1": {"match": "^1[1-9]\\d{2}$", "format": "{xx_in_xx00} hundra"},
|
||||
"2": {"match": "^1\\d{3}$", "format": "ett tusen"},
|
||||
"3": {"match": "^\\d{4}$", "format": "{x_in_x000} tusen"},
|
||||
"default": "{number}"
|
||||
},
|
||||
"year_format": {
|
||||
"1": {"match": "^\\d\\d?$", "format": "{formatted_decade} {bc}"},
|
||||
"2": {"match": "^\\d00$", "format": "{formatted_hundreds} {bc}"},
|
||||
"3": {"match": "^\\d{3}$", "format": "{formatted_hundreds} {formatted_decade} {bc}"},
|
||||
"4": {"match": "^(1\\d00)|([2-9]000)$", "format": "{formatted_thousand} {bc}"},
|
||||
"5": {"match": "^(1\\d{3})|(\\d0\\d{2})$", "format": "{formatted_thousand} {formatted_decade} {bc}"},
|
||||
"6": {"match": "^\\d{4}$", "format": "{formatted_thousand} {formatted_hundreds} {formatted_decade} {bc}"},
|
||||
"default": "{year} {bc}",
|
||||
"bc": "f.kr."
|
||||
},
|
||||
"date_format": {
|
||||
"date_full": "{weekday}, den {day} {month}, {formatted_year}",
|
||||
"date_full_no_year": "{weekday}, den {day} {month}",
|
||||
"date_full_no_year_month": "{weekday}, den {day}",
|
||||
"today": "i dag",
|
||||
"tomorrow": "i morgon",
|
||||
"yesterday": "i går"
|
||||
},
|
||||
"date_time_format": {
|
||||
"date_time": "{formatted_date} klockan {formatted_time}"
|
||||
},
|
||||
"weekday": {
|
||||
"0": "måndag",
|
||||
"1": "tisdag",
|
||||
"2": "onsdag",
|
||||
"3": "torsdag",
|
||||
"4": "fredag",
|
||||
"5": "lördag",
|
||||
"6": "söndag"
|
||||
},
|
||||
"date": {
|
||||
"1": "förste",
|
||||
"2": "andra",
|
||||
"3": "tredje",
|
||||
"4": "fjärde",
|
||||
"5": "femte",
|
||||
"6": "sjätte",
|
||||
"7": "sjunde",
|
||||
"8": "åttonde",
|
||||
"9": "nionde",
|
||||
"10": "tionde",
|
||||
"11": "elfte",
|
||||
"12": "tolfte",
|
||||
"13": "trettionde",
|
||||
"14": "fjortonde",
|
||||
"15": "femtonde",
|
||||
"16": "sextonde",
|
||||
"17": "sjuttonde",
|
||||
"18": "artonde",
|
||||
"19": "nittonde",
|
||||
"20": "tjugonde",
|
||||
"21": "tjugoförste",
|
||||
"22": "tjugoandre",
|
||||
"23": "tjugotredje",
|
||||
"24": "tjugofjärde",
|
||||
"25": "tjugofemte",
|
||||
"26": "tjugosjätte",
|
||||
"27": "tjugosjunde",
|
||||
"28": "tjugoåttonde",
|
||||
"29": "tjugonionde",
|
||||
"30": "trettionde",
|
||||
"31": "trettioförste"
|
||||
},
|
||||
"month": {
|
||||
"1": "januari",
|
||||
"2": "februari",
|
||||
"3": "mars",
|
||||
"4": "april",
|
||||
"5": "maj",
|
||||
"6": "juni",
|
||||
"7": "juli",
|
||||
"8": "augusti",
|
||||
"9": "september",
|
||||
"10": "oktober",
|
||||
"11": "november",
|
||||
"12": "december"
|
||||
},
|
||||
"number": {
|
||||
"0": "noll",
|
||||
"1": "en",
|
||||
"2": "två",
|
||||
"3": "tre",
|
||||
"4": "fyra",
|
||||
"5": "fem",
|
||||
"6": "sex",
|
||||
"7": "sju",
|
||||
"8": "åtta",
|
||||
"9": "nio",
|
||||
"10": "tio",
|
||||
"11": "elva",
|
||||
"12": "tolv",
|
||||
"13": "tretton",
|
||||
"14": "fjorton",
|
||||
"15": "femton",
|
||||
"16": "sexton",
|
||||
"17": "sjutton",
|
||||
"18": "arton",
|
||||
"19": "nitton",
|
||||
"20": "tjugo",
|
||||
"30": "trettio",
|
||||
"40": "fyrtio",
|
||||
"50": "femtio",
|
||||
"60": "sextio",
|
||||
"70": "sjuttio",
|
||||
"80": "åttio",
|
||||
"90": "nitio",
|
||||
"100": "hundra",
|
||||
"1000": "tusen",
|
||||
"2000": "tvåtusen"
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"test_nice_year": {
|
||||
"1": {"datetime_param": "2017, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "två tusen sjutton"},
|
||||
"2": {"datetime_param": "1984, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "nitton hundra 84"},
|
||||
"3": {"datetime_param": "1906, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "nitton hundra sex"},
|
||||
"4": {"datetime_param": "1802, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "arton hundra två" },
|
||||
"5": {"datetime_param": "806, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "åtta hundra sex" },
|
||||
"6": {"datetime_param": "1800, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "arton hundra" },
|
||||
"7": {"datetime_param": "1, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "ett" },
|
||||
"8": {"datetime_param": "103, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "ett hundra tre" },
|
||||
"9": {"datetime_param": "1000, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "ett tusen" },
|
||||
"10": {"datetime_param": "2000, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "två tusen" },
|
||||
"11": {"datetime_param": "99, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "99 f.kr." },
|
||||
"12": {"datetime_param": "5, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "fem f.kr." },
|
||||
"13": {"datetime_param": "3120, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "tre tusen ett hundra tjugo f.kr." },
|
||||
"14": {"datetime_param": "3241, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "tre tusen två hundra 41 f.kr." }
|
||||
},
|
||||
"test_nice_date": {
|
||||
"1": {"datetime_param": "2017, 1, 31, 0, 2, 3", "now": "None", "assertEqual": "tisdag, den trettioförste januari, två tusen sjutton"},
|
||||
"2": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2017, 1, 1, 0, 2, 3", "assertEqual": "söndag, den fjärde februari, två tusen arton"},
|
||||
"3": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 1, 1, 0, 2, 3", "assertEqual": "söndag, den fjärde februari"},
|
||||
"4": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 1, 0, 2, 3", "assertEqual": "söndag, den fjärde"},
|
||||
"5": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 3, 0, 2, 3", "assertEqual": "i morgon"},
|
||||
"6": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 4, 0, 2, 3", "assertEqual": "i dag"},
|
||||
"7": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 5, 0, 2, 3", "assertEqual": "i går"},
|
||||
"8": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 6, 0, 2, 3", "assertEqual": "söndag, den fjärde februari"},
|
||||
"9": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2019, 2, 6, 0, 2, 3", "assertEqual": "söndag, den fjärde februari, två tusen arton"}
|
||||
},
|
||||
"test_nice_date_time": {
|
||||
"1": {"datetime_param": "2017, 1, 31, 13, 22, 3", "now": "None", "use_24hour": "False", "use_ampm": "True", "assertEqual": "tisdag, den trettioförste januari, två tusen sjutton klockan tjugotvå minuter över ett på eftermiddagen"}
|
||||
}
|
||||
}
|
|
@ -285,6 +285,8 @@ def nice_number(number, lang=None, speech=True, denominators=None):
|
|||
return nice_number_nl(number, speech, denominators)
|
||||
elif lang_code == "da":
|
||||
return nice_number_da(number, speech, denominators)
|
||||
elif lang_code == "sv":
|
||||
return nice_number_sv(number, speech, denominators)
|
||||
|
||||
# Default to the raw number for unsupported languages,
|
||||
# hopefully the STT engine will pronounce understandably.
|
||||
|
@ -327,6 +329,8 @@ def nice_time(dt, lang=None, speech=True, use_24hour=False,
|
|||
return nice_time_da(dt, speech, use_24hour, use_ampm)
|
||||
elif lang_code == "pt":
|
||||
return nice_time_pt(dt, speech, use_24hour, use_ampm)
|
||||
elif lang_code == "sv":
|
||||
return nice_time_sv(dt, speech, use_24hour, use_ampm)
|
||||
|
||||
# TODO: Other languages
|
||||
return str(dt)
|
||||
|
@ -370,6 +374,8 @@ def pronounce_number(number, lang=None, places=2, short_scale=True,
|
|||
return pronounce_number_da(number, places=places)
|
||||
elif lang_code == "pt":
|
||||
return pronounce_number_pt(number, places=places)
|
||||
elif lang_code == "sv":
|
||||
return pronounce_number_sv(number, places=places)
|
||||
|
||||
# Default to just returning the numeric value
|
||||
return str(number)
|
||||
|
|
|
@ -16,6 +16,54 @@
|
|||
#
|
||||
|
||||
from mycroft.util.lang.format_common import convert_to_mixed_fraction
|
||||
from math import floor
|
||||
|
||||
months = ['januari', 'februari', 'mars', 'april', 'maj', 'juni',
|
||||
'juli', 'augusti', 'september', 'oktober', 'november',
|
||||
'december']
|
||||
|
||||
NUM_STRING_SV = {
|
||||
0: 'noll',
|
||||
1: 'en',
|
||||
2: 'två',
|
||||
3: 'tre',
|
||||
4: 'fyra',
|
||||
5: 'fem',
|
||||
6: 'sex',
|
||||
7: 'sju',
|
||||
8: 'åtta',
|
||||
9: 'nio',
|
||||
10: 'tio',
|
||||
11: 'elva',
|
||||
12: 'tolv',
|
||||
13: 'tretton',
|
||||
14: 'fjorton',
|
||||
15: 'femton',
|
||||
16: 'sexton',
|
||||
17: 'sjutton',
|
||||
18: 'arton',
|
||||
19: 'nitton',
|
||||
20: 'tjugo',
|
||||
30: 'trettio',
|
||||
40: 'fyrtio',
|
||||
50: 'femtio',
|
||||
60: 'sextio',
|
||||
70: 'sjuttio',
|
||||
80: 'åttio',
|
||||
90: 'nittio',
|
||||
100: 'hundra'
|
||||
}
|
||||
|
||||
NUM_POWERS_OF_TEN = [
|
||||
'hundra',
|
||||
'tusen',
|
||||
'miljon',
|
||||
'miljard',
|
||||
'biljon',
|
||||
'biljard',
|
||||
'triljon',
|
||||
'triljard'
|
||||
]
|
||||
|
||||
FRACTION_STRING_SV = {
|
||||
2: 'halv',
|
||||
|
@ -39,6 +87,8 @@ FRACTION_STRING_SV = {
|
|||
20: 'tjugondel'
|
||||
}
|
||||
|
||||
EXTRA_SPACE = " "
|
||||
|
||||
|
||||
def nice_number_sv(number, speech, denominators):
|
||||
""" Swedish helper for nice_number
|
||||
|
@ -79,8 +129,297 @@ def nice_number_sv(number, speech, denominators):
|
|||
return_string = '{} och en {}'.format(whole, den_str)
|
||||
else:
|
||||
return_string = '{} och {} {}'.format(whole, num, den_str)
|
||||
if num == 2:
|
||||
return_string += 'a'
|
||||
if num > 2:
|
||||
if num > 1:
|
||||
return_string += 'ar'
|
||||
return return_string
|
||||
|
||||
|
||||
def pronounce_number_sv(num, places=2):
|
||||
"""
|
||||
Convert a number to its spoken equivalent
|
||||
For example, '5.2' would return 'five point two'
|
||||
Args:
|
||||
num(float or int): the number to pronounce (set limit below)
|
||||
places(int): maximum decimal places to speak
|
||||
Returns:
|
||||
(str): The pronounced number
|
||||
|
||||
"""
|
||||
|
||||
def pronounce_triplet_sv(num):
|
||||
result = ""
|
||||
num = floor(num)
|
||||
|
||||
if num > 99:
|
||||
hundreds = floor(num / 100)
|
||||
if hundreds > 0:
|
||||
if hundreds == 1:
|
||||
result += 'ett' + 'hundra'
|
||||
else:
|
||||
result += NUM_STRING_SV[hundreds] + 'hundra'
|
||||
|
||||
num -= hundreds * 100
|
||||
|
||||
if num == 0:
|
||||
result += '' # do nothing
|
||||
elif num == 1:
|
||||
result += 'ett'
|
||||
elif num <= 20:
|
||||
result += NUM_STRING_SV[num]
|
||||
elif num > 20:
|
||||
tens = num % 10
|
||||
ones = num - tens
|
||||
|
||||
if ones > 0:
|
||||
result += NUM_STRING_SV[ones]
|
||||
if tens > 0:
|
||||
result += NUM_STRING_SV[tens]
|
||||
|
||||
return result
|
||||
|
||||
def pronounce_fractional_sv(num, places):
|
||||
# fixed number of places even with trailing zeros
|
||||
result = ""
|
||||
place = 10
|
||||
while places > 0:
|
||||
# doesn't work with 1.0001 and places = 2: int(
|
||||
# num*place) % 10 > 0 and places > 0:
|
||||
result += " " + NUM_STRING_SV[int(num * place) % 10]
|
||||
place *= 10
|
||||
places -= 1
|
||||
return result
|
||||
|
||||
def pronounce_whole_number_sv(num, scale_level=0):
|
||||
if num == 0:
|
||||
return ''
|
||||
|
||||
num = floor(num)
|
||||
result = ''
|
||||
last_triplet = num % 1000
|
||||
|
||||
if last_triplet == 1:
|
||||
if scale_level == 0:
|
||||
if result != '':
|
||||
result += '' + 'ett'
|
||||
else:
|
||||
result += 'en'
|
||||
elif scale_level == 1:
|
||||
result += 'ettusen' + EXTRA_SPACE
|
||||
else:
|
||||
result += 'en ' + NUM_POWERS_OF_TEN[scale_level] + EXTRA_SPACE
|
||||
elif last_triplet > 1:
|
||||
result += pronounce_triplet_sv(last_triplet)
|
||||
if scale_level == 1:
|
||||
result += 'tusen' + EXTRA_SPACE
|
||||
if scale_level >= 2:
|
||||
result += NUM_POWERS_OF_TEN[scale_level]
|
||||
if scale_level >= 2:
|
||||
result += 'er' + EXTRA_SPACE # MiljonER
|
||||
|
||||
num = floor(num / 1000)
|
||||
scale_level += 1
|
||||
return pronounce_whole_number_sv(num, scale_level) + result
|
||||
|
||||
result = ""
|
||||
if abs(num) >= 1000000000000000000000000: # cannot do more than this
|
||||
return str(num)
|
||||
elif num == 0:
|
||||
return str(NUM_STRING_SV[0])
|
||||
elif num < 0:
|
||||
return "minus " + pronounce_number_sv(abs(num), places)
|
||||
else:
|
||||
if num == int(num):
|
||||
return pronounce_whole_number_sv(num)
|
||||
else:
|
||||
whole_number_part = floor(num)
|
||||
fractional_part = num - whole_number_part
|
||||
result += pronounce_whole_number_sv(whole_number_part)
|
||||
if places > 0:
|
||||
result += " komma"
|
||||
result += pronounce_fractional_sv(fractional_part, places)
|
||||
return result
|
||||
|
||||
|
||||
def pronounce_ordinal_sv(num):
|
||||
# ordinals for 1, 3, 7 and 8 are irregular
|
||||
# this produces the base form, it will have to be adapted for genus,
|
||||
# casus, numerus
|
||||
|
||||
ordinals = ["noll", "första", "andra", "tredje", "fjärde", "femte",
|
||||
"sjätte", "sjunde", "åttonde", "nionde", "tionde"]
|
||||
|
||||
tens = int(floor(num / 10.0)) * 10
|
||||
ones = num % 10
|
||||
|
||||
if num < 0 or num != int(num):
|
||||
return num
|
||||
if num == 0:
|
||||
return ordinals[num]
|
||||
|
||||
result = ""
|
||||
if num > 10:
|
||||
result += pronounce_number_sv(tens).rstrip()
|
||||
|
||||
if ones > 0:
|
||||
result += ordinals[ones]
|
||||
else:
|
||||
result += 'de'
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def nice_time_sv(dt, speech=True, use_24hour=False, use_ampm=False):
|
||||
"""
|
||||
Format a time to a comfortable human format
|
||||
|
||||
For example, generate 'five thirty' for speech or '5:30' for
|
||||
text display.
|
||||
|
||||
Args:
|
||||
dt (datetime): date to format (assumes already in local timezone)
|
||||
speech (bool): format for speech (default/True) or display (False)=Fal
|
||||
use_24hour (bool): output in 24-hour/military or 12-hour format
|
||||
use_ampm (bool): include the am/pm for 12-hour format
|
||||
Returns:
|
||||
(str): The formatted time string
|
||||
"""
|
||||
if use_24hour:
|
||||
# e.g. "03:01" or "14:22"
|
||||
string = dt.strftime("%H:%M")
|
||||
else:
|
||||
if use_ampm:
|
||||
# e.g. "3:01 AM" or "2:22 PM"
|
||||
string = dt.strftime("%I:%M %p")
|
||||
else:
|
||||
# e.g. "3:01" or "2:22"
|
||||
string = dt.strftime("%I:%M")
|
||||
|
||||
if not speech:
|
||||
return string
|
||||
|
||||
# Generate a speakable version of the time
|
||||
speak = ""
|
||||
if use_24hour:
|
||||
if dt.hour == 1:
|
||||
speak += "ett" # 01:00 is "ett" not "en"
|
||||
else:
|
||||
speak += pronounce_number_sv(dt.hour)
|
||||
if not dt.minute == 0:
|
||||
if dt.minute < 10:
|
||||
speak += ' noll'
|
||||
|
||||
if dt.minute == 1:
|
||||
speak += ' ett'
|
||||
else:
|
||||
speak += " " + pronounce_number_sv(dt.minute)
|
||||
|
||||
return speak # ampm is ignored when use_24hour is true
|
||||
else:
|
||||
hour = dt.hour
|
||||
|
||||
if not dt.minute == 0:
|
||||
if dt.minute < 30:
|
||||
if dt.minute != 15:
|
||||
speak += pronounce_number_sv(dt.minute)
|
||||
else:
|
||||
speak += 'kvart'
|
||||
|
||||
if dt.minute == 1:
|
||||
speak += ' minut över '
|
||||
elif dt.minute != 10 and dt.minute != 5 and dt.minute != 15:
|
||||
speak += ' minuter över '
|
||||
else:
|
||||
speak += ' över '
|
||||
elif dt.minute > 30:
|
||||
if dt.minute != 45:
|
||||
speak += pronounce_number_sv((60 - dt.minute))
|
||||
else:
|
||||
speak += 'kvart'
|
||||
|
||||
if dt.minute == 1:
|
||||
speak += ' minut i '
|
||||
elif dt.minute != 50 and dt.minute != 55 and dt.minute != 45:
|
||||
speak += ' minuter i '
|
||||
else:
|
||||
speak += ' i '
|
||||
|
||||
hour = (hour + 1) % 12
|
||||
elif dt.minute == 30:
|
||||
speak += 'halv '
|
||||
hour = (hour + 1) % 12
|
||||
|
||||
if hour == 0 and dt.minute == 0:
|
||||
return "midnatt"
|
||||
if hour == 12 and dt.minute == 0:
|
||||
return "middag"
|
||||
# TODO: "half past 3", "a quarter of 4" and other idiomatic times
|
||||
|
||||
if hour == 0:
|
||||
speak += pronounce_number_sv(12)
|
||||
elif hour <= 13:
|
||||
if hour == 1 or hour == 13: # 01:00 and 13:00 is "ett"
|
||||
speak += 'ett'
|
||||
else:
|
||||
speak += pronounce_number_sv(hour)
|
||||
else:
|
||||
speak += pronounce_number_sv(hour - 12)
|
||||
|
||||
if use_ampm:
|
||||
if dt.hour > 11:
|
||||
if dt.hour < 18:
|
||||
# 12:01 - 17:59 nachmittags/afternoon
|
||||
speak += " på eftermiddagen"
|
||||
elif dt.hour < 22:
|
||||
# 18:00 - 21:59 abends/evening
|
||||
speak += " på kvällen"
|
||||
else:
|
||||
# 22:00 - 23:59 nachts/at night
|
||||
speak += " på natten"
|
||||
elif dt.hour < 3:
|
||||
# 00:01 - 02:59 nachts/at night
|
||||
speak += " på natten"
|
||||
else:
|
||||
# 03:00 - 11:59 morgens/in the morning
|
||||
speak += " på morgonen"
|
||||
|
||||
return speak
|
||||
|
||||
|
||||
def nice_response_sv(text):
|
||||
# check for months and call nice_ordinal_sv declension of ordinals
|
||||
# replace "^" with "hoch" (to the power of)
|
||||
words = text.split()
|
||||
|
||||
for idx, word in enumerate(words):
|
||||
if word.lower() in months:
|
||||
text = nice_ordinal_sv(text)
|
||||
|
||||
if word == '^':
|
||||
wordNext = words[idx + 1] if idx + 1 < len(words) else ""
|
||||
if wordNext.isnumeric():
|
||||
words[idx] = "upphöjt till"
|
||||
text = " ".join(words)
|
||||
return text
|
||||
|
||||
|
||||
def nice_ordinal_sv(text):
|
||||
# check for months for declension of ordinals before months
|
||||
# depending on articles/prepositions
|
||||
normalized_text = text
|
||||
words = text.split()
|
||||
|
||||
for idx, word in enumerate(words):
|
||||
wordNext = words[idx + 1] if idx + 1 < len(words) else ""
|
||||
wordPrev = words[idx - 1] if idx > 0 else ""
|
||||
if word[-1:] == ".":
|
||||
if word[:-1].isdecimal():
|
||||
if wordNext.lower() in months:
|
||||
word = pronounce_ordinal_sv(int(word[:-1]))
|
||||
if wordPrev.lower() in ["om", "den", "från", "till",
|
||||
"(från", "(om", "till"]:
|
||||
word += "n"
|
||||
elif wordPrev.lower() not in ["den"]:
|
||||
word += "r"
|
||||
words[idx] = word
|
||||
normalized_text = " ".join(words)
|
||||
return normalized_text
|
||||
|
|
|
@ -0,0 +1,358 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright 2017 Mycroft AI Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
import unittest
|
||||
import datetime
|
||||
|
||||
from mycroft.util.format import nice_number
|
||||
from mycroft.util.format import nice_time
|
||||
from mycroft.util.format import pronounce_number
|
||||
# from mycroft.util.lang.format_sv import nice_response_sv
|
||||
from mycroft.util.lang.format_sv import pronounce_ordinal_sv
|
||||
|
||||
# fractions are not capitalized for now
|
||||
NUMBERS_FIXTURE_sv = {
|
||||
1.435634: '1.436',
|
||||
2: '2',
|
||||
5.0: '5',
|
||||
1234567890: '1234567890',
|
||||
12345.67890: '12345.679',
|
||||
0.027: '0.027',
|
||||
0.5: 'en halv',
|
||||
1.333: '1 och en tredjedel',
|
||||
2.666: '2 och 2 tredjedelar',
|
||||
0.25: 'en fjärdedel',
|
||||
1.25: '1 och en fjärdedel',
|
||||
0.75: '3 fjärdedelar',
|
||||
1.75: '1 och 3 fjärdedelar',
|
||||
3.4: '3 och 2 femtedelar',
|
||||
16.8333: '16 och 5 sjättedelar',
|
||||
12.5714: '12 och 4 sjundedelar',
|
||||
9.625: '9 och 5 åttondelar',
|
||||
6.777: '6 och 7 niondelar',
|
||||
3.1: '3 och en tiondel',
|
||||
2.272: '2 och 3 elftedelar',
|
||||
5.583: '5 och 7 tolftedelar',
|
||||
8.384: '8 och 5 trettondelar',
|
||||
0.071: 'en fjortondel',
|
||||
6.466: '6 och 7 femtondelar',
|
||||
8.312: '8 och 5 sextondelar',
|
||||
2.176: '2 och 3 sjuttondelar',
|
||||
200.722: '200 och 13 artondelar',
|
||||
7.421: '7 och 8 nittondelar',
|
||||
0.05: 'en tjugondel'
|
||||
}
|
||||
|
||||
|
||||
# class TestNiceResponse(unittest.TestCase):
|
||||
# def test_replace_ordinal(self):
|
||||
# self.assertEqual(nice_response_sv("det er den 31. maj"),
|
||||
# "det er den enogtredifte maj")
|
||||
# self.assertEqual(nice_response_sv("Det begynder den 31. maj"),
|
||||
# "Det begynder den enogtrefte maj")
|
||||
# self.assertEqual(nice_response_sv("den 31. mai"),
|
||||
# "den enogtrefte maj")
|
||||
# self.assertEqual(nice_response_sv("10 ^ 2"), "ti to")
|
||||
|
||||
|
||||
class TestNiceNumberFormat(unittest.TestCase):
|
||||
def test_convert_float_to_nice_number(self):
|
||||
for number, number_str in NUMBERS_FIXTURE_sv.items():
|
||||
self.assertEqual(nice_number(number, lang="sv-se"), number_str,
|
||||
'should format {} as {} and not {}'.format(
|
||||
number, number_str,
|
||||
nice_number(number, lang="sv-se")))
|
||||
|
||||
def test_specify_danominator(self):
|
||||
self.assertEqual(nice_number(5.5, lang="sv-se",
|
||||
denominators=[1, 2, 3]), '5 och en halv',
|
||||
'should format 5.5 as 5 und ein halb not {}'.format(
|
||||
nice_number(5.5, denominators=[1, 2, 3])))
|
||||
self.assertEqual(nice_number(2.333, lang="sv-se", denominators=[1, 2]),
|
||||
'2.333',
|
||||
'should format 2,333 as 2.333 not {}'.format(
|
||||
nice_number(2.333, lang="sv-se",
|
||||
denominators=[1, 2])))
|
||||
|
||||
def test_no_speech(self):
|
||||
self.assertEqual(nice_number(6.777, speech=False),
|
||||
'6 7/9',
|
||||
'should format 6.777 as 6 7/9 not {}'.format(
|
||||
nice_number(6.777, lang="sv-se", speech=False)))
|
||||
self.assertEqual(nice_number(6.0, speech=False),
|
||||
'6',
|
||||
'should format 6.0 as 6 not {}'.format(
|
||||
nice_number(6.0, lang="sv-se", speech=False)))
|
||||
|
||||
|
||||
class TestPronounceOrdinal(unittest.TestCase):
|
||||
def test_convert_int_sv(self):
|
||||
self.assertEqual(pronounce_ordinal_sv(0),
|
||||
"noll")
|
||||
self.assertEqual(pronounce_ordinal_sv(1),
|
||||
"första")
|
||||
self.assertEqual(pronounce_ordinal_sv(3),
|
||||
"tredje")
|
||||
self.assertEqual(pronounce_ordinal_sv(5),
|
||||
"femte")
|
||||
self.assertEqual(pronounce_ordinal_sv(21),
|
||||
"tjugoförsta")
|
||||
self.assertEqual(pronounce_ordinal_sv(2000),
|
||||
"tvåtusende")
|
||||
self.assertEqual(pronounce_ordinal_sv(1000),
|
||||
"ettusende")
|
||||
# self.assertEqual(pronounce_ordinal_sv(123456),
|
||||
# "ethundredetreogtyvetusindefirehundredeseksog\
|
||||
# halvtresende")
|
||||
|
||||
|
||||
class TestPronounceNumber(unittest.TestCase):
|
||||
def test_convert_int_sv(self):
|
||||
self.assertEqual(pronounce_number(123456789123456789, lang="sv-se"),
|
||||
"etthundratjugotrebiljarder "
|
||||
"fyrahundrafemtiosexbiljoner "
|
||||
"sjuhundraåttioniomiljarder "
|
||||
"etthundratjugotremiljoner "
|
||||
"fyrahundrafemtiosextusen "
|
||||
"sjuhundraåttionio")
|
||||
self.assertEqual(pronounce_number(1, lang="sv-se"), "en")
|
||||
self.assertEqual(pronounce_number(10, lang="sv-se"), "tio")
|
||||
self.assertEqual(pronounce_number(15, lang="sv-se"), "femton")
|
||||
self.assertEqual(pronounce_number(20, lang="sv-se"), "tjugo")
|
||||
self.assertEqual(pronounce_number(27, lang="sv-se"), "tjugosju")
|
||||
self.assertEqual(pronounce_number(30, lang="sv-se"), "trettio")
|
||||
self.assertEqual(pronounce_number(33, lang="sv-se"), "trettiotre")
|
||||
self.assertEqual(pronounce_number(71, lang="sv-se"), "sjuttioen")
|
||||
self.assertEqual(pronounce_number(80, lang="sv-se"), "åttio")
|
||||
self.assertEqual(pronounce_number(74, lang="sv-se"), "sjuttiofyra")
|
||||
self.assertEqual(pronounce_number(79, lang="sv-se"), "sjuttionio")
|
||||
self.assertEqual(pronounce_number(91, lang="sv-se"), "nittioen")
|
||||
self.assertEqual(pronounce_number(97, lang="sv-se"), "nittiosju")
|
||||
self.assertEqual(pronounce_number(300, lang="sv-se"), "trehundra")
|
||||
self.assertEqual(pronounce_number(10000001, lang="sv-se"),
|
||||
"tiomiljoner en")
|
||||
|
||||
def test_convert_negative_int_sv(self):
|
||||
self.assertEqual(pronounce_number(-1, lang="sv-se"),
|
||||
"minus en")
|
||||
self.assertEqual(pronounce_number(-10, lang="sv-se"),
|
||||
"minus tio")
|
||||
self.assertEqual(pronounce_number(-15, lang="sv-se"),
|
||||
"minus femton")
|
||||
self.assertEqual(pronounce_number(-20, lang="sv-se"),
|
||||
"minus tjugo")
|
||||
self.assertEqual(pronounce_number(-27, lang="sv-se"),
|
||||
"minus tjugosju")
|
||||
self.assertEqual(pronounce_number(-30, lang="sv-se"),
|
||||
"minus trettio")
|
||||
self.assertEqual(pronounce_number(-33, lang="sv-se"),
|
||||
"minus trettiotre")
|
||||
|
||||
def test_convert_dacimals_sv(self):
|
||||
self.assertEqual(pronounce_number(1.1, lang="sv-se", places=1),
|
||||
"en komma en")
|
||||
self.assertEqual(pronounce_number(1.234, lang="sv-se"),
|
||||
"en komma två tre")
|
||||
self.assertEqual(pronounce_number(21.234, lang="sv-se"),
|
||||
"tjugoen komma två tre")
|
||||
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=1),
|
||||
"tjugoen komma två")
|
||||
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=0),
|
||||
"tjugoen")
|
||||
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=3),
|
||||
"tjugoen komma två tre fyra")
|
||||
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=4),
|
||||
"tjugoen komma två tre fyra noll")
|
||||
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=5),
|
||||
"tjugoen komma två tre fyra noll noll")
|
||||
self.assertEqual(pronounce_number(-1.234, lang="sv-se"),
|
||||
"minus en komma två tre")
|
||||
self.assertEqual(pronounce_number(-21.234, lang="sv-se"),
|
||||
"minus tjugoen komma två tre")
|
||||
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=1),
|
||||
"minus tjugoen komma två")
|
||||
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=0),
|
||||
"minus tjugoen")
|
||||
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=3),
|
||||
"minus tjugoen komma två tre fyra")
|
||||
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=4),
|
||||
"minus tjugoen komma två tre fyra noll")
|
||||
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=5),
|
||||
"minus tjugoen komma två tre fyra noll noll")
|
||||
|
||||
|
||||
# def nice_time(dt, lang="sv-se", speech=True, use_24hour=False,
|
||||
# use_ampm=False):
|
||||
class TestNiceDateFormat_sv(unittest.TestCase):
|
||||
def test_convert_times_sv(self):
|
||||
dt = datetime.datetime(2017, 1, 31, 13, 22, 3)
|
||||
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"),
|
||||
"tjugotvå minuter över ett")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
|
||||
"tjugotvå minuter över ett på eftermiddagen")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
|
||||
"01:22")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_ampm=True),
|
||||
"01:22 PM")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se",
|
||||
speech=False, use_24hour=True),
|
||||
"13:22")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True, use_ampm=True),
|
||||
"13:22")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=True),
|
||||
"tretton tjugotvå")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=False),
|
||||
"tretton tjugotvå")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 13, 0, 3)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "ett")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
|
||||
"ett på eftermiddagen")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
|
||||
"01:00")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_ampm=True),
|
||||
"01:00 PM")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True),
|
||||
"13:00")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True, use_ampm=True),
|
||||
"13:00")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=True),
|
||||
"tretton")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=False),
|
||||
"tretton")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 13, 2, 3)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "två minuter över ett")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
|
||||
"två minuter över ett på eftermiddagen")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
|
||||
"01:02")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_ampm=True),
|
||||
"01:02 PM")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True),
|
||||
"13:02")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True, use_ampm=True),
|
||||
"13:02")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=True),
|
||||
"tretton noll två")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=False),
|
||||
"tretton noll två")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 0, 2, 3)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "två minuter över tolv")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
|
||||
"två minuter över tolv på natten")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
|
||||
"12:02")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_ampm=True),
|
||||
"12:02 AM")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True),
|
||||
"00:02")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True, use_ampm=True),
|
||||
"00:02")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=True),
|
||||
"noll noll två")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=False),
|
||||
"noll noll två")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 12, 15, 9)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "kvart över tolv")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
|
||||
"kvart över tolv på eftermiddagen")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
|
||||
"12:15")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_ampm=True),
|
||||
"12:15 PM")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True),
|
||||
"12:15")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True, use_ampm=True),
|
||||
"12:15")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=True),
|
||||
"tolv femton")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=False),
|
||||
"tolv femton")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 19, 40, 49)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "tjugo minuter i åtta")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
|
||||
"tjugo minuter i åtta på kvällen")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
|
||||
"07:40")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_ampm=True),
|
||||
"07:40 PM")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True),
|
||||
"19:40")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
|
||||
use_24hour=True, use_ampm=True),
|
||||
"19:40")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=True),
|
||||
"nitton fyrtio")
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
|
||||
use_ampm=False),
|
||||
"nitton fyrtio")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 1, 15, 00)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True),
|
||||
"ett femton")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 1, 35, 00)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"),
|
||||
"tjugofem minuter i två")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 1, 45, 00)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "kvart i två")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 4, 50, 00)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "tio i fem")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 5, 55, 00)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se"), "fem i sex")
|
||||
|
||||
dt = datetime.datetime(2017, 1, 31, 5, 30, 00)
|
||||
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
|
||||
"halv sex på morgonen")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
Loading…
Reference in New Issue