package freezelib import ( "fmt" "strings" ) // QuickFreeze provides a simplified, chainable API for quick code screenshots type QuickFreeze struct { config *Config } // NewQuickFreeze creates a new QuickFreeze instance with default configuration func NewQuickFreeze() *QuickFreeze { return &QuickFreeze{ config: DefaultConfig(), } } // NewQuickFreezeWithPreset creates a new QuickFreeze instance with a preset func NewQuickFreezeWithPreset(presetName string) *QuickFreeze { return &QuickFreeze{ config: GetPreset(presetName), } } // WithTheme sets the syntax highlighting theme func (qf *QuickFreeze) WithTheme(theme string) *QuickFreeze { qf.config.SetTheme(theme) return qf } // WithFont sets the font family and size func (qf *QuickFreeze) WithFont(family string, size float64) *QuickFreeze { qf.config.SetFont(family, size) return qf } // WithBackground sets the background color func (qf *QuickFreeze) WithBackground(color string) *QuickFreeze { qf.config.SetBackground(color) return qf } // WithWindow enables window controls func (qf *QuickFreeze) WithWindow() *QuickFreeze { qf.config.SetWindow(true) return qf } // WithoutWindow disables window controls func (qf *QuickFreeze) WithoutWindow() *QuickFreeze { qf.config.SetWindow(false) return qf } // WithLineNumbers enables line numbers func (qf *QuickFreeze) WithLineNumbers() *QuickFreeze { qf.config.SetLineNumbers(true) return qf } // WithoutLineNumbers disables line numbers func (qf *QuickFreeze) WithoutLineNumbers() *QuickFreeze { qf.config.SetLineNumbers(false) return qf } // WithShadow adds a shadow effect func (qf *QuickFreeze) WithShadow() *QuickFreeze { qf.config.SetShadow(20, 0, 10) return qf } // WithCustomShadow adds a custom shadow effect func (qf *QuickFreeze) WithCustomShadow(blur, x, y float64) *QuickFreeze { qf.config.SetShadow(blur, x, y) return qf } // WithoutShadow removes shadow effect func (qf *QuickFreeze) WithoutShadow() *QuickFreeze { qf.config.SetShadow(0, 0, 0) return qf } // WithBorder adds a border func (qf *QuickFreeze) WithBorder() *QuickFreeze { qf.config.SetBorder(1, 8, "#515151") return qf } // WithCustomBorder adds a custom border func (qf *QuickFreeze) WithCustomBorder(width, radius float64, color string) *QuickFreeze { qf.config.SetBorder(width, radius, color) return qf } // WithoutBorder removes border func (qf *QuickFreeze) WithoutBorder() *QuickFreeze { qf.config.SetBorder(0, 0, "") return qf } // WithPadding sets padding (1, 2, or 4 values like CSS) func (qf *QuickFreeze) WithPadding(values ...float64) *QuickFreeze { qf.config.SetPadding(values...) return qf } // WithMargin sets margin (1, 2, or 4 values like CSS) func (qf *QuickFreeze) WithMargin(values ...float64) *QuickFreeze { qf.config.SetMargin(values...) return qf } // WithDimensions sets specific width and height func (qf *QuickFreeze) WithDimensions(width, height float64) *QuickFreeze { qf.config.SetDimensions(width, height) return qf } // WithWidth sets specific width (height auto) func (qf *QuickFreeze) WithWidth(width float64) *QuickFreeze { qf.config.Width = width return qf } // WithHeight sets specific height (width auto) func (qf *QuickFreeze) WithHeight(height float64) *QuickFreeze { qf.config.Height = height return qf } // WithLines sets the line range to capture (1-indexed) func (qf *QuickFreeze) WithLines(start, end int) *QuickFreeze { qf.config.SetLines(start, end) return qf } // WithLanguage sets the programming language for syntax highlighting func (qf *QuickFreeze) WithLanguage(language string) *QuickFreeze { qf.config.SetLanguage(language) return qf } // WithLineHeight sets the line height ratio func (qf *QuickFreeze) WithLineHeight(ratio float64) *QuickFreeze { qf.config.LineHeight = ratio return qf } // WithWrap sets text wrapping at specified column func (qf *QuickFreeze) WithWrap(columns int) *QuickFreeze { qf.config.Wrap = columns return qf } // CodeToSVG generates SVG from source code func (qf *QuickFreeze) CodeToSVG(code string) ([]byte, error) { generator := NewGenerator(qf.config) return generator.GenerateFromCode(code, qf.config.Language) } // CodeToSVGAuto generates SVG from source code with automatic language detection func (qf *QuickFreeze) CodeToSVGAuto(code string) ([]byte, error) { generator := NewGenerator(qf.config) return generator.GenerateFromCode(code, "") } // CodeToPNG generates PNG from source code func (qf *QuickFreeze) CodeToPNG(code string) ([]byte, error) { generator := NewGenerator(qf.config) svgData, err := generator.GenerateFromCode(code, qf.config.Language) if err != nil { return nil, err } width := qf.config.Width height := qf.config.Height if width == 0 || height == 0 { width = 800 * 4 height = 600 * 4 } else { width *= 4 height *= 4 } return generator.ConvertToPNG(svgData, width, height) } // CodeToPNGAuto generates PNG from source code with automatic language detection func (qf *QuickFreeze) CodeToPNGAuto(code string) ([]byte, error) { generator := NewGenerator(qf.config) svgData, err := generator.GenerateFromCode(code, "") if err != nil { return nil, err } // Calculate dimensions for PNG width := qf.config.Width height := qf.config.Height if width == 0 || height == 0 { width = 800 * 4 height = 600 * 4 } else { width *= 4 height *= 4 } return generator.ConvertToPNG(svgData, width, height) } // DetectLanguage detects the programming language from code content func (qf *QuickFreeze) DetectLanguage(code string) string { generator := NewGenerator(qf.config) return generator.DetectLanguage(code) } // DetectLanguageFromFilename detects the programming language from filename func (qf *QuickFreeze) DetectLanguageFromFilename(filename string) string { generator := NewGenerator(qf.config) return generator.DetectLanguageFromFilename(filename) } // DetectLanguageFromFile detects language from both filename and content func (qf *QuickFreeze) DetectLanguageFromFile(filename, content string) string { generator := NewGenerator(qf.config) return generator.DetectLanguageFromFile(filename, content) } // GetSupportedLanguages returns a list of all supported languages func (qf *QuickFreeze) GetSupportedLanguages() []string { generator := NewGenerator(qf.config) return generator.GetSupportedLanguages() } // IsLanguageSupported checks if a language is supported func (qf *QuickFreeze) IsLanguageSupported(language string) bool { generator := NewGenerator(qf.config) return generator.IsLanguageSupported(language) } // GetSupportedThemes returns a list of all supported themes func (qf *QuickFreeze) GetSupportedThemes() []string { generator := NewGenerator(qf.config) return generator.GetSupportedThemes() } // IsThemeSupported checks if a theme is supported func (qf *QuickFreeze) IsThemeSupported(theme string) bool { generator := NewGenerator(qf.config) return generator.IsThemeSupported(theme) } // GetAvailablePresets returns a list of all available presets func (qf *QuickFreeze) GetAvailablePresets() []string { return GetAvailablePresets() } // FileToSVG generates SVG from a source code file func (qf *QuickFreeze) FileToSVG(filename string) ([]byte, error) { generator := NewGenerator(qf.config) return generator.GenerateFromFile(filename) } // FileToPNG generates PNG from a source code file func (qf *QuickFreeze) FileToPNG(filename string) ([]byte, error) { generator := NewGenerator(qf.config) svgData, err := generator.GenerateFromFile(filename) if err != nil { return nil, err } width := qf.config.Width height := qf.config.Height if width == 0 || height == 0 { width = 800 * 4 height = 600 * 4 } else { width *= 4 height *= 4 } return generator.ConvertToPNG(svgData, width, height) } // ANSIToSVG generates SVG from ANSI terminal output func (qf *QuickFreeze) ANSIToSVG(ansiOutput string) ([]byte, error) { generator := NewGenerator(qf.config) return generator.GenerateFromANSI(ansiOutput) } // ANSIToPNG generates PNG from ANSI terminal output func (qf *QuickFreeze) ANSIToPNG(ansiOutput string) ([]byte, error) { generator := NewGenerator(qf.config) svgData, err := generator.GenerateFromANSI(ansiOutput) if err != nil { return nil, err } width := qf.config.Width height := qf.config.Height if width == 0 || height == 0 { width = 800 * 4 height = 600 * 4 } else { width *= 4 height *= 4 } return generator.ConvertToPNG(svgData, width, height) } // SaveCodeToFile generates and saves code screenshot to file func (qf *QuickFreeze) SaveCodeToFile(code, filename string) error { var data []byte var err error if isPNGFile(filename) { data, err = qf.CodeToPNG(code) } else { data, err = qf.CodeToSVG(code) } if err != nil { return err } return saveToFile(data, filename) } // SaveFileToFile generates and saves file screenshot to file func (qf *QuickFreeze) SaveFileToFile(inputFile, outputFile string) error { var data []byte var err error if isPNGFile(outputFile) { data, err = qf.FileToPNG(inputFile) } else { data, err = qf.FileToSVG(inputFile) } if err != nil { return err } return saveToFile(data, outputFile) } // SaveANSIToFile generates and saves ANSI screenshot to file func (qf *QuickFreeze) SaveANSIToFile(ansiOutput, filename string) error { var data []byte var err error if isPNGFile(filename) { data, err = qf.ANSIToPNG(ansiOutput) } else { data, err = qf.ANSIToSVG(ansiOutput) } if err != nil { return err } return saveToFile(data, filename) } // Config returns the current configuration func (qf *QuickFreeze) Config() *Config { return qf.config } // Clone creates a copy of the QuickFreeze instance func (qf *QuickFreeze) Clone() *QuickFreeze { return &QuickFreeze{ config: qf.config.Clone(), } } // Reset resets the configuration to defaults func (qf *QuickFreeze) Reset() *QuickFreeze { qf.config = DefaultConfig() return qf } // ResetToPreset resets the configuration to a specific preset func (qf *QuickFreeze) ResetToPreset(presetName string) *QuickFreeze { qf.config = GetPreset(presetName) return qf } // String returns a string representation of the current configuration func (qf *QuickFreeze) String() string { var parts []string parts = append(parts, fmt.Sprintf("Theme: %s", qf.config.Theme)) parts = append(parts, fmt.Sprintf("Font: %s %.1fpx", qf.config.Font.Family, qf.config.Font.Size)) parts = append(parts, fmt.Sprintf("Background: %s", qf.config.Background)) if qf.config.Window { parts = append(parts, "Window: enabled") } if qf.config.ShowLineNumbers { parts = append(parts, "Line numbers: enabled") } if qf.config.Shadow.Blur > 0 { parts = append(parts, fmt.Sprintf("Shadow: blur=%.1f", qf.config.Shadow.Blur)) } if qf.config.Border.Width > 0 { parts = append(parts, fmt.Sprintf("Border: width=%.1f", qf.config.Border.Width)) } return "QuickFreeze{" + strings.Join(parts, ", ") + "}" } // saveToFile is a helper function to save data to file func saveToFile(data []byte, filename string) error { return NewWithConfig(DefaultConfig()).SaveToFile(data, filename) }