Skip to content

Commit 056267a

Browse files
authored
Merge pull request #503 from devlights/add-parse-funcs
2 parents 28dee80 + ea88a47 commit 056267a

File tree

8 files changed

+228
-1
lines changed

8 files changed

+228
-1
lines changed

examples/basic/templates/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,6 @@
3939
|txttmpl/with.go|templates\_text\_tmpl\_with|text/template の テンプレート仕様 における with のサンプルです.|
4040
|txttmpl/with.go|templates\_text\_tmpl\_define|text/template の テンプレート仕様 における define (独自テンプレートの定義) のサンプルです.|
4141
|txttmpl/with.go|templates\_text\_tmpl\_funcmap|text/template の テンプレート仕様 における funcmap (独自関数の定義) のサンプルです.|
42+
|txttmpl/parsefuncs/parsefs.go|templates\_parsefuncs\_parsefs|template.ParseFS() のサンプルです.|
43+
|txttmpl/parsefuncs/parsefiles.go|templates\_parsefuncs\_parsefiles|template.ParseFiles() のサンプルです.|
44+
|txttmpl/parsefuncs/parseglob.go|templates\_parsefuncs\_parseglob|template.ParseGlob() のサンプルです.|

examples/basic/templates/txttmpl/examples.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package txttmpl
22

3-
import "github.com/devlights/try-golang/mapping"
3+
import (
4+
"github.com/devlights/try-golang/examples/basic/templates/txttmpl/parsefuncs"
5+
"github.com/devlights/try-golang/mapping"
6+
)
47

