From 9268a6691e0c6ab16b92b47e8f83e2a5977e9407 Mon Sep 17 00:00:00 2001
From: David Vogel <Dadido3@aol.com>
Date: Thu, 27 Feb 2025 16:07:34 +0100
Subject: [PATCH] Rework passing-values example

This changes the example to use the template pattern; we now have a single Typst file containing a template function.
Instead of loading and rendering the template, we will now generate temporary Typst markup that will import the template function and call it with custom data.

This also means that it's pretty easy to test, preview and debug the template.typ outside of go-typst.
All that is needed is another Typst file which will call the template with mock data.

Also, we now use Compile instead of CompileWithVariables and inject encoded Go values into our temporary markup.
---
 examples/passing-values/README.md             |  13 ++++
 examples/passing-values/main.go               |  22 +++++--
 examples/passing-values/main_test.go          |  16 +++++
 examples/passing-values/output.pdf            | Bin 18978 -> 20665 bytes
 ...ate-test-data.typ => template-preview.typ} |  11 +++-
 examples/passing-values/template.typ          |  61 +++++++++---------
 6 files changed, 85 insertions(+), 38 deletions(-)
 create mode 100644 examples/passing-values/README.md
 create mode 100644 examples/passing-values/main_test.go
 rename examples/passing-values/{template-test-data.typ => template-preview.typ} (60%)

