Add ReadDir function to list local files. - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 81e69c416d985ff57e654bc5613341828a033c9f
DIR parent 72ecd0cdc7b02bf55cf86cd13afbbfdc4f72de9c
HTML Author: Russell Oliver <roliver8143@gmail.com>
Date: Fri, 26 Jun 2015 20:23:37 +1000
Add ReadDir function to list local files.
Includes documentation.
Diffstat:
A docs/content/extras/localfiles.md | 51 +++++++++++++++++++++++++++++++
A docs/layouts/shortcodes/fileindex.… | 16 ++++++++++++++++
M tpl/template_funcs.go | 1 +
M tpl/template_resources.go | 24 ++++++++++++++++++++++++
4 files changed, 92 insertions(+), 0 deletions(-)
---
DIR diff --git a/docs/content/extras/localfiles.md 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'
+
+ <table style="width=100%">
+ <th>Size in bytes</th>
+ <th>Name</th>
+ {{$dir := .Get "dir"}}
+ {{ $url := .Get "baseurl" }}
+
+ {{ $files := ReadDir $dir }}
+ {{ range $files }}
+ <tr>
+ <td>{{.Size}}</td>
+ <td>
+ <a href="{{$url}}{{.Name | urlize }}"> {{.Name}}</a>
+ </td>
+ </tr>
+ {{ end }}
+ </table>
+
+Now lets use it to list the css files used on this site
+
+ {{</* fileindex dir="static/css" baseurl="/css/" */>}}
+
+Is rendered as:
+
+{{< fileindex dir="static/css/" baseurl="/css/">}}
DIR diff --git a/docs/layouts/shortcodes/fileindex.html b/docs/layouts/shortcodes/fileindex.html
@@ -0,0 +1,16 @@
+<table style="width=100%">
+<th>Size in bytes</th>
+<th>Name</th>
+{{$dir := .Get "dir"}}
+{{ $url := .Get "baseurl" }}
+
+{{ $files := ReadDir $dir }}
+ {{ range $files }}
+ <tr>
+ <td>{{.Size}}</td>
+ <td>
+ <a href="{{$url}}{{.Name | urlize }}"> {{.Name}}</a>
+ </td>
+ </tr>
+ {{ end }}
+</table>
DIR diff --git 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) },
DIR diff --git 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
+}