Sort directory listings with directories before files

This commit is contained in:
Russ Magee 2021-08-11 14:05:38 -07:00
parent e42c366565
commit 2dcaf941e4
3 changed files with 49 additions and 0 deletions

View File

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

View File

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

View File

@ -15,6 +15,7 @@
## Directory listing ## Directory listing
# #
#DirectorySort = "Time" #DirectorySort = "Time"
#DirectoriesFirst = false
#DirectoryReverse = true #DirectoryReverse = true
#DirectoryTitles = true #DirectoryTitles = true
# #