package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
"sourcecraft.dev/bigbes/markdown-to-confluence-xml/api"
"sourcecraft.dev/bigbes/markdown-to-confluence-xml/converter"
)
var (
pullOutput string
pullRaw bool
)
var pullCmd = &cobra.Command{
Use: "pull <confluence-url>",
Short: "Pull a page from Confluence and convert to Markdown",
Long: `Fetch a Confluence page by URL, extract its storage format body,
and convert it to Markdown.
Supported URL formats:
https://confluence.example.com/pages/viewpage.action?pageId=12345
https://confluence.example.com/display/SPACE/Page+Title
Use --raw to get the Confluence storage XML without converting to Markdown.
Authentication via --token flag or CONFLUENCE_TOKEN environment variable.`,
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
token := resolveToken()
if token == "" {
return fmt.Errorf("Confluence token required: use --token flag or set CONFLUENCE_TOKEN env var")
}
ref, err := api.ParsePageURL(args[0])
if err != nil {
return err
}
client := api.NewClient(ref.BaseURL, token)
page, err := client.GetPage(ref)
if err != nil {
return err
}
xmlBody := page.Body.Storage.Value
fmt.Fprintf(os.Stderr, "Pulled page: %s (id=%s, version=%d)\n", page.Title, page.ID, page.Version.Number)
var result string
if pullRaw {
result = xmlBody
} else {
result, err = converter.ConfluenceToMarkdown(xmlBody)
if err != nil {
return fmt.Errorf("converting to markdown: %w", err)
}
}
if pullOutput != "" {
if err := os.WriteFile(pullOutput, []byte(result), 0644); err != nil {
return err
}
fmt.Fprintf(os.Stderr, "Written to %s\n", pullOutput)
return nil
}
fmt.Print(result)
return nil
},
}
func init() {
pullCmd.Flags().StringVarP(&pullOutput, "output", "o", "", "Output file (default: stdout)")
pullCmd.Flags().BoolVar(&pullRaw, "raw", false, "Output raw Confluence storage XML instead of Markdown")
rootCmd.AddCommand(pullCmd)
}