Add ReadDir function to list local files.

Includes documentation.
This commit is contained in:
Russell Oliver 2015-06-26 20:23:37 +10:00 committed by Bjørn Erik Pedersen
parent 72ecd0cdc7
commit 81e69c416d
4 changed files with 92 additions and 0 deletions

View file

@ -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/">}}

View file

@ -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>

View file

@ -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) },

View file

@ -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
}