forked from Anri/cal8tor
WIP: table
This commit is contained in:
parent
526cd46747
commit
aa287b87c2
2 changed files with 90 additions and 6 deletions
|
@ -59,7 +59,7 @@ pub async fn info() -> HashMap<usize, Vec<(DateTime<Utc>, i64)>> {
|
||||||
|
|
||||||
/// Get info webpage
|
/// 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 url = "https://informatique.up8.edu/licence-iv/edt";
|
/* let url = "https://informatique.up8.edu/licence-iv/edt";
|
||||||
|
|
||||||
// We don't use reqwest::get() but a client with a custom user-agent
|
// We don't use reqwest::get() but a client with a custom user-agent
|
||||||
// in order to avoid getting rate limit
|
// in order to avoid getting rate limit
|
||||||
|
@ -69,7 +69,9 @@ async fn get_webpage() -> Result<Html, Box<dyn std::error::Error>> {
|
||||||
let html = client.get(url).send().await?.text().await?;
|
let html = client.get(url).send().await?.text().await?;
|
||||||
|
|
||||||
// Panic on error
|
// Panic on error
|
||||||
crate::utils::check_errors(&html, url);
|
crate::utils::check_errors(&html, url); */
|
||||||
|
|
||||||
|
let html = std::fs::read_to_string("target/debug-sch.htm").unwrap();
|
||||||
|
|
||||||
Ok(Html::parse_document(&html))
|
Ok(Html::parse_document(&html))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
use chrono::{Datelike, Duration, TimeZone, Utc};
|
use chrono::{Datelike, Duration, TimeZone, Utc};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use scraper::{Html, Selector};
|
use scraper::{Html, Selector};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::utils::{
|
||||||
|
self,
|
||||||
|
models::{Position, TabChar},
|
||||||
|
};
|
||||||
|
|
||||||
pub mod models;
|
pub mod models;
|
||||||
|
|
||||||
/// Fetch the timetable for a class
|
/// Fetch the timetable for a class
|
||||||
|
@ -120,7 +127,7 @@ async fn get_webpage(
|
||||||
semester: i8,
|
semester: i8,
|
||||||
letter: Option<char>,
|
letter: Option<char>,
|
||||||
) -> Result<Html, Box<dyn std::error::Error>> {
|
) -> Result<Html, Box<dyn std::error::Error>> {
|
||||||
let url = {
|
/* let url = {
|
||||||
let panic_semester_message = "Unknown semester.";
|
let panic_semester_message = "Unknown semester.";
|
||||||
let panic_letter_message = "Unknown letter.";
|
let panic_letter_message = "Unknown letter.";
|
||||||
|
|
||||||
|
@ -165,7 +172,8 @@ async fn get_webpage(
|
||||||
let html = reqwest::get(&url).await?.text().await?;
|
let html = reqwest::get(&url).await?.text().await?;
|
||||||
|
|
||||||
// Panic on error
|
// Panic on error
|
||||||
crate::utils::check_errors(&html, &url);
|
crate::utils::check_errors(&html, &url); */
|
||||||
|
let html = std::fs::read_to_string("target/debug-l1a.htm").unwrap();
|
||||||
|
|
||||||
// Parse document
|
// Parse document
|
||||||
let document = Html::parse_document(&html);
|
let document = Html::parse_document(&html);
|
||||||
|
@ -210,7 +218,7 @@ type T = (
|
||||||
(usize, Vec<models::Day>),
|
(usize, Vec<models::Day>),
|
||||||
);
|
);
|
||||||
// Data builded in the info webpage
|
// Data builded in the info webpage
|
||||||
type D = std::collections::HashMap<
|
type D = HashMap<
|
||||||
// Semester
|
// Semester
|
||||||
usize,
|
usize,
|
||||||
// List of start and repetition of course weeks
|
// List of start and repetition of course weeks
|
||||||
|
@ -321,4 +329,78 @@ fn get_semester(semester: Option<i8>, letter: Option<char>) -> i8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Display the timetable
|
/// Display the timetable
|
||||||
pub fn display(timetable: (Vec<String>, (usize, Vec<models::Day>))) {}
|
pub fn display(timetable: (Vec<String>, (usize, Vec<models::Day>))) {
|
||||||
|
// Cell length
|
||||||
|
let cl = 35;
|
||||||
|
// Cell length for hours
|
||||||
|
let clh = 11;
|
||||||
|
// Cell number
|
||||||
|
let cn = 6;
|
||||||
|
|
||||||
|
let sep = TabChar::Bv.val();
|
||||||
|
|
||||||
|
// Top of the tab
|
||||||
|
utils::line_table(clh, cl, cn, Position::Top, HashMap::new());
|
||||||
|
|
||||||
|
// First empty case
|
||||||
|
print!("{}{:^clh$}{}", sep, "", sep);
|
||||||
|
|
||||||
|
// Print day's of the week
|
||||||
|
let mut days = HashMap::new();
|
||||||
|
for (i, data) in (&timetable.1 .1).iter().enumerate() {
|
||||||
|
days.insert(i, &data.name);
|
||||||
|
print!("{:^cl$}{}", &data.name, sep);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the data of the course for utils::line_table
|
||||||
|
let mut next_skip = HashMap::new();
|
||||||
|
// For each hours
|
||||||
|
for (i, hour) in timetable.0.into_iter().enumerate() {
|
||||||
|
// Draw separator line
|
||||||
|
utils::line_table(clh, cl, cn, Position::Middle, next_skip);
|
||||||
|
|
||||||
|
// Reset
|
||||||
|
next_skip = HashMap::new();
|
||||||
|
|
||||||
|
// Print hour
|
||||||
|
print!("{}{:^clh$}", sep, hour);
|
||||||
|
|
||||||
|
// For all the days
|
||||||
|
for (j, day) in (&timetable.1 .1).iter().enumerate() {
|
||||||
|
// For all the courses of each days
|
||||||
|
for (k, course_opt) in (&day.courses).iter().enumerate() {
|
||||||
|
match course_opt {
|
||||||
|
// If there is a course
|
||||||
|
Some(course) => {
|
||||||
|
// Check if the course's hour
|
||||||
|
if i == k {
|
||||||
|
if course.size != 1 {
|
||||||
|
// If the course uses more than one time slot
|
||||||
|
next_skip.insert(course.start, &course.name);
|
||||||
|
print!("{}{:^cl$}", sep, "");
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// Else simply print the course
|
||||||
|
print!("{}{:^cl$}", sep, &course.name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If no course was found
|
||||||
|
None => {
|
||||||
|
// Verify the "no course" is in the correct day and hour
|
||||||
|
if *days.get(&j).unwrap() == &day.name.to_string() && k == i {
|
||||||
|
// If yes print empty row
|
||||||
|
print!("{}{:^cl$}", sep, "");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Else it was a course of another day/time
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print!("{}", sep);
|
||||||
|
}
|
||||||
|
// Bottom of the table
|
||||||
|
utils::line_table(clh, cl, cn, Position::Bottom, HashMap::new());
|
||||||
|
}
|
||||||
|
|
Reference in a new issue