diff --git a/src/data/batch.rs b/src/data/batch.rs index d433471..eff3ec5 100644 --- a/src/data/batch.rs +++ b/src/data/batch.rs @@ -2,7 +2,7 @@ use crate::banner::Course; use crate::data::models::{DbMeetingTime, UpsertCounts}; -use crate::data::names::parse_banner_name; +use crate::data::names::{decode_html_entities, parse_banner_name}; use crate::error::Result; use sqlx::PgConnection; use sqlx::PgPool; @@ -448,7 +448,10 @@ async fn upsert_courses(courses: &[Course], conn: &mut PgConnection) -> Result = courses.iter().map(|c| c.subject.as_str()).collect(); let course_numbers: Vec<&str> = courses.iter().map(|c| c.course_number.as_str()).collect(); - let titles: Vec<&str> = courses.iter().map(|c| c.course_title.as_str()).collect(); + let titles: Vec = courses + .iter() + .map(|c| decode_html_entities(&c.course_title)) + .collect(); let term_codes: Vec<&str> = courses.iter().map(|c| c.term.as_str()).collect(); let enrollments: Vec = courses.iter().map(|c| c.enrollment).collect(); let max_enrollments: Vec = courses.iter().map(|c| c.maximum_enrollment).collect(); @@ -628,7 +631,7 @@ async fn upsert_instructors( conn: &mut PgConnection, ) -> Result> { let mut seen = HashSet::new(); - let mut display_names: Vec<&str> = Vec::new(); + let mut display_names: Vec = Vec::new(); let mut first_names: Vec> = Vec::new(); let mut last_names: Vec> = Vec::new(); let mut emails_lower: Vec = Vec::new(); @@ -640,7 +643,7 @@ async fn upsert_instructors( let email_lower = email.to_lowercase(); if seen.insert(email_lower.clone()) { let parts = parse_banner_name(&faculty.display_name); - display_names.push(faculty.display_name.as_str()); + display_names.push(decode_html_entities(&faculty.display_name)); first_names.push(parts.as_ref().map(|p| p.first.clone())); last_names.push(parts.as_ref().map(|p| p.last.clone())); emails_lower.push(email_lower); diff --git a/src/data/names.rs b/src/data/names.rs index 695dbdb..1bd8ee5 100644 --- a/src/data/names.rs +++ b/src/data/names.rs @@ -30,7 +30,7 @@ pub struct NameParts { /// /// Handles both named entities (`&`, `ü`) and numeric references /// (`'`, `'`). -fn decode_html_entities(s: &str) -> String { +pub(crate) fn decode_html_entities(s: &str) -> String { if !s.contains('&') { return s.to_string(); }