use super::length::{FontContext, Length, Viewport};
use super::parse_border_shorthand;
use crate::html::box_edges::Border;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum ColumnFill {
#[default]
Balance,
Auto,
}
#[doc(hidden)]
pub fn parse_column_fill(s: &str) -> Option<ColumnFill> {
match s.trim().to_ascii_lowercase().as_str() {
"balance" | "balance-all" => Some(ColumnFill::Balance),
"auto" => Some(ColumnFill::Auto),
_ => None,
}
}
#[doc(hidden)]
pub fn parse_column_count(s: &str) -> Option<usize> {
let n = s.trim().parse::<usize>().ok()?;
(1..=10000).contains(&n).then_some(n)
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ColumnsShorthand {
pub width: Option<Length>,
pub count: Option<usize>,
}
#[doc(hidden)]
pub fn parse_columns_shorthand(s: &str) -> Option<ColumnsShorthand> {
let mut width: Option<Length> = None;
let mut count: Option<usize> = None;
for token in s.split_whitespace() {
if let Some(c) = parse_column_count(token) {
if count.is_some() {
return None;
}
count = Some(c);
continue;
}
let l = Length::parse(token)?;
if width.is_some() {
return None;
}
width = Some(l);
}
(width.is_some() || count.is_some()).then_some(ColumnsShorthand { width, count })
}
#[doc(hidden)]
pub fn parse_column_rule(
s: &str,
containing_width: usize,
font_ctx: FontContext,
viewport: Viewport,
) -> Option<Border> {
parse_border_shorthand(s, containing_width, font_ctx, viewport)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ColumnsResolved {
pub count: usize,
pub col_width: usize,
pub gap: usize,
pub fill: ColumnFill,
pub rule: Option<Border>,
}