Write pagetree as html

This commit is contained in:
Johannes Rothe 2022-09-06 22:13:42 +02:00
parent 82e36eacc1
commit 2160605775
2 changed files with 44 additions and 19 deletions

1
.gitignore vendored
View File

@ -21,3 +21,4 @@
# Go workspace file
go.work
*.html

62
main.go
View File

@ -3,38 +3,56 @@ package main
import (
"encoding/base64"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"strings"
"os"
"text/template"
"github.com/alexflint/go-arg"
)
type NodeData struct {
id string
title string
Id string
Title string
}
type Node struct {
children []*Node
data NodeData
Children []*Node
Data NodeData
}
func (n Node) printChildren(level int) {
log.Printf("%v%v", strings.Repeat("\t", level), n.data.title)
// leaf note
if len(n.children) == 0 {
return
func (n Node) writeHTML(w io.Writer) {
tmpl, err := template.New("root").Parse(`
{{ define "tree" }}
{{ if gt (len .Children) 0 }}
<ul>
{{ range $index, $element := .Children}}
<li>
{{ $element.Data.Title }}
{{ template "tree" $element }}
</li>
{{ end }}
</ul>
{{ end }}
{{ end }}
<html>
{{ template "tree" . }}
</html>
`)
if err != nil {
fmt.Println("ERROR creating template")
}
for _, child := range n.children {
child.printChildren(level + 1)
err = tmpl.Execute(w, n)
if err != nil {
fmt.Printf("ERROR executing template: %v", err)
}
}
func (n *Node) getChildWithID(id string) (node *Node, hasChild bool) {
for _, c := range n.children {
if c.data.id == id {
for _, c := range n.Children {
if c.Data.Id == id {
return c, true
}
}
@ -43,7 +61,7 @@ func (n *Node) getChildWithID(id string) (node *Node, hasChild bool) {
}
func (n *Node) addChild(child *Node) {
n.children = append(n.children, child)
n.Children = append(n.Children, child)
}
type spaceResult struct {
@ -147,7 +165,7 @@ func getSpaceChildren(url, user, token string) spaceResult {
func createPageTree(s *spaceResult) {
var parent *Node
root := Node{data: NodeData{title: "root"}}
root := Node{Data: NodeData{Title: "root"}}
for _, page := range s.Results {
parent = &root
// ignore the root node
@ -165,15 +183,21 @@ func createPageTree(s *spaceResult) {
parent = node
continue
}
n := Node{data: NodeData{id: ancestor.ID, title: ancestor.Title}}
n := Node{Data: NodeData{Id: ancestor.ID, Title: ancestor.Title}}
parent.addChild(&n)
parent = &n
}
// create leaf node
n := Node{data: NodeData{id: page.ID, title: page.Title}}
n := Node{Data: NodeData{Id: page.ID, Title: page.Title}}
parent.addChild(&n)
}
root.printChildren(0)
fname := "tree.html"
f, err := os.Create(fname)
if err != nil {
log.Fatalf("Failed to open %v", fname)
}
defer f.Close()
root.writeHTML(f)
}
func main() {