// parseFiles is the helper for the method and function. If the argument // template is nil, it is created from the first file. func parseFiles(fs http.FileSystem, t *template.Template, filenames ...string) (*template.Template, error) { if len(filenames) == 0 { // Not really a problem, but be consistent. return nil, fmt.Errorf("vfs/html/vfstemplate: no files named in call to ParseFiles") } for _, filename := range filenames { b, err := vfsutil.ReadFile(fs, filename) if err != nil { return nil, err } s := string(b) name := path.Base(filename) // First template becomes return value if not already defined, // and we use that one for subsequent New calls to associate // all the templates together. Also, if this file has the same name // as t, this file becomes the contents of t, so // t, err := New(name).Funcs(xxx).ParseFiles(name) // works. Otherwise we create a new template associated with t. var tmpl *template.Template if t == nil { t = template.New(name) } if name == t.Name() { tmpl = t } else { tmpl = t.New(name) } _, err = tmpl.Parse(s) if err != nil { return nil, err } } return t, nil }
// Basic functionality test. func ExampleBasic() { var fs http.FileSystem = assets walkFn := func(path string, fi os.FileInfo, err error) error { if err != nil { log.Printf("can't stat file %s: %v\n", path, err) return nil } fmt.Println(path) if fi.IsDir() { return nil } b, err := vfsutil.ReadFile(fs, path) fmt.Printf("%q %v\n", string(b), err) return nil } err := vfsutil.Walk(fs, "/", walkFn) if err != nil { panic(err) } // Output: // / // /folderA // /folderA/file1.txt // "Stuff in /folderA/file1.txt." <nil> // /folderA/file2.txt // "Stuff in /folderA/file2.txt." <nil> // /folderB // /folderB/folderC // /folderB/folderC/file3.txt // "Stuff in /folderB/folderC/file3.txt." <nil> // /not-worth-compressing-file.txt // "Its normal contents are here." <nil> // /sample-file.txt // "This file compresses well. Blaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!" <nil> }