FreezeLib - Go Library for Beautiful Code Screenshots
Documentation / 文档: Usage Guide (English) | 使用指南 (中文)
FreezeLib is a Go library for generating beautiful screenshots of code and terminal output. It's based on the popular freeze CLI tool by Charm, but redesigned as a reusable library for Go applications.
Features
- 🎨 Syntax Highlighting: Support for 270+ programming languages
- 🔍 Auto Language Detection: Intelligent language detection from code content and filenames
- 📋 Simple Lists: Easy access to all available languages, themes, and presets
- 🖼️ Multiple Output Formats: Generate SVG and PNG images
- 🎭 Rich Themes: 67+ built-in themes including GitHub, Dracula, Monokai, and more
- 🪟 Window Controls: macOS-style window decorations
- 📏 Line Numbers: Optional line numbering
- 🌈 ANSI Support: Render colored terminal output
- ⚡ Easy API: Simple and chainable API design
- 🎯 Presets: 10 pre-configured styles for common use cases
- 🔧 Highly Customizable: Fine-tune every aspect of the output
Installation
go get github.com/landaiqing/freezelib
Quick Start
Basic Usage
package main
import (
"os"
"github.com/landaiqing/freezelib"
)
func main() {
// Create a new freeze instance
freeze := freezelib.New()
// Go code to screenshot
code := `package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}`
// Generate SVG
svgData, err := freeze.GenerateFromCode(code, "go")
if err != nil {
panic(err)
}
// Save to file
os.WriteFile("hello.svg", svgData, 0644)
}
Auto Language Detection
FreezeLib can automatically detect the programming language:
freeze := freezelib.New()
// Automatic language detection from code content
svgData, err := freeze.GenerateFromCodeAuto(code)
// Detect language manually
language := freeze.DetectLanguage(code)
fmt.Printf("Detected language: %s", language)
QuickFreeze API
For a more fluent experience, use the QuickFreeze API:
qf := freezelib.NewQuickFreeze()
svgData, err := qf.WithTheme("dracula").
WithFont("Fira Code", 14).
WithWindow().
WithShadow().
WithLineNumbers().
CodeToSVGAuto(code) // Auto-detect language
API Reference
Core Types
Freeze
The main interface for generating screenshots:
freeze := freezelib.New() // Default config
freeze := freezelib.NewWithConfig(config) // Custom config
freeze := freezelib.NewWithPreset("dark") // Preset config
QuickFreeze
Simplified, chainable API:
qf := freezelib.NewQuickFreeze()
qf := freezelib.NewQuickFreezeWithPreset("terminal")
Generation Methods
From Code String
svgData, err := freeze.GenerateFromCode(code, "python")
pngData, err := freeze.GeneratePNGFromCode(code, "python")
// With automatic language detection
svgData, err := freeze.GenerateFromCodeAuto(code)
pngData, err := freeze.GeneratePNGFromCodeAuto(code)
From File
svgData, err := freeze.GenerateFromFile("main.go")
pngData, err := freeze.GeneratePNGFromFile("main.go")
From ANSI Terminal Output
terminalOutput := "\033[32mSUCCESS\033[0m: Build completed"
svgData, err := freeze.GenerateFromANSI(terminalOutput)
pngData, err := freeze.GeneratePNGFromANSI(terminalOutput)
From Reader
svgData, err := freeze.GenerateFromReader(reader, "javascript")
Configuration
Basic Configuration
config := freezelib.DefaultConfig()
config.SetTheme("github-dark")
config.SetFont("JetBrains Mono", 14)
config.SetBackground("#1e1e1e")
config.SetWindow(true)
config.SetLineNumbers(true)
Advanced Configuration
config.SetPadding(20) // All sides
config.SetPadding(20, 40) // Vertical, horizontal
config.SetPadding(20, 40, 20, 40) // Top, right, bottom, left
config.SetShadow(20, 0, 10) // Blur, X offset, Y offset
config.SetBorder(1, 8, "#333") // Width, radius, color
config.SetDimensions(800, 600) // Width, height
config.SetLines(10, 20) // Line range (1-indexed)
Presets
FreezeLib comes with several built-in presets:
// Available presets
presets := []string{
"base", // Simple, clean
"full", // macOS-style with window controls
"terminal", // Optimized for terminal output
"presentation", // High contrast for presentations
"minimal", // Minimal styling
"dark", // Dark theme
"light", // Light theme
"retro", // Retro terminal style
"neon", // Neon/cyberpunk style
"compact", // Compact for small snippets
}
freeze := freezelib.NewWithPreset("dark")
Language Detection
FreezeLib provides powerful language detection capabilities:
freeze := freezelib.New()
// Detect language from code content
language := freeze.DetectLanguage(code)
// Detect from filename
language = freeze.DetectLanguageFromFilename("script.py")
// Combined detection (filename + content)
language = freeze.DetectLanguageFromFile("script.py", code)
// Check language support
supported := freeze.IsLanguageSupported("go")
// Get all supported languages
languages := freeze.GetSupportedLanguages()
// Custom language detector
detector := freeze.GetLanguageDetector()
detector.AddCustomMapping(".myext", "python")
Available Options
Get lists of all available options:
freeze := freezelib.New()
// Get all available options (sorted lists)
languages := freeze.GetSupportedLanguages() // 270+ languages
themes := freeze.GetSupportedThemes() // 67+ themes
presets := freeze.GetAvailablePresets() // 10 presets
// Test support
isSupported := freeze.IsLanguageSupported("go")
isSupported = freeze.IsThemeSupported("github")
isValid := freezelib.IsValidPreset("dark")
// Global functions also available
languages = freezelib.GetSupportedLanguages()
themes = freezelib.GetSupportedThemes()
presets = freezelib.GetAvailablePresets()
Chainable Methods
Both Freeze
and QuickFreeze
support method chaining:
freeze := freezelib.New().
WithTheme("monokai").
WithFont("Cascadia Code", 15).
WithWindow(true).
WithShadow(20, 0, 10).
WithLineNumbers(true)
svgData, err := freeze.GenerateFromCode(code, "rust")
Examples
Terminal Output Screenshot
freeze := freezelib.NewWithPreset("terminal")
ansiOutput := "\033[32m✓ Tests passed\033[0m\n" +
"\033[31m✗ Build failed\033[0m\n" +
"\033[33m⚠ Warning: deprecated API\033[0m"
svgData, err := freeze.GenerateFromANSI(ansiOutput)
Custom Styling
config := freezelib.DefaultConfig()
config.Theme = "github"
config.Background = "#f6f8fa"
config.Font.Family = "SF Mono"
config.Font.Size = 16
config.SetPadding(30)
config.SetMargin(20)
config.Window = true
config.ShowLineNumbers = true
config.Border.Radius = 12
config.Shadow.Blur = 25
freeze := freezelib.NewWithConfig(config)
Batch Processing
files := []string{"main.go", "config.go", "utils.go"}
for _, file := range files {
svgData, err := freeze.GenerateFromFile(file)
if err != nil {
continue
}
outputFile := strings.TrimSuffix(file, ".go") + ".svg"
os.WriteFile(outputFile, svgData, 0644)
}
Supported Languages
FreezeLib supports syntax highlighting for 270+ programming languages including:
Popular Languages
- System: Go, Rust, C, C++, Zig, D, Nim, V
- Web: JavaScript, TypeScript, HTML, CSS, SCSS, PHP
- Enterprise: Java, C#, Kotlin, Scala, Swift
- Scripting: Python, Ruby, Perl, Lua, Bash, PowerShell
- Data: JSON, YAML, TOML, XML, SQL, GraphQL
Categories
- Popular (30): Most commonly used languages
- Web (15): Frontend and backend web technologies
- System (13): Low-level and systems programming
- Scripting (12): Automation and scripting languages
- Data (11): Configuration and data formats
- And many more: 270+ total languages supported
Supported Themes
FreezeLib includes 67+ syntax highlighting themes:
Popular Themes
- GitHub:
github
,github-dark
- Modern:
dracula
,monokai
,nord
,one-dark
- Classic:
solarized-dark
,solarized-light
,material
,vim
- Colorful:
colorful
,friendly
,fruity
,rainbow_dash
Categories
- Popular (30): Most commonly used themes
- Dark (10): Dark color schemes for low-light environments
- Light (14): Light color schemes for bright environments
- And many more: 67+ total themes available
Simple and Efficient
All lists are sorted alphabetically for easy browsing and selection.
Error Handling
svgData, err := freeze.GenerateFromCode(code, "go")
if err != nil {
// Handle specific errors
switch {
case strings.Contains(err.Error(), "language"):
// Language detection failed
case strings.Contains(err.Error(), "config"):
// Configuration error
default:
// Other errors
}
}
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT License - see the LICENSE file for details.
Acknowledgments
This library is based on the excellent freeze CLI tool by Charm. Special thanks to the Charm team for creating such a beautiful tool.