diff --git a/examples/passing-values/README.md b/examples/passing-values/README.md
new file mode 100644
index 0000000..492143d
--- /dev/null
+++ b/examples/passing-values/README.md
@@ -0,0 +1,13 @@
+# Passing values example
+
+This example demonstrates how to pass values to Typst, which can be useful in rendering custom documents such as reports, invoices, and more.
+
+## How it works
+
+This example follows the [template pattern](https://typst.app/docs/tutorial/making-a-template/) described in the Typst documentation.
+Here is a short overview of the files:
+
+- [template.typ](template.typ) defines a Typst template function that constructs a document based on parameters.
+- [main.go](main.go) shows how to convert/encode Go values into Typst markup, and how to call/render the template with these converted values.
+- [template-preview.typ](template-preview.typ) also invokes the template while providing mock data.
+    This is useful when you want to preview, update or debug the template.
diff --git a/examples/passing-values/main.go b/examples/passing-values/main.go
index 407a441..6c75bd3 100644
--- a/examples/passing-values/main.go
+++ b/examples/passing-values/main.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+	"bytes"
 	"log"
 	"os"
 	"time"
@@ -8,7 +9,7 @@ import (
 	"github.com/Dadido3/go-typst"
 )
 
-// DataEntry contains fake data to be passed to typst.
+// DataEntry contains data to be passed to Typst.
 type DataEntry struct {
 	Name string
 	Size struct{ X, Y, Z float64 }
@@ -25,21 +26,28 @@ var TestData = []DataEntry{
 }
 
 func main() {
-	typstCLI := typst.CLI{}
+	var markup bytes.Buffer
 
-	r, err := os.Open("template.typ")
-	if err != nil {
-		log.Panicf("Failed to open template file for reading: %v.", err)
+	// Inject Go values as Typst markup.
+	if err := typst.InjectValues(&markup, map[string]any{"data": TestData, "customText": "This data is coming from a Go application."}); err != nil {
+		log.Panicf("Failed to inject values into Typst markup: %v.", err)
 	}
-	defer r.Close()
 
+	// Import the template and invoke the template function with the custom data.
+	// Show is used to replace the current document with whatever content the template function in `template.typ` returns.
+	markup.WriteString(`
+#import "template.typ": template
+#show: doc => template(data, customText)`)
+
+	// Compile the prepared markup with Typst and write the result it into `output.pdf`.
 	f, err := os.Create("output.pdf")
 	if err != nil {
 		log.Panicf("Failed to create output file: %v.", err)
 	}
 	defer f.Close()
 
-	if err := typstCLI.CompileWithVariables(r, f, nil, map[string]any{"Data": TestData}); err != nil {
+	typstCLI := typst.CLI{}
+	if err := typstCLI.Compile(&markup, f, nil); err != nil {
 		log.Panicf("Failed to compile document: %v.", err)
 	}
 }
diff --git a/examples/passing-values/main_test.go b/examples/passing-values/main_test.go
new file mode 100644
index 0000000..96ccbb0
--- /dev/null
+++ b/examples/passing-values/main_test.go
@@ -0,0 +1,16 @@
+package main
+
+import (
+	"testing"
+)
+
+// Run the example as a test.
+func TestMain(t *testing.T) {
+	defer func() {
+		if r := recover(); r != nil {
+			t.Error(r)
+		}
+	}()
+
+	main()
+}
diff --git a/examples/passing-values/output.pdf b/examples/passing-values/output.pdf
index 718a7eae313213dc3529e5569635c780b5f0f39f..68cfaa89afcdf6b3f249aae239eb6e7ab6cc6844 100644
GIT binary patch
delta 10774
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

delta 9161
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
J19|nw{}0l<c@Y2r

diff --git a/examples/passing-values/template-test-data.typ b/examples/passing-values/template-preview.typ
similarity index 60%
rename from examples/passing-values/template-test-data.typ
rename to examples/passing-values/template-preview.typ
index 6132a68..2025097 100644
--- a/examples/passing-values/template-test-data.typ
+++ b/examples/passing-values/template-preview.typ
@@ -1,5 +1,12 @@
-#let Data = (
+// Prepare data that will be used as preview.
+#let data = (
   (Name: "Bell", Size: (X: 80, Y: 40, Z: 40), Created: datetime(year: 2010, month: 12, day: 1, hour: 12, minute: 13, second: 14), Numbers: (1, 2, 3)),
   (Name: "Bell", Size: (X: 80, Y: 40, Z: 40), Created: datetime(year: 2010, month: 12, day: 1, hour: 12, minute: 13, second: 14), Numbers: (10, 12, 15)),
   (Name: "Bell", Size: (X: 80, Y: 40, Z: 40), Created: datetime(year: 2010, month: 12, day: 1, hour: 12, minute: 13, second: 14), Numbers: (100, 109, 199, 200)),
-)
\ No newline at end of file
+)
+
+#let customText = "Hey, this is example data to test the template."
+
+// Invoke the template with the preview data and replace this whole document with the result.
+#import "template.typ": template
+#show: doc => template(data, customText)
diff --git a/examples/passing-values/template.typ b/examples/passing-values/template.typ
index 6d3ef88..4bd7101 100644
--- a/examples/passing-values/template.typ
+++ b/examples/passing-values/template.typ
@@ -1,33 +1,36 @@
-#set page(paper: "a4")
+#let template(data, customText) = {
+  set page(paper: "a4")
 
-// Uncomment to use test data.
-//#import "template-test-data.typ": Data
+  [= Example]
 
-= List of items
+  customText
 
-#show table.cell.where(y: 0): strong
-#set table(
-  stroke: (x, y) => if y == 0 {
-    (bottom: 0.7pt + black)
-  },
-)
+  [== List of items]
 
-#table(
-  columns: 5,
-  table.header(
-    [Name],
-    [Size],
-    [Example box],
-    [Created],
-    [Numbers],
-  ),
-  ..for value in Data {
-    (
-      [#value.Name],
-      [#value.Size],
-      box(fill: black, width: 0.1mm * value.Size.X, height: 0.1mm * value.Size.Y),
-      value.Created.display(),
-      [#list(..for num in value.Numbers {([#num],)})],
-    )
-  }
-)
+  show table.cell.where(y: 0): strong
+  set table(
+    stroke: (x, y) => if y == 0 {
+      (bottom: 0.7pt + black)
+    },
+  )
+
+  table(
+    columns: 5,
+    table.header(
+      [Name],
+      [Size],
+      [Example box],
+      [Created],
+      [Numbers],
+    ),
+    ..for value in data {
+      (
+        [#value.Name],
+        [#value.Size],
+        box(fill: black, width: 0.1mm * value.Size.X, height: 0.1mm * value.Size.Y),
+        value.Created.display(),
+        [#list(..for num in value.Numbers {([#num],)})],
+      )
+    }
+  )
+}