smartcalc_tauri/tokinizer/regex_tokinizer/
text.rs

1/*
2 * smartcalc v1.0.8
3 * Copyright (c) Erhan BARIS (Ruslan Ognyanov Asenov)
4 * Licensed under the GNU General Public License v2.0.
5 */
6
7use alloc::string::ToString;
8use alloc::borrow::ToOwned;
9use chrono::{Duration, Utc};
10use crate::config::SmartCalcConfig;
11use crate::types::{TokenType};
12use crate::tokinizer::{Tokinizer, read_currency};
13use crate::token::ui_token::{UiTokenType};
14use regex::{Regex};
15use crate::constants::ConstantType;
16
17pub fn text_regex_parser(config: &SmartCalcConfig, tokinizer: &mut Tokinizer, group_item: &[Regex]) {
18    for re in group_item.iter() {
19        for capture in re.captures_iter(&tokinizer.data.to_owned()) {
20            let text = capture.name("TEXT").unwrap().as_str();
21            if !text.trim().is_empty() {
22
23                if let Some(constant) = config.constant_pair.get(&tokinizer.language).unwrap().get(&text.to_string()) {
24
25                    let token = match constant {
26                        ConstantType::Today     => Some(TokenType::Date(Utc::today().naive_utc(), config.get_time_offset())),
27                        ConstantType::Tomorrow  => Some(TokenType::Date(Utc::today().naive_utc() + Duration::days(1), config.get_time_offset())),
28                        ConstantType::Yesterday => Some(TokenType::Date(Utc::today().naive_utc() + Duration::days(-1), config.get_time_offset())),
29                        ConstantType::Now       => Some(TokenType::Time(Utc::now().naive_utc(), config.get_time_offset())),
30                        _ => None
31                    };
32
33                    if token.is_some() && tokinizer.add_token_from_match(&capture.get(0), token) {
34                        tokinizer.add_uitoken_from_match(capture.get(0), UiTokenType::DateTime);
35                    }
36                }
37
38                if tokinizer.add_token_from_match(&capture.get(0), Some(TokenType::Text(text.to_string()))) {
39                    match read_currency(config, text) {
40                        Some(_) => tokinizer.add_uitoken_from_match(capture.get(0), UiTokenType::Symbol1),
41                        _ => tokinizer.add_uitoken_from_match(capture.get(0), UiTokenType::Text)
42                    };
43                }
44            }
45        }
46    }
47}
48
49#[cfg(test)]
50#[test]
51fn text_test_1() {
52    use core::ops::Deref;
53    use crate::tokinizer::regex_tokinizer;
54    use crate::tokinizer::test::setup_tokinizer;
55    use crate::config::SmartCalcConfig;
56    use crate::session::Session;
57    let mut session = Session::new();
58    let config = SmartCalcConfig::default();
59    let mut tokinizer_mut = setup_tokinizer("erhan barış aysel barış test".to_string(), &mut session, &config);
60
61    regex_tokinizer(&mut tokinizer_mut);
62    let tokens = &tokinizer_mut.token_infos;
63
64    assert_eq!(tokens.len(), 5);
65    assert_eq!(tokens[0].start, 0);
66    assert_eq!(tokens[0].end, 5);
67    assert_eq!(tokens[0].token_type.borrow().deref(), &Some(TokenType::Text("erhan".to_string())));
68
69    assert_eq!(tokens[1].start, 6);
70    assert_eq!(tokens[1].end, 13);
71    assert_eq!(tokens[1].token_type.borrow().deref(), &Some(TokenType::Text("barış".to_string())));
72
73    assert_eq!(tokens[2].start, 14);
74    assert_eq!(tokens[2].end, 19);
75    assert_eq!(tokens[2].token_type.borrow().deref(), &Some(TokenType::Text("aysel".to_string())));
76
77    assert_eq!(tokens[3].start, 20);
78    assert_eq!(tokens[3].end, 27);
79    assert_eq!(tokens[3].token_type.borrow().deref(), &Some(TokenType::Text("barış".to_string())));
80
81    assert_eq!(tokens[4].start, 28);
82    assert_eq!(tokens[4].end, 32);
83    assert_eq!(tokens[4].token_type.borrow().deref(), &Some(TokenType::Text("test".to_string())));
84}
85
86#[cfg(test)]
87#[test]
88fn text_test_2() {
89    use core::ops::Deref;
90    use crate::tokinizer::regex_tokinizer;
91    use crate::tokinizer::test::setup_tokinizer;
92    use crate::config::SmartCalcConfig;
93    use crate::session::Session;
94    let mut session = Session::new();
95    let config = SmartCalcConfig::default();
96    let mut tokinizer_mut = setup_tokinizer("today now yesterday tomorrow".to_string(), &mut session, &config);
97
98    regex_tokinizer(&mut tokinizer_mut);
99    let tokens = &tokinizer_mut.token_infos;
100
101    let today = Utc::today().naive_utc();
102    let tomorrow = Utc::today().naive_utc() + Duration::days(1);
103    let yesterday = Utc::today().naive_utc() + Duration::days(-1);
104    let now = Utc::now().naive_utc();
105
106    assert_eq!(tokens.len(), 4);
107
108    /*Today */
109    assert_eq!(tokens[0].start, 0);
110    assert_eq!(tokens[0].end, 5);
111    let token = tokens[0].token_type.borrow().deref().clone();
112
113    if let Some(TokenType::Date(calculated_today, offset)) = token {
114        assert_eq!(offset, config.get_time_offset());
115        assert!(today.signed_duration_since(calculated_today).num_seconds().abs() < 5);
116    } else { assert!(false); }
117
118    /*Now */
119    assert_eq!(tokens[1].start, 6);
120    assert_eq!(tokens[1].end, 9);
121    let token = tokens[1].token_type.borrow().deref().clone();
122
123    if let Some(TokenType::Time(calculated_now, offset)) = token {
124        assert_eq!(offset, config.get_time_offset());
125        assert!(now.signed_duration_since(calculated_now).num_seconds().abs() < 5);
126    } else { assert!(false); }
127
128    /*Yesterday */
129    assert_eq!(tokens[2].start, 10);
130    assert_eq!(tokens[2].end, 19);
131    let token = tokens[2].token_type.borrow().deref().clone();
132
133    if let Some(TokenType::Date(calculated_yesterday, offset)) = token {
134        assert_eq!(offset, config.get_time_offset());
135        assert!(yesterday.signed_duration_since(calculated_yesterday).num_seconds().abs() < 5);
136    } else { assert!(false); }
137
138    /*Tomorrow */
139    assert_eq!(tokens[3].start, 20);
140    assert_eq!(tokens[3].end, 28);
141    let token = tokens[3].token_type.borrow().deref().clone();
142
143    if let Some(TokenType::Date(calculated_tomorrow, offset)) = token {
144        assert_eq!(offset, config.get_time_offset());
145        assert!(tomorrow.signed_duration_since(calculated_tomorrow).num_seconds().abs() < 5);
146    } else { assert!(false); }
147}
148