58
type (
69
register struct{}
@@ -48,4 +51,6 @@ func (r *register) Regist(m mapping.ExampleMapping) {
4851
m["templates_text_tmpl_with"] = With
4952
m["templates_text_tmpl_define"] = Define
5053
m["templates_text_tmpl_funcmap"] = FuncMap
54+
55+
parsefuncs.NewRegister().Regist(m)
5156
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package parsefuncs
2+
3+
import (
4+
"github.com/devlights/try-golang/mapping"
5+
)
6+
7+
type (
8+
register struct{}
9+
)
10+
11+
// NewRegister -- このパッケージ用のサンプルを登録する mapping.Register を生成します。
12+
func NewRegister() mapping.Register {
13+
return new(register)
14+
}
15+
16+
// Regist -- 登録します.
17+
func (r *register) Regist(m mapping.ExampleMapping) {
18+
m["templates_parsefuncs_parsefs"] = ParseFS
19+
m["templates_parsefuncs_parsefiles"] = ParseFiles
20+
m["templates_parsefuncs_parseglob"] = ParseGlob
21+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package parsefuncs
2+
3+
import (
4+
"bytes"
5+
"io/fs"
6+
"os"
7+
"path/filepath"
8+
"text/template"
9+
10+
"github.com/devlights/gomy/output"
11+
)
12+
13+
// ParseFiles -- template.ParseFiles() のサンプルです。
14+
//
15+
// REFERENCES
16+
// - https://pkg.go.dev/text/template@latest#ParseFiles
17+
func ParseFiles() error {
18+
const (
19+
dir = "examples/basic/templates/txttmpl/parsefuncs/tmpls"
20+
)
21+
22+
var (
23+
fSys = os.DirFS(dir)
24+
files []string
25+
err error
26+
)
27+
28+
files, err = fs.Glob(fSys, "*.tmpl")
29+
if err != nil {
30+
return err
31+
}
32+
33+
for i, f := range files {
34+
files[i] = filepath.Join(dir, f)
35+
}
36+
37+
var (
38+
tmpl *template.Template
39+
buf bytes.Buffer
40+
)
41+
42+
tmpl, err = template.ParseFiles(files...)
43+
if err != nil {
44+
return err
45+
}
46+
47+
output.Stdoutl("[name ]", tmpl.Name())
48+
output.Stdoutl("[parse name ]", tmpl.ParseName)
49+
output.Stdoutl("[define tmpl]", tmpl.DefinedTemplates())
50+
output.StdoutHr()
51+
52+
//
53+
// 複数のテンプレートが存在する場合 Execute の呼び出しは最初のテンプレートが処理される.
54+
// 最初のテンプレートとは tmpl.ParseName が返すテンプレートの値.
55+
//
56+
err = tmpl.Execute(&buf, "world")
57+
if err != nil {
58+
return err
59+
}
60+
61+
output.Stdoutf("[tmpl - Execute ]", "%s\n", buf.String())
62+
output.StdoutHr()
63+
64+
//
65+
// 特定のテンプレートを処理したい場合は、ExecuteTemplate を使う
66+
//
67+
for _, name := range []string{"hello.tmpl", "world.tmpl"} {
68+
buf.Reset()
69+
70+
err = tmpl.ExecuteTemplate(&buf, name, "hello")
71+
if err != nil {
72+
return err
73+
}
74+
75+
output.Stdoutf("[tmpl - ExecuteTemplate]", "%s\n", buf.String())
76+
output.StdoutHr()
77+
}
78+
79+
//
80+
// または t.Templates() で各テンプレートが取得できるので、それで処理することもできる
81+
//
82+
for _, t := range tmpl.Templates() {
83+
buf.Reset()
84+
85+
err = t.Execute(&buf, "hello")
86+
if err != nil {
87+
return err
88+
}
89+
90+
output.Stdoutl("[name ]", t.Name())
91+
output.Stdoutl("[parse name ]", t.ParseName)
92+
output.Stdoutf("[tmpl ]", "%s\n", buf.String())
93+
output.StdoutHr()
94+
}
95+
96+
return nil
97+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package parsefuncs
2+
3+
import (
4+
"bytes"
5+
"os"
6+
"text/template"
7+
8+
"github.com/devlights/gomy/output"
9+
)
10+
11+
// ParseFS -- template.ParseFS() のサンプルです。
12+
//
13+
// REFERENCES
14+
// - https://pkg.go.dev/text/template@latest#ParseFS
15+
// - https://pkg.go.dev/io/fs@latest
16+
func ParseFS() error {
17+
const (
18+
dir = "examples/basic/templates/txttmpl/parsefuncs/tmpls"
19+
)
20+
21+
var (
22+
fSys = os.DirFS(dir)
23+
tmpl *template.Template
24+
buf bytes.Buffer
25+
err error
26+
)
27+
28+
tmpl, err = template.ParseFS(fSys, "hello.tmpl")
29+
if err != nil {
30+
return err
31+
}
32+
33+
output.Stdoutl("[name ]", tmpl.Name())
34+
output.Stdoutl("[parse name ]", tmpl.ParseName)
35+
output.Stdoutl("[define tmpl]", tmpl.DefinedTemplates())
36+
output.StdoutHr()
37+
38+
err = tmpl.Execute(&buf, "world")
39+
if err != nil {
40+
return err
41+
}
42+
43+
output.Stdoutf("[tmpl]", "%s\n", buf.String())
44+
output.StdoutHr()
45+
46+
return nil
47+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package parsefuncs
2+
3+
import (
4+
"bytes"
5+
"path/filepath"
6+
"text/template"
7+
8+
"github.com/devlights/gomy/output"
9+
)
10+
11+
// ParseGlob -- template.ParseGlob() のサンプルです。
12+
//
13+
// REFERENCES
14+
// - https://pkg.go.dev/text/template@latest#ParseGlob
15+
func ParseGlob() error {
16+
const (
17+
dir = "examples/basic/templates/txttmpl/parsefuncs/tmpls"
18+
pat = "*.tmpl"
19+
)
20+
21+
var (
22+
pattern = filepath.Join(dir, pat)
23+
tmpl *template.Template
24+
err error
25+
)
26+
27+
output.Stdoutl("[pattern]", pattern)
28+
output.StdoutHr()
29+
30+
tmpl, err = template.ParseGlob(pattern)
31+
if err != nil {
32+
return err
33+
}
34+
35+
for _, t := range tmpl.Templates() {
36+
var (
37+
buf bytes.Buffer
38+
)
39+
40+
err = t.Execute(&buf, "hello")
41+
if err != nil {
42+
return err
43+
}
44+
45+
output.Stdoutl("[name ]", t.Name())
46+
output.Stdoutl("[parse name ]", t.ParseName)
47+
output.Stdoutf("[tmpl ]", "%s\n", buf.String())
48+
output.StdoutHr()
49+
}
50+
51+
return nil
52+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[hello.tmpl] hello {{ . }}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[world.tmpl] {{ . }} world

0 commit comments

Comments
 (0)