11

How can I do in Golang if I have an HTML file like this:

<html>
  <head lang="en">

  </head>
  <body>
    <header>{{.Header}}</header>
    <div class="panel panel-default">

    </div>
  </body>
</html>

and I want to embed a part of code into to header tags from an other file like this:

<div id="logo"></div><div id="motto"></div>

My try:

header, _ := template.ParseFiles("header.html")
c := Content{Header: ""}
header.Execute(c.Header, nil)

index := template.Must(template.ParseFiles("index.html"))
index.Execute(w, c)
icza
  • 389,944
  • 63
  • 907
  • 827
PumpkinSeed
  • 2,945
  • 9
  • 36
  • 62
  • 1
    What have you tried so far? Why is it not working? Please post a [Minimal, Complete and Verifiable Example](https://stackoverflow.com/help/mcve) – R4PH43L Nov 29 '15 at 15:07
  • 1
    @R4PH43L I refreshed the post with my try. – PumpkinSeed Nov 29 '15 at 16:52
  • 1
    You've got two possibilities:use nested template (find into https://golang.org/pkg/text/template/ and name of nested template will be header.html) or use template.HTMLEscapeString. I would prefer first one. – lofcek Nov 29 '15 at 20:40

1 Answers1

13

If you parse all your template files with template.ParseFiles() or with template.ParseGlob(), the templates can refer to each other, they can include each other.

Change your index.html to include the header.html like this:

<html>
  <head lang="en">

  </head>
  <body>
    <header>{{template "header.html"}}</header>
    <div class="panel panel-default">

    </div>
  </body>
</html>

And then the complete program (which parses files from the current directory, executes "index.html" and writes the result to the standard output):

t, err := template.ParseFiles("index.html", "header.html")
if err != nil {
    panic(err)
}

err = t.ExecuteTemplate(os.Stdout, "index.html", nil)
if err != nil {
    panic(err)
}

With template.ParseGlob() it could look like this:

t, err := template.ParseGlob("*.html")
// ...and the rest is the same...

The output (printed on the console):

<html>
  <head lang="en">

  </head>
  <body>
    <header><div id="logo"></div><div id="motto"></div></header>
    <div class="panel panel-default">

    </div>
  </body>
</html>
icza
  • 389,944
  • 63
  • 907
  • 827