mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-24 10:08:00 -06:00
Render weekday letters in FormCalc date pictures (#3321)
Found while testing crates/js/src/formcalc.rs:1929-1957 (format_date), with DateFmt returning "EEEE, MMMM D, YYYY" at :2333 Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Haiku 5.5
parent
666648349b
commit
8d6254aa0b
@@ -1933,6 +1933,8 @@ fn days_in(y: i64, m: u32) -> u32 {
|
||||
}
|
||||
}
|
||||
|
||||
const WEEKDAYS: [&str; 7] = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
||||
|
||||
fn format_date(y: i64, m: u32, d: u32, picture: &str) -> String {
|
||||
let pic: Vec<char> = picture.chars().collect();
|
||||
let mut out = String::new();
|
||||
@@ -1955,6 +1957,19 @@ fn format_date(y: i64, m: u32, d: u32, picture: &str) -> String {
|
||||
('D', 1) => out.push_str(&d.to_string()),
|
||||
(_, _) => out.push_str(&format!("{d:02}")),
|
||||
}
|
||||
} else if pic[i] == 'E' {
|
||||
let mut run = 1;
|
||||
while i + run < pic.len() && pic[i + run] == 'E' {
|
||||
run += 1;
|
||||
}
|
||||
i += run;
|
||||
// Day 1 (1900-01-01) was a Monday, so the serial modulo 7 indexes from Sunday.
|
||||
let weekday = days_from_civil(y, m, d).rem_euclid(7) as usize;
|
||||
match run {
|
||||
1 | 2 => out.push_str(&(weekday + 1).to_string()),
|
||||
3 => out.push_str(WEEKDAYS.get(weekday).map_or("", |n| &n[..3])),
|
||||
_ => out.push_str(WEEKDAYS.get(weekday).copied().unwrap_or("")),
|
||||
}
|
||||
} else {
|
||||
out.push(pic[i]);
|
||||
i += 1;
|
||||
|
||||
@@ -636,6 +636,21 @@ mod formcalc {
|
||||
assert_eq!(calc("; a comment\n// another\nSum(1,\n 2,\n 3)"), "6");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn date_pictures_render_the_weekday_letters() {
|
||||
assert_eq!(calc(r#"Num2Date(45350, DateFmt(4))"#), "Thursday, February 29, 2024");
|
||||
assert_eq!(calc(r#"Num2Date(45350, "EEE, YYYY-MM-DD")"#), "Thu, 2024-02-29");
|
||||
assert_eq!(calc(r#"Num2Date(45350, "EEEE")"#), "Thursday");
|
||||
assert_eq!(calc(r#"Num2Date(45350, "E")"#), "5");
|
||||
assert_eq!(calc(r#"Num2Date(45351, "EEEE")"#), "Friday");
|
||||
assert_eq!(calc(r#"Num2Date(45352, "EEEE")"#), "Saturday");
|
||||
assert_eq!(calc(r#"Num2Date(45353, "EEEE")"#), "Sunday");
|
||||
assert_eq!(calc(r#"Num2Date(1, "EEEE")"#), "Monday");
|
||||
assert_eq!(calc(r#"Format("EEEE, YYYY-MM-DD", 45350)"#), "Thursday, 2024-02-29");
|
||||
// Other letters are still literal text.
|
||||
assert_eq!(calc(r#"Num2Date(45350, "YYYY-MM-DD x")"#), "2024-02-29 x");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn str_and_format_round_exact_ties_away_from_zero() {
|
||||
assert_eq!(calc("Str(2.5, 3, 0)"), " 3");
|
||||
|
||||
Reference in New Issue
Block a user