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],)})], + ) + } + ) +}