main.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Command-line tool for exporting mermaid diagrams
  2. package main
  3. import (
  4. "flag"
  5. "fmt"
  6. "io/ioutil"
  7. "log"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. "mermaid-go/pkg/exporter"
  12. "mermaid-go/pkg/parser"
  13. )
  14. func main() {
  15. // Command line flags
  16. var (
  17. inputFile = flag.String("input", "", "Input mermaid file (.mmd)")
  18. outputFile = flag.String("output", "", "Output file (format inferred from extension)")
  19. format = flag.String("format", "svg", "Output format (svg)")
  20. width = flag.Int("width", 800, "Output width in pixels")
  21. height = flag.Int("height", 600, "Output height in pixels")
  22. theme = flag.String("theme", "default", "Theme for SVG output")
  23. help = flag.Bool("help", false, "Show help")
  24. )
  25. flag.Parse()
  26. if *help || *inputFile == "" {
  27. showHelp()
  28. return
  29. }
  30. // Validate input file
  31. if !fileExists(*inputFile) {
  32. log.Fatalf("Input file does not exist: %s", *inputFile)
  33. }
  34. // Read input file
  35. content, err := ioutil.ReadFile(*inputFile)
  36. if err != nil {
  37. log.Fatalf("Failed to read input file: %v", err)
  38. }
  39. // Parse diagram
  40. mermaidParser := parser.NewMermaidParser()
  41. diagram, err := mermaidParser.Parse(string(content))
  42. if err != nil {
  43. log.Fatalf("Failed to parse mermaid diagram: %v", err)
  44. }
  45. // Validate diagram
  46. if err := diagram.Validate(); err != nil {
  47. log.Printf("Warning: Diagram validation failed: %v", err)
  48. }
  49. // Determine output file
  50. if *outputFile == "" {
  51. base := strings.TrimSuffix(*inputFile, filepath.Ext(*inputFile))
  52. *outputFile = fmt.Sprintf("%s.%s", base, *format)
  53. }
  54. // Create export options
  55. var exportFormat exporter.ExportFormat
  56. switch strings.ToLower(*format) {
  57. case "svg":
  58. exportFormat = exporter.FormatSVG
  59. default:
  60. log.Fatalf("Unsupported format: %s (only 'svg' is supported)", *format)
  61. }
  62. options := &exporter.ExportOptions{
  63. Format: exportFormat,
  64. Width: *width,
  65. Height: *height,
  66. Theme: *theme,
  67. }
  68. // Export diagram
  69. exp := exporter.NewDiagramExporter()
  70. if !exp.IsFormatSupported(exportFormat) {
  71. log.Fatalf("Format %s is not supported", *format)
  72. }
  73. if !exp.IsDiagramTypeSupported(diagram.Type()) {
  74. log.Printf("Warning: Diagram type %s may have limited export support", diagram.Type())
  75. }
  76. err = exp.ExportToFile(diagram, *outputFile, options)
  77. if err != nil {
  78. log.Fatalf("Failed to export diagram: %v", err)
  79. }
  80. // Show success message
  81. fmt.Printf("✅ Successfully exported %s diagram to %s\n", diagram.Type(), *outputFile)
  82. // Show file info
  83. if info, err := os.Stat(*outputFile); err == nil {
  84. fmt.Printf(" File size: %d bytes\n", info.Size())
  85. fmt.Printf(" Dimensions: %dx%d pixels\n", *width, *height)
  86. fmt.Printf(" Theme: %s\n", *theme)
  87. }
  88. }
  89. func showHelp() {
  90. fmt.Println("Mermaid Diagram Export Tool")
  91. fmt.Println()
  92. fmt.Println("Usage:")
  93. fmt.Println(" mermaid-export -input diagram.mmd [options]")
  94. fmt.Println()
  95. fmt.Println("Options:")
  96. flag.PrintDefaults()
  97. fmt.Println()
  98. fmt.Println("Examples:")
  99. fmt.Println(" # Export to SVG")
  100. fmt.Println(" mermaid-export -input flowchart.mmd -output diagram.svg")
  101. fmt.Println()
  102. fmt.Println(" # Export to SVG with custom size")
  103. fmt.Println(" mermaid-export -input diagram.mmd -width 1200 -height 800")
  104. fmt.Println()
  105. fmt.Println(" # Export with custom theme")
  106. fmt.Println(" mermaid-export -input chart.mmd -theme dark")
  107. fmt.Println()
  108. fmt.Println("Supported formats: svg")
  109. fmt.Println("Supported diagram types: flowchart, sequence, class, state, er, pie, gantt, timeline, journey, architecture, organization, bpmn")
  110. }
  111. func fileExists(filename string) bool {
  112. _, err := os.Stat(filename)
  113. return !os.IsNotExist(err)
  114. }