Documentation
¶
Index ¶
- func ClearVMPool()
- func HTMLEscape(s string) native.HTML
- type BuildError
- type BuildOptions
- type CallKind
- type CallNode
- type CallRecord
- type Converter
- type ExitError
- type Files
- type Format
- type FormatFS
- type FunctionStats
- type PanicError
- func (p *PanicError) Error() string
- func (p *PanicError) Message() interface{}
- func (p *PanicError) Next() *PanicError
- func (p *PanicError) Path() string
- func (p *PanicError) Position() Position
- func (p *PanicError) Recovered() bool
- func (p *PanicError) StackFrames() []StackFrame
- func (p *PanicError) StackTrace() string
- func (p *PanicError) String() string
- type Position
- type PrintFunc
- type Profile
- type ProfileStats
- type Program
- type RunOptions
- type StackFrame
- type Template
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ClearVMPool ¶
func ClearVMPool()
ClearVMPool releases pooled VMs to allow garbage collection. Call this after large rendering operations complete to reduce memory usage from parallel rendering spikes (go render statements).
The pool will rebuild naturally on the next render operation - there is no persistent impact on performance, just a one-time ~10ms overhead for creating new VMs on the first render after clearing.
Thread-safe: can be called from any goroutine.
func HTMLEscape ¶
HTMLEscape escapes s, replacing the characters <, >, &, " and ' and returns the escaped string as HTML type.
Use HTMLEscape to put a trusted or untrusted string into an HTML element content or in a quoted attribute value. But don't use it with complex attributes like href, src, style, or any of the event handlers like onmouseover.
Example ¶
package main
import (
"fmt"
"gitlab.com/haproxy-haptic/scriggo"
)
func main() {
fmt.Println(scriggo.HTMLEscape("Rock & Roll!"))
}
Output: Rock & Roll!
Types ¶
type BuildError ¶
type BuildError struct {
// contains filtered or unexported fields
}
BuildError represents an error occurred building a program or template.
Example ¶
package main
import (
"fmt"
"gitlab.com/haproxy-haptic/scriggo"
)
func main() {
fsys := scriggo.Files{
"index.html": []byte(`{{ 42 + true }}`),
}
_, err := scriggo.BuildTemplate(fsys, "index.html", nil)
if err != nil {
fmt.Printf("Error has type %T\n", err)
fmt.Printf("Error message is: %s\n", err.(*scriggo.BuildError).Message())
fmt.Printf("Error path is: %s\n", err.(*scriggo.BuildError).Path())
}
}
Output: Error has type *scriggo.BuildError Error message is: invalid operation: 42 + true (mismatched types int and bool) Error path is: index.html
func (*BuildError) Error ¶
func (err *BuildError) Error() string
Error returns a string representation of the error.
func (*BuildError) Message ¶
func (err *BuildError) Message() string
Message returns the error message.
func (*BuildError) Path ¶
func (err *BuildError) Path() string
Path returns the path of the file where the error occurred.
func (*BuildError) Position ¶
func (err *BuildError) Position() Position
Position returns the position in the file where the error occurred.
type BuildOptions ¶
type BuildOptions struct {
// AllowGoStmt, when true, allows the use of the go statement.
AllowGoStmt bool
// Packages is a package importer that makes native packages available
// in programs and templates through the import statement.
Packages native.Importer
// TreeTransformer is a function that transforms a tree. If it is not nil,
// it is called before the type checking.
//
// Used for templates only.
TreeTransformer func(tree *ast.Tree) error
// NoParseShortShowStmt, when true, don't parse the short show statements.
//
// Used for templates only.
NoParseShortShowStmt bool
// MarkdownConverter converts a Markdown source code to HTML.
//
// Used for templates only.
MarkdownConverter Converter
// Globals declares constants, types, variables, functions and packages
// that are accessible from the code in the template.
//
// Used for templates only.
Globals native.Declarations
// EnableProfiling enables profiling instrumentation in the compiled template.
// When true, the runtime will collect timing data for function calls,
// macros, and includes during execution.
//
// Used for templates only.
EnableProfiling bool
}
BuildOptions contains options for building programs and templates.
type CallKind ¶
type CallKind int
CallKind distinguishes different types of calls in profiling. Internal implementation: runtime.ProfileCallKind (internal/runtime/profiler.go)
type CallNode ¶
type CallNode struct {
// Call is the call record for this node (nil for the root node).
Call *CallRecord
// Children are the child calls.
Children []*CallNode
}
CallNode represents a node in the call tree.
type CallRecord ¶
type CallRecord struct {
// ID is a unique identifier for this call.
ID uint64
// ParentID links to the parent call (0 for root calls).
ParentID uint64
// Name is the function or macro name.
Name string
// Package is the package path (empty for macros).
Package string
// File is the source file path.
File string
// Line is the source line number.
Line int
// Kind indicates the type of call.
Kind CallKind
// StartTime is when the call began.
StartTime time.Time
// Duration is how long the call took.
Duration time.Duration
// SelfDuration excludes time spent in child calls.
SelfDuration time.Duration
// TemplatePath is the template path for include calls.
TemplatePath string
}
CallRecord represents a single function or macro invocation during profiling. Internal implementation: runtime.ProfileCallRecord (internal/runtime/profiler.go)
type ExitError ¶
ExitError represents an exit from an execution with a non-zero status code. It may wrap the error that caused the exit.
An ExitError is conventionally passed to the Stop method of [native.Env so that the error code can be used as the process exit code.
func NewExitError ¶
NewExitError returns an exit error with the given status code and error. The status code should be in the range [1, 125] and err can be nil. It panics if code is zero.
type FormatFS ¶
FormatFS is the interface implemented by a file system that can determine the file format from a path name.
type FunctionStats ¶
type FunctionStats struct {
// Name is the function or macro name.
Name string
// Package is the package path (empty for macros).
Package string
// CallCount is the number of times this function was called.
CallCount int
// TotalTime is the sum of all call durations.
TotalTime time.Duration
// SelfTime is the sum of all self durations.
SelfTime time.Duration
// MinTime is the minimum call duration.
MinTime time.Duration
// MaxTime is the maximum call duration.
MaxTime time.Duration
}
FunctionStats contains per-function statistics.
type PanicError ¶
type PanicError struct {
// contains filtered or unexported fields
}
PanicError represents the error that occurs when an executed program or template calls the panic built-in and the panic is not recovered.
func (*PanicError) Error ¶
func (p *PanicError) Error() string
Error returns all currently active panics as a string.
To print only the message, use the PanicError.String method instead.
func (*PanicError) Message ¶
func (p *PanicError) Message() interface{}
Message returns the panic message.
func (*PanicError) Next ¶
func (p *PanicError) Next() *PanicError
Next returns the next panic in the chain.
func (*PanicError) Path ¶
func (p *PanicError) Path() string
Path returns the path of the file that panicked.
func (*PanicError) Position ¶
func (p *PanicError) Position() Position
Position returns the position in file where the panic occurred.
func (*PanicError) Recovered ¶
func (p *PanicError) Recovered() bool
Recovered reports whether it has been recovered.
func (*PanicError) StackFrames ¶
func (p *PanicError) StackFrames() []StackFrame
StackFrames returns the call stack as structured frames. The first frame is the immediate location of the panic, subsequent frames show the call chain up to the entry point.
func (*PanicError) StackTrace ¶
func (p *PanicError) StackTrace() string
StackTrace returns the stack trace at the point of the panic. The trace shows the call chain with file paths and line numbers.
func (*PanicError) String ¶
func (p *PanicError) String() string
String returns the panic message as a string.
type Position ¶
type Position struct {
Line int // line starting from 1
Column int // column in characters starting from 1
Start int // index of the first byte
End int // index of the last byte
}
Position is a position in a file.
type PrintFunc ¶
type PrintFunc func(interface{})
PrintFunc represents a function that prints the arguments of the print and println builtins.
type Profile ¶
type Profile struct {
// StartTime is when execution began.
StartTime time.Time
// EndTime is when execution completed.
EndTime time.Time
// TotalDuration is the wall-clock execution time.
TotalDuration time.Duration
// Calls contains all recorded function/macro calls in order.
Calls []*CallRecord
// contains filtered or unexported fields
}
Profile contains the profiling results from a template execution. Internal implementation: runtime.ProfileData (internal/runtime/profiler.go)
func (*Profile) Stats ¶
func (p *Profile) Stats() *ProfileStats
Stats returns aggregated statistics by function. This method computes the statistics lazily on first call and caches the result.
type ProfileStats ¶
type ProfileStats struct {
// TotalCalls is the total number of function/macro calls.
TotalCalls int
// NativeCalls is the count of native Go function calls.
NativeCalls int
// ScriggoCalls is the count of Scriggo function calls.
ScriggoCalls int
// MacroCalls is the count of macro invocations.
MacroCalls int
// ByFunction maps function key (pkg.name or name for macros) to stats.
ByFunction map[string]*FunctionStats
}
ProfileStats contains aggregated profiling statistics.
type Program ¶
type Program struct {
// contains filtered or unexported fields
}
Program is a program compiled with the Build function.
func Build ¶
func Build(fsys fs.FS, options *BuildOptions) (*Program, error)
Build builds a program from the package in the root of fsys with the given options.
Current limitation: fsys can contain only one Go file in its root.
If a build error occurs, it returns a *BuildError.
Example ¶
package main
import (
"log"
"gitlab.com/haproxy-haptic/scriggo"
)
func main() {
fsys := scriggo.Files{
"main.go": []byte(`
package main
func main() { }
`),
}
_, err := scriggo.Build(fsys, nil)
if err != nil {
log.Fatal(err)
}
}
func (*Program) Disassemble ¶
Disassemble disassembles the package with the given path and returns its assembly code. Native packages can not be disassembled.
func (*Program) Run ¶
func (p *Program) Run(options *RunOptions) error
Run starts the program and waits for it to complete. It can be called concurrently by multiple goroutines.
If the executed program panics, and it is not recovered, Run returns a *PanicError.
If the Stop method of native.Env is called, Run returns the argument passed to Stop.
If the Fatal method of native.Env is called, Run panics with the argument passed to Fatal.
If the context has been canceled, Run returns the error returned by the Err method of the context.
Example ¶
package main
import (
"fmt"
"log"
"gitlab.com/haproxy-haptic/scriggo"
"gitlab.com/haproxy-haptic/scriggo/native"
)
func main() {
fsys := scriggo.Files{
"main.go": []byte(`
package main
import "fmt"
func main() {
fmt.Println("Hello, I'm Scriggo!")
}
`),
}
opts := &scriggo.BuildOptions{
Packages: native.Packages{
"fmt": native.Package{
Name: "fmt",
Declarations: native.Declarations{
"Println": fmt.Println,
},
},
},
}
program, err := scriggo.Build(fsys, opts)
if err != nil {
log.Fatal(err)
}
err = program.Run(nil)
if err != nil {
log.Fatal(err)
}
}
Output: Hello, I'm Scriggo!
type RunOptions ¶
type RunOptions struct {
// Context is a context that can be read by native functions and methods
// via the Context method of native.Env. Canceling the context, the
// execution is terminated and the Run method returns Context.Err().
Context context.Context
// Print is called by the print and println builtins to print values.
// If it is nil, the print and println builtins format their arguments as
// expected and write the result to standard error.
Print PrintFunc
// Profile receives profiling data after execution completes.
// Only populated if the template was built with EnableProfiling=true.
// Caller must allocate: &scriggo.Profile{}
//
// Note: Native function calls executed as goroutines (via go statement)
// are not included in the profile since their execution is asynchronous.
//
// Used for templates only. Ignored for programs.
Profile *Profile
// MaxParallelRenders limits the number of concurrent "go render" operations.
// If zero or negative, defaults to 2*GOMAXPROCS.
//
// Used for templates only. Ignored for programs.
MaxParallelRenders int
}
RunOptions are the run options.
type StackFrame ¶
type StackFrame struct {
Function string // Function name
Path string // File path
Line int // Line number
}
StackFrame represents a single frame in the call stack.
type Template ¶
type Template struct {
// contains filtered or unexported fields
}
Template is a template compiled with the BuildTemplate function.
func BuildTemplate ¶
BuildTemplate builds the named template file rooted at the given file system. Imported, rendered and extended files are read from fsys.
If fsys implements FormatFS, file formats are read with its Format method, otherwise it depends on the file name extension
HTML : .html CSS : .css JavaScript : .js JSON : .json Markdown : .md .mdx .mkd .mkdn .mdown .markdown Text : all other extensions
If the named file does not exist, BuildTemplate returns an error satisfying errors.Is(err, fs.ErrNotExist).
If a build error occurs, it returns a *BuildError.
Example ¶
package main
import (
"log"
"gitlab.com/haproxy-haptic/scriggo"
)
func main() {
fsys := scriggo.Files{
"index.html": []byte(`{% name := "Scriggo" %}Hello, {{ name }}!`),
}
_, err := scriggo.BuildTemplate(fsys, "index.html", nil)
if err != nil {
log.Fatal(err)
}
}
func (*Template) Disassemble ¶
Disassemble disassembles a template and returns its assembly code.
n determines the maximum length, in runes, of a disassembled text:
n > 0: at most n runes; leading and trailing white space are removed n == 0: no text n < 0: all text
func (*Template) Run ¶
Run runs the template and write the rendered code to out. vars contains the values of the global variables. It can be called concurrently by multiple goroutines.
If the executed template panics, and it is not recovered, Run returns a *PanicError.
If the Stop method of native.Env is called, Run returns the argument passed to Stop.
If the Fatal method of native.Env is called, Run panics with the argument passed to Fatal.
If the context has been canceled, Run returns the error returned by the Err method of the context.
If a call to out.Write returns an error, a panic occurs. If the executed code does not recover the panic, Run returns the error returned by out.Write.
Example ¶
package main
import (
"log"
"os"
"gitlab.com/haproxy-haptic/scriggo"
)
func main() {
fsys := scriggo.Files{
"index.html": []byte(`{% name := "Scriggo" %}Hello, {{ name }}!`),
}
template, err := scriggo.BuildTemplate(fsys, "index.html", nil)
if err != nil {
log.Fatal(err)
}
err = template.Run(os.Stdout, nil, nil)
if err != nil {
log.Fatal(err)
}
}
Output: Hello, Scriggo!
Directories
¶
| Path | Synopsis |
|---|---|
|
Package ast declares the types used to define program and template trees.
|
Package ast declares the types used to define program and template trees. |
|
astutil
Package astutil implements methods to walk and dump a tree.
|
Package astutil implements methods to walk and dump a tree. |
|
Package builtin provides simple functions, types, constants and a package that can be used as globals in a Scriggo template.
|
Package builtin provides simple functions, types, constants and a package that can be used as globals in a Scriggo template. |
|
cmd
|
|
|
scriggo
command
|
|
|
internal
|
|
|
compiler
Package compiler implements parsing, type checking and emitting of sources.
|
Package compiler implements parsing, type checking and emitting of sources. |
|
compiler/types
Package types implements functions and types to represent and work with Scriggo types.
|
Package types implements functions and types to represent and work with Scriggo types. |
|
Package native provides types to implement native variables, constants, functions, types and packages that can be imported or used as builtins in programs and templates.
|
Package native provides types to implement native variables, constants, functions, types and packages that can be imported or used as builtins in programs and templates. |