miki

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

commit 2c088ebdbb839b2633792a5d364168ff1641c226
parent 80f3de4bba87deb3abb8e994af85cd994aa6baf8
Author: weetat <wtenison@protonmail.com>
Date:   Thu, 27 Feb 2025 14:45:20 +0000

Split page handler into home, subject and edit

The subject handler takes a file name from the ?s= query parameter and
renders the matching .fmd from the data directory.

Diffstat:
Msrc/network/routes.go | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mweb/global/header.tmpl.html | 3+--
Mweb/global/styles.css | 4+++-
Mweb/home/index.html | 2+-
Mweb/subject/index.html | 6+++---
5 files changed, 104 insertions(+), 12 deletions(-)

diff --git a/src/network/routes.go b/src/network/routes.go @@ -3,10 +3,12 @@ package network import ( "log" "net/http" + "net/url" "path/filepath" "text/template" mfs "miki/src/filesystem" + "miki/src/fmd" ) var mux *http.ServeMux @@ -21,8 +23,9 @@ func makeServerRoutes() { http.ServeFile(w, r, filepath.Join(mfs.Dirs["web"], "/global/favicon.ico")) }) - mux.HandleFunc("/home", handlePageDefault) - mux.HandleFunc("/edit", handlePageDefault) + mux.HandleFunc("/home", handlePageHome) + mux.HandleFunc("/subject", handlePageSubject) + mux.HandleFunc("/edit", handlePageEdit) mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { @@ -34,7 +37,95 @@ func makeServerRoutes() { }) } -func handlePageDefault(w http.ResponseWriter, r *http.Request) { +func handlePageHome(w http.ResponseWriter, r *http.Request) { + + // Collect HTML template files from directory. + _rPkg, _err := mfs.MakeDirectoryPkg(filepath.Join(mfs.Dirs["web"], r.URL.String()), mfs.SEARCH_DEPTH_ZERO, "*.html") + if _err != nil { + log.Printf("_ERROR\tnetwork:handlePage(\"/subject\"):%s", _err) + http.NotFound(w, r) + return + } + + // Add 'global' file dependencies. + _rPkg.DependencyFiles = append(_rPkg.DependencyFiles, mfs.WebGlobalPkg.DependencyFiles...) + + // Create template from package. + _tmpl, _err := template.ParseFiles(_rPkg.DependencyFiles...) + if _err != nil { + log.Printf("_ERROR\tnetwork:handlePage(\"/home\"):%s", _err) + http.Error(w, "_ERROR:network:handlePage(\"/home\"):template.ParseFiles", http.StatusInternalServerError) + return + } + + var _templateDataContainer struct { + FileText string + } + _templateDataContainer.FileText = fmd.WritFMDToHTMLString(filepath.Join(mfs.Dirs["data"], "/fmd/home.fmd")) + + // Render template. + if _err = _tmpl.ExecuteTemplate(w, "index.html", _templateDataContainer); _err != nil { + log.Printf("_ERROR\tnetwork:handlePageDefault(\"/\"):%s", _err) + http.Error(w, "_ERROR:network:handlePageDefault(\"/\"):template.ExecuteTemplate", http.StatusInternalServerError) + return + } + + log.Printf("DONE\thandlePageDefault:%s", r.URL) +} + +func handlePageSubject(w http.ResponseWriter, r *http.Request) { + + // Collect HTML template files from directory. + _rPkg, _err := mfs.MakeDirectoryPkg(filepath.Join(mfs.Dirs["web"], r.URL.Path), mfs.SEARCH_DEPTH_ZERO, "*.html") + if _err != nil { + log.Printf("_ERROR\tnetwork:handlePage(\"/subject\"):%s", _err) + http.NotFound(w, r) + return + } + + // Add 'global' file dependencies. + _rPkg.DependencyFiles = append(_rPkg.DependencyFiles, mfs.WebGlobalPkg.DependencyFiles...) + + // Create template from package. + _tmpl, _err := template.ParseFiles(_rPkg.DependencyFiles...) + if _err != nil { + log.Printf("_ERROR\tnetwork:handlePage(\"/subject\"):%s", _err) + http.Error(w, "_ERROR:network:handlePage(\"/subject\"):template.ParseFiles", http.StatusInternalServerError) + return + } + + _urlContent, _err := url.Parse(r.URL.String()) + if _err != nil { + log.Printf("_ERROR\tnetwork:handlePage(\"/subject\"):%s", _err) + http.Error(w, "_ERROR:network:handlePage(\"/subject\"):url.Parse", http.StatusInternalServerError) + } + + _urlQuerySubject, _err := url.ParseQuery(_urlContent.RawQuery) + if _err != nil { + log.Printf("_ERROR\tnetwork:handlePage(\"/subject\"):%s", _err) + http.Error(w, "_ERROR:network:handlePage(\"/subject\"):url.ParseQuery", http.StatusInternalServerError) + } + + _fileName := _urlQuerySubject.Get("s") + + var _templateDataContainer struct { + FileName string + FileText string + } + _templateDataContainer.FileName = _fileName + _templateDataContainer.FileText = fmd.WritFMDToHTMLString(filepath.Join(mfs.Dirs["data"], "/fmd/"+_fileName+".fmd")) + + // Render template. + if _err = _tmpl.ExecuteTemplate(w, "index.html", _templateDataContainer); _err != nil { + log.Printf("_ERROR\tnetwork:handlePageDefault(\"/\"):%s", _err) + http.Error(w, "_ERROR:network:handlePageDefault(\"/\"):template.ExecuteTemplate", http.StatusInternalServerError) + return + } + + log.Printf("DONE\thandlePageDefault:%s", r.URL) +} + +func handlePageEdit(w http.ResponseWriter, r *http.Request) { // Collect HTML template files from directory. _rPkg, _err := mfs.MakeDirectoryPkg(filepath.Join(mfs.Dirs["web"], r.URL.String()), mfs.SEARCH_DEPTH_ZERO, "*.html") @@ -51,14 +142,14 @@ func handlePageDefault(w http.ResponseWriter, r *http.Request) { _tmpl, _err := template.ParseFiles(_rPkg.DependencyFiles...) if _err != nil { log.Printf("_ERROR\tnetwork:handlePageDefault(\"/\"):%s", _err) - http.Error(w, "_ERROR:network:handlePageDefault(\"/\"):template.ParseFiles", 500) + http.Error(w, "_ERROR:network:handlePageDefault(\"/\"):template.ParseFiles", http.StatusInternalServerError) return } // Render template. if _err = _tmpl.ExecuteTemplate(w, "index.html", nil); _err != nil { log.Printf("_ERROR\tnetwork:handlePageDefault(\"/\"):%s", _err) - http.Error(w, "_ERROR:network:handlePageDefault(\"/\"):template.ExecuteTemplate", 500) + http.Error(w, "_ERROR:network:handlePageDefault(\"/\"):template.ExecuteTemplate", http.StatusInternalServerError) return } diff --git a/web/global/header.tmpl.html b/web/global/header.tmpl.html @@ -6,7 +6,6 @@ <div class="_button">MENU</div> <div class="_content"> <a href="https://test.wtenison.com/home">HOME</a> - <a href="https://test.wtenison.com/edit">EDIT</a> </div> </div> @@ -15,7 +14,7 @@ <div id="right" class="collapsible_"> <div class="_button">SEARCH</div> <div class="_content"> - <p>TEST SEARCH</p> + <p>COMING SOON</p> </div> </div> diff --git a/web/global/styles.css b/web/global/styles.css @@ -443,6 +443,8 @@ } } - #_body {} + #_body { + padding: var(--miki_padding); + } } } \ No newline at end of file diff --git a/web/home/index.html b/web/home/index.html @@ -24,7 +24,7 @@ <section id="_body"> - {{.fileTextHTML}} + {{.FileText}} </section> diff --git a/web/subject/index.html b/web/subject/index.html @@ -2,7 +2,7 @@ <html> <head> - <title>Miki/Home</title> + <title>Miki/Subject/{{.FileName}}</title> <meta name="viewport" charset="utf-8" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="/web/global/styles.css" /> <script src="/web/global/script.js" defer></script> @@ -10,7 +10,7 @@ <body> - {{template "header" "Home"}} + {{template "header" .FileName}} <section class="_content"> @@ -24,7 +24,7 @@ <section id="_body"> - {{.fileTextHTML}} + {{.FileText}} </section>