From 66a3cf57f5b1a7a57ef001630cc025c24971e90a Mon Sep 17 00:00:00 2001 From: Eugene Blikh Date: Thu, 7 May 2026 17:19:42 +0300 Subject: [PATCH] feat: split convert into md2xml and xml2md commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the single convert command with two directional commands: md2xml for Markdown→Confluence XML and xml2md for the reverse. Update completions and README accordingly. --- .gitignore | 2 ++ README.md | 15 +++++++-- cmd/mdcx/completions.go | 6 ++-- cmd/mdcx/{convert.go => md2xml.go} | 14 ++++----- cmd/mdcx/xml2md.go | 49 ++++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+), 12 deletions(-) rename cmd/mdcx/{convert.go => md2xml.go} (71%) create mode 100644 cmd/mdcx/xml2md.go diff --git a/.gitignore b/.gitignore index 4ad9582aca8ed4c02c8f0bcf242bc9ecd7ecb381..81bb79a46265829d5078b62718f7c9746b9075d6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ 0-root.xml rfc-111.xml rfc-111.md +raw.md +raw.xml # IDE .idea/ diff --git a/README.md b/README.md index b2dc9c469cd6a9039fff2912fd64e7ccdb36d3f5..b41b7d171c20c8f32108c8a2c82079b193be10d3 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/cmd/mdcx/completions.go b/cmd/mdcx/completions.go index e4542a627bb1bb9a83485e9507d786dc4ba1bbc5..a795b3257f9d3e7c2a419d02039b3c05b615a51f 100644 --- a/cmd/mdcx/completions.go +++ b/cmd/mdcx/completions.go @@ -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) diff --git a/cmd/mdcx/convert.go b/cmd/mdcx/md2xml.go similarity index 71% rename from cmd/mdcx/convert.go rename to cmd/mdcx/md2xml.go index c915df9f2f7e4a5a59e2ba068d9fb0f05c1f4852..2334dff7d3192adfcf679687860ca8df5b439c6d 100644 --- a/cmd/mdcx/convert.go +++ b/cmd/mdcx/md2xml.go @@ -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) } diff --git a/cmd/mdcx/xml2md.go b/cmd/mdcx/xml2md.go new file mode 100644 index 0000000000000000000000000000000000000000..8f4aad341ea2db2cda95df1dd95202f0378d9a6d --- /dev/null +++ b/cmd/mdcx/xml2md.go @@ -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) +}