Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang. How to create loop function using html/template package

Tags:

templates

go

I'm trying to implement loop as custom function. It takes number of iterations and content between curly brackets, then it should iterate content between brackets n times. Please, see example:

main.go

template.Must(template.ParseFiles("palette.html")).Funcs(template.FuncMap{
        "loop": func(n int, content string) string {
            var r string
            for i := 0; i <= n; i++ {
                r += content
            }
            return r
        },
    }).ExecuteTemplate(rw, index, nil)

index.html

{{define "index"}}
<div class="row -flex palette">
  {{loop 16}}
    <div class="col-2"></div>
  {{end}}
</div>
{{end}}

Output

<div class="row -flex palette">
    <div class="col-2"></div>
    <div class="col-2"></div>
    <div class="col-2"></div>
    <div class="col-2"></div>
    ... 16 times
</div>

Is it possible to implement it? The motivation is that standard functionality of the text/template doesn't allow just to iterate content between curly bracket. Yes we can do it by range action going through "outside" data.

like image 718
Timur Fayzrakhmanov Avatar asked Mar 07 '15 17:03

Timur Fayzrakhmanov


1 Answers

You can use range on a function that returns a slice. http://play.golang.org/p/FCuLkEHaZn

package main

import (
    "html/template"
    "os"
)

func main() {
    html := `
<div class="row -flex palette">
  {{range loop 16}}
    <div class="col-2"></div>
  {{end}}
</div>`
    tmpl := template.Must(template.New("test").Funcs(template.FuncMap{
        "loop": func(n int) []struct{} {
            return make([]struct{}, n)
        },
    }).Parse(html))
    tmpl.Execute(os.Stdout, nil)
}
like image 109
Innominate Avatar answered Nov 15 '22 06:11

Innominate