Documentation
¶
Overview ¶
Package lofigui provides a simple interface for building lightweight web UIs Similar to the Python version, it provides a print-like interface for generating HTML
Index ¶
- Constants
- func Buffer() string
- func GetFaviconDataURI() string
- func GetFaviconHTMLTag() string
- func GetFaviconICO() ([]byte, error)
- func GetFaviconSVG() string
- func HTML(msg string)
- func Markdown(msg string)
- func Print(msg string, options ...PrintOption)
- func Printf(format string, args ...interface{})
- func Reset()
- func ServeFavicon(w http.ResponseWriter, r *http.Request)
- func Table(data [][]string, options ...TableOption)
- type App
- func (app *App) ControllerName() string
- func (app *App) EndAction()
- func (app *App) GetController() *Controller
- func (app *App) HandleDisplay(w http.ResponseWriter, r *http.Request)
- func (app *App) HandleRoot(w http.ResponseWriter, r *http.Request, modelFunc func(context.Context, *App), ...)
- func (app *App) IsActionRunning() bool
- func (app *App) SetController(ctrl *Controller)
- func (app *App) SetDisplayURL(url string)
- func (app *App) SetRefreshTime(seconds int)
- func (app *App) StartAction() context.Context
- func (app *App) StateDict(r *http.Request, extraContext pongo2.Context) pongo2.Context
- func (app *App) WriteRefreshHeader(w http.ResponseWriter)
- type Context
- func (c *Context) Buffer() string
- func (c *Context) HTML(msg string)
- func (c *Context) Markdown(msg string)
- func (c *Context) Print(msg string, options ...PrintOption)
- func (c *Context) Printf(format string, args ...interface{})
- func (c *Context) Reset()
- func (c *Context) Table(data [][]string, options ...TableOption)
- type Controller
- func (ctrl *Controller) GetTemplate() *pongo2.Template
- func (ctrl *Controller) HandleDisplay(w http.ResponseWriter, r *http.Request, extraContext pongo2.Context)
- func (ctrl *Controller) ReloadTemplate(templatePath string) error
- func (ctrl *Controller) RenderTemplate(w http.ResponseWriter, context pongo2.Context) error
- func (ctrl *Controller) ServeHTTP(w http.ResponseWriter, r *http.Request)
- func (ctrl *Controller) StateDict(r *http.Request) pongo2.Context
- type ControllerConfig
- type PrintOption
- type TableOption
Constants ¶
const FaviconICOBase64 = `` /* 364-byte string literal not displayed */
FaviconICOBase64 is the base64-encoded favicon.ico file This is a 16x16 pixel ICO file with a simple "L" logo
const FaviconSVG = `` /* 199-byte string literal not displayed */
FaviconSVG is the SVG version of the favicon
LayoutNavbar has a fixed navbar (is-primary) with app name + status tag, a section with container for results, and a footer with version.
const LayoutSingle = `` /* 449-byte string literal not displayed */
LayoutSingle is a minimal layout: section > container > results. No navbar, no footer.
const LayoutThreePanel = `` /* 1202-byte string literal not displayed */
LayoutThreePanel has a navbar, a sidebar column (is-3) and main content column, plus a footer. Pass sidebar content via extra context key "sidebar".
Variables ¶
This section is empty.
Functions ¶
func GetFaviconDataURI ¶
func GetFaviconDataURI() string
GetFaviconDataURI returns the favicon as a data URI
func GetFaviconHTMLTag ¶
func GetFaviconHTMLTag() string
GetFaviconHTMLTag returns an HTML link tag for the favicon
func GetFaviconICO ¶
GetFaviconICO returns the favicon as ICO format bytes
func HTML ¶
func HTML(msg string)
HTML adds raw HTML to buffer (no escaping) WARNING: Only use with trusted input to avoid XSS
func Print ¶
func Print(msg string, options ...PrintOption)
Print adds text to the buffer as HTML paragraphs Similar to Python's lofigui.print()
func Printf ¶
func Printf(format string, args ...interface{})
Printf is a convenience function for formatted printing
func ServeFavicon ¶
func ServeFavicon(w http.ResponseWriter, r *http.Request)
ServeFavicon is an http.HandlerFunc that serves the favicon Usage:
http.HandleFunc("/favicon.ico", lofigui.ServeFavicon)
func Table ¶
func Table(data [][]string, options ...TableOption)
Table generates an HTML table with Bulma styling
Types ¶
type App ¶ added in v0.9.0
type App struct {
Version string // Version/name of the application
PollCount int // Number of polling cycles
// contains filtered or unexported fields
}
App provides a wrapper around a Controller with safe controller replacement.
The app manages:
- Action state (running/stopped)
- Auto-refresh polling during actions
- Version information
- Controller lifecycle and composition
When replacing a controller, App ensures that any running action is safely stopped before the new controller is set. This prevents dangling goroutines and ensures clean state transitions.
Example usage:
app := lofigui.NewApp()
ctrl, err := lofigui.NewController(lofigui.ControllerConfig{
TemplatePath: "templates/page.html",
})
if err != nil {
log.Fatal(err)
}
app.SetController(ctrl)
func NewAppWithController ¶ added in v0.9.0
func NewAppWithController(ctrl *Controller) *App
NewAppWithController creates a new App with the given controller.
func (*App) ControllerName ¶ added in v0.13.0
ControllerName returns the name of the current controller. Returns "Lofigui no controller" if no controller is set.
func (*App) EndAction ¶ added in v0.9.0
func (app *App) EndAction()
EndAction stops the action and disables auto-refresh polling. Also cancels the context returned by StartAction.
func (*App) GetController ¶ added in v0.9.0
func (app *App) GetController() *Controller
GetController returns the current controller. Returns nil if no controller is set.
func (*App) HandleDisplay ¶ added in v0.9.0
func (app *App) HandleDisplay(w http.ResponseWriter, r *http.Request)
HandleDisplay renders the template with full app state (including polling/refresh). Sets the HTTP Refresh header when polling is active, so the browser reloads the current page (not a hardcoded URL). Returns an error if no controller is set.
func (*App) HandleRoot ¶ added in v0.9.0
func (app *App) HandleRoot(w http.ResponseWriter, r *http.Request, modelFunc func(context.Context, *App), resetBuffer bool)
HandleRoot is a helper for the root endpoint that starts an action.
This function:
- Resets the buffer (if resetBuffer is true)
- Starts the action (app-level state) and gets a cancellable context
- Launches the model function in a goroutine with the context
- Returns HTML that redirects to the display page
The model function receives a context.Context that is cancelled when the action is stopped (EndAction) or replaced by a new action (another HandleRoot call).
Example:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
app.HandleRoot(w, r, model, true)
})
func (*App) IsActionRunning ¶ added in v0.9.0
IsActionRunning returns whether an action is currently running. This checks the app-level state (singleton active model).
func (*App) SetController ¶ added in v0.9.0
func (app *App) SetController(ctrl *Controller)
SetController sets a new controller with safe cleanup of the existing controller.
If there's an existing controller with a running action, this will safely stop the action before replacing with the new controller. This prevents dangling goroutines and ensures clean state transitions.
The cleanup logic is defensive - it handles controllers that may not have standard methods implemented and silently ignores any errors during cleanup.
This method is idempotent - if the same controller is being set again, no cleanup is performed and the running action continues.
Args:
- ctrl: The new controller to set (can be nil to clear)
func (*App) SetDisplayURL ¶ added in v0.13.0
SetDisplayURL sets the URL to redirect to for displaying results.
func (*App) SetRefreshTime ¶ added in v0.13.0
SetRefreshTime sets the refresh time in seconds for auto-refresh polling.
func (*App) StartAction ¶ added in v0.9.0
StartAction starts an action and enables auto-refresh polling. This implements the singleton active model concept - only one action can be running at a time across the entire app.
If a previous action is still running, its context is cancelled before starting the new one. Returns a context that will be cancelled when the action is stopped or replaced.
func (*App) StateDict ¶ added in v0.13.0
StateDict generates a template context dictionary with app and controller state merged.
This method provides centralized state management by combining:
- App-level state (version, controller name, polling status)
- Controller-level state (buffer content)
- Extra context passed by the caller
Returns a pongo2.Context containing:
- request: The HTTP request object
- version: Application version string
- controller_name: Name of the active controller
- results: Buffer content from Print/Markdown calls
- polling: "Running" or "Stopped" (app-level singleton state)
- poll_count: Number of refresh cycles (app-level)
- refresh: Always empty string (refresh now uses HTTP header, kept for template compat)
- Any additional keys from extraContext
Example:
func (app *App) HandleCustomDisplay(w http.ResponseWriter, r *http.Request) {
extra := pongo2.Context{"title": "My Page"}
data := app.StateDict(r, extra)
// Use data for template rendering
}
func (*App) WriteRefreshHeader ¶ added in v0.17.4
func (app *App) WriteRefreshHeader(w http.ResponseWriter)
WriteRefreshHeader sets the HTTP Refresh header when polling is active. This causes the browser to reload the current page after refreshTime seconds, which works correctly for multi-page apps (unlike a meta refresh with a hardcoded URL).
type Context ¶
type Context struct {
// contains filtered or unexported fields
}
Context manages the output buffer for HTML generation
func NewContext ¶
func NewContext() *Context
NewContext creates a new Context with optional max buffer size
func (*Context) Print ¶
func (c *Context) Print(msg string, options ...PrintOption)
Print adds text to the buffer as HTML paragraphs
func (*Context) Table ¶
func (c *Context) Table(data [][]string, options ...TableOption)
Table generates an HTML table
type Controller ¶ added in v0.6.0
type Controller struct {
Name string // Name of the controller
// contains filtered or unexported fields
}
Controller manages template rendering and buffer content for lofigui apps.
The Controller provides:
- Template rendering with state
- Access to the output buffer
- Customizable template directories and paths
NOTE: Action state management (polling, refresh) is now handled at the App level to implement the singleton active model concept. Use App methods for action control.
Example usage:
// Basic usage with defaults
ctrl, err := lofigui.NewController(lofigui.ControllerConfig{
TemplatePath: "../templates/hello.html",
})
// With custom settings
ctrl, err := lofigui.NewController(lofigui.ControllerConfig{
TemplatePath: "../templates/hello.html",
Name: "My Custom Controller",
})
func NewController ¶ added in v0.6.0
func NewController(config ControllerConfig) (*Controller, error)
NewController creates a new Controller with the given configuration.
Either TemplatePath or TemplateString must be provided. If both are set, TemplateString takes precedence.
Returns an error if the template cannot be loaded or parsed.
Example:
// From file:
ctrl, err := lofigui.NewController(lofigui.ControllerConfig{
TemplatePath: "../templates/hello.html",
})
// From embedded string:
//go:embed templates/hello.html
var helloTemplate string
ctrl, err := lofigui.NewController(lofigui.ControllerConfig{
TemplateString: helloTemplate,
})
func NewControllerFromDir ¶ added in v0.6.0
func NewControllerFromDir(templateDir, templateName string) (*Controller, error)
NewControllerFromDir creates a new Controller by loading a template from a directory.
This is a convenience function that constructs the full template path.
Example:
ctrl, err := lofigui.NewControllerFromDir("../templates", "hello.html")
func NewControllerFromString ¶ added in v0.13.3
func NewControllerFromString(templateString string) (*Controller, error)
NewControllerFromString creates a new Controller from a template string.
This is a convenience function for embedded templates.
Example:
//go:embed templates/hello.html var helloTemplate string ctrl, err := lofigui.NewControllerFromString(helloTemplate)
func NewControllerWithLayout ¶ added in v0.16.1
func NewControllerWithLayout(layout string, name string) (*Controller, error)
NewControllerWithLayout creates a Controller from a built-in layout template.
Example:
ctrl, err := lofigui.NewControllerWithLayout(lofigui.LayoutNavbar, "My App")
func (*Controller) GetTemplate ¶ added in v0.6.0
func (ctrl *Controller) GetTemplate() *pongo2.Template
GetTemplate returns the underlying pongo2 template. This allows advanced users to work directly with the template if needed.
func (*Controller) HandleDisplay ¶ added in v0.6.0
func (ctrl *Controller) HandleDisplay(w http.ResponseWriter, r *http.Request, extraContext pongo2.Context)
HandleDisplay renders the template with the provided context.
NOTE: This method now only handles template rendering. For complete state management including polling status, use app.HandleDisplay() or app.StateDict().
This function:
- Generates basic state dict with buffer content
- Merges extra context if provided
- Renders the template
Example:
http.HandleFunc("/display", func(w http.ResponseWriter, r *http.Request) {
ctrl.HandleDisplay(w, r, nil)
})
// With extra context
http.HandleFunc("/display", func(w http.ResponseWriter, r *http.Request) {
extra := pongo2.Context{"title": "My Page"}
ctrl.HandleDisplay(w, r, extra)
})
func (*Controller) ReloadTemplate ¶ added in v0.6.0
func (ctrl *Controller) ReloadTemplate(templatePath string) error
ReloadTemplate reloads the template from the original path. This is useful during development when templates change.
func (*Controller) RenderTemplate ¶ added in v0.6.0
func (ctrl *Controller) RenderTemplate(w http.ResponseWriter, context pongo2.Context) error
RenderTemplate renders the controller's template with custom context. This is useful for one-off custom rendering.
func (*Controller) ServeHTTP ¶ added in v0.6.0
func (ctrl *Controller) ServeHTTP(w http.ResponseWriter, r *http.Request)
ServeHTTP allows Controller to be used as an http.Handler. It serves the display page by default.
func (*Controller) StateDict ¶ added in v0.6.0
func (ctrl *Controller) StateDict(r *http.Request) pongo2.Context
StateDict generates a template context dictionary with controller state.
NOTE: This method now only provides basic controller state (request, buffer). Polling state and action management are now handled at the App level. Use app.StateDict() for complete state including polling status.
Returns a pongo2.Context containing:
- request: The HTTP request object
- results: Buffer content from Print/Markdown calls
You can merge additional context by using pongo2.Context.Update().
type ControllerConfig ¶ added in v0.6.0
type ControllerConfig struct {
// Name is the display name for the controller.
// Default: "Lofigui Controller"
Name string
// TemplatePath is the path to the template file.
// Can be absolute or relative. Examples:
// - "../templates/hello.html"
// - "/opt/myapp/templates/custom.html"
// - "templates/page.html"
// Either TemplatePath or TemplateString must be provided.
TemplatePath string
// TemplateString is the template content as a string.
// Use this for embedded templates (e.g. via Go's embed package).
// Either TemplatePath or TemplateString must be provided.
TemplateString string
// Context is an optional custom Context for buffer management.
// If nil, uses the default global context.
Context *Context
}
ControllerConfig holds configuration for creating a Controller.
type PrintOption ¶
type PrintOption func(*printOptions)
PrintOption is a functional option for Print
func WithEnd ¶
func WithEnd(end string) PrintOption
WithEnd sets the end character (use "" for inline, "\n" for paragraph)
func WithEscape ¶
func WithEscape(escape bool) PrintOption
WithEscape controls HTML escaping (default true)
type TableOption ¶
type TableOption func(*tableOptions)
TableOption is a functional option for Table
func WithTableEscape ¶
func WithTableEscape(escape bool) TableOption
WithTableEscape controls HTML escaping for table cells