diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-06-25 18:14:19 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-06-25 18:14:19 +0200 |
| commit | 63cf36149635156013f0324b660bf4d362beb87f (patch) | |
| tree | 252d63dafe6da81e04d8b3c0f2aadde29c2c41e7 /src | |
| parent | ef279fa6673ebf7aaf5bfb26354db66d6dcec302 (diff) | |
Make font take everything as keyword arguments
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval/value.rs | 4 | ||||
| -rw-r--r-- | src/exec/state.rs | 4 | ||||
| -rw-r--r-- | src/library/align.rs | 2 | ||||
| -rw-r--r-- | src/library/font.rs | 59 | ||||
| -rw-r--r-- | src/library/grid.rs | 4 | ||||
| -rw-r--r-- | src/library/mod.rs | 2 |
6 files changed, 44 insertions, 31 deletions
diff --git a/src/eval/value.rs b/src/eval/value.rs index b29d01f3..dda1c3e1 100644 --- a/src/eval/value.rs +++ b/src/eval/value.rs @@ -662,7 +662,7 @@ impl From<AnyValue> for Value { } } -/// Mark a type as a [`Value`]. +/// Make a type castable from a value. /// /// Given a type `T`, this implements the following traits: /// - [`Type`] for `T`, @@ -684,7 +684,7 @@ impl From<AnyValue> for Value { /// This would allow the type `FontFamily` to be cast from: /// - a [`Value::Any`] variant already containing a `FontFamily`, /// - a string, producing a named font family. -macro_rules! value { +macro_rules! castable { ($type:ty: $type_name:literal $(, $pattern:pat => $out:expr)* diff --git a/src/exec/state.rs b/src/exec/state.rs index fa16004e..6f900b54 100644 --- a/src/exec/state.rs +++ b/src/exec/state.rs @@ -216,9 +216,9 @@ impl Default for FamilyList { Self { list: vec![FontFamily::Serif], serif: vec!["eb garamond".into()], - sans_serif: vec![/* TODO */], + sans_serif: vec!["pt sans".into()], monospace: vec!["inconsolata".into()], - base: vec!["twitter color emoji".into()], + base: vec!["twitter color emoji".into(), "latin modern math".into()], } } } diff --git a/src/library/align.rs b/src/library/align.rs index 507bc939..c0ed0416 100644 --- a/src/library/align.rs +++ b/src/library/align.rs @@ -123,6 +123,6 @@ impl Display for AlignValue { } } -value! { +castable! { AlignValue: "alignment", } diff --git a/src/library/font.rs b/src/library/font.rs index 8d76328f..3f816c6d 100644 --- a/src/library/font.rs +++ b/src/library/font.rs @@ -6,20 +6,20 @@ use super::*; /// `font`: Configure the font. /// /// # Positional parameters -/// - Font size: optional, of type `linear` relative to current font size. -/// - Font families: variadic, of type `font-family`. /// - Body: optional, of type `template`. /// /// # Named parameters +/// - Font size: `size`, of type `linear` relative to current font size. +/// - Font families: `family`, `font-family`, `string` or `array`. /// - Font Style: `style`, of type `font-style`. /// - Font Weight: `weight`, of type `font-weight`. /// - Font Stretch: `stretch`, of type `relative`, between 0.5 and 2.0. /// - Top edge of the font: `top-edge`, of type `vertical-font-metric`. /// - Bottom edge of the font: `bottom-edge`, of type `vertical-font-metric`. /// - Color the glyphs: `color`, of type `color`. -/// - Serif family definition: `serif`, of type `font-family-definition`. -/// - Sans-serif family definition: `sans-serif`, of type `font-family-definition`. -/// - Monospace family definition: `monospace`, of type `font-family-definition`. +/// - Serif family definition: `serif`, of type `family-def`. +/// - Sans-serif family definition: `sans-serif`, of type `family-def`. +/// - Monospace family definition: `monospace`, of type `family-def`. /// /// # Return value /// A template that configures font properties. The effect is scoped to the body @@ -31,9 +31,9 @@ use super::*; /// - `sans-serif` /// - `monospace` /// - coerces from `string` -/// - Type `font-family-definition` +/// - Type `family-def` /// - coerces from `string` -/// - coerces from `array` +/// - coerces from `array` of `string` /// - Type `font-style` /// - `normal` /// - `italic` @@ -49,8 +49,8 @@ use super::*; /// - `baseline` /// - `descender` pub fn font(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { - let size = args.eat::<Linear>(ctx); - let list = args.all::<FontFamily>(ctx); + let list = args.named(ctx, "family"); + let size = args.named::<Linear>(ctx, "size"); let style = args.named(ctx, "style"); let weight = args.named(ctx, "weight"); let stretch = args.named(ctx, "stretch"); @@ -70,7 +70,7 @@ pub fn font(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { font.size = linear.resolve(font.size); } - if !list.is_empty() { + if let Some(FontDef(list)) = &list { font.families_mut().list = list.clone(); } @@ -98,15 +98,15 @@ pub fn font(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { font.fill = Fill::Color(color); } - if let Some(FontFamilies(serif)) = &serif { + if let Some(FamilyDef(serif)) = &serif { font.families_mut().serif = serif.clone(); } - if let Some(FontFamilies(sans_serif)) = &sans_serif { + if let Some(FamilyDef(sans_serif)) = &sans_serif { font.families_mut().sans_serif = sans_serif.clone(); } - if let Some(FontFamilies(monospace)) = &monospace { + if let Some(FamilyDef(monospace)) = &monospace { font.families_mut().monospace = monospace.clone(); } @@ -117,12 +117,25 @@ pub fn font(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { }) } -/// A list of font family names. -#[derive(Debug, Clone, PartialEq)] -struct FontFamilies(Vec<String>); +#[derive(Debug)] +struct FontDef(Vec<FontFamily>); -value! { - FontFamilies: "string or array of strings", +castable! { + FontDef: "font family or array of font families", + Value::Str(string) => Self(vec![FontFamily::Named(string.to_lowercase())]), + Value::Array(values) => Self(values + .into_iter() + .filter_map(|v| v.cast().ok()) + .collect() + ), + #(family: FontFamily) => Self(vec![family]), +} + +#[derive(Debug)] +struct FamilyDef(Vec<String>); + +castable! { + FamilyDef: "string or array of strings", Value::Str(string) => Self(vec![string.to_lowercase()]), Value::Array(values) => Self(values .into_iter() @@ -132,16 +145,16 @@ value! { ), } -value! { +castable! { FontFamily: "font family", Value::Str(string) => Self::Named(string.to_lowercase()) } -value! { +castable! { FontStyle: "font style", } -value! { +castable! { FontWeight: "font weight", Value::Int(number) => { let [min, max] = [Self::THIN, Self::BLACK]; @@ -161,7 +174,7 @@ value! { }, } -value! { +castable! { FontStretch: "font stretch", Value::Relative(relative) => { let [min, max] = [Self::ULTRA_CONDENSED, Self::ULTRA_EXPANDED]; @@ -182,6 +195,6 @@ value! { }, } -value! { +castable! { VerticalFontMetric: "vertical font metric", } diff --git a/src/library/grid.rs b/src/library/grid.rs index 9efa687c..c2e76514 100644 --- a/src/library/grid.rs +++ b/src/library/grid.rs @@ -70,7 +70,7 @@ pub fn grid(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { /// Defines size of rows and columns in a grid. type Tracks = Vec<TrackSizing>; -value! { +castable! { Tracks: "array of `auto`s, linears, and fractionals", Value::Int(count) => vec![TrackSizing::Auto; count.max(0) as usize], Value::Array(values) => values @@ -79,7 +79,7 @@ value! { .collect(), } -value! { +castable! { TrackSizing: "`auto`, linear, or fractional", Value::Auto => TrackSizing::Auto, Value::Length(v) => TrackSizing::Linear(v.into()), diff --git a/src/library/mod.rs b/src/library/mod.rs index 6c736081..4911e5c8 100644 --- a/src/library/mod.rs +++ b/src/library/mod.rs @@ -110,6 +110,6 @@ pub fn new() -> Scope { std } -value! { +castable! { Dir: "direction" } |
