// escapeTemplate rewrites the named template, which must be // associated with t, to guarantee that the output of any of the named // templates is properly escaped. If no error is returned, then the named templates have // been modified. Otherwise the named templates have been rendered // unusable. func escapeTemplate(tmpl *Template, node parse.Node, name string) error { … } // evalArgs formats the list of arguments into a string. It is equivalent to // fmt.Sprint(args...), except that it dereferences all pointers. func evalArgs(args ...any) string { … } var funcMap … type escaper … type rangeContext … // makeEscaper creates a blank escaper for the given set. func makeEscaper(n *nameSpace) escaper { … } const filterFailsafe … // escape escapes a template node. func (e *escaper) escape(c context, n parse.Node) context { … } var debugAllowActionJSTmpl … // escapeAction escapes an action template node. func (e *escaper) escapeAction(c context, n *parse.ActionNode) context { … } // ensurePipelineContains ensures that the pipeline ends with the commands with // the identifiers in s in order. If the pipeline ends with a predefined escaper // (i.e. "html" or "urlquery"), merge it with the identifiers in s. func ensurePipelineContains(p *parse.PipeNode, s []string) { … } var predefinedEscapers … var equivEscapers … // escFnsEq reports whether the two escaping functions are equivalent. func escFnsEq(a, b string) bool { … } // normalizeEscFn(a) is equal to normalizeEscFn(b) for any pair of names of // escaper functions a and b that are equivalent. func normalizeEscFn(e string) string { … } var redundantFuncs … // appendCmd appends the given command to the end of the command pipeline // unless it is redundant with the last command. func appendCmd(cmds []*parse.CommandNode, cmd *parse.CommandNode) []*parse.CommandNode { … } // newIdentCmd produces a command containing a single identifier node. func newIdentCmd(identifier string, pos parse.Pos) *parse.CommandNode { … } // nudge returns the context that would result from following empty string // transitions from the input context. // For example, parsing: // // `<a href=` // // will end in context{stateBeforeValue, attrURL}, but parsing one extra rune: // // `<a href=x` // // will end in context{stateURL, delimSpaceOrTagEnd, ...}. // There are two transitions that happen when the 'x' is seen: // (1) Transition from a before-value state to a start-of-value state without // // consuming any character. // // (2) Consume 'x' and transition past the first value character. // In this case, nudging produces the context after (1) happens. func nudge(c context) context { … } // join joins the two contexts of a branch template node. The result is an // error context if either of the input contexts are error contexts, or if the // input contexts differ. func join(a, b context, node parse.Node, nodeName string) context { … } // escapeBranch escapes a branch template node: "if", "range" and "with". func (e *escaper) escapeBranch(c context, n *parse.BranchNode, nodeName string) context { … } func joinRange(c0 context, rc *rangeContext) context { … } // escapeList escapes a list template node. func (e *escaper) escapeList(c context, n *parse.ListNode) context { … } // escapeListConditionally escapes a list node but only preserves edits and // inferences in e if the inferences and output context satisfy filter. // It returns the best guess at an output context, and the result of the filter // which is the same as whether e was updated. func (e *escaper) escapeListConditionally(c context, n *parse.ListNode, filter func(*escaper, context) bool) (context, bool) { … } // escapeTemplate escapes a {{template}} call node. func (e *escaper) escapeTemplate(c context, n *parse.TemplateNode) context { … } // escapeTree escapes the named template starting in the given context as // necessary and returns its output context. func (e *escaper) escapeTree(c context, node parse.Node, name string, line int) (context, string) { … } // computeOutCtx takes a template and its start context and computes the output // context while storing any inferences in e. func (e *escaper) computeOutCtx(c context, t *template.Template) context { … } // escapeTemplateBody escapes the given template assuming the given output // context, and returns the best guess at the output context and whether the // assumption was correct. func (e *escaper) escapeTemplateBody(c context, t *template.Template) (context, bool) { … } var delimEnds … var specialScriptTagRE … var specialScriptTagReplacement … func containsSpecialScriptTag(s []byte) bool { … } func escapeSpecialScriptTags(s []byte) []byte { … } var doctypeBytes … // escapeText escapes a text template node. func (e *escaper) escapeText(c context, n *parse.TextNode) context { … } // contextAfterText starts in context c, consumes some tokens from the front of // s, then returns the context after those tokens and the unprocessed suffix. func contextAfterText(c context, s []byte) (context, int) { … } // editActionNode records a change to an action pipeline for later commit. func (e *escaper) editActionNode(n *parse.ActionNode, cmds []string) { … } // editTemplateNode records a change to a {{template}} callee for later commit. func (e *escaper) editTemplateNode(n *parse.TemplateNode, callee string) { … } // editTextNode records a change to a text node for later commit. func (e *escaper) editTextNode(n *parse.TextNode, text []byte) { … } // commit applies changes to actions and template calls needed to contextually // autoescape content and adds any derived templates to the set. func (e *escaper) commit() { … } // template returns the named template given a mangled template name. func (e *escaper) template(name string) *template.Template { … } // arbitraryTemplate returns an arbitrary template from the name space // associated with e and panics if no templates are found. func (e *escaper) arbitraryTemplate() *Template { … } // HTMLEscape writes to w the escaped HTML equivalent of the plain text data b. func HTMLEscape(w io.Writer, b []byte) { … } // HTMLEscapeString returns the escaped HTML equivalent of the plain text data s. func HTMLEscapeString(s string) string { … } // HTMLEscaper returns the escaped HTML equivalent of the textual // representation of its arguments. func HTMLEscaper(args ...any) string { … } // JSEscape writes to w the escaped JavaScript equivalent of the plain text data b. func JSEscape(w io.Writer, b []byte) { … } // JSEscapeString returns the escaped JavaScript equivalent of the plain text data s. func JSEscapeString(s string) string { … } // JSEscaper returns the escaped JavaScript equivalent of the textual // representation of its arguments. func JSEscaper(args ...any) string { … } // URLQueryEscaper returns the escaped value of the textual representation of // its arguments in a form suitable for embedding in a URL query. func URLQueryEscaper(args ...any) string { … }