package cmd import ( "fmt" "io" "os" "github.com/spf13/cobra" "sourcecraft.dev/bigbes/confluence-md-utilities/converter" "sourcecraft.dev/bigbes/confluence-md-utilities/template" ) var ( extractOutput string extractMarkerStart string extractMarkerEnd string extractRaw bool ) var extractCmd = &cobra.Command{ Use: "extract [input.xml]", Short: "Extract Markdown from a Confluence XML document", Long: `Extract content between marker comments from a Confluence XML document and convert it back to Markdown. The document must contain marker comments: Use --raw to get the Confluence XML without converting to Markdown. Reads from stdin if no file is specified.`, Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { // Read input var input []byte var err error if len(args) > 0 { input, err = os.ReadFile(args[0]) } else { input, err = io.ReadAll(os.Stdin) } if err != nil { return fmt.Errorf("reading input: %w", err) } // Extract content between markers xmlContent, err := template.Extract(string(input), extractMarkerStart, extractMarkerEnd) if err != nil { return fmt.Errorf("extracting: %w", err) } var result string if extractRaw { result = xmlContent } else { result, err = converter.ConfluenceToMarkdown(xmlContent) if err != nil { return fmt.Errorf("converting to markdown: %w", err) } } if extractOutput != "" { return os.WriteFile(extractOutput, []byte(result), 0644) } fmt.Print(result) return nil }, } func init() { extractCmd.Flags().StringVarP(&extractOutput, "output", "o", "", "Output file (default: stdout)") extractCmd.Flags().StringVar(&extractMarkerStart, "marker-start", template.DefaultMarkerStart, "Start marker comment") extractCmd.Flags().StringVar(&extractMarkerEnd, "marker-end", template.DefaultMarkerEnd, "End marker comment") extractCmd.Flags().BoolVar(&extractRaw, "raw", false, "Output raw Confluence XML instead of Markdown") rootCmd.AddCommand(extractCmd) }