From 2a1d2990e78d19c1496cb84e1921145c4304ea48 Mon Sep 17 00:00:00 2001 From: David Vogel Date: Thu, 27 Feb 2025 16:08:02 +0100 Subject: [PATCH] Add simple example --- examples/simple/README.md | 12 ++++++++++++ examples/simple/main.go | 37 +++++++++++++++++++++++++++++++++++ examples/simple/main_test.go | 16 +++++++++++++++ examples/simple/output.pdf | Bin 0 -> 10876 bytes 4 files changed, 65 insertions(+) create mode 100644 examples/simple/README.md create mode 100644 examples/simple/main.go create mode 100644 examples/simple/main_test.go create mode 100644 examples/simple/output.pdf diff --git a/examples/simple/README.md b/examples/simple/README.md new file mode 100644 index 0000000..27f4e83 --- /dev/null +++ b/examples/simple/README.md @@ -0,0 +1,12 @@ +# Simple example + +This example shows how to render Typst documents directly from strings in Go. + +## The pros and cons + +The main advantage of this method is that it's really easy to set up. +In the most simple case you build your Typst markup by concatenating strings, or by using `fmt.Sprintf`. + +The downside is that the final Typst markup is only generated on demand. +This means that you can't easily use the existing Typst tooling to write, update or debug your Typst markup. +Especially as your your documents get more complex, you should switch to other methods. diff --git a/examples/simple/main.go b/examples/simple/main.go new file mode 100644 index 0000000..ae8920b --- /dev/null +++ b/examples/simple/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "bytes" + "fmt" + "log" + "os" + "time" + + "github.com/Dadido3/go-typst" +) + +func main() { + // Convert a time.Time value into Typst markup. + date, err := typst.MarshalVariable(time.Now()) + if err != nil { + log.Panicf("Failed to marshal date into Typst markup: %v", err) + } + + // Write Typst markup into buffer. + var markup bytes.Buffer + fmt.Fprintf(&markup, `= Hello world + +This document was created at #%s.display() using typst-go.`, date) + + // 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() + + typstCLI := typst.CLI{} + if err := typstCLI.Compile(&markup, f, nil); err != nil { + log.Panic("failed to compile document: %w", err) + } +} diff --git a/examples/simple/main_test.go b/examples/simple/main_test.go new file mode 100644 index 0000000..96ccbb0 --- /dev/null +++ b/examples/simple/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/simple/output.pdf b/examples/simple/output.pdf new file mode 100644 index 0000000000000000000000000000000000000000..24f0857d8acd09c114db44f88cd2a4804d2a9c76 GIT binary patch literal 10876 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 literal 0 HcmV?d00001