diff --git a/go.mod b/go.mod index 405bfb2..87a9644 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/dlclark/regexp2 v1.11.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect @@ -39,6 +40,8 @@ require ( github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect github.com/tetratelabs/wazero v1.7.0 // indirect golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect golang.org/x/sync v0.6.0 // indirect diff --git a/go.sum b/go.sum index 56f5052..105f240 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,7 @@ github.com/charmbracelet/x/exp/term v0.0.0-20240403043919-dea9035a27d4 h1:LewLBF github.com/charmbracelet/x/exp/term v0.0.0-20240403043919-dea9035a27d4/go.mod h1:6GZ13FjIP6eOCqWU4lqgveGnYxQo9c3qBzHPeFu4HBE= github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -51,6 +52,8 @@ github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/kanrichan/resvg-go v0.0.2-0.20231001163256-63db194ca9f5 h1:BXnB1Gz4y/zwQh+ZFNy7rgd+ZfMOrwRr4uZSHEI+ieY= github.com/kanrichan/resvg-go v0.0.2-0.20231001163256-63db194ca9f5/go.mod h1:c9+VS9GaommgIOzNWb5ze4lYwfT8BZ2UDyGiuQTT7yc= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= @@ -76,6 +79,11 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/main.go b/main.go index 3675a47..2434f24 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ import ( "github.com/charmbracelet/x/exp/term/ansi" "github.com/charmbracelet/x/exp/term/ansi/parser" "github.com/mattn/go-isatty" + "github.com/spf13/cobra" ) const ( @@ -37,6 +38,19 @@ var ( // CommitSHA contains the SHA of the commit that this application was built // against. It's set via ldflags when building. CommitSHA = "" + + rootCmd = &cobra.Command{ + Use: "freeze [options] [file]", + Short: "Generate images of code and terminal output", + Long: `Generate images of code and terminal output. 📸`, + SilenceUsage: false, + SilenceErrors: false, + TraverseChildren: true, + Run: func(cmd *cobra.Command, args []string) { + + cmd.Help() + }, + } ) func main() { @@ -61,7 +75,6 @@ func main() { if len(ctx.Args) > 0 { switch ctx.Args[0] { - case "version": if Version == "" { if info, ok := debug.ReadBuildInfo(); ok && info.Main.Sum != "" { @@ -173,7 +186,10 @@ func main() { strippedInput = cut(strippedInput, config.Lines) if !isAnsi && lexer == nil { - printErrorFatal("Language Unknown", errors.New("specify a language with the --language flag")) + printErrorFatal( + "Language Unknown", + errors.New("specify a language with the --language flag"), + ) } input = cut(input, config.Lines) @@ -292,7 +308,13 @@ func main() { if config.Shadow.Blur > 0 || config.Shadow.X > 0 || config.Shadow.Y > 0 { id := "shadow" - svg.AddShadow(image, id, config.Shadow.X*scale, config.Shadow.Y*scale, config.Shadow.Blur*scale) + svg.AddShadow( + image, + id, + config.Shadow.X*scale, + config.Shadow.Y*scale, + config.Shadow.Blur*scale, + ) terminal.CreateAttr("filter", fmt.Sprintf("url(#%s)", id)) } @@ -324,7 +346,11 @@ func main() { line.InsertChildAt(0, ln) } x := float64(config.Padding[left] + config.Margin[left]) - y := (float64(i+1))*(config.Font.Size*config.LineHeight) + float64(config.Padding[top]) + float64(config.Margin[top]) + y := (float64(i+1))*(config.Font.Size*config.LineHeight) + float64( + config.Padding[top], + ) + float64( + config.Margin[top], + ) svg.Move(line, x, y) @@ -339,7 +365,9 @@ func main() { if isAnsi { tabWidth = 6 } - longestLine := lipgloss.Width(strings.ReplaceAll(strippedInput, "\t", strings.Repeat(" ", tabWidth))) + longestLine := lipgloss.Width( + strings.ReplaceAll(strippedInput, "\t", strings.Repeat(" ", tabWidth)), + ) terminalWidth = float64(longestLine+1) * (config.Font.Size / fontHeightToWidthRatio) terminalWidth *= scale terminalWidth += hPadding @@ -369,7 +397,11 @@ func main() { terminalWidth, terminalHeight-config.Padding[bottom]) } - svg.Move(terminal, max(float64(config.Margin[left]), float64(config.Border.Width)/2), max(float64(config.Margin[top]), float64(config.Border.Width)/2)) + svg.Move( + terminal, + max(float64(config.Margin[left]), float64(config.Border.Width)/2), + max(float64(config.Margin[top]), float64(config.Border.Width)/2), + ) svg.SetDimensions(image, imageWidth, imageHeight) svg.SetDimensions(terminal, terminalWidth, terminalHeight) @@ -431,7 +463,10 @@ func main() { // reading from file. if istty { - config.Output = strings.TrimSuffix(filepath.Base(config.Input), filepath.Ext(config.Input)) + ".svg" + config.Output = strings.TrimSuffix( + filepath.Base(config.Input), + filepath.Ext(config.Input), + ) + ".svg" err = doc.WriteToFile(config.Output) printFilenameOutput(config.Output) } else { @@ -443,7 +478,13 @@ func main() { } } -var outputHeader = lipgloss.NewStyle().Foreground(lipgloss.Color("#F1F1F1")).Background(lipgloss.Color("#6C50FF")).Bold(true).Padding(0, 1).MarginRight(1).SetString("WROTE") +var outputHeader = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#F1F1F1")). + Background(lipgloss.Color("#6C50FF")). + Bold(true). + Padding(0, 1). + MarginRight(1). + SetString("WROTE") func printFilenameOutput(filename string) { fmt.Println(lipgloss.JoinHorizontal(lipgloss.Center, outputHeader.String(), filename))