Home >Backend Development >Golang >How Can I Extract All Actions from a Parsed HTML Template?

How Can I Extract All Actions from a Parsed HTML Template?

Barbara Streisand
Barbara StreisandOriginal
2024-12-26 02:58:10897browse

How Can I Extract All Actions from a Parsed HTML Template?

How to Inspect a Parsed Template for Embedded Actions

Problem Statement

Given a parsed template, how can we retrieve a list of all the actions defined within it?

Solution

Disclaimer: Internal API Usage

Note that the method we'll use, Template.Tree, is not intended for external use. It's exported solely for the internal workings of the html/template package. Relying on it in your code can lead to unexpected behavior in future releases of the package.

Walkthrough

A parsed template is represented internally as a tree (parse.Tree) comprising various nodes. Each node represents a specific element within the template, such as text, fields, function calls, and so on.

To find the actions, we'll traverse this tree recursively, looking for nodes of type parse.NodeAction. These nodes represent non-control actions, such as field evaluations.

Implementation

import (
    "fmt"
    "html/template"
    "text/template/parse"
)

func ListTemplateFields(t *template.Template) []string {
    return listNodeFields(t.Tree.Root, nil)
}

func listNodeFields(node parse.Node, results []string) []string {
    if node.Type() == parse.NodeAction {
        results = append(results, node.String())
    }

    if listNode, ok := node.(*parse.ListNode); ok {
        for _, n := range listNode.Nodes {
            results = listNodeFields(n, results)
        }
    }

    return results
}

Example Usage

t := template.Must(template.New("example").Parse(`{{ .name }} {{ .age }}`))
fields := ListTemplateFields(t)
fmt.Println(fields)

Output

[{{.name}} {{.age}}]

The above is the detailed content of How Can I Extract All Actions from a Parsed HTML Template?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn