summaryrefslogtreecommitdiff
path: root/src/library/mod.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2019-12-13 23:59:01 +0100
committerLaurenz <laurmaedje@gmail.com>2019-12-13 23:59:01 +0100
commit665b4d2aca81af48b8e0eaca4e709ef2e7825844 (patch)
tree4ada33f607455f14b6a170fe4b7fbe173056567b /src/library/mod.rs
parent971ff3a2dcff1e68bf7e19017113469aad5a30c2 (diff)
More consistent library code and functions 🎄
Diffstat (limited to 'src/library/mod.rs')
-rw-r--r--src/library/mod.rs99
1 files changed, 54 insertions, 45 deletions
diff --git a/src/library/mod.rs b/src/library/mod.rs
index 9a49896b..1e5e406c 100644
--- a/src/library/mod.rs
+++ b/src/library/mod.rs
@@ -3,11 +3,10 @@
use toddle::query::FontClass;
use crate::func::prelude::*;
-use self::keys::*;
-use self::maps::*;
+use crate::style::parse_paper_name;
+use self::maps::{ExtentMap, PaddingMap, AxisKey};
pub mod maps;
-pub mod keys;
pub_use_mod!(align);
pub_use_mod!(boxed);
@@ -20,29 +19,23 @@ pub fn std() -> Scope {
std.add::<Align>("align");
std.add::<Boxed>("box");
std.add::<DirectionChange>("direction");
- std.add::<PageSize>("page.size");
- std.add::<PageMargins>("page.margins");
std.add::<LineBreak>("n");
std.add::<LineBreak>("line.break");
std.add::<ParBreak>("par.break");
std.add::<PageBreak>("page.break");
-
- std.add::<FontSize>("font.size");
+ std.add::<PageSize>("page.size");
+ std.add::<PageMargins>("page.margins");
std.add_with_metadata::<Spacing>("spacing", None);
+ std.add_with_metadata::<Spacing>("h", Some(Horizontal));
+ std.add_with_metadata::<Spacing>("v", Some(Vertical));
- for (name, key) in &[("h", AxisKey::Horizontal), ("v", AxisKey::Vertical)] {
- std.add_with_metadata::<Spacing>(name, Some(*key));
- }
+ std.add_with_metadata::<StyleChange>("bold", FontClass::Bold);
+ std.add_with_metadata::<StyleChange>("italic", FontClass::Italic);
+ std.add_with_metadata::<StyleChange>("mono", FontClass::Monospace);
- for (name, class) in &[
- ("bold", FontClass::Bold),
- ("italic", FontClass::Italic),
- ("mono", FontClass::Monospace),
- ] {
- std.add_with_metadata::<StyleChange>(name, class.clone());
- }
+ std.add::<FontSize>("font.size");
std
}
@@ -67,33 +60,46 @@ function! {
layout() { vec![BreakParagraph] }
}
-
function! {
/// `page.break`: Ends the current page.
#[derive(Debug, Default, PartialEq)]
pub struct PageBreak;
parse(default)
- layout() { vec![FinishSpace] }
+ layout() { vec![BreakPage] }
}
function! {
/// `page.size`: Set the size of pages.
#[derive(Debug, PartialEq)]
- pub struct PageSize {
- map: ExtentMap<Size>,
+ pub enum PageSize {
+ Map(ExtentMap<PSize>),
+ Size(Size2D),
}
parse(args, body) {
parse!(forbidden: body);
- PageSize {
- map: ExtentMap::new(&mut args, true)?,
+
+ if let Some(name) = args.get_pos_opt::<Ident>()? {
+ PageSize::Size(parse_paper_name(name.0.as_str())?)
+ } else {
+ PageSize::Map(ExtentMap::new(&mut args, true)?)
}
}
layout(self, ctx) {
let mut style = ctx.style.page;
- self.map.apply(ctx.axes, &mut style.dimensions, |&s| s)?;
+ let dims = &mut style.dimensions;
+
+ match self {
+ PageSize::Map(map) => {
+ let map = map.dedup(ctx.axes)?;
+ map.with(Horizontal, |&psize| dims.x = psize.concretize(dims.x));
+ map.with(Vertical, |&psize| dims.y = psize.concretize(dims.y));
+ }
+ PageSize::Size(size) => *dims = *size,
+ }
+
vec![SetPageStyle(style)]
}
}
@@ -108,7 +114,7 @@ function! {
parse(args, body) {
parse!(forbidden: body);
PageMargins {
- map: PaddingMap::new(&mut args, true)?,
+ map: PaddingMap::new(&mut args)?,
}
}
@@ -127,33 +133,30 @@ function! {
spacing: FSize,
}
- type Meta = Option<AxisKey>;
+ type Meta = Option<SpecificAxis>;
parse(args, body, _, meta) {
- let spacing = if let Some(axis) = meta {
+ parse!(forbidden: body);
+
+ if let Some(axis) = meta {
Spacing {
- axis,
+ axis: AxisKey::Specific(axis),
spacing: FSize::from_expr(args.get_pos::<Spanned<Expression>>()?)?,
}
- } else {
- if let Some(arg) = args.get_key_next() {
- let axis = AxisKey::from_ident(&arg.v.key)
- .map_err(|_| error!(@unexpected_argument))?;
-
- let spacing = FSize::from_expr(arg.v.value)?;
- Spacing { axis, spacing }
- } else {
- error!("expected axis and expression")
- }
- };
+ } else if let Some(arg) = args.get_key_next() {
+ let axis = AxisKey::from_ident(&arg.v.key)
+ .map_err(|_| error!(@unexpected_argument))?;
- parse!(forbidden: body);
- spacing
+ let spacing = FSize::from_expr(arg.v.value)?;
+ Spacing { axis, spacing }
+ } else {
+ error!("expected axis and spacing")
+ }
}
layout(self, ctx) {
let axis = self.axis.to_generic(ctx.axes);
- let spacing = self.spacing.concretize(ctx.style.text.font_size);
+ let spacing = self.spacing.concretize(ctx.style.text.font_size());
vec![AddSpacing(spacing, SpacingKind::Hard, axis)]
}
}
@@ -187,19 +190,25 @@ function! {
#[derive(Debug, PartialEq)]
pub struct FontSize {
body: Option<SyntaxTree>,
- size: Size,
+ size: ScaleSize,
}
parse(args, body, ctx) {
FontSize {
body: parse!(optional: body, ctx),
- size: args.get_pos::<Size>()?,
+ size: args.get_pos::<ScaleSize>()?,
}
}
layout(self, ctx) {
let mut style = ctx.style.text.clone();
- style.font_size = self.size;
+ match self.size {
+ ScaleSize::Absolute(size) => {
+ style.base_font_size = size;
+ style.font_scale = 1.0;
+ }
+ ScaleSize::Scaled(scale) => style.font_scale = scale,
+ }
styled(&self.body, &ctx, style)
}
}