From ea17dae687ab24d3d73c3dfc3bd3f71ea9c94c96 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Wed, 3 Aug 2022 20:44:11 +0700 Subject: lib/memfs: add method to generate index.html in Node's Content The GenerateIndexHtml generate simple directory listing as HTML for all child in the node. This method is only applicable if node is a directory. --- lib/memfs/node.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/lib/memfs/node.go b/lib/memfs/node.go index bf436fc1..0520a044 100644 --- a/lib/memfs/node.go +++ b/lib/memfs/node.go @@ -21,6 +21,17 @@ import ( libbytes "github.com/shuLhan/share/lib/bytes" ) +const ( + templateIndexHtmlHeader = ` + + + + +` +) + var ( errOffset = errors.New("Seek: invalid offset") errWhence = errors.New("Seek: invalid whence") @@ -139,6 +150,46 @@ func (node *Node) Close() error { return nil } +// GenerateIndexHtml generate simple directory listing as HTML for all childs +// in this node. +// This method is only applicable if node is a directory. +func (node *Node) GenerateIndexHtml() { + if !node.IsDir() { + return + } + if len(node.Content) != 0 { + // Either the index has been generated or the node is not + // empty. + node.size = int64(len(node.Content)) + return + } + + var ( + buf bytes.Buffer + child *Node + ) + + buf.WriteString(templateIndexHtmlHeader) + + fmt.Fprintf(&buf, `

Index of %s

`, node.name) + + if node.Parent != nil { + buf.WriteString(`
..

`) + } + + for _, child = range node.Childs { + fmt.Fprintf(&buf, `
%s %12d %s %s

`, + child.mode, child.size, child.modTime.Format(time.RFC3339), + child.Path, child.name) + } + + buf.WriteString(``) + + node.ContentType = `text/html; charset=utf-8` + node.size = int64(buf.Len()) + node.Content = libbytes.Copy(buf.Bytes()) +} + func (node *Node) IsDir() bool { return node.mode.IsDir() } -- cgit v1.3