pull.go

v0.1.0
Doc Versions Source
1
package main
2
3
import (
4
	"fmt"
5
	"os"
6
7
	"github.com/spf13/cobra"
8
9
	"go.bigb.es/confluence-md-utilities/api"
10
	"go.bigb.es/confluence-md-utilities/converter"
11
)
12
13
var (
14
	pullOutput string
15
	pullRaw    bool
16
)
17
18
var pullCmd = &cobra.Command{
19
	Use:   "pull <confluence-url>",
20
	Short: "Pull a page from Confluence and convert to Markdown",
21
	Long: `Fetch a Confluence page by URL, extract its storage format body,
22
and convert it to Markdown.
23
24
Supported URL formats:
25
  https://confluence.example.com/pages/viewpage.action?pageId=12345
26
  https://confluence.example.com/display/SPACE/Page+Title
27
28
Use --raw to get the Confluence storage XML without converting to Markdown.
29
30
Authentication via --token flag or CONFLUENCE_TOKEN environment variable.`,
31
	Args: cobra.ExactArgs(1),
32
	RunE: func(cmd *cobra.Command, args []string) error {
33
		token := resolveToken()
34
		if token == "" {
35
			return fmt.Errorf("Confluence token required: use --token flag or set CONFLUENCE_TOKEN env var")
36
		}
37
38
		ref, err := api.ParsePageURL(args[0])
39
		if err != nil {
40
			return err
41
		}
42
43
		client := api.NewClient(ref.BaseURL, token)
44
		page, err := client.GetPage(ref)
45
		if err != nil {
46
			return err
47
		}
48
49
		xmlBody := page.Body.Storage.Value
50
		fmt.Fprintf(os.Stderr, "Pulled page: %s (id=%s, version=%d)\n", page.Title, page.ID, page.Version.Number)
51
52
		var result string
53
		if pullRaw {
54
			result = xmlBody
55
		} else {
56
			result, err = converter.ConfluenceToMarkdown(xmlBody)
57
			if err != nil {
58
				return fmt.Errorf("converting to markdown: %w", err)
59
			}
60
		}
61
62
		if pullOutput != "" {
63
			if err := os.WriteFile(pullOutput, []byte(result), 0644); err != nil {
64
				return err
65
			}
66
			fmt.Fprintf(os.Stderr, "Written to %s\n", pullOutput)
67
			return nil
68
		}
69
		fmt.Print(result)
70
		return nil
71
	},
72
}
73
74
func init() {
75
	pullCmd.Flags().StringVarP(&pullOutput, "output", "o", "", "Output file (default: stdout)")
76
	pullCmd.Flags().BoolVar(&pullRaw, "raw", false, "Output raw Confluence storage XML instead of Markdown")
77
	rootCmd.AddCommand(pullCmd)
78
}
79

Source Files