miki

Miki: personal wiki with the fmd markup format
git clone https://wtenison.com/repo/miki.git
Log | Files | Refs | README | LICENSE

commit 6899ca04e284877554b91f3f448367eaa141515b
parent eda9cccce7704e65905f26fa0bfc94f055e498e2
Author: weetat <wtenison@protonmail.com>
Date:   Thu, 27 Feb 2025 05:29:12 +0000

Fold DirectorySignature into MakeDirectoryPkg

MakeDirectoryPkg now takes the path, depth and a filepath.Match glob
directly instead of a signature struct holding a regexp. The fmd data
lookup is commented out for now.

Diffstat:
Msrc/filesystem/directories.go | 122++++++++++++++++++++++++++++++++++++-------------------------------------------
Msrc/filesystem/files.go | 4----
Msrc/filesystem/filesystem.go | 9++-------
Msrc/network/network.go | 9++++++---
Msrc/network/routes.go | 10+---------
5 files changed, 65 insertions(+), 89 deletions(-)

diff --git a/src/filesystem/directories.go b/src/filesystem/directories.go @@ -2,12 +2,8 @@ package filesystem import ( "fmt" - "log" - "miki/src/fmd" "os" "path/filepath" - "regexp" - "strings" ) type SearchDepth int @@ -18,112 +14,106 @@ const ( SEARCH_DEPTH_ZERO SearchDepth = 0 ) -type DirectorySignature struct { - Root string // The root directoy of the resource. - DependencyDepth SearchDepth // The folder search depth of the resource. -1=inf, 0=single, >0=n-depth - DependencyPattern *regexp.Regexp // The pattern of valid resource dependency files. -} - type DirectoryPackage struct { Root string // The root directory of the resource. DependencyFiles []string // The set of valid resource files. DependencyData interface{} // Any relevant resource data. } -func MakeDirectorySig(directory string, depth SearchDepth, pattern *regexp.Regexp) (DirectorySignature, error) { +// func MakeDirectoryPkg(resSig DirectorySignature) (DirectoryPackage, error) { +func MakeDirectoryPkg(directory string, depth SearchDepth, filePattern string) (DirectoryPackage, error) { - if directory == "" || depth < -1 || pattern == nil { - _retErr := fmt.Errorf("MakeDirectorySig:invalid directory signature (%s, %d, %s)", directory, depth, pattern) - return DirectorySignature{}, _retErr - } + _dirPkg := DirectoryPackage{Root: filepath.Clean(directory)} - if _, _err := os.Stat(directory); _err != nil { - _retErr := fmt.Errorf("MakeDirectorySig:%s", _err) - return DirectorySignature{}, _retErr + // Check for valid input parameters. + if _dirPkg.Root == "" || depth < -1 { + _retErr := fmt.Errorf("MakeDirectoryDir:invalid directory signature (%s, %d)", _dirPkg.Root, depth) + return _dirPkg, _retErr } - return DirectorySignature{directory, depth, pattern}, nil -} - -func MakeDirectoryPkg(resSig DirectorySignature) (DirectoryPackage, error) { + // Check if input directory exists. + if _, _err := os.Stat(_dirPkg.Root); _err != nil { + _retErr := fmt.Errorf("MakeDirectoryDir:os.Stat:%s", _err) + return _dirPkg, _retErr + } // Check and collect resource signature directory files. - _files, _err := os.ReadDir(resSig.Root) + _fileList, _err := os.ReadDir(_dirPkg.Root) if _err != nil { _retErr := fmt.Errorf("MakeDirectoryPkg:%s", _err) return DirectoryPackage{}, _retErr } - _resPkg := DirectoryPackage{ - Root: resSig.Root, - DependencyFiles: []string{}, - DependencyData: nil, - } - - _resFileDirDeps := []string{} + // A variable to store root sub-directory files. + _subDirPkgDeps := []string{} // Collete all valid files and/or sub-directory files. - for _, _f := range _files { + for _, _f := range _fileList { // Recurse into valid sub-directory files. - if _f.IsDir() && (resSig.DependencyDepth > SEARCH_DEPTH_ZERO || resSig.DependencyDepth == SEARCH_DEPTH_INF) { + if _f.IsDir() && (depth > SEARCH_DEPTH_ZERO || depth == SEARCH_DEPTH_INF) { // Decrement depth if not infinite. - _depDepth := resSig.DependencyDepth - if _depDepth != SEARCH_DEPTH_INF { - _depDepth = _depDepth - 1 - } - - // Make directory signature for each sub-file/dir - _resDirSig, _err := MakeDirectorySig(_f.Name(), _depDepth, resSig.DependencyPattern) - if _err != nil { - _retErr := fmt.Errorf("MakeDirectoryPkg:%s", _err) - return DirectoryPackage{}, _retErr + if depth != SEARCH_DEPTH_INF { + depth-- } - // Make the respective package. - _resDirPkg, _err := MakeDirectoryPkg(_resDirSig) + // Get sub-directory content. + _subDirPkg, _err := MakeDirectoryPkg(_f.Name(), depth, filePattern) if _err != nil { _retErr := fmt.Errorf("MakeDirectoryPkg:%s", _err) return DirectoryPackage{}, _retErr } // Add to package dependencies list. - _resFileDirDeps = append(_resFileDirDeps, _resDirPkg.DependencyFiles...) + _subDirPkgDeps = append(_subDirPkgDeps, _subDirPkg.DependencyFiles...) - } else if resSig.DependencyPattern != nil && resSig.DependencyPattern.MatchString(_f.Name()) { + } else { // Add files that match pattern to dependency list. - _resPkg.DependencyFiles = append(_resPkg.DependencyFiles, filepath.Join(_resPkg.Root, _f.Name())) + if matches, _ := filepath.Match(filePattern, _f.Name()); matches { + _dirPkg.DependencyFiles = append(_dirPkg.DependencyFiles, filepath.Join(_dirPkg.Root, _f.Name())) + } } } // Include any sub-directory file dependencies. - _resPkg.DependencyFiles = append(_resPkg.DependencyFiles, _resFileDirDeps...) + _dirPkg.DependencyFiles = append(_dirPkg.DependencyFiles, _subDirPkgDeps...) + + return _dirPkg, nil // Check for atricle entry. // TODO: Move to secure and refined interface. - _dataFiles, _err := os.ReadDir(Dirs["data"]) - if _err != nil { - _retErr := fmt.Errorf("MakeDirectoryPkg:%s", _err) - return DirectoryPackage{}, _retErr - } - for _, _df := range _dataFiles { - _rootFile := strings.Split(resSig.Root, "/") - _rootDataFile := _rootFile[len(_rootFile)-1] + ".fmd" + // _dataFiles, _err := os.ReadDir(Dirs["data"]) + // if _err != nil { + // _retErr := fmt.Errorf("MakeDirectoryPkg:%s", _err) + // return DirectoryPackage{}, _retErr + // } - if _df.Name() == _rootDataFile { - log.Printf("INFO\tMakeDirectoryPkg:df:%s, rootDataFile:%s", _df.Name(), _rootDataFile) + // for _, _df := range _dataFiles { + // _rootFile := strings.Split(resSig.Root, "/") + // _rootDataFile := _rootFile[len(_rootFile)-1] + ".fmd" - var _DataContainer struct { - PageContent string - } + // if _df.Name() == _rootDataFile { + // log.Printf("INFO\tMakeDirectoryPkg:df:%s, rootDataFile:%s", _df.Name(), _rootDataFile) - _DataContainer.PageContent = fmd.WritFMDToHTMLString(filepath.Join(Dirs["data"], _rootDataFile)) + // var _DataContainer struct { + // PageContent string + // } - _resPkg.DependencyData = _DataContainer - } - } + // _DataContainer.PageContent = fmd.WritFMDToHTMLString(filepath.Join(Dirs["data"], _rootDataFile)) - return _resPkg, nil + // _resPkg.DependencyData = _DataContainer + // } + // } } + +// func AppendRootPathToFiles(root string, files []string) []string { +// var _appendedFileList []string + +// for _, _f := range files { +// _appendedFileList = append(_appendedFileList, filepath.Join(root, _f)) +// } + +// return _appendedFileList +// } diff --git a/src/filesystem/files.go b/src/filesystem/files.go @@ -4,12 +4,8 @@ import ( "encoding/json" "fmt" "os" - "regexp" ) -var FilePatternHTML = regexp.MustCompile("^([a-zA-Z0-9.]+).html$") -var FilePatternJSON = regexp.MustCompile("^([a-zA-Z0-9.]+).json$") - func ReadFileJSON(filePath string, outputDataContainer interface{}) error { _fsData, _err := os.ReadFile(filePath) diff --git a/src/filesystem/filesystem.go b/src/filesystem/filesystem.go @@ -5,7 +5,6 @@ import ( "path/filepath" ) -// var Dirs map[string]string var Dirs = make(map[string]string) var WebGlobalPkg DirectoryPackage @@ -30,12 +29,8 @@ func Init() { //// GET GLOBAL WEB RESOURCES - _globalSig, _err := MakeDirectorySig(filepath.Join(Dirs["web"], "/global"), 0, FilePatternHTML) - if _err != nil { - log.Panicf("__PANIC\tfilesystem:Init:%s", _err) - } - - WebGlobalPkg, _err = MakeDirectoryPkg(_globalSig) + var _err error + WebGlobalPkg, _err = MakeDirectoryPkg(filepath.Join(Dirs["web"], "/global"), SEARCH_DEPTH_ZERO, "*.html") if _err != nil { log.Panicf("__PANIC\tfilesystem:Init:%s", _err) } diff --git a/src/network/network.go b/src/network/network.go @@ -26,11 +26,14 @@ func Init() { CertFile string `json:"cert-file"` KeyFile string `json:"key-file"` } + var _siDataStruct struct { ServerInfo ServerInfo `json:"server-info"` } - mfs.ReadFileJSON("sys/config.json", &_siDataStruct) + if _err := mfs.ReadFileJSON("sys/config.json", &_siDataStruct); _err != nil { + log.Panicf("__PANIC\tfilesystem:%s", _err) + } serverInfo.port = _siDataStruct.ServerInfo.Port serverInfo.sslPath = _siDataStruct.ServerInfo.SslPath @@ -42,11 +45,11 @@ func Init() { //// CHECK FOR VALID CERT INFO if _, err := os.Stat(serverInfo.certFile); err != nil { - log.Panicf("__PANIC\tnetwork:Init:%s", err) + log.Panicf("__PANIC\tnetwork:Init:os.Stat:%s", err) } if _, err := os.Stat(serverInfo.keyFile); err != nil { - log.Panicf("__PANIC\tnetwork:Init:%s", err) + log.Panicf("__PANIC\tnetwork:Init:os.Stat:%s", err) } //// MAKE SERVER ROUTES diff --git a/src/network/routes.go b/src/network/routes.go @@ -36,16 +36,8 @@ func makeServerRoutes() { func handlePageDefault(w http.ResponseWriter, r *http.Request) { - // Produce URL path to directory relation. - _r, _err := mfs.MakeDirectorySig(filepath.Join(mfs.Dirs["web"], r.URL.String()), 0, mfs.FilePatternHTML) - if _err != nil { - log.Printf("_ERROR\tnetwork:handlePageDefault(\"/\"):%s", _err) - http.NotFound(w, r) - return - } - // Collect HTML template files from directory. - _rPkg, _err := mfs.MakeDirectoryPkg(_r) + _rPkg, _err := mfs.MakeDirectoryPkg(filepath.Join(mfs.Dirs["web"], r.URL.String()), mfs.SEARCH_DEPTH_ZERO, "*.html") if _err != nil { log.Printf("_ERROR\tnetwork:handlePageDefault(\"/\"):%s", _err) http.NotFound(w, r)