Files
freezelib/quickfreeze.go

424 lines
11 KiB
Go

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