Skip to main content

whichtime_sys/dictionaries/
sv.rs

1//! Swedish (Svenska) locale dictionaries
2
3use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6/// Weekday dictionary
7pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8    "söndag" => Weekday::Sunday,
9    "sondag" => Weekday::Sunday,
10    "sön" => Weekday::Sunday,
11    "son" => Weekday::Sunday,
12    "sön." => Weekday::Sunday,
13    "son." => Weekday::Sunday,
14    "måndag" => Weekday::Monday,
15    "mandag" => Weekday::Monday,
16    "mån" => Weekday::Monday,
17    "man" => Weekday::Monday,
18    "mån." => Weekday::Monday,
19    "man." => Weekday::Monday,
20    "tisdag" => Weekday::Tuesday,
21    "tis" => Weekday::Tuesday,
22    "tis." => Weekday::Tuesday,
23    "onsdag" => Weekday::Wednesday,
24    "ons" => Weekday::Wednesday,
25    "ons." => Weekday::Wednesday,
26    "torsdag" => Weekday::Thursday,
27    "tor" => Weekday::Thursday,
28    "tor." => Weekday::Thursday,
29    "tors" => Weekday::Thursday,
30    "tors." => Weekday::Thursday,
31    "fredag" => Weekday::Friday,
32    "fre" => Weekday::Friday,
33    "fre." => Weekday::Friday,
34    "lördag" => Weekday::Saturday,
35    "lordag" => Weekday::Saturday,
36    "lör" => Weekday::Saturday,
37    "lor" => Weekday::Saturday,
38    "lör." => Weekday::Saturday,
39    "lor." => Weekday::Saturday,
40};
41
42/// Month dictionary
43pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
44    "januari" => 1,
45    "jan" => 1,
46    "jan." => 1,
47    "februari" => 2,
48    "feb" => 2,
49    "feb." => 2,
50    "mars" => 3,
51    "mar" => 3,
52    "mar." => 3,
53    "april" => 4,
54    "apr" => 4,
55    "apr." => 4,
56    "maj" => 5,
57    "juni" => 6,
58    "jun" => 6,
59    "jun." => 6,
60    "juli" => 7,
61    "jul" => 7,
62    "jul." => 7,
63    "augusti" => 8,
64    "aug" => 8,
65    "aug." => 8,
66    "september" => 9,
67    "sep" => 9,
68    "sep." => 9,
69    "sept" => 9,
70    "sept." => 9,
71    "oktober" => 10,
72    "okt" => 10,
73    "okt." => 10,
74    "november" => 11,
75    "nov" => 11,
76    "nov." => 11,
77    "december" => 12,
78    "dec" => 12,
79    "dec." => 12,
80};
81
82/// Integer words dictionary
83pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
84    "en" => 1.0,
85    "ett" => 1.0,
86    "två" => 2.0,
87    "tva" => 2.0,
88    "tre" => 3.0,
89    "fyra" => 4.0,
90    "fem" => 5.0,
91    "sex" => 6.0,
92    "sju" => 7.0,
93    "åtta" => 8.0,
94    "atta" => 8.0,
95    "nio" => 9.0,
96    "tio" => 10.0,
97    "elva" => 11.0,
98    "tolv" => 12.0,
99};
100
101/// Time unit dictionary
102pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
103    "sek" => TimeUnit::Second,
104    "sekund" => TimeUnit::Second,
105    "sekunder" => TimeUnit::Second,
106    "min" => TimeUnit::Minute,
107    "minut" => TimeUnit::Minute,
108    "minuter" => TimeUnit::Minute,
109    "tim" => TimeUnit::Hour,
110    "timme" => TimeUnit::Hour,
111    "timmar" => TimeUnit::Hour,
112    "dag" => TimeUnit::Day,
113    "dagar" => TimeUnit::Day,
114    "vecka" => TimeUnit::Week,
115    "veckor" => TimeUnit::Week,
116    "månad" => TimeUnit::Month,
117    "manad" => TimeUnit::Month,
118    "månader" => TimeUnit::Month,
119    "manader" => TimeUnit::Month,
120    "kvartal" => TimeUnit::Quarter,
121    "år" => TimeUnit::Year,
122    "ar" => TimeUnit::Year,
123};
124
125/// Casual date keywords
126pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
127    "nu" => CasualDateType::Now,
128    "idag" => CasualDateType::Today,
129    "i dag" => CasualDateType::Today,
130    "ikväll" => CasualDateType::Tonight,
131    "i kväll" => CasualDateType::Tonight,
132    "ikvall" => CasualDateType::Tonight,
133    "i kvall" => CasualDateType::Tonight,
134    "imorgon" => CasualDateType::Tomorrow,
135    "i morgon" => CasualDateType::Tomorrow,
136    "igår" => CasualDateType::Yesterday,
137    "i går" => CasualDateType::Yesterday,
138    "igar" => CasualDateType::Yesterday,
139    "i gar" => CasualDateType::Yesterday,
140    "övermorgon" => CasualDateType::Overmorrow,
141    "i övermorgon" => CasualDateType::Overmorrow,
142    "overmorgon" => CasualDateType::Overmorrow,
143    "i overmorgon" => CasualDateType::Overmorrow,
144    "förrgår" => CasualDateType::DayBeforeYesterday,
145    "i förrgår" => CasualDateType::DayBeforeYesterday,
146    "forrgar" => CasualDateType::DayBeforeYesterday,
147    "i forrgar" => CasualDateType::DayBeforeYesterday,
148};
149
150/// Casual time keywords
151pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
152    "middag" => CasualTimeType::Noon,
153    "mitt på dagen" => CasualTimeType::Noon,
154    "midnatt" => CasualTimeType::Midnight,
155    "morgon" => CasualTimeType::Morning,
156    "på morgonen" => CasualTimeType::Morning,
157    "eftermiddag" => CasualTimeType::Afternoon,
158    "på eftermiddagen" => CasualTimeType::Afternoon,
159    "kväll" => CasualTimeType::Evening,
160    "kvall" => CasualTimeType::Evening,
161    "på kvällen" => CasualTimeType::Evening,
162    "natt" => CasualTimeType::Night,
163    "på natten" => CasualTimeType::Night,
164};
165
166/// Relative modifiers
167pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
168    "denna" => RelativeModifier::This,
169    "detta" => RelativeModifier::This,
170    "den här" => RelativeModifier::This,
171    "det här" => RelativeModifier::This,
172    "nästa" => RelativeModifier::Next,
173    "nasta" => RelativeModifier::Next,
174    "kommande" => RelativeModifier::Next,
175    "förra" => RelativeModifier::Last,
176    "forra" => RelativeModifier::Last,
177    "senaste" => RelativeModifier::Last,
178    "sista" => RelativeModifier::Last,
179    "föregående" => RelativeModifier::Last,
180    "foregaende" => RelativeModifier::Last,
181};
182
183// ============================================================================
184// Lookup functions
185// ============================================================================
186
187#[inline]
188pub fn get_weekday(s: &str) -> Option<Weekday> {
189    WEEKDAY_MAP.get(s).copied()
190}
191
192#[inline]
193pub fn get_month(s: &str) -> Option<u32> {
194    MONTH_MAP.get(s).copied()
195}
196
197#[inline]
198pub fn get_integer_word(s: &str) -> Option<f64> {
199    INTEGER_WORD_MAP.get(s).copied()
200}
201
202#[inline]
203pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
204    TIME_UNIT_MAP.get(s).copied()
205}
206
207#[inline]
208pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
209    CASUAL_DATE_MAP.get(s).copied()
210}
211
212#[inline]
213pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
214    CASUAL_TIME_MAP.get(s).copied()
215}
216
217#[inline]
218pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
219    RELATIVE_MODIFIER_MAP.get(s).copied()
220}
221
222/// Parse a number pattern
223pub fn parse_number_pattern(text: &str) -> f64 {
224    let lower = text.to_lowercase();
225
226    if let Some(val) = get_integer_word(&lower) {
227        return val;
228    }
229
230    match lower.as_str() {
231        s if s.contains("några") || s.contains("nagra") => return 3.0,
232        s if s.contains("halv") => return 0.5,
233        s if s.contains("par") => return 2.0,
234        s if s.contains("flera") => return 7.0,
235        _ => {}
236    }
237
238    text.parse::<f64>().unwrap_or(0.0)
239}