diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval/scope.rs | 21 | ||||
| -rw-r--r-- | src/eval/value.rs | 8 | ||||
| -rw-r--r-- | src/library/font.rs | 9 | ||||
| -rw-r--r-- | src/library/mod.rs | 133 |
4 files changed, 87 insertions, 84 deletions
diff --git a/src/eval/scope.rs b/src/eval/scope.rs index 20c18306..a3c9234b 100644 --- a/src/eval/scope.rs +++ b/src/eval/scope.rs @@ -1,10 +1,10 @@ use std::cell::RefCell; use std::collections::HashMap; -use std::fmt::{self, Debug, Formatter}; +use std::fmt::{self, Debug, Display, Formatter}; use std::iter; use std::rc::Rc; -use super::Value; +use super::{AnyValue, EvalContext, FuncArgs, FuncValue, Type, Value}; /// A slot where a variable is stored. pub type Slot = Rc<RefCell<Value>>; @@ -100,6 +100,23 @@ impl Scope { self.values.insert(var.into(), Rc::new(cell)); } + /// Define a constant function. + pub fn def_func<F>(&mut self, name: impl Into<String>, f: F) + where + F: Fn(&mut EvalContext, &mut FuncArgs) -> Value + 'static, + { + let name = name.into(); + self.def_const(name.clone(), FuncValue::new(Some(name), f)); + } + + /// Define a constant variable with a value of variant `Value::Any`. + pub fn def_any<T>(&mut self, var: impl Into<String>, any: T) + where + T: Type + Debug + Display + Clone + PartialEq + 'static, + { + self.def_const(var, AnyValue::new(any)) + } + /// Define a mutable variable with a value. pub fn def_mut(&mut self, var: impl Into<String>, value: impl Into<Value>) { self.values.insert(var.into(), Rc::new(RefCell::new(value.into()))); diff --git a/src/eval/value.rs b/src/eval/value.rs index a69398f0..0d87c28f 100644 --- a/src/eval/value.rs +++ b/src/eval/value.rs @@ -6,7 +6,7 @@ use std::ops::Deref; use std::rc::Rc; use super::{EvalContext, NodeMap}; -use crate::color::Color; +use crate::color::{Color, RgbaColor}; use crate::exec::ExecContext; use crate::geom::{Angle, Length, Linear, Relative}; use crate::syntax::{Span, Spanned, Tree}; @@ -622,6 +622,12 @@ impl From<&str> for Value { } } +impl From<RgbaColor> for Value { + fn from(v: RgbaColor) -> Self { + Self::Color(Color::Rgba(v)) + } +} + impl From<AnyValue> for Value { fn from(v: AnyValue) -> Self { Self::Any(v) diff --git a/src/library/font.rs b/src/library/font.rs index 64aec75b..33a521f5 100644 --- a/src/library/font.rs +++ b/src/library/font.rs @@ -39,16 +39,9 @@ use super::*; /// - `italic` /// - `oblique` /// - Type `font-weight` -/// - `thin` (100) -/// - `extralight` (200) -/// - `light` (300) /// - `regular` (400) -/// - `medium` (500) -/// - `semibold` (600) /// - `bold` (700) -/// - `extrabold` (800) -/// - `black` (900) -/// - coerces from `integer` +/// - coerces from `integer`, between 100 and 900 /// - Type `vertical-font-metric` /// - `ascender` /// - `cap-height` diff --git a/src/library/mod.rs b/src/library/mod.rs index a6628315..6a46314c 100644 --- a/src/library/mod.rs +++ b/src/library/mod.rs @@ -33,9 +33,8 @@ pub use stack::*; use std::fmt::{self, Display, Formatter}; -use crate::eval::{ - AnyValue, EvalContext, FuncArgs, FuncValue, Scope, TemplateValue, Value, -}; +use crate::color::RgbaColor; +use crate::eval::{EvalContext, FuncArgs, Scope, TemplateValue, Value}; use crate::exec::{Exec, FontFamily}; use crate::font::{FontStyle, FontWeight, VerticalFontMetric}; use crate::geom::*; @@ -45,80 +44,68 @@ use crate::syntax::{Node, Spanned}; pub fn new() -> Scope { let mut std = Scope::new(); - macro_rules! func { - ($name:expr, $func:expr) => { - std.def_const($name, FuncValue::new(Some($name.into()), $func)) - }; - } - - macro_rules! constant { - ($var:expr, $any:expr) => { - std.def_const($var, AnyValue::new($any)) - }; - } - // Syntax functions. - func!(Node::LINEBREAK, linebreak); - func!(Node::PARBREAK, parbreak); - func!(Node::STRONG, strong); - func!(Node::EMPH, emph); - func!(Node::HEADING, heading); - func!(Node::RAW, raw); + std.def_func(Node::LINEBREAK, linebreak); + std.def_func(Node::PARBREAK, parbreak); + std.def_func(Node::STRONG, strong); + std.def_func(Node::EMPH, emph); + std.def_func(Node::HEADING, heading); + std.def_func(Node::RAW, raw); // Library functions. - func!("align", align); - func!("circle", circle); - func!("ellipse", ellipse); - func!("font", font); - func!("h", h); - func!("image", image); - func!("lang", lang); - func!("max", max); - func!("min", min); - func!("pad", pad); - func!("page", page); - func!("pagebreak", pagebreak); - func!("par", par); - func!("rect", rect); - func!("repr", repr); - func!("rgb", rgb); - func!("square", square); - func!("stack", stack); - func!("type", type_); - func!("v", v); + std.def_func("align", align); + std.def_func("circle", circle); + std.def_func("ellipse", ellipse); + std.def_func("font", font); + std.def_func("h", h); + std.def_func("image", image); + std.def_func("lang", lang); + std.def_func("max", max); + std.def_func("min", min); + std.def_func("pad", pad); + std.def_func("page", page); + std.def_func("pagebreak", pagebreak); + std.def_func("par", par); + std.def_func("rect", rect); + std.def_func("repr", repr); + std.def_func("rgb", rgb); + std.def_func("square", square); + std.def_func("stack", stack); + std.def_func("type", type_); + std.def_func("v", v); + + // Colors. + std.def_const("white", RgbaColor::WHITE); + std.def_const("black", RgbaColor::BLACK); + std.def_const("eastern", RgbaColor::new(0x23, 0x9D, 0xAD, 0xFF)); + std.def_const("conifer", RgbaColor::new(0x9f, 0xEB, 0x52, 0xFF)); + std.def_const("forest", RgbaColor::new(0x43, 0xA1, 0x27, 0xFF)); - // Constants. - constant!("start", AlignValue::Start); - constant!("center", AlignValue::Center); - constant!("end", AlignValue::End); - constant!("left", AlignValue::Left); - constant!("right", AlignValue::Right); - constant!("top", AlignValue::Top); - constant!("bottom", AlignValue::Bottom); - constant!("ltr", Dir::LTR); - constant!("rtl", Dir::RTL); - constant!("ttb", Dir::TTB); - constant!("btt", Dir::BTT); - constant!("serif", FontFamily::Serif); - constant!("sans-serif", FontFamily::SansSerif); - constant!("monospace", FontFamily::Monospace); - constant!("normal", FontStyle::Normal); - constant!("italic", FontStyle::Italic); - constant!("oblique", FontStyle::Oblique); - constant!("thin", FontWeight::THIN); - constant!("extralight", FontWeight::EXTRALIGHT); - constant!("light", FontWeight::LIGHT); - constant!("regular", FontWeight::REGULAR); - constant!("medium", FontWeight::MEDIUM); - constant!("semibold", FontWeight::SEMIBOLD); - constant!("bold", FontWeight::BOLD); - constant!("extrabold", FontWeight::EXTRABOLD); - constant!("black", FontWeight::BLACK); - constant!("ascender", VerticalFontMetric::Ascender); - constant!("cap-height", VerticalFontMetric::CapHeight); - constant!("x-height", VerticalFontMetric::XHeight); - constant!("baseline", VerticalFontMetric::Baseline); - constant!("descender", VerticalFontMetric::Descender); + // Arbitrary constants. + std.def_any("start", AlignValue::Start); + std.def_any("center", AlignValue::Center); + std.def_any("end", AlignValue::End); + std.def_any("left", AlignValue::Left); + std.def_any("right", AlignValue::Right); + std.def_any("top", AlignValue::Top); + std.def_any("bottom", AlignValue::Bottom); + std.def_any("ltr", Dir::LTR); + std.def_any("rtl", Dir::RTL); + std.def_any("ttb", Dir::TTB); + std.def_any("btt", Dir::BTT); + std.def_any("serif", FontFamily::Serif); + std.def_any("sans-serif", FontFamily::SansSerif); + std.def_any("monospace", FontFamily::Monospace); + std.def_any("normal", FontStyle::Normal); + std.def_any("italic", FontStyle::Italic); + std.def_any("oblique", FontStyle::Oblique); + std.def_any("regular", FontWeight::REGULAR); + std.def_any("bold", FontWeight::BOLD); + std.def_any("ascender", VerticalFontMetric::Ascender); + std.def_any("cap-height", VerticalFontMetric::CapHeight); + std.def_any("x-height", VerticalFontMetric::XHeight); + std.def_any("baseline", VerticalFontMetric::Baseline); + std.def_any("descender", VerticalFontMetric::Descender); std } |
