package step import "io" import "time" import "strings" import "html/template" // Document represents a STEP file. type Document struct { Author string Title string Extends string // WORM: environment *Environment frontMatter FrontMatter name string parseTime time.Time template *template.Template } // Execute executes this document and writes the result to the output. This // method is safe for concurrent use by multiple goroutines. func (this *Document) Execute (output io.Writer, data ExecutionData) error { if this.Extends == "" { // no parent return this.template.Execute(output, data) } // execute into string builder outputBuilder := strings.Builder { } err := this.template.Execute(&outputBuilder, data) if err != nil { return err } // execute parent with this document's result parent, err := this.environment.Parse(this.Extends) if err != nil { return err } return parent.Execute(output, ExecutionData { Data: data.Data, Child: &ExecutionResult { Author: this.Author, Title: this.Title, Extends: this.Extends, FrontMatter: this.frontMatter, Body: template.HTML(outputBuilder.String()), }, }) } // ExecutionData is data made available to documents as they are being exeucted. type ExecutionData struct { Data any // Custom data Child *ExecutionResult // The child document's result, if applicable } // ExecutionResult is the result of executing a document. type ExecutionResult struct { Author string Title string Extends string FrontMatter FrontMatter Body template.HTML }