diff --git a/main.go b/main.go
index 5050dc6..b697528 100644
--- a/main.go
+++ b/main.go
@@ -25,10 +25,11 @@ type Node struct {
}
type Arguments struct {
- Baseurl string `arg:"required" help:"Base URL of the Confluence instance (required)"`
- Spacekey string `arg:"required" help:"Spacekey to export (required)"`
- User string `arg:"required" help:"User used for authentication (required)"`
- Token string `arg:"required" help:"Token used for authentication (required)"`
+ Baseurl string `arg:"required" help:"Base URL of the Confluence instance (required)"`
+ Spacekey string `arg:"required" help:"Spacekey to export (required)"`
+ User string `arg:"required" help:"User used for authentication (required)"`
+ Token string `arg:"required" help:"Token used for authentication (required)"`
+ WithAttachments bool `arg:"-a,--attachments" help:"Download attachments"`
}
func (n *Node) writeIndex(w io.Writer) {
@@ -38,7 +39,7 @@ func (n *Node) writeIndex(w io.Writer) {
{{ range $index, $element := .Children}}
-
- {{ $element.Data.Title }}
+ {{ $element.Data.Title }}
{{ template "tree" $element }}
{{ end }}
@@ -91,7 +92,7 @@ func (n *Node) addChild(child *Node) {
}
func writeHTML(n *Node) {
- os.Chdir("pages")
+ os.Chdir("content")
f, err := os.Create(n.Data.Id + ".html")
if err != nil {
log.Fatalf("Error creating file for ID %v", n.Data.Id)
@@ -247,6 +248,55 @@ type contentResult struct {
} `json:"_links"`
}
+type attachmentResult struct {
+ Results []struct {
+ ID string `json:"id"`
+ Type string `json:"type"`
+ Status string `json:"status"`
+ Title string `json:"title"`
+ MacroRenderedOutput struct {
+ } `json:"macroRenderedOutput"`
+ Metadata struct {
+ MediaType string `json:"mediaType"`
+ } `json:"metadata"`
+ Extensions struct {
+ MediaType string `json:"mediaType"`
+ FileSize int `json:"fileSize"`
+ Comment string `json:"comment"`
+ MediaTypeDescription string `json:"mediaTypeDescription"`
+ FileID string `json:"fileId"`
+ CollectionName string `json:"collectionName"`
+ } `json:"extensions"`
+ Expandable struct {
+ ChildTypes string `json:"childTypes"`
+ Container string `json:"container"`
+ Operations string `json:"operations"`
+ SchedulePublishDate string `json:"schedulePublishDate"`
+ Children string `json:"children"`
+ Restrictions string `json:"restrictions"`
+ History string `json:"history"`
+ Ancestors string `json:"ancestors"`
+ Body string `json:"body"`
+ Version string `json:"version"`
+ Descendants string `json:"descendants"`
+ Space string `json:"space"`
+ } `json:"_expandable"`
+ Links struct {
+ Webui string `json:"webui"`
+ Self string `json:"self"`
+ Download string `json:"download"`
+ } `json:"_links"`
+ } `json:"results"`
+ Start int `json:"start"`
+ Limit int `json:"limit"`
+ Size int `json:"size"`
+ Links struct {
+ Base string `json:"base"`
+ Context string `json:"context"`
+ Self string `json:"self"`
+ } `json:"_links"`
+}
+
func getRequest(args Arguments, url string) ([]byte, error) {
b64Auth := base64.StdEncoding.EncodeToString([]byte(args.User + ":" + args.Token))
client := &http.Client{}
@@ -294,6 +344,42 @@ func getContentFromID(args Arguments, id string) contentResult {
return result
}
+func downloadAttachmentsForPage(args Arguments, page *Node) {
+ url := args.Baseurl + "/wiki/rest/api/content/" + page.Data.Id + "/child/attachment"
+ body, err := getRequest(args, url)
+ if err != nil {
+ log.Fatal(err)
+ }
+ var result attachmentResult
+ json.Unmarshal(body, &result)
+ for _, att := range result.Results {
+ filename := att.Title
+ url := args.Baseurl + "/wiki/" + att.Links.Download
+ out, err := os.Create(filename)
+ log.Printf("Writing attachment: %v", filename)
+ if err != nil {
+ log.Fatalf("Failed to create file: %v", err)
+ }
+ defer out.Close()
+ body, err := getRequest(args, url)
+ if err != nil {
+ log.Fatalf("Failed to download file: %v", err)
+ }
+ _, err = out.Write(body)
+ if err != nil {
+ log.Fatalf("Failed to write file: %v", err)
+ }
+ }
+
+ // TODO polish html, replace img attachment links, table styling
+ // in html müssen die href zu den files geändert werden
+ // href order img class
+ // data-linked-resource-type="attachment"
+ // data-linked-resource-default-alias="image-20210609-123740.png"
+ // example with image: ROBODEVOPS/pages/3036938774.html
+ // example with href: ROBODEVOPS/pages/2165571587.html
+}
+
func createPageTree(s *spaceResult) *Node {
var parent *Node
root := Node{Data: NodeData{Title: "root"}}
@@ -332,9 +418,9 @@ func main() {
root := createPageTree(&result)
fname := "index.html"
- os.Mkdir("content", 0744)
- os.Mkdir("content/pages", 0744)
- os.Chdir("content")
+ os.Mkdir(args.Spacekey, 0744)
+ os.Mkdir(args.Spacekey+"/content", 0744)
+ os.Chdir(args.Spacekey)
f, err := os.Create(fname)
if err != nil {
log.Fatalf("Failed to open %v", fname)
@@ -347,5 +433,8 @@ func main() {
content := getContentFromID(args, page.Data.Id)
page.Data.Body = content.Body.View.Value
writeHTML(page)
+ if args.WithAttachments {
+ downloadAttachmentsForPage(args, page)
+ }
}
}