forked from Anri/cal8tor
Many improvement to support many type of cases
- ask for first period day of the current one instead of the first one - holidays are not mandatory anymore - also add an option to force the weeks number
This commit is contained in:
parent
bbdc50b23a
commit
64911ba351
3 changed files with 68 additions and 18 deletions
45
src/info.rs
45
src/info.rs
|
@ -4,7 +4,7 @@ use scraper::Selector;
|
||||||
use std::{collections::HashMap, sync::Arc};
|
use std::{collections::HashMap, sync::Arc};
|
||||||
|
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
get_semester, get_webpage, get_year,
|
get_period_weeks, get_semester, get_webpage, get_year,
|
||||||
models::{Info, InfoList, InfoType},
|
models::{Info, InfoList, InfoType},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,28 +33,47 @@ pub async fn get_start_date(
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.inner_html();
|
.inner_html();
|
||||||
|
|
||||||
let re = Regex::new(r"\d{1,2} (septembre|octobre)").unwrap();
|
let first_semester = semester == 1;
|
||||||
|
|
||||||
re.captures(&raw_data)
|
let re = Regex::new(if first_semester {
|
||||||
.and_then(|caps| caps.get(0))
|
r"\d{1,2} (septembre|octobre)"
|
||||||
.map_or("1 septembre".to_owned(), |m| m.as_str().to_owned())
|
} else {
|
||||||
|
r"\d{1,2} (janvier|février)"
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
re.captures(&raw_data).and_then(|caps| caps.get(0)).map_or(
|
||||||
|
if first_semester {
|
||||||
|
"1 septembre"
|
||||||
|
} else {
|
||||||
|
"1 janvier"
|
||||||
|
}
|
||||||
|
.to_owned(),
|
||||||
|
|m| m.as_str().to_owned(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn info(semester_opt: Option<i8>, year_opt: Option<i32>, date: &str, skip_week: bool) -> Info {
|
#[allow(clippy::bool_to_int_with_if)]
|
||||||
|
pub fn info(
|
||||||
|
semester_opt: Option<i8>,
|
||||||
|
year_opt: Option<i32>,
|
||||||
|
date: &str,
|
||||||
|
skip_week: bool,
|
||||||
|
holidays: bool,
|
||||||
|
weeks: Option<i32>,
|
||||||
|
) -> Info {
|
||||||
let semester = get_semester(semester_opt);
|
let semester = get_semester(semester_opt);
|
||||||
let year = get_year(year_opt, semester);
|
let year = get_year(year_opt, semester);
|
||||||
|
|
||||||
// 1st semester
|
// 1st semester
|
||||||
let weeks_s1_1 = 6; // Weeks before break
|
let (weeks_s1_1, weeks_s1_2) = get_period_weeks(1, weeks); // Weeks before and after break
|
||||||
let weeks_s1_2 = 7; // Weeks after break
|
|
||||||
let date_s1_1 = get_date(&format!("{} {}", date, year.split_once('-').unwrap().0)); // Get first week of school
|
let date_s1_1 = get_date(&format!("{} {}", date, year.split_once('-').unwrap().0)); // Get first week of school
|
||||||
let date_s1_2 = date_s1_1 + Duration::weeks(weeks_s1_1 + 1); // Back-to-school week - add week of holidays
|
let date_s1_2 = date_s1_1 + Duration::weeks(weeks_s1_1 + if holidays { 1 } else { 0 }); // Back-to-school week
|
||||||
|
|
||||||
// 2nd semester
|
// 2nd semester
|
||||||
let weeks_s2_1 = 11; // Weeks before break
|
let (weeks_s2_1, weeks_s2_2) = get_period_weeks(2, weeks); // Weeks before and after break
|
||||||
let weeks_s2_2 = 1; // Weeks after break
|
let date_s2_1 = get_date(&format!("{} {}", date, year.split_once('-').unwrap().1)); // Get first week
|
||||||
let date_s2_1 = date_s1_2 + Duration::weeks(weeks_s1_2 + 4); // Get first week - add week of 'christmas/new year holidays'
|
let date_s2_2 = date_s2_1 + Duration::weeks(weeks_s2_1 + if holidays { 2 } else { 0 }); // Back-to-school week
|
||||||
let date_s2_2 = date_s2_1 + Duration::weeks(weeks_s2_1 + 2); // Back-to-school week - add week of holidays
|
|
||||||
|
|
||||||
// Group courses values and derive it for TD/TP
|
// Group courses values and derive it for TD/TP
|
||||||
let cours_s1 = vec![(date_s1_1, weeks_s1_1), (date_s1_2, weeks_s1_2)];
|
let cours_s1 = vec![(date_s1_1, weeks_s1_1), (date_s1_2, weeks_s1_2)];
|
||||||
|
|
26
src/main.rs
26
src/main.rs
|
@ -8,6 +8,7 @@ mod info;
|
||||||
mod timetable;
|
mod timetable;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
|
#[allow(clippy::struct_excessive_bools)]
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[clap(version, about, long_about = None)]
|
#[clap(version, about, long_about = None)]
|
||||||
struct Args {
|
struct Args {
|
||||||
|
@ -31,17 +32,25 @@ struct Args {
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
td_are_tp: bool,
|
td_are_tp: bool,
|
||||||
|
|
||||||
|
/// Number of weeks for the period
|
||||||
|
#[clap(short, long, value_parser)]
|
||||||
|
weeks: Option<i32>,
|
||||||
|
|
||||||
/// First day of your year
|
/// First day of your year
|
||||||
#[clap(short, long)]
|
#[clap(long)]
|
||||||
first_day: Option<String>,
|
first_day: Option<String>,
|
||||||
|
|
||||||
/// If TD/TP start a week after courses
|
/// If TD/TP start a week after courses
|
||||||
#[clap(short, long)]
|
#[clap(long)]
|
||||||
week_skip: bool,
|
week_skip: bool,
|
||||||
|
|
||||||
/// If the exported ICS file should not use the timezone
|
/// If the exported ICS file should not use the timezone
|
||||||
#[clap(short, long)]
|
#[clap(long)]
|
||||||
no_tz: bool,
|
no_tz: bool,
|
||||||
|
|
||||||
|
/// Guess the holidays and apply it to the generated calendar
|
||||||
|
#[clap(long)]
|
||||||
|
holidays: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -69,7 +78,7 @@ async fn main() {
|
||||||
|
|
||||||
let date = match args.first_day {
|
let date = match args.first_day {
|
||||||
None => Input::new()
|
None => Input::new()
|
||||||
.with_prompt("Début des cours de l'année (première période)")
|
.with_prompt("Début des cours de la période")
|
||||||
.default(info::get_start_date(level, args.semester, args.year, &user_agent).await)
|
.default(info::get_start_date(level, args.semester, args.year, &user_agent).await)
|
||||||
.interact_text()
|
.interact_text()
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
|
@ -77,7 +86,14 @@ async fn main() {
|
||||||
};
|
};
|
||||||
|
|
||||||
println!("Récupération des informations par rapport à l'année...");
|
println!("Récupération des informations par rapport à l'année...");
|
||||||
let info = info::info(args.semester, args.year, &date, args.week_skip);
|
let info = info::info(
|
||||||
|
args.semester,
|
||||||
|
args.year,
|
||||||
|
&date,
|
||||||
|
args.week_skip,
|
||||||
|
args.holidays,
|
||||||
|
args.weeks,
|
||||||
|
);
|
||||||
|
|
||||||
if let Some(mut filename) = args.export {
|
if let Some(mut filename) = args.export {
|
||||||
// Export the calendar
|
// Export the calendar
|
||||||
|
|
15
src/utils.rs
15
src/utils.rs
|
@ -176,3 +176,18 @@ pub fn format_time_slot(start: usize, size: usize) -> String {
|
||||||
|
|
||||||
format!("{start_hour:02}h{start_minute:02}-{end_hour:02}h{end_minute:02}")
|
format!("{start_hour:02}h{start_minute:02}-{end_hour:02}h{end_minute:02}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Based on the user input and some default values, find the correct repartition of weeks between the break
|
||||||
|
pub fn get_period_weeks(semester: i32, user_input: Option<i32>) -> (i64, i64) {
|
||||||
|
if let Some(nb_weeks) = user_input {
|
||||||
|
// When weeks are forced by the user, we simply cut the period in half
|
||||||
|
let half = nb_weeks / 2;
|
||||||
|
return (half.into(), (nb_weeks - half).into());
|
||||||
|
}
|
||||||
|
|
||||||
|
match semester {
|
||||||
|
1 => (6, 7),
|
||||||
|
2 => (11, 1),
|
||||||
|
_ => panic!("Weird semester"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue