Documentation
¶
Overview ¶
Package htmlcore converts HTML and MD into Cogent Core widget trees.
Index ¶
- func ExtractText(ctx *Context) string
- func ExtractTextExclude(ctx *Context, excludeSubs ...string) (string, *html.Node)
- func Get(ctx *Context, url string) (*http.Response, error)
- func GetAttr(n *html.Node, attr string) string
- func GetLanguage(class string) string
- func GetURLFromFS(fsys fs.FS, rawURL string) (*http.Response, error)
- func HasAttr(n *html.Node, attr string) bool
- func MDGetAttr(n ast.Node, attr string) string
- func MDSetAttr(n ast.Node, attr, value string)
- func MDToHTML(ctx *Context, md []byte) []byte
- func New[T tree.NodeValue](ctx *Context) *T
- func ReadHTML(ctx *Context, parent core.Widget, r io.Reader) error
- func ReadHTMLString(ctx *Context, parent core.Widget, s string) error
- func ReadMD(ctx *Context, parent core.Widget, b []byte) error
- func ReadMDString(ctx *Context, parent core.Widget, s string) error
- type Context
- func (c *Context) AddWidgetHandler(f func(w core.Widget))
- func (c *Context) AddWikilinkHandler(h WikilinkHandler)
- func (c *Context) HasRest() bool
- func (c *Context) InlineParent() core.Widget
- func (c *Context) LinkButton(bt *core.Button, url string) *core.Button
- func (c *Context) LinkButtonUpdating(bt *core.Button, url func() string) *core.Button
- func (c *Context) Parent() core.Widget
- func (c *Context) ReadRest() (core.Widget, int, error)
- func (c *Context) SetStyleAttr(node *html.Node, style string) error
- type ImageCache
- type WikilinkHandler
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ExtractText ¶
ExtractText recursively extracts all of the text from the children of the given *html.Node, adding any appropriate inline markup for formatted text. It adds any non-text elements to the given core.Widget using [readHTMLNode]. It should not be called on text nodes themselves; for that, you can directly access the html.Node.Data field. It uses the given page URL for context when resolving URLs, but it can be omitted if not available.
func ExtractTextExclude ¶ added in v0.3.12
ExtractTextExclude recursively extracts all of the text from the children of the given *html.Node, adding any appropriate inline markup for formatted text. It adds any non-text elements to the given core.Widget using [readHTMLNode], except those types listed in the excludeSubs list. If one of those types is encountered, it is returned.
func Get ¶
Get is a helper function that calls Context.GetURL with the given URL, parsed relative to the page URL of the given context. It also checks the status code of the response and closes the response body and returns an error if it is not http.StatusOK. If the error is nil, then the response body is not closed and must be closed by the caller.
func GetAttr ¶
GetAttr gets the given attribute from the given node, returning "" if the attribute is not found.
func GetLanguage ¶ added in v0.3.13
GetLanguage returns the 'x' in a `language-x` class from the given string of class(es).
func GetURLFromFS ¶ added in v0.3.8
GetURLFromFS can be used for Context.GetURL to get resources from the given file system.
func MDGetAttr ¶ added in v0.3.11
MDGetAttr gets the given attribute from the given markdown node, returning "" if the attribute is not found.
func New ¶
New adds a new widget of the given type to the context parent. It automatically calls [Context.config] on the resulting widget.
func ReadHTML ¶
ReadHTML reads HTML from the given io.Reader and adds corresponding Cogent Core widgets to the given core.Widget, using the given context.
func ReadHTMLString ¶
ReadHTMLString reads HTML from the given string and adds corresponding Cogent Core widgets to the given core.Widget, using the given context.
func ReadMD ¶
ReadMD reads MD (markdown) from the given bytes and adds corresponding Cogent Core widgets to the given core.Widget, using the given context.
func ReadMDString ¶
ReadMDString reads MD (markdown) from the given string and adds corresponding Cogent Core widgets to the given core.Widget, using the given context.
Types ¶
type Context ¶
type Context struct {
// Node is the node that is currently being read.
Node *html.Node
// NewParent is the current parent widget that children of
// the previously read element should be added to, if any.
NewParent core.Widget
// BlockParent is the current parent widget that non-inline elements
// should be added to.
BlockParent core.Widget
// TableParent is the current table being generated.
TableParent *core.Frame
// PageURL, if not "", is the URL of the current page.
// Otherwise, there is no current page.
PageURL string
// OpenURL is the function used to open URLs,
// which defaults to [system.App.OpenURL].
OpenURL func(url string, e events.Event)
// GetURL is the function used to get resources from URLs,
// which defaults to [http.Get].
GetURL func(url string) (*http.Response, error)
// ElementHandlers is a map of handler functions for each HTML element
// type (eg: "button", "input", "p"). It is empty by default, but can be
// used by anyone in need of behavior different than the default behavior
// defined in [handleElement] (for example, for custom elements).
// If the handler for an element returns false, then the default behavior
// for an element is used.
ElementHandlers map[string]func(ctx *Context) bool
// WikilinkHandlers is a list of handlers to use for wikilinks.
// If one returns "", "", the next ones will be tried instead.
// The functions are tried in sequential ascending order.
// See [Context.AddWikilinkHandler] to add a new handler.
WikilinkHandlers []WikilinkHandler
// AttributeHandlers is a map of markdown render handler functions
// for custom attribute values that are specified in {tag: value}
// attributes prior to markdown elements in the markdown source.
// The map key is the tag in the attribute, which is then passed
// to the function, along with the markdown node being rendered.
// Alternative or additional HTML output can be written to the given writer.
// If the handler function returns true, then the default HTML code
// will not be generated.
AttributeHandlers map[string]func(ctx *Context, w io.Writer, node ast.Node, entering bool, tag, value string) bool
// WidgetHandlers is a list of handler functions for each Widget,
// called in sequential order for each widget that is created,
// after it has been configured by the existing handlers etc.
// This allows for additional styling to be applied based on the
// type of widget, for example.
WidgetHandlers []func(w core.Widget)
// DelayedImageLoad causes images to be loaded at a delay.
// if not set, then they are loaded immediately.
DelayedImageLoad bool
// ImageCache, if non-nil, caches the decoded images of img elements
// by their resolved URL, so that rebuilding a page does not decode
// them again. It must only be set when [Context.GetURL] returns the
// same content for the same URL until the cache is reset. It is nil
// by default; see [NewImageCache].
ImageCache *ImageCache
// StageSize, if positive, is the size of the content of the body (in
// runes of text, with estimates for other elements) after which
// [ReadHTML] stops adding the widgets of its top-level elements,
// leaving the rest for [Context.ReadRest]. This allows the first part
// of a long page to be shown sooner.
StageSize int
// contains filtered or unexported fields
}
Context contains context information about the current state of a htmlcore reader and its surrounding context. It should be created with NewContext.
func (*Context) AddWidgetHandler ¶ added in v0.3.13
AddWidgetHandler adds given widget handler function
func (*Context) AddWikilinkHandler ¶ added in v0.3.8
func (c *Context) AddWikilinkHandler(h WikilinkHandler)
AddWikilinkHandler adds a new WikilinkHandler to Context.WikilinkHandlers. If it returns "", "", the next handlers will be tried instead. The functions are tried in sequential ascending order.
func (*Context) HasRest ¶ added in v0.5.0
HasRest returns whether ReadHTML has left elements to read with Context.ReadRest (see Context.StageSize).
func (*Context) InlineParent ¶
InlineParent returns the current parent widget that inline elements should be added to.
func (*Context) LinkButton ¶ added in v0.3.8
LinkButton is a helper function that makes the given button open the given link when clicked on, using Context.OpenURL. The advantage of using this is that it does tree.NodeBase.SetProperty of "href" to the given url, allowing generatehtml to create an <a> element for HTML preview and SEO purposes. It also sets the tooltip to the URL.
See also Context.LinkButtonUpdating for a dynamic version.
func (*Context) LinkButtonUpdating ¶ added in v0.3.9
LinkButtonUpdating is a version of Context.LinkButton that is robust to a changing/dynamic URL, using an Updater and a URL function instead of a variable.
func (*Context) Parent ¶
Parent returns the current parent widget that a widget associated with the current node should be added to. It may make changes to the widget tree, so the widget must be added to the resulting parent immediately.
func (*Context) ReadRest ¶ added in v0.5.0
ReadRest adds the widgets of the elements that ReadHTML left (see Context.StageSize), and returns the widget that they are added to and the index of the first child added, which need to be updated. The context must not have been used to read other HTML since.
type ImageCache ¶ added in v0.5.0
type ImageCache struct {
// MaxBytes is the maximum total size of the cached images, in bytes
// of decoded pixels. The least recently used images are removed
// to keep the total size within it, and an image larger than it
// is not cached.
MaxBytes int
// contains filtered or unexported fields
}
ImageCache is a cache of decoded images, keyed by their resolved URL, so that rebuilding a page does not decode the same images again. It keeps the most recently used images up to a total size in bytes, and it is safe for concurrent use.
The cached images are shared by all of the widgets that show them, so they must not be modified. Images are only read when they are rendered: core.Image and the resizing and cropping functions of imagex make new images.
func NewImageCache ¶ added in v0.5.0
func NewImageCache(maxBytes int) *ImageCache
NewImageCache returns a new ImageCache that keeps images up to the given total size in bytes.
func (*ImageCache) Add ¶ added in v0.5.0
func (ic *ImageCache) Add(url string, img image.Image)
Add adds the given image for the given resolved URL to the cache, removing the least recently used images as needed to stay within ImageCache.MaxBytes.
func (*ImageCache) Get ¶ added in v0.5.0
func (ic *ImageCache) Get(url string) image.Image
Get returns the cached image for the given resolved URL, or nil.
func (*ImageCache) Reset ¶ added in v0.5.0
func (ic *ImageCache) Reset()
Reset removes all of the images from the cache.
type WikilinkHandler ¶ added in v0.3.8
WikilinkHandler is a function that converts wikilink text to a corresponding URL and label text. If it returns "", "", the handler will be skipped in favor of the next possible handlers. Wikilinks are of the form [[wikilink text]]. Only the text inside of the brackets is passed to the handler. If there is additional text directly after the closing brackets without spaces or punctuation, it will be appended to the label text after the handler is run (ex: [[widget]]s).
func GoDocWikilink ¶ added in v0.3.8
func GoDocWikilink(prefix string, pkg string) WikilinkHandler
GoDocWikilink returns a WikilinkHandler that converts wikilinks of the form [[prefix:identifier]] to a pkg.go.dev URL starting at pkg. For example, with prefix="doc" and pkg="cogentcore.org/core", the wikilink [[doc:core.Button]] will result in the URL "https://pkg.go.dev/cogentcore.org/core/core#Button".