| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- // Command-line tool for exporting mermaid diagrams
- package main
- import (
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "strings"
- "mermaid-go/pkg/exporter"
- "mermaid-go/pkg/parser"
- )
- func main() {
- // Command line flags
- var (
- inputFile = flag.String("input", "", "Input mermaid file (.mmd)")
- outputFile = flag.String("output", "", "Output file (format inferred from extension)")
- format = flag.String("format", "svg", "Output format (svg)")
- width = flag.Int("width", 800, "Output width in pixels")
- height = flag.Int("height", 600, "Output height in pixels")
- theme = flag.String("theme", "default", "Theme for SVG output")
- help = flag.Bool("help", false, "Show help")
- )
- flag.Parse()
- if *help || *inputFile == "" {
- showHelp()
- return
- }
- // Validate input file
- if !fileExists(*inputFile) {
- log.Fatalf("Input file does not exist: %s", *inputFile)
- }
- // Read input file
- content, err := ioutil.ReadFile(*inputFile)
- if err != nil {
- log.Fatalf("Failed to read input file: %v", err)
- }
- // Parse diagram
- mermaidParser := parser.NewMermaidParser()
- diagram, err := mermaidParser.Parse(string(content))
- if err != nil {
- log.Fatalf("Failed to parse mermaid diagram: %v", err)
- }
- // Validate diagram
- if err := diagram.Validate(); err != nil {
- log.Printf("Warning: Diagram validation failed: %v", err)
- }
- // Determine output file
- if *outputFile == "" {
- base := strings.TrimSuffix(*inputFile, filepath.Ext(*inputFile))
- *outputFile = fmt.Sprintf("%s.%s", base, *format)
- }
- // Create export options
- var exportFormat exporter.ExportFormat
- switch strings.ToLower(*format) {
- case "svg":
- exportFormat = exporter.FormatSVG
- default:
- log.Fatalf("Unsupported format: %s (only 'svg' is supported)", *format)
- }
- options := &exporter.ExportOptions{
- Format: exportFormat,
- Width: *width,
- Height: *height,
- Theme: *theme,
- }
- // Export diagram
- exp := exporter.NewDiagramExporter()
- if !exp.IsFormatSupported(exportFormat) {
- log.Fatalf("Format %s is not supported", *format)
- }
- if !exp.IsDiagramTypeSupported(diagram.Type()) {
- log.Printf("Warning: Diagram type %s may have limited export support", diagram.Type())
- }
- err = exp.ExportToFile(diagram, *outputFile, options)
- if err != nil {
- log.Fatalf("Failed to export diagram: %v", err)
- }
- // Show success message
- fmt.Printf("✅ Successfully exported %s diagram to %s\n", diagram.Type(), *outputFile)
- // Show file info
- if info, err := os.Stat(*outputFile); err == nil {
- fmt.Printf(" File size: %d bytes\n", info.Size())
- fmt.Printf(" Dimensions: %dx%d pixels\n", *width, *height)
- fmt.Printf(" Theme: %s\n", *theme)
- }
- }
- func showHelp() {
- fmt.Println("Mermaid Diagram Export Tool")
- fmt.Println()
- fmt.Println("Usage:")
- fmt.Println(" mermaid-export -input diagram.mmd [options]")
- fmt.Println()
- fmt.Println("Options:")
- flag.PrintDefaults()
- fmt.Println()
- fmt.Println("Examples:")
- fmt.Println(" # Export to SVG")
- fmt.Println(" mermaid-export -input flowchart.mmd -output diagram.svg")
- fmt.Println()
- fmt.Println(" # Export to SVG with custom size")
- fmt.Println(" mermaid-export -input diagram.mmd -width 1200 -height 800")
- fmt.Println()
- fmt.Println(" # Export with custom theme")
- fmt.Println(" mermaid-export -input chart.mmd -theme dark")
- fmt.Println()
- fmt.Println("Supported formats: svg")
- fmt.Println("Supported diagram types: flowchart, sequence, class, state, er, pie, gantt, timeline, journey, architecture, organization, bpmn")
- }
- func fileExists(filename string) bool {
- _, err := os.Stat(filename)
- return !os.IsNotExist(err)
- }
|