forked from Anri/cal8tor
convert string date to datetime object
This commit is contained in:
parent
c8026131cf
commit
6125911d0a
1 changed files with 46 additions and 10 deletions
56
src/info.rs
56
src/info.rs
|
@ -1,4 +1,7 @@
|
||||||
use regex::Regex;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use chrono::{TimeZone, Utc};
|
||||||
|
use regex::{Captures, Regex};
|
||||||
use scraper::{Html, Selector};
|
use scraper::{Html, Selector};
|
||||||
|
|
||||||
pub async fn info() {
|
pub async fn info() {
|
||||||
|
@ -16,7 +19,7 @@ pub async fn info() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut data = std::collections::HashMap::new();
|
let mut data = HashMap::new();
|
||||||
// d => date
|
// d => date
|
||||||
// r => repetition
|
// r => repetition
|
||||||
let re = Regex::new(r"(?P<d>\d{1,2} \w+ \d{4}).+(?P<r>\d)").unwrap();
|
let re = Regex::new(r"(?P<d>\d{1,2} \w+ \d{4}).+(?P<r>\d)").unwrap();
|
||||||
|
@ -25,14 +28,17 @@ pub async fn info() {
|
||||||
match element.inner_html() {
|
match element.inner_html() {
|
||||||
e if e.starts_with("Début") => {
|
e if e.starts_with("Début") => {
|
||||||
let captures = re.captures(&e).unwrap();
|
let captures = re.captures(&e).unwrap();
|
||||||
data.insert(
|
|
||||||
i,
|
let date = captures.name("d").unwrap().as_str();
|
||||||
format!(
|
let rep = captures.name("r").unwrap().as_str();
|
||||||
"{} pendant {}s",
|
|
||||||
captures.name("d").unwrap().as_str(),
|
let from = Utc
|
||||||
captures.name("r").unwrap().as_str()
|
.datetime_from_str(&anglophonization(date), "%e %B %Y %H:%M")
|
||||||
),
|
.unwrap();
|
||||||
);
|
|
||||||
|
println!("'{}' -> {}", date, from);
|
||||||
|
|
||||||
|
data.insert(i, format!("{} pendant {}s", date, rep));
|
||||||
}
|
}
|
||||||
e if e.starts_with("Reprise") => {
|
e if e.starts_with("Reprise") => {
|
||||||
let captures = re.captures(&e).unwrap();
|
let captures = re.captures(&e).unwrap();
|
||||||
|
@ -55,6 +61,7 @@ pub async fn info() {
|
||||||
println!("{:#?}", data);
|
println!("{:#?}", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get info webpage
|
||||||
async fn get_webpage() -> Result<Html, Box<dyn std::error::Error>> {
|
async fn get_webpage() -> Result<Html, Box<dyn std::error::Error>> {
|
||||||
/* let html = reqwest::get("https://informatique.up8.edu/licence-iv/edt").await?.text().await?;
|
/* let html = reqwest::get("https://informatique.up8.edu/licence-iv/edt").await?.text().await?;
|
||||||
|
|
||||||
|
@ -63,3 +70,32 @@ async fn get_webpage() -> Result<Html, Box<dyn std::error::Error>> {
|
||||||
let html = include_str!("../target/debug2.html");
|
let html = include_str!("../target/debug2.html");
|
||||||
Ok(Html::parse_document(html))
|
Ok(Html::parse_document(html))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Turn a french date to an english one
|
||||||
|
fn anglophonization(date: &str) -> String {
|
||||||
|
let dico = HashMap::from([
|
||||||
|
("janvier", "january"),
|
||||||
|
("mars", "march"),
|
||||||
|
("septembre", "september"),
|
||||||
|
("novembre", "november"),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// New regex of all the french month
|
||||||
|
let re = Regex::new(&format!(
|
||||||
|
"({})",
|
||||||
|
dico.keys().cloned().collect::<Vec<_>>().join("|")
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
format!(
|
||||||
|
// Use 12:00 for chrono parser
|
||||||
|
"{} 12:00",
|
||||||
|
// Replace french by english month
|
||||||
|
re.replace_all(date, |cap: &Captures| {
|
||||||
|
match &cap[0] {
|
||||||
|
month if dico.contains_key(month) => dico.get(month).unwrap(),
|
||||||
|
month => panic!("Unknown month: {}", month),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
Reference in a new issue