Skip to content

sugarcraft/sugar-glow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

97 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

sugar-glow

SugarGlow

CI codecov Packagist Version License PHP

demo

PHP port of charmbracelet/glow β€” a Markdown CLI viewer that composes CandyShine (rendering) and SugarBits Viewport (scrolling).

composer require sugarcraft/sugar-glow

CLI

sugarglow README.md                            # render to stdout (default)
sugarglow -p README.md                         # open in a fullscreen pager
git log -1 --pretty=%B | sugarglow -p          # pipe stdin
sugarglow --theme dracula README.md
sugarglow --width 80 --no-hyperlinks README.md
sugarglow --theme-config ./my-theme.json README.md

Flags:

  • --theme {ansi|plain|dark|light|notty|dracula|tokyo-night|pink|solarized|monokai|github} β€” picks a CandyShine preset. solarized, monokai, and github load JSON theme files from themes/.
  • --style / -s β€” alias for --theme (glamour-compat).
  • --theme-config <path> β€” load a custom JSON theme via Theme::fromJson. Overrides --theme.
  • --width / -w <N> β€” word-wrap paragraphs / blockquotes / list bodies. 0 = no wrap.
  • --no-hyperlinks β€” disable OSC 8 link envelopes; render links as text (url) instead.
  • --pager / -p β€” open in a fullscreen pager.

Pager keys

Standard reader keys come from Viewport:

Key Action
↑ / k line up
↓ / j line down
PgUp / b page up
PgDn / space / f page down
Ctrl+U / Ctrl+D half page
Home / g top
End / G bottom
q / Esc / Ctrl+C exit

Demos

Render to stdout

render

Fullscreen pager

pager

Library API

Beyond the CLI, sugar-glow exposes three utility classes for integrating its behaviour into other PHP projects.

GlamourTheme

Loads and parses Glamour-style theme JSON files (block_prefix/suffix, indent_token, margin, chroma token mapping).

use SugarCraft\Glow\GlamourTheme;

// From a JSON string
$theme = GlamourTheme::fromJson(file_get_contents('./my-theme.json'));

// From a file path
$theme = GlamourTheme::fromFile('./my-theme.json');

// Resolve a chroma token to an SGR color code (e.g., "31" for red)
$sgr = $theme->resolve('emphasis'); // => "31" or null

FileWatcher

File watching via mtime polling β€” works cross-platform with no extensions.

use SugarCraft\Glow\FileWatcher;

$watcher = new FileWatcher('/path/to/file.md');

// Check if modified since a given mtime
if ($watcher->hasChangedSince($lastMtime)) {
    // re-render
}

// Generator-based watch loop (e.g., in a ReactPHP stream)
foreach (FileWatcher::watch('/path/to/file.md', 500) as $changed) {
    // $changed === true each time the file is modified
}

Width helpers

CJK and emoji width handling lives in SugarCraft\Core\Util\Width. Use it directly for visual truncation, padding, and ANSI-aware measurement:

use SugarCraft\Core\Util\Width;

Width::string('hello');           // 5
Width::string('δ½ ε₯½');            // 4 (full-width)
Width::string('πŸ“¦');              // 2 (emoji)

Width::padRight('hi', 8);         // "hi      "
Width::truncate('hello world', 8); // "hello wo"

Test

cd sugar-glow && composer install && vendor/bin/phpunit

About

πŸŒ™ PHP port of ✨ glow β€” Markdown CLI viewer/pager composing CandyShine + SugarBits Viewport with 8 themes & OSC 8 link support.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages