~bigbes/confluence-md-utilities

66a3cf57f5b1a7a57ef001630cc025c24971e90a — Eugene Blikh 2 months ago b3d8390
feat: split convert into md2xml and xml2md commands

Replace the single convert command with two directional commands:
md2xml for Markdown→Confluence XML and xml2md for the reverse.
Update completions and README accordingly.
5 files changed, 74 insertions(+), 12 deletions(-)

M .gitignore
M README.md
M cmd/mdcx/completions.go
R cmd/mdcx/{convert => md2xml}.go
A cmd/mdcx/xml2md.go
M .gitignore => .gitignore +2 -0
@@ 5,6 5,8 @@
0-root.xml
rfc-111.xml
rfc-111.md
raw.md
raw.xml

# IDE
.idea/

M README.md => README.md +12 -3
@@ 20,13 20,22 @@ just install

## Commands

### convert
### md2xml

Markdown to Confluence XML.

```bash
mdcx convert input.md -o output.xml
cat input.md | mdcx convert > output.xml
mdcx md2xml input.md -o output.xml
cat input.md | mdcx md2xml > output.xml
```

### xml2md

Confluence XML to Markdown.

```bash
mdcx xml2md input.xml -o output.md
cat input.xml | mdcx xml2md > output.md
```

### embed

M cmd/mdcx/completions.go => cmd/mdcx/completions.go +4 -2
@@ 7,7 7,8 @@ import (
func init() {
	// File extension hints for positional args

	convertCmd.ValidArgsFunction = completeMarkdownFiles
	md2xmlCmd.ValidArgsFunction = completeMarkdownFiles
	xml2mdCmd.ValidArgsFunction = completeXMLFiles
	embedCmd.ValidArgsFunction = completeMarkdownFiles
	fmtCmd.ValidArgsFunction = completeXMLFiles
	extractCmd.ValidArgsFunction = completeXMLFiles


@@ 16,7 17,8 @@ func init() {
	pushCmd.ValidArgsFunction = completePushArgs

	// Flag file completions
	_ = convertCmd.RegisterFlagCompletionFunc("output", completeXMLFilesFlag)
	_ = md2xmlCmd.RegisterFlagCompletionFunc("output", completeXMLFilesFlag)
	_ = xml2mdCmd.RegisterFlagCompletionFunc("output", completeMarkdownFilesFlag)
	_ = embedCmd.RegisterFlagCompletionFunc("output", completeXMLFilesFlag)
	_ = embedCmd.RegisterFlagCompletionFunc("template", completeXMLFilesFlag)
	_ = extractCmd.RegisterFlagCompletionFunc("output", completeMarkdownFilesFlag)

R cmd/mdcx/convert.go => cmd/mdcx/md2xml.go +7 -7
@@ 10,10 10,10 @@ import (
	"go.bigb.es/confluence-md-utilities/converter"
)

var convertOutput string
var md2xmlOutput string

var convertCmd = &cobra.Command{
	Use:   "convert [input.md]",
var md2xmlCmd = &cobra.Command{
	Use:   "md2xml [input.md]",
	Short: "Convert Markdown to Confluence XML",
	Long:  "Convert a Markdown file to Confluence storage format XML. Reads from stdin if no file is specified.",
	Args:  cobra.MaximumNArgs(1),


@@ 35,8 35,8 @@ var convertCmd = &cobra.Command{
			return fmt.Errorf("converting: %w", err)
		}

		if convertOutput != "" {
			return os.WriteFile(convertOutput, []byte(result), 0644)
		if md2xmlOutput != "" {
			return os.WriteFile(md2xmlOutput, []byte(result), 0644)
		}
		fmt.Print(result)
		return nil


@@ 44,6 44,6 @@ var convertCmd = &cobra.Command{
}

func init() {
	convertCmd.Flags().StringVarP(&convertOutput, "output", "o", "", "Output file (default: stdout)")
	rootCmd.AddCommand(convertCmd)
	md2xmlCmd.Flags().StringVarP(&md2xmlOutput, "output", "o", "", "Output file (default: stdout)")
	rootCmd.AddCommand(md2xmlCmd)
}

A cmd/mdcx/xml2md.go => cmd/mdcx/xml2md.go +49 -0
@@ 0,0 1,49 @@
package main

import (
	"fmt"
	"io"
	"os"

	"github.com/spf13/cobra"

	"go.bigb.es/confluence-md-utilities/converter"
)

var xml2mdOutput string

var xml2mdCmd = &cobra.Command{
	Use:   "xml2md [input.xml]",
	Short: "Convert Confluence XML to Markdown",
	Long:  "Convert a Confluence storage format XML file to Markdown. Reads from stdin if no file is specified.",
	Args:  cobra.MaximumNArgs(1),
	RunE: func(cmd *cobra.Command, args []string) error {
		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)
		}

		result, err := converter.ConfluenceToMarkdown(string(input))
		if err != nil {
			return fmt.Errorf("converting: %w", err)
		}

		if xml2mdOutput != "" {
			return os.WriteFile(xml2mdOutput, []byte(result), 0644)
		}
		fmt.Print(result)
		return nil
	},
}

func init() {
	xml2mdCmd.Flags().StringVarP(&xml2mdOutput, "output", "o", "", "Output file (default: stdout)")
	rootCmd.AddCommand(xml2mdCmd)
}