README
ΒΆ
FIGlet-Go
A complete rewrite of FIGlet in Go
_____ ___ ____ _ _ ____
| ___|_ _/ ___| | ___| |_ / ___| ___
| |_ | | | _| |/ _ \ __|____| | _ / _ \
| _| | | |_| | | __/ ||_____| |_| | (_) |
|_| |___\____|_|\___|\__| \____|\___/
This is a 100% compatible implementation - it passes all the original FIGlet 2.2.5 tests and produces identical output to the C version.
Why?
I wanted a FIGlet that:
- Compiles to a single binary with all fonts embedded
- Works the same way on any platform
- Can be used as a Go library in other projects β
Installation
git clone https://github.com/lsferreira42/figlet-go.git
cd figlet-go
make build
Or with go install:
go install github.com/lsferreira42/figlet-go@latest
Usage
figlet
# pipe text
echo "Hello World" | ./figlet-bin
# pass as argument
./figlet-bin "Hello World"
# use a different font
./figlet-bin -f banner "Hello"
# centered with slant font
./figlet-bin -c -f slant "Centered"
# right-to-left (Hebrew font)
./figlet-bin -R -f ivrit "Hello"
# custom width
./figlet-bin -w 120 "Wide output"
# full width (no smushing)
./figlet-bin -W "FULL"
# with colors (ANSI)
./figlet-bin --colors 'red;green;blue' "Colors"
# with TrueColor (hex)
./figlet-bin --colors 'FF0000;00FF00;0000FF' "TrueColor"
# HTML output
./figlet-bin --parser html "HTML Output"
# colored HTML output
./figlet-bin --parser html --colors 'red;green;blue' "Colored HTML"
π Complete Colors and Output Formats Guide β
Sample output with different fonts:
standard (default):
_ _ _ _ __ __ _ _
| | | | ___| | | ___ \ \ / /__ _ __| | __| |
| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` |
| _ | __/ | | (_) | \ V V / (_) | | | | (_| |
|_| |_|\___|_|_|\___/ \_/\_/ \___/|_| |_|\__,_|
banner:
# # ####### # # #######
# # # # # # #
# # # # # # #
####### ##### # # # #
# # # # # # #
# # # # # # #
# # ####### ####### ####### #######
Command Line Options
Usage: figlet [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]
[ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]
[ -C controlfile ] [ -I infocode ] [ message ]
| Option | Description |
|---|---|
-f font |
Specify font file |
-d dir |
Specify font directory |
-w width |
Set output width (default: 80) |
-c |
Center justify |
-l |
Left justify |
-r |
Right justify |
-k |
Kerning mode (letters touch) |
-o |
Overlap mode (letters overlap) |
-W |
Full width (no smushing) |
-S |
Force smushing |
-s |
Use font's default smushing |
-L |
Left-to-right text |
-R |
Right-to-left text |
-X |
Auto direction based on font |
-p |
Paragraph mode |
-n |
Normal mode (default) |
-D |
German character translation |
-E |
Disable German translation |
-C file |
Add control file |
-N |
Clear control file list |
-t |
Use terminal width |
-v |
Display version info |
-I code |
Display info (0=version, 1=version int, 2=font dir, 3=font name, 4=output width, 5=supported font formats) |
--colors colors |
Set colors for output (e.g., --colors red;green;blue or --colors FF0000;00FF00) - See Colors Guide |
--parser parser |
Set output parser (terminal, terminal-color, or html) - See Output Formats Guide |
chkfont
Font file validator. Checks FIGlet 2.0/2.1 font files (.flf) for format errors without modifying them.
# build chkfont
make build-chkfont
# check a single font
./chkfont-go fonts/standard.flf
# check multiple fonts
./chkfont-go fonts/*.flf
# check from stdin
./chkfont-go -
Usage: chkfont-go fontfile ...
What it checks:
Errors (fatal):
- Invalid magic number (must be
flf2) - First line improperly formatted
- charheight/maxlen not positive
- Unexpected end of file
Errors:
- Filename doesn't end with
.flf - Line length exceeds maxlen
- Inconsistent character width within a character
- Too many endmarks (more than 2)
- Invalid layout values
- Invalid old_layout values
- up_height out of bounds
- Code tag -1 (unusable)
- Inconsistent Codetag_Cnt
Warnings:
- Sub-version character is not 'a'
- Unusual hardblank character
- Blank endmark
- Inconsistent endmark between lines
- Endchar count convention violated
- Code tag > 65535
- Code tag in ASCII range (32-126)
- Code tag in old Deutsch area (-255 to -249)
- Non-increasing code tags
- Extra characters after font data
Output example (valid font):
fonts/standard.flf: Errors: 0, Warnings: 0
-------------------------------------------------------------------------------
Output example (font with issues):
tests/emboss.tlf: ERROR- Filename does not end with '.flf'.
tests/emboss.tlf: ERROR- Incorrect magic number.
tests/emboss.tlf: ERROR- Inconsistent character width in line 27.
tests/emboss.tlf: ERROR- Line length > maxlen in line 38.
*******************************************************************************
tests/emboss.tlf: Too many errors/warnings.
tests/emboss.tlf: Errors: 21, Warnings: 0
tests/emboss.tlf: maxlen: 8, actual max line length: 13
-------------------------------------------------------------------------------
Helper Scripts
# list all available fonts and control files
./figlist
# show a sample of each font
./showfigfonts
# show a specific word in all fonts
./showfigfonts "Test"
# use fonts from a different directory
./showfigfonts -d /path/to/fonts
Using as a Library
FIGlet-Go can be used as a library in your Go projects. See the complete library documentation for a full tutorial and API reference.
Quick Start
go get github.com/lsferreira42/figlet-go/figlet
package main
import (
"fmt"
"log"
"github.com/lsferreira42/figlet-go/figlet"
)
func main() {
// Simple usage
result, err := figlet.Render("Hello!")
if err != nil {
log.Fatal(err)
}
fmt.Print(result)
// With a specific font
result, err = figlet.RenderWithFont("Go!", "slant")
if err != nil {
log.Fatal(err)
}
fmt.Print(result)
// With options
result, err = figlet.Render("Centered",
figlet.WithFont("big"),
figlet.WithWidth(60),
figlet.WithJustification(1), // center
)
if err != nil {
log.Fatal(err)
}
fmt.Print(result)
}
Library Features
- Simple API:
Render()andRenderWithFont()for quick usage - Functional Options: Configure with
WithFont(),WithWidth(),WithJustification(), etc. - Full Control: Use
Configstruct directly for advanced usage - 146 Embedded Fonts: All fonts from figlet.org are embedded
- Font Discovery:
ListFonts()returns all available fonts - Color Support: ANSI colors and TrueColor (24-bit RGB) support
- Output Parsers: Terminal (normal), terminal with colors, and HTML output formats
π Colors and Output Formats Documentation β - Complete guide for command-line usage
- Color Support: ANSI colors and TrueColor (24-bit RGB) support
- Output Parsers: Terminal (normal), terminal with colors, and HTML output formats
π Full Library Documentation β
Web/Browser Usage
FIGlet-Go can run in the browser via WebAssembly!
Online Playground
Try it now at: FIGlet-Go Playground
npm Package
Install the npm package for Node.js or browser use:
npm install figlet-go
const figlet = require('figlet-go');
// Simple rendering
const art = await figlet.render('Hello!');
console.log(art);
// With a specific font
const slantArt = await figlet.renderWithFont('Go!', 'slant');
console.log(slantArt);
// List available fonts
const fonts = await figlet.listFonts();
console.log(fonts);
Building WebAssembly
# Build the WASM module
make build-wasm
# Build and serve the playground locally
make serve-website
# Opens at http://localhost:8080
# Build the npm package
make npm-build
# Publish to npm (requires npm login)
make npm-publish
Compatibility
This implementation is 100% compatible with the original FIGlet 2.2.5:
- Passes all 26 official test cases
- Produces identical output to the C version
- Supports all command-line options
- Handles all font files (.flf) and control files (.flc)
- Supports TOIlet fonts (.tlf)
- Handles all encoding modes:
- ISO 2022 (with G0/G1/G2/G3 character sets)
- UTF-8
- DBCS (Double-Byte Character Sets)
- HZ encoding
- Shift-JIS
You can run compatibility tests against the original C version:
# requires figlet (C version) installed
make test-compat
Fonts
146 fonts are embedded in the binary, downloaded from the FIGlet font database. Popular fonts include:
standard, banner, big, block, slant, shadow, script, small, doom, graffiti, starwars, larry3d, colossal, gothic, epic, poison, roman, rounded, speed, stellar, and many more!
Run figlist to see all available fonts, or use figlet.ListFonts() in Go.
There are also control files (.flc) for different encodings: UTF-8, ISO 646 variants, ISO 8859, JIS, KOI8-R, etc.
You can use fonts from other directories:
./figlet-bin -d /path/to/fonts -f myfont "Hello"
# or
export FIGLET_FONTDIR=/path/to/fonts
Building
make build # build figlet
make build-chkfont # build the font checker
make test # run tests
make test-compat # test against C version (needs figlet installed)
Requires Go 1.21+.
Project Structure
figlet-go/
βββ figlet.go # main executable entry point
βββ chkfont.go # font file validator
βββ go.mod # Go module
βββ Makefile # build commands
βββ LICENSE # BSD 3-Clause
βββ lib.md # library documentation
β
βββ figlet/ # FIGlet library package
β βββ figlet.go # core FIGlet implementation
β βββ figlet_test.go # library tests
β βββ terminal_unix.go # terminal width detection (Linux/macOS)
β βββ terminal_windows.go # terminal width detection (Windows)
β βββ fonts/ # 146 embedded .flf fonts + .flc control files
β
βββ wasm/ # WebAssembly build source
β βββ main.go # WASM entry point
β
βββ website/ # Online playground
β βββ index.html # playground UI
β βββ styles.css # styles
β βββ main.js # JavaScript
β βββ wasm_exec.js # Go WASM support
β βββ figlet.wasm # compiled WASM (generated)
β
βββ npm/ # npm package
β βββ package.json # npm configuration
β βββ src/ # package source
β βββ README.md # npm documentation
β
βββ example/ # library usage examples
β βββ main.go
β
βββ figlet.6 # man page for figlet
βββ chkfont.6 # man page for chkfont
βββ showfigfonts.6 # man page for showfigfonts
β
βββ figlist # lists available fonts (shell script)
βββ showfigfonts # shows samples of all fonts (shell script)
βββ run-tests.sh # main test runner
βββ run-lib-tests.sh # library test runner
βββ run-chkfont-tests.sh # chkfont test runner
βββ run-compatibility-tests.sh # tests against C version
βββ fonts/ # fonts for CLI (also embedded in library)
βββ tests/ # 26 test cases + input files
Roadmap
Done:
- Full FIGlet 2.2.5 compatibility
- Cross-platform (Linux, macOS, Windows)
- Embedded fonts
- All encoding modes (UTF-8, ISO 2022, DBCS, HZ, Shift-JIS)
- TOIlet font support (.tlf)
- CI/CD
- Go library for use in other projects (documentation)
- WASM build for browser usage (playground)
- JavaScript/npm package (npm)
Next:
- Color support (ANSI and TrueColor) β - See Colors and Output Formats Guide
- Output parsers (terminal with colors, HTML) β - See Colors and Output Formats Guide
The color and parser ideas come from figlet4go.
License
BSD 3-Clause. See LICENSE.
Original FIGlet by Glenn Chappell, Ian Chai, John Cowan, Christiaan Keet and Claudio Matsuoka.
Links
- Library Documentation - Complete API reference and tutorial
- FIGlet Official
- FIGlet Font Database