summaryrefslogtreecommitdiff
path: root/library/src/layout
diff options
context:
space:
mode:
Diffstat (limited to 'library/src/layout')
-rw-r--r--library/src/layout/columns.rs15
-rw-r--r--library/src/layout/container.rs14
-rw-r--r--library/src/layout/grid.rs27
-rw-r--r--library/src/layout/hide.rs7
-rw-r--r--library/src/layout/pad.rs7
-rw-r--r--library/src/layout/page.rs14
-rw-r--r--library/src/layout/par.rs2
-rw-r--r--library/src/layout/place.rs7
-rw-r--r--library/src/layout/repeat.rs7
-rw-r--r--library/src/layout/spacing.rs34
-rw-r--r--library/src/layout/stack.rs20
-rw-r--r--library/src/layout/transform.rs22
12 files changed, 174 insertions, 2 deletions
diff --git a/library/src/layout/columns.rs b/library/src/layout/columns.rs
index c03ff433..a5f67b94 100644
--- a/library/src/layout/columns.rs
+++ b/library/src/layout/columns.rs
@@ -65,6 +65,14 @@ impl ColumnsNode {
}
.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "count" => Some(Value::Int(self.count.get() as i64)),
+ "body" => Some(Value::Content(self.body.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for ColumnsNode {
@@ -186,6 +194,13 @@ impl ColbreakNode {
let weak = args.named("weak")?.unwrap_or(false);
Ok(Self { weak }.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "weak" => Some(Value::Bool(self.weak)),
+ _ => None,
+ }
+ }
}
impl Behave for ColbreakNode {
diff --git a/library/src/layout/container.rs b/library/src/layout/container.rs
index 62e129b4..112c6f03 100644
--- a/library/src/layout/container.rs
+++ b/library/src/layout/container.rs
@@ -50,6 +50,13 @@ impl BoxNode {
let body = args.eat::<Content>()?.unwrap_or_default();
Ok(Self { sizing: Axes::new(width, height), body }.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.body.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for BoxNode {
@@ -163,6 +170,13 @@ impl BlockNode {
args.named("below")?.map(VNode::block_around).or(spacing),
);
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.0.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for BlockNode {
diff --git a/library/src/layout/grid.rs b/library/src/layout/grid.rs
index 85d464b1..eafe644f 100644
--- a/library/src/layout/grid.rs
+++ b/library/src/layout/grid.rs
@@ -120,6 +120,19 @@ impl GridNode {
}
.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "columns" => Some(TrackSizing::encode_slice(&self.tracks.x)),
+ "rows" => Some(TrackSizing::encode_slice(&self.tracks.y)),
+ "column-gutter" => Some(TrackSizing::encode_slice(&self.gutter.x)),
+ "row-gutter" => Some(TrackSizing::encode_slice(&self.gutter.y)),
+ "cells" => Some(Value::Array(
+ self.cells.iter().cloned().map(Value::Content).collect(),
+ )),
+ _ => None,
+ }
+ }
}
impl Layout for GridNode {
@@ -157,6 +170,20 @@ pub enum TrackSizing {
Fractional(Fr),
}
+impl TrackSizing {
+ pub fn encode(self) -> Value {
+ match self {
+ Self::Auto => Value::Auto,
+ Self::Relative(rel) => Spacing::Relative(rel).encode(),
+ Self::Fractional(fr) => Spacing::Fractional(fr).encode(),
+ }
+ }
+
+ pub fn encode_slice(vec: &[TrackSizing]) -> Value {
+ Value::Array(vec.iter().copied().map(Self::encode).collect())
+ }
+}
+
impl From<Spacing> for TrackSizing {
fn from(spacing: Spacing) -> Self {
match spacing {
diff --git a/library/src/layout/hide.rs b/library/src/layout/hide.rs
index dec6dd1c..6d168d35 100644
--- a/library/src/layout/hide.rs
+++ b/library/src/layout/hide.rs
@@ -30,6 +30,13 @@ impl HideNode {
fn construct(_: &Vm, args: &mut Args) -> SourceResult<Content> {
Ok(Self(args.expect("body")?).pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.0.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for HideNode {
diff --git a/library/src/layout/pad.rs b/library/src/layout/pad.rs
index 13b573bf..bbd55225 100644
--- a/library/src/layout/pad.rs
+++ b/library/src/layout/pad.rs
@@ -67,6 +67,13 @@ impl PadNode {
let padding = Sides::new(left, top, right, bottom);
Ok(Self { padding, body }.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.body.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for PadNode {
diff --git a/library/src/layout/page.rs b/library/src/layout/page.rs
index 105638a7..8e146126 100644
--- a/library/src/layout/page.rs
+++ b/library/src/layout/page.rs
@@ -64,6 +64,13 @@ impl PageNode {
styles.set(Self::HEIGHT, Smart::Custom(paper.height().into()));
}
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.0.clone())),
+ _ => None,
+ }
+ }
}
impl PageNode {
@@ -190,6 +197,13 @@ impl PagebreakNode {
let weak = args.named("weak")?.unwrap_or(false);
Ok(Self { weak }.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "weak" => Some(Value::Bool(self.weak)),
+ _ => None,
+ }
+ }
}
/// A header, footer, foreground or background definition.
diff --git a/library/src/layout/par.rs b/library/src/layout/par.rs
index f966d30b..412a279e 100644
--- a/library/src/layout/par.rs
+++ b/library/src/layout/par.rs
@@ -467,7 +467,7 @@ fn collect<'a>(
Segment::Text(c.len_utf8())
} else if let Some(node) = child.to::<SmartQuoteNode>() {
let prev = full.len();
- if styles.get(TextNode::SMART_QUOTES) {
+ if styles.get(SmartQuoteNode::ENABLED) {
let lang = styles.get(TextNode::LANG);
let region = styles.get(TextNode::REGION);
let quotes = Quotes::from_lang(lang, region);
diff --git a/library/src/layout/place.rs b/library/src/layout/place.rs
index ed3d71bf..406aa862 100644
--- a/library/src/layout/place.rs
+++ b/library/src/layout/place.rs
@@ -33,6 +33,13 @@ impl PlaceNode {
let out_of_flow = aligns.y.is_some();
Ok(Self(body.moved(Axes::new(dx, dy)).aligned(aligns), out_of_flow).pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.0.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for PlaceNode {
diff --git a/library/src/layout/repeat.rs b/library/src/layout/repeat.rs
index 864454c4..04610fca 100644
--- a/library/src/layout/repeat.rs
+++ b/library/src/layout/repeat.rs
@@ -19,6 +19,13 @@ impl RepeatNode {
fn construct(_: &Vm, args: &mut Args) -> SourceResult<Content> {
Ok(Self(args.expect("body")?).pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.0.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for RepeatNode {
diff --git a/library/src/layout/spacing.rs b/library/src/layout/spacing.rs
index 91b36661..35f6aa9b 100644
--- a/library/src/layout/spacing.rs
+++ b/library/src/layout/spacing.rs
@@ -54,10 +54,18 @@ pub struct HNode {
#[node]
impl HNode {
fn construct(_: &Vm, args: &mut Args) -> SourceResult<Content> {
- let amount = args.expect("spacing")?;
+ let amount = args.expect("amount")?;
let weak = args.named("weak")?.unwrap_or(false);
Ok(Self { amount, weak }.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "amount" => Some(self.amount.encode()),
+ "weak" => Some(Value::Bool(self.weak)),
+ _ => None,
+ }
+ }
}
impl HNode {
@@ -159,6 +167,14 @@ impl VNode {
};
Ok(node.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "amount" => Some(self.amount.encode()),
+ "weak" => Some(Value::Bool(self.weakness != 0)),
+ _ => None,
+ }
+ }
}
impl VNode {
@@ -220,6 +236,22 @@ impl Spacing {
pub fn is_fractional(self) -> bool {
matches!(self, Self::Fractional(_))
}
+
+ /// Encode into a value.
+ pub fn encode(self) -> Value {
+ match self {
+ Self::Relative(rel) => {
+ if rel.rel.is_zero() {
+ Value::Length(rel.abs)
+ } else if rel.abs.is_zero() {
+ Value::Ratio(rel.rel)
+ } else {
+ Value::Relative(rel)
+ }
+ }
+ Self::Fractional(fr) => Value::Fraction(fr),
+ }
+ }
}
impl From<Abs> for Spacing {
diff --git a/library/src/layout/stack.rs b/library/src/layout/stack.rs
index f83f4e41..c423b1a3 100644
--- a/library/src/layout/stack.rs
+++ b/library/src/layout/stack.rs
@@ -40,6 +40,26 @@ impl StackNode {
}
.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "dir" => Some(Value::dynamic(self.dir)),
+ "spacing" => Some(match self.spacing {
+ Some(spacing) => spacing.encode(),
+ None => Value::None,
+ }),
+ "items" => Some(Value::Array(
+ self.children
+ .iter()
+ .map(|child| match child {
+ StackChild::Spacing(spacing) => spacing.encode(),
+ StackChild::Block(content) => Value::Content(content.clone()),
+ })
+ .collect(),
+ )),
+ _ => None,
+ }
+ }
}
impl Layout for StackNode {
diff --git a/library/src/layout/transform.rs b/library/src/layout/transform.rs
index 92a31780..57a6c069 100644
--- a/library/src/layout/transform.rs
+++ b/library/src/layout/transform.rs
@@ -31,6 +31,7 @@ use crate::prelude::*;
/// ### Example
/// ```
/// Hello, world!#move(dy: -2pt)[!]#move(dy: 2pt)[!]
+/// ```
///
/// - dx: Rel<Length> (named)
/// The horizontal displacement of the content.
@@ -61,6 +62,13 @@ impl MoveNode {
}
.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.body.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for MoveNode {
@@ -130,6 +138,13 @@ impl RotateNode {
}
.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.body.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for RotateNode {
@@ -209,6 +224,13 @@ impl ScaleNode {
}
.pack())
}
+
+ fn field(&self, name: &str) -> Option<Value> {
+ match name {
+ "body" => Some(Value::Content(self.body.clone())),
+ _ => None,
+ }
+ }
}
impl Layout for ScaleNode {