diff --git a/docs/src/reference/styling.md b/docs/src/reference/styling.md index 92b5f8c96..8e3937b4e 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 b4d14e01c..422c035f2 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 08a8e8f79..ab65008cc 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 bf2fd3b15..6b176d321 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 d6879cca4..8db1bf82f 100644 --- a/src/ide/complete.rs +++ b/src/ide/complete.rs @@ -723,6 +723,12 @@ fn code_completions(ctx: &mut CompletionContext, hashtag: bool) { "Redefines the look of an element.", ); + ctx.snippet_completion( + "show rule (everything)", + "show: ${}", + "Transforms everything that follows.", + ); + ctx.snippet_completion( "let binding", "let ${name} = ${value}", diff --git a/src/ide/highlight.rs b/src/ide/highlight.rs index c12cb87a8..7827b2c9b 100644 --- a/src/ide/highlight.rs +++ b/src/ide/highlight.rs @@ -279,9 +279,10 @@ fn highlight_ident(node: &LinkedNode) -> Option { 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 8082fd649..cd318983c 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 236a09cb0..18e52dc5a 100644 Binary files a/tests/ref/compiler/highlight.png and b/tests/ref/compiler/highlight.png differ diff --git a/tests/ref/text/raw-code.png b/tests/ref/text/raw-code.png index e03878705..a326b41ef 100644 Binary files a/tests/ref/text/raw-code.png and b/tests/ref/text/raw-code.png differ diff --git a/tests/typ/compiler/break-continue.typ b/tests/typ/compiler/break-continue.typ index e1041551f..d4bd01e37 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 2f076adec..0558fc444 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 f6298a285..09481957c 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 94facdeb1..cde4b112c 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,