Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
CLI Colorization via HTML style tagging function. This solution is UNLICENSED, feel free to do whatever you want with it.
<?php
/** @license http://unlicense.org/UNLICENSE */
function colorize($string, $useAnsi = null)
{
if (is_null($useAnsi)) {
$useAnsi = function_exists('posix_isatty');
}
$tags = array(
'reset' => 0, 'bold' => 1, 'dark' => 2, 'italic' => 3, 'underline' => 4, 'blink' => 5, 'reverse' => 7, 'concealed' => 8,
'black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33, 'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'white' => 37,
'bg_black' => 40, 'bg_red' => 41, 'bg_green' => 42, 'bg_yellow' => 43, 'bg_blue' => 44, 'bg_magenta' => 45, 'bg_cyan' => 46, 'bg_white' => 47,
'dark_gray' => 90, 'light_red' => 91, 'light_green' => 92, 'light_yellow' => 93, 'light_blue' => 94, 'light_magenta' => 95, 'light_cyan' => 96, 'white' => 97,
'bg_dark_gray' => 100, 'bg_light_red' => 101, 'bg_light_green' => 102, 'bg_light_yellow' => 103, 'bg_light_blue' => 104, 'bg_light_magenta' => 105, 'bg_light_cyan' => 106, 'bg_white' => 107,
);
$matches = array();
$regex = '#(<(' . implode('|', array_keys($tags)) . ')\b[^>]*>)(.+?)</\2?>#si';
while (preg_match_all($regex, $string, $matches)) {
foreach ($matches[0] as $index => $matchFull) {
$replacement = ($useAnsi) ? '=START(' . $tags[$matches[2][$index]] . ')=' . $matches[3][$index] . '=END=' : $matches[3][$index];
$string = str_replace($matchFull, $replacement, $string);
}
}
$tokens = preg_split('#(=START\(\d+\)=|=END=?)#', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$codeStack = array();
foreach ($tokens as $tokenIndex => $token) {
if (strpos($token, '=START(') === 0) {
$codeStack[] = $codeNum = substr($token, 7, -2);
$tokens[$tokenIndex] = "\033[{$codeNum}m";
} elseif (strpos($token, '=END=') === 0) {
array_shift($codeStack);
$tokens[$tokenIndex] = "\033[" . (($codeStack) ? implode(',', $codeStack) : '0') . 'm';
}
}
return implode('', $tokens);
}
// example usage
echo colorize("<red>Red</red> <bold>Bold</bold> <bold><blue>Blue and Bold</blue></bold>\n");
echo colorize("<light_blue>light blue</light_blue> vs. <blue>blue</blue>\n");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.