Sort directory listings with directories before files
This commit is contained in:
parent
e42c366565
commit
2dcaf941e4
|
@ -5,6 +5,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/BurntSushi/toml"
|
"github.com/BurntSushi/toml"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@ type Config struct {
|
||||||
SCGIPaths map[string]string
|
SCGIPaths map[string]string
|
||||||
CertificateZones map[string][]string
|
CertificateZones map[string][]string
|
||||||
DirectorySort string
|
DirectorySort string
|
||||||
|
DirectoriesFirst bool
|
||||||
DirectoryReverse bool
|
DirectoryReverse bool
|
||||||
DirectoryTitles bool
|
DirectoryTitles bool
|
||||||
}
|
}
|
||||||
|
@ -39,6 +41,7 @@ type MollyFile struct {
|
||||||
CertificateZones map[string][]string
|
CertificateZones map[string][]string
|
||||||
DefaultLang string
|
DefaultLang string
|
||||||
DirectorySort string
|
DirectorySort string
|
||||||
|
DirectoriesFirst bool
|
||||||
DirectoryReverse bool
|
DirectoryReverse bool
|
||||||
DirectoryTitles bool
|
DirectoryTitles bool
|
||||||
}
|
}
|
||||||
|
@ -63,6 +66,7 @@ func getConfig(filename string) (Config, error) {
|
||||||
config.CGIPaths = make([]string, 0)
|
config.CGIPaths = make([]string, 0)
|
||||||
config.SCGIPaths = make(map[string]string)
|
config.SCGIPaths = make(map[string]string)
|
||||||
config.DirectorySort = "Name"
|
config.DirectorySort = "Name"
|
||||||
|
config.DirectoriesFirst = false
|
||||||
|
|
||||||
// Return defaults if no filename given
|
// Return defaults if no filename given
|
||||||
if filename == "" {
|
if filename == "" {
|
||||||
|
@ -124,6 +128,7 @@ func parseMollyFiles(path string, config *Config, errorLog *log.Logger) {
|
||||||
mollyFile.GeminiExt = config.GeminiExt
|
mollyFile.GeminiExt = config.GeminiExt
|
||||||
mollyFile.DefaultLang = config.DefaultLang
|
mollyFile.DefaultLang = config.DefaultLang
|
||||||
mollyFile.DirectorySort = config.DirectorySort
|
mollyFile.DirectorySort = config.DirectorySort
|
||||||
|
mollyFile.DirectoriesFirst = config.DirectoriesFirst
|
||||||
mollyFile.DirectoryReverse = config.DirectoryReverse
|
mollyFile.DirectoryReverse = config.DirectoryReverse
|
||||||
mollyFile.DirectoryTitles = config.DirectoryTitles
|
mollyFile.DirectoryTitles = config.DirectoryTitles
|
||||||
// Build list of directories to check
|
// Build list of directories to check
|
||||||
|
@ -161,6 +166,7 @@ func parseMollyFiles(path string, config *Config, errorLog *log.Logger) {
|
||||||
config.GeminiExt = mollyFile.GeminiExt
|
config.GeminiExt = mollyFile.GeminiExt
|
||||||
config.DefaultLang = mollyFile.DefaultLang
|
config.DefaultLang = mollyFile.DefaultLang
|
||||||
config.DirectorySort = mollyFile.DirectorySort
|
config.DirectorySort = mollyFile.DirectorySort
|
||||||
|
config.DirectoriesFirst = mollyFile.DirectoriesFirst
|
||||||
config.DirectoryReverse = mollyFile.DirectoryReverse
|
config.DirectoryReverse = mollyFile.DirectoryReverse
|
||||||
config.DirectoryTitles = mollyFile.DirectoryTitles
|
config.DirectoryTitles = mollyFile.DirectoryTitles
|
||||||
for key, value := range mollyFile.TempRedirects {
|
for key, value := range mollyFile.TempRedirects {
|
||||||
|
|
42
dirlist.go
42
dirlist.go
|
@ -42,10 +42,52 @@ func generateDirectoryListing(URL *url.URL, path string, config Config) (string,
|
||||||
i, j = j, i
|
i, j = j, i
|
||||||
}
|
}
|
||||||
if config.DirectorySort == "Name" {
|
if config.DirectorySort == "Name" {
|
||||||
|
if config.DirectoriesFirst {
|
||||||
|
if files[i].IsDir() {
|
||||||
|
if files[j].IsDir() {
|
||||||
|
return files[i].Name() < files[j].Name()
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if files[j].IsDir() {
|
||||||
|
if files[i].IsDir() {
|
||||||
|
return files[i].Name() < files[j].Name()
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
return files[i].Name() < files[j].Name()
|
return files[i].Name() < files[j].Name()
|
||||||
} else if config.DirectorySort == "Size" {
|
} else if config.DirectorySort == "Size" {
|
||||||
|
if config.DirectoriesFirst {
|
||||||
|
if files[i].IsDir() {
|
||||||
|
if files[j].IsDir() {
|
||||||
|
return files[i].Size() < files[j].Size()
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if files[j].IsDir() {
|
||||||
|
if files[i].IsDir() {
|
||||||
|
return files[i].Size() < files[j].Size()
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
return files[i].Size() < files[j].Size()
|
return files[i].Size() < files[j].Size()
|
||||||
} else if config.DirectorySort == "Time" {
|
} else if config.DirectorySort == "Time" {
|
||||||
|
if config.DirectoriesFirst {
|
||||||
|
if files[i].IsDir() {
|
||||||
|
if files[j].IsDir() {
|
||||||
|
return files[i].ModTime().Before(files[j].ModTime())
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if files[j].IsDir() {
|
||||||
|
if files[i].IsDir() {
|
||||||
|
return files[i].ModTime().Before(files[j].ModTime())
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
return files[i].ModTime().Before(files[j].ModTime())
|
return files[i].ModTime().Before(files[j].ModTime())
|
||||||
}
|
}
|
||||||
return false // Should not happen
|
return false // Should not happen
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
## Directory listing
|
## Directory listing
|
||||||
#
|
#
|
||||||
#DirectorySort = "Time"
|
#DirectorySort = "Time"
|
||||||
|
#DirectoriesFirst = false
|
||||||
#DirectoryReverse = true
|
#DirectoryReverse = true
|
||||||
#DirectoryTitles = true
|
#DirectoryTitles = true
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue