From 2b624140b9982d40c6601af09838504ed9d74bd6 Mon Sep 17 00:00:00 2001 From: Russell Oliver Date: Fri, 26 Jun 2015 20:23:37 +1000 Subject: [PATCH] Add ReadDir function to list local files. Includes documentation. --- docs/content/extras/localfiles.md | 51 ++++++++++++++++++++++++++ docs/layouts/shortcodes/fileindex.html | 16 ++++++++ tpl/template_funcs.go | 1 + tpl/template_resources.go | 24 ++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 docs/content/extras/localfiles.md create mode 100644 docs/layouts/shortcodes/fileindex.html diff --git a/docs/content/extras/localfiles.md b/docs/content/extras/localfiles.md new file mode 100644 index 00000000000..843082df914 --- /dev/null +++ b/docs/content/extras/localfiles.md @@ -0,0 +1,51 @@ +--- +aliases: +- /doc/localfiles/ +date: 2015-06-12 +menu: + main: + parent: extras +next: /community/mailing-list +notoc: true +prev: /extras/urls +title: Traversing Local Files +weight: 110 +--- + +## Traversing Local Files + +Hugo includes a way to traverse local files. +This is done using the 'ReadDir' function. + +## Using ReadDir + +ReadDir takes a single string input that is relative to the root directory of the site. It returns an array of [os.FileInfo](https://golang.org/pkg/os/#FileInfo) + +Let's create a shortcode to build a file index with links using ReadDir. + +'fileindex.html' + + + + + {{$dir := .Get "dir"}} + {{ $url := .Get "baseurl" }} + + {{ $files := ReadDir $dir }} + {{ range $files }} + + + + + {{ end }} +
Size in bytesName
{{.Size}} + {{.Name}} +
+ +Now lets use it to list the css files used on this site + + {{}} + +Is rendered as: + +{{< fileindex dir="static/css/" baseurl="/css/">}} diff --git a/docs/layouts/shortcodes/fileindex.html b/docs/layouts/shortcodes/fileindex.html new file mode 100644 index 00000000000..132ed67e50c --- /dev/null +++ b/docs/layouts/shortcodes/fileindex.html @@ -0,0 +1,16 @@ + + + +{{$dir := .Get "dir"}} +{{ $url := .Get "baseurl" }} + +{{ $files := ReadDir $dir }} + {{ range $files }} + + + + + {{ end }} +
Size in bytesName
{{.Size}} + {{.Name}} +
diff --git a/tpl/template_funcs.go b/tpl/template_funcs.go index 258591314d4..fdf4d9f189f 100644 --- a/tpl/template_funcs.go +++ b/tpl/template_funcs.go @@ -1353,6 +1353,7 @@ func init() { "dateFormat": DateFormat, "getJSON": GetJSON, "getCSV": GetCSV, + "ReadDir": ReadDir, "seq": helpers.Seq, "getenv": func(varName string) string { return os.Getenv(varName) }, diff --git a/tpl/template_resources.go b/tpl/template_resources.go index c413574d38f..f49e7df6f7a 100644 --- a/tpl/template_resources.go +++ b/tpl/template_resources.go @@ -21,6 +21,8 @@ import ( "io/ioutil" "net/http" "net/url" + "os" + "path/filepath" "strings" "sync" "time" @@ -263,3 +265,25 @@ func GetCSV(sep string, urlParts ...string) [][]string { } return d } + +func ReadDir(path string) []os.FileInfo { + wd := "" + p := "" + if viper.GetString("WorkingDir") != "" { + wd = viper.GetString("WorkingDir") + } + if strings.Contains(path, "..") { + jww.ERROR.Printf("Path contains parent directory marker ..\n", path) + return nil + } + + p = filepath.Clean(path) + p = filepath.Join(wd, p) + + list, err := ioutil.ReadDir(p) + if err != nil { + jww.ERROR.Printf("Failed to read Directory %s with error message %s", path, err) + return nil + } + return list +}