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)
+}