summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-02-12 20:23:52 +0100
committerLaurenz <laurmaedje@gmail.com>2023-02-12 20:25:24 +0100
commit7b2cdb9d95331bba87f9ae54c71b7103a10faf1c (patch)
tree8b0581fd14849e6a6ceaa9527ed8534e05d2b695
parent77c29b36d4e8706163c8d52359577e403a15a1ae (diff)
Require colon in show rule
-rw-r--r--docs/src/reference/styling.md2
-rw-r--r--docs/src/reference/syntax.md3
-rw-r--r--docs/src/tutorial/3-advanced.md16
-rw-r--r--docs/src/tutorial/4-template.md10
-rw-r--r--src/ide/complete.rs6
-rw-r--r--src/ide/highlight.rs7
-rw-r--r--src/syntax/parser.rs5
-rw-r--r--tests/ref/compiler/highlight.pngbin87216 -> 86597 bytes
-rw-r--r--tests/ref/text/raw-code.pngbin40777 -> 40759 bytes
-rw-r--r--tests/typ/compiler/break-continue.typ2
-rw-r--r--tests/typ/compiler/show-bare.typ12
-rw-r--r--tests/typ/compiler/show-node.typ2
-rw-r--r--tests/typ/visualize/shape-circle.typ2
13 files changed, 38 insertions, 29 deletions
diff --git a/docs/src/reference/styling.md b/docs/src/reference/styling.md
index 92b5f8c9..8e3937b4 100644
--- a/docs/src/reference/styling.md
+++ b/docs/src/reference/styling.md
@@ -110,7 +110,7 @@ element. And apart from a function, the left-hand side of a show rule can also
take a number of other _selectors_ that define what to apply the transformation
to:
-- **Everything:** `{show rest => ..}` \
+- **Everything:** `{show: rest => ..}` \
Transform everything after the show rule. This is useful to apply a more
complex layout to your whole document without wrapping everything in a giant
function call.
diff --git a/docs/src/reference/syntax.md b/docs/src/reference/syntax.md
index b4d14e01..422c035f 100644
--- a/docs/src/reference/syntax.md
+++ b/docs/src/reference/syntax.md
@@ -89,8 +89,9 @@ a table listing all syntax that is available in code mode:
| Named function | `{let f(x) = 2 * x}` | [Function]($type/function) |
| Set rule | `{set text(14pt)}` | [Styling]($styling/#set-rules) |
| Set-if rule | `{set text(..) if .. }` | [Styling]($styling/#set-rules) |
-| Show rule | `{show raw: it => {..}}` | [Styling]($styling/#set-rules) |
| Show-set rule | `{show par: set block(..)}` | [Styling]($styling/#show-rules) |
+| Show rule with function | `{show raw: it => {..}}` | [Styling]($styling/#show-rules) |
+| Show-everything rule | `{show: columns.with(2)}` | [Styling]($styling/#show-rules) |
| Conditional | `{if x == 1 {..} else {..}}` | [Scripting]($scripting/#conditionals) |
| For loop | `{for x in (1, 2, 3) {..}}` | [Scripting]($scripting/#loops) |
| While loop | `{while x < 10 {..}}` | [Scripting]($scripting/#loops) |
diff --git a/docs/src/tutorial/3-advanced.md b/docs/src/tutorial/3-advanced.md
index 08a8e8f7..ab65008c 100644
--- a/docs/src/tutorial/3-advanced.md
+++ b/docs/src/tutorial/3-advanced.md
@@ -268,11 +268,11 @@ abstract to be in two columns, we need to apply the column function to our whole
document.
Instead of wrapping the whole document in a giant function call, we can use an
-"everything" show rule. This show rule does not feature a colon. Instead, we
-directly provide a function that is given the rest of the document as a
-parameter. We have called the parameter `rest` here, but you are free to choose
-any name. The rule can then do anything with this content. In our case, it
-passes it on to the `columns` function.
+"everything" show rule. To write such a show rule, put a colon directly behind
+the show keyword and then provide a function. This function is given the rest of
+the document as a parameter. We have called the parameter `rest` here, but you
+are free to choose any name. The function can then do anything with this
+content. In our case, it passes it on to the `columns` function.
```example
>>> #let title = [
@@ -323,7 +323,7 @@ passes it on to the `columns` function.
>>> #v(4mm)
<<< ...
-#show rest => columns(2, rest)
+#show: rest => columns(2, rest)
= Introduction
#lorem(300)
@@ -391,7 +391,7 @@ a way to set any of that, we need to write our own heading show rule.
>>> ]
>>>
>>> #v(4mm)
->>> #show rest => columns(2, rest)
+>>> #show: rest => columns(2, rest)
>>>
>>> = Introduction
>>> #lorem(35)
@@ -480,7 +480,7 @@ differentiate between section and subsection headings:
>>> ]
>>>
>>> #v(4mm)
->>> #show rest => columns(2, rest)
+>>> #show: rest => columns(2, rest)
>>>
>>> = Introduction
>>> #lorem(35)
diff --git a/docs/src/tutorial/4-template.md b/docs/src/tutorial/4-template.md
index bf2fd3b1..6b176d32 100644
--- a/docs/src/tutorial/4-template.md
+++ b/docs/src/tutorial/4-template.md
@@ -48,7 +48,7 @@ function to our whole document. Let's do that with our `amazed` function.
>>> #let amazed(term, color: blue) = {
>>> text(color, box[✨ #term ✨])
>>> }
-#show amazed
+#show: amazed
I choose to focus on the good
in my life and let go of any
negative thoughts or beliefs.
@@ -72,7 +72,7 @@ that content block.
#doc
]
-#show template
+#show: template
I am learning something cool today.
It's going great so far!
```
@@ -125,7 +125,7 @@ previous chapter.
columns(2, doc)
}
-#show doc => conf([Paper title], doc)
+#show: doc => conf([Paper title], doc)
= Introduction
#lorem(90)
@@ -161,7 +161,7 @@ things readable, we'll add those as named arguments. In the end, we want it to
work like this:
```typ
-#show doc => conf(
+#show: doc => conf(
title: [Towards Improved Modelling],
authors: (
(
@@ -324,7 +324,7 @@ path of the file after the `{from}` keyword.
>>>}
<<< #import "conf.typ": conf
-#show doc => conf(
+#show: doc => conf(
title: [
Towards Improved Modelling
],
diff --git a/src/ide/complete.rs b/src/ide/complete.rs
index d6879cca..8db1bf82 100644
--- a/src/ide/complete.rs
+++ b/src/ide/complete.rs
@@ -724,6 +724,12 @@ fn code_completions(ctx: &mut CompletionContext, hashtag: bool) {
);
ctx.snippet_completion(
+ "show rule (everything)",
+ "show: ${}",
+ "Transforms everything that follows.",
+ );
+
+ ctx.snippet_completion(
"let binding",
"let ${name} = ${value}",
"Saves a value in a variable.",
diff --git a/src/ide/highlight.rs b/src/ide/highlight.rs
index c12cb87a..7827b2c9 100644
--- a/src/ide/highlight.rs
+++ b/src/ide/highlight.rs
@@ -279,9 +279,10 @@ fn highlight_ident(node: &LinkedNode) -> Option<Tag> {
ancestor = ancestor.parent()?;
}
- // Are we directly before a show rule colon?
- if next_leaf.map(|leaf| leaf.kind()) == Some(SyntaxKind::Colon)
- && ancestor.parent_kind() == Some(SyntaxKind::ShowRule)
+ // Are we directly before or behind a show rule colon?
+ if ancestor.parent_kind() == Some(SyntaxKind::ShowRule)
+ && (next_leaf.map(|leaf| leaf.kind()) == Some(SyntaxKind::Colon)
+ || node.prev_leaf().map(|leaf| leaf.kind()) == Some(SyntaxKind::Colon))
{
return Some(Tag::Function);
}
diff --git a/src/syntax/parser.rs b/src/syntax/parser.rs
index 8082fd64..cd318983 100644
--- a/src/syntax/parser.rs
+++ b/src/syntax/parser.rs
@@ -852,10 +852,11 @@ fn set_rule(p: &mut Parser) {
fn show_rule(p: &mut Parser) {
let m = p.marker();
p.assert(SyntaxKind::Show);
- code_expr(p);
- if p.eat_if(SyntaxKind::Colon) {
+ if !p.at(SyntaxKind::Colon) {
code_expr(p);
}
+ p.expect(SyntaxKind::Colon);
+ code_expr(p);
p.wrap(m, SyntaxKind::ShowRule);
}
diff --git a/tests/ref/compiler/highlight.png b/tests/ref/compiler/highlight.png
index 236a09cb..18e52dc5 100644
--- a/tests/ref/compiler/highlight.png
+++ b/tests/ref/compiler/highlight.png
Binary files differ
diff --git a/tests/ref/text/raw-code.png b/tests/ref/text/raw-code.png
index e0387870..a326b41e 100644
--- a/tests/ref/text/raw-code.png
+++ b/tests/ref/text/raw-code.png
Binary files differ
diff --git a/tests/typ/compiler/break-continue.typ b/tests/typ/compiler/break-continue.typ
index e1041551..d4bd01e3 100644
--- a/tests/typ/compiler/break-continue.typ
+++ b/tests/typ/compiler/break-continue.typ
@@ -116,7 +116,7 @@
// Everything should be in smallcaps.
#for color in (red, blue, green, yellow) [
#set text("Roboto")
- #show it => text(fill: color, it)
+ #show: it => text(fill: color, it)
#smallcaps(if color != green [
Some
] else [
diff --git a/tests/typ/compiler/show-bare.typ b/tests/typ/compiler/show-bare.typ
index 2f076ade..0558fc44 100644
--- a/tests/typ/compiler/show-bare.typ
+++ b/tests/typ/compiler/show-bare.typ
@@ -9,25 +9,25 @@
T. Ypst
]
-#show columns.with(2)
+#show: columns.with(2)
Great typography is at the essence of great storytelling. It is the medium that
transports meaning from parchment to reader, the wave that sparks a flame
in booklovers and the great fulfiller of human need.
---
// Test bare show in content block.
-A #[_B #show c => [*#c*]; C_] D
+A #[_B #show: c => [*#c*]; C_] D
---
// Test style precedence.
#set text(fill: eastern, size: 1.5em)
-#show text.with(fill: forest)
+#show: text.with(fill: forest)
Forest
---
-#show [Shown]
+#show: [Shown]
Ignored
---
-// Error: 5-19 show is only allowed directly in code and content blocks
-#{ (show body => 2) * body }
+// Error: 5-20 show is only allowed directly in code and content blocks
+#{ (show: body => 2) * body }
diff --git a/tests/typ/compiler/show-node.typ b/tests/typ/compiler/show-node.typ
index f6298a28..09481957 100644
--- a/tests/typ/compiler/show-node.typ
+++ b/tests/typ/compiler/show-node.typ
@@ -64,7 +64,7 @@ Another text.
world
{
set text(blue)
- show it => {
+ show: it => {
show "o": "Ø"
it
}
diff --git a/tests/typ/visualize/shape-circle.typ b/tests/typ/visualize/shape-circle.typ
index 94facdeb..cde4b112 100644
--- a/tests/typ/visualize/shape-circle.typ
+++ b/tests/typ/visualize/shape-circle.typ
@@ -40,7 +40,7 @@ Expanded by height.
---
// Test relative sizing.
#set text(fill: white)
-#show rect.with(width: 100pt, height: 50pt, inset: 0pt, fill: rgb("aaa"))
+#show: rect.with(width: 100pt, height: 50pt, inset: 0pt, fill: rgb("aaa"))
#set align(center + horizon)
#stack(
dir: ltr,