mirror of
https://github.com/typst/typst
synced 2025-05-14 04:56:26 +08:00
Make templates and strings summable 🥪
This commit is contained in:
parent
58f799c41c
commit
094462cbdd
@ -30,6 +30,7 @@ pub fn neg(value: Value) -> Value {
|
|||||||
/// Compute the sum of two values.
|
/// Compute the sum of two values.
|
||||||
pub fn add(lhs: Value, rhs: Value) -> Value {
|
pub fn add(lhs: Value, rhs: Value) -> Value {
|
||||||
match (lhs, rhs) {
|
match (lhs, rhs) {
|
||||||
|
// Math.
|
||||||
(Int(a), Int(b)) => Int(a + b),
|
(Int(a), Int(b)) => Int(a + b),
|
||||||
(Int(a), Float(b)) => Float(a as f64 + b),
|
(Int(a), Float(b)) => Float(a as f64 + b),
|
||||||
(Float(a), Int(b)) => Float(a + b as f64),
|
(Float(a), Int(b)) => Float(a + b as f64),
|
||||||
@ -45,14 +46,23 @@ pub fn add(lhs: Value, rhs: Value) -> Value {
|
|||||||
(Linear(a), Relative(b)) => Linear(a + b),
|
(Linear(a), Relative(b)) => Linear(a + b),
|
||||||
(Linear(a), Linear(b)) => Linear(a + b),
|
(Linear(a), Linear(b)) => Linear(a + b),
|
||||||
|
|
||||||
|
// Collections.
|
||||||
(Str(a), Str(b)) => Str(a + &b),
|
(Str(a), Str(b)) => Str(a + &b),
|
||||||
(Array(a), Array(b)) => Array(concat(a, b)),
|
(Array(a), Array(b)) => Array(concat(a, b)),
|
||||||
(Dict(a), Dict(b)) => Dict(concat(a, b)),
|
(Dict(a), Dict(b)) => Dict(concat(a, b)),
|
||||||
|
|
||||||
// TODO: Add string and template.
|
// Templates.
|
||||||
(Template(a), Template(b)) => Template(concat(a, b)),
|
(Template(a), Template(b)) => Template(concat(a, b)),
|
||||||
(Template(a), None) => Template(a),
|
(Template(a), None) => Template(a),
|
||||||
(None, Template(b)) => Template(b),
|
(None, Template(b)) => Template(b),
|
||||||
|
(Template(mut a), Str(b)) => Template({
|
||||||
|
a.push(TemplateNode::Str(b));
|
||||||
|
a
|
||||||
|
}),
|
||||||
|
(Str(a), Template(mut b)) => Template({
|
||||||
|
b.insert(0, TemplateNode::Str(a));
|
||||||
|
b
|
||||||
|
}),
|
||||||
|
|
||||||
_ => Error,
|
_ => Error,
|
||||||
}
|
}
|
||||||
|
@ -119,6 +119,8 @@ pub enum TemplateNode {
|
|||||||
/// The evaluated expressions for the `tree`.
|
/// The evaluated expressions for the `tree`.
|
||||||
map: ExprMap,
|
map: ExprMap,
|
||||||
},
|
},
|
||||||
|
/// A template that was converted from a string.
|
||||||
|
Str(String),
|
||||||
/// A template that can implement custom behaviour.
|
/// A template that can implement custom behaviour.
|
||||||
Any(TemplateAny),
|
Any(TemplateAny),
|
||||||
}
|
}
|
||||||
|
@ -155,6 +155,7 @@ impl Exec for TemplateNode {
|
|||||||
fn exec(&self, ctx: &mut ExecContext) {
|
fn exec(&self, ctx: &mut ExecContext) {
|
||||||
match self {
|
match self {
|
||||||
Self::Tree { tree, map } => tree.exec_with_map(ctx, &map),
|
Self::Tree { tree, map } => tree.exec_with_map(ctx, &map),
|
||||||
|
Self::Str(s) => ctx.push_text(s),
|
||||||
Self::Any(any) => any.exec(ctx),
|
Self::Any(any) => any.exec(ctx),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,7 +120,7 @@ impl PrettyWithMap for Node {
|
|||||||
Self::Linebreak => p.push_str(r"\"),
|
Self::Linebreak => p.push_str(r"\"),
|
||||||
Self::Parbreak => p.push_str("\n\n"),
|
Self::Parbreak => p.push_str("\n\n"),
|
||||||
// TODO: Handle escaping.
|
// TODO: Handle escaping.
|
||||||
Self::Text(text) => p.push_str(&text),
|
Self::Text(text) => p.push_str(text),
|
||||||
Self::Heading(heading) => heading.pretty_with_map(p, map),
|
Self::Heading(heading) => heading.pretty_with_map(p, map),
|
||||||
Self::Raw(raw) => raw.pretty(p),
|
Self::Raw(raw) => raw.pretty(p),
|
||||||
Self::Expr(expr) => {
|
Self::Expr(expr) => {
|
||||||
@ -538,6 +538,7 @@ impl Pretty for TemplateNode {
|
|||||||
fn pretty(&self, p: &mut Printer) {
|
fn pretty(&self, p: &mut Printer) {
|
||||||
match self {
|
match self {
|
||||||
Self::Tree { tree, map } => tree.pretty_with_map(p, Some(map)),
|
Self::Tree { tree, map } => tree.pretty_with_map(p, Some(map)),
|
||||||
|
Self::Str(s) => p.push_str(s),
|
||||||
Self::Any(any) => any.pretty(p),
|
Self::Any(any) => any.pretty(p),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,12 @@
|
|||||||
// Block body yields template.
|
// Block body yields template.
|
||||||
// Should output `[1st, 2nd, 3rd, 4th, 5th, 6th]`.
|
// Should output `[1st, 2nd, 3rd, 4th, 5th, 6th]`.
|
||||||
{
|
{
|
||||||
[\[] + #for v #in (1, 2, 3, 4, 5, 6) {
|
"[" + #for v #in (1, 2, 3, 4, 5, 6) {
|
||||||
(#if v > 1 [, ]
|
(#if v > 1 [, ]
|
||||||
+ [{v}]
|
+ [{v}]
|
||||||
+ #if v == 1 [st]
|
+ #if v == 1 [st]
|
||||||
+ #if v == 2 [nd]
|
+ #if v == 2 [nd]
|
||||||
+ #if v == 3 [rd]
|
+ #if v == 3 [rd]
|
||||||
+ #if v >= 4 [th])
|
+ #if v >= 4 [th])
|
||||||
} + [\]]
|
} + "]"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user