mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
Add ReadDir function to list local files.
Includes documentation.
This commit is contained in:
parent
72ecd0cdc7
commit
81e69c416d
4 changed files with 92 additions and 0 deletions
51
docs/content/extras/localfiles.md
Normal file
51
docs/content/extras/localfiles.md
Normal 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/">}}
|
16
docs/layouts/shortcodes/fileindex.html
Normal file
16
docs/layouts/shortcodes/fileindex.html
Normal 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>
|
|
@ -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) },
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue