diff --git a/render_parts.php b/render_parts.php index 1e75f11..80a21c0 100755 --- a/render_parts.php +++ b/render_parts.php @@ -1,98 +1,267 @@ #!/usr/bin/php = 30 && $format < 38 ) - { - $color_n = $format-30; - } - else if ( $format >= 90 && $format < 98 ) - { - $color_n = $format-90; - $bold = true; - } - else if ( $format == 1 ) - $bold = true; - } - - if ( $bold ) - { - switch($color_n) - { - case 0: return 'gray'; - case 1: return 'red'; - case 2: return 'lime'; - case 3: return 'yellow'; - case 4: return 'blue'; - case 5: return 'magenta'; - case 6: return 'cyan'; - case 7: return 'white'; - } - } - switch($color_n) - { - case 0: return 'black'; - case 1: return 'maroon'; - case 2: return 'green'; - case 3: return 'orange'; - case 4: return 'navy'; - case 5: return 'purple'; - case 6: return 'teal'; - case 7: return 'silver'; - } - return "silver"; + public $color = 7; + public $bright = false; + + function __construct($color, $bright=false) + { + $this->color = $color; + $this->bright = $bright; + } + + static $names_to_int = array( + 'black' => 0, + 'red' => 1, + 'green' => 2, + 'yellow' => 3, + 'blue' => 4, + 'magenta' => 5, + 'cyan' => 6, + 'white' => 7 + ); + + static function from_ansi($col) + { + $formats = explode(';',$col); + $color_n = 7; + $bold = false; + foreach($formats as $format) + { + $format = (int)$format; + if ( $format >= 30 && $format < 38 ) + { + $color_n = $format-30; + } + else if ( $format >= 90 && $format < 98 ) + { + $color_n = $format-90; + $bold = true; + } + else if ( $format == 1 ) + { + $bold = true; + } + } + + return new Color( $color_n, $bold ); + } + } -function color_ansi2irc($col) +interface ColorOutput { - $formats = explode(';',$col); - $color_n = 7; - $bold = false; - foreach($formats as $format) - { - $format = (int)$format; - if ( $format >= 30 && $format < 38 ) - { - $color_n = $format-30; - } - else if ( $format == 1 ) - $bold = true; - } - - - if ( $bold ) - { - switch($color_n) - { - case 0: return '14'; - case 1: return '04'; - case 2: return '09'; - case 3: return '08'; - case 4: return '12'; - case 5: return '13'; - case 6: return '11'; - case 7: return '00'; - } - } - switch($color_n) - { - case 0: return '01'; - case 1: return '05'; - case 2: return '03'; - case 3: return '07'; - case 4: return '02'; - case 5: return '06'; - case 6: return '10'; - case 7: return '15'; - } - return ''; + function begin(); + function end(); + function begin_line(); + function end_line(); + function character( $char ); + +} + +class SvgColorOutput implements ColorOutput +{ + private $font_size; + private $font_width; + private $width, $height; + private $y = 0, $x = 0; + + function __construct($width_in_characters, $height_in_characters, $font_size = 12) + { + $this->font_size = $font_size; + $this->font_width = $font_size/2; + $this->width = $width_in_characters * $this->font_width; + $this->height = $height_in_characters * $this->font_size; + } + + function begin() + { + echo "\n"; + echo "\n"; + echo "\n"; + echo ""; + } + + function end() + { + echo ""; + } + + function begin_line() + { + $this->y += $this->font_size; + $this->x = 0; + } + + function end_line() + { + echo "\n"; + } + + function character( $char ) + { + if ( !is_null($char) ) + { + echo "". + htmlspecialchars($char['char'],ENT_XML1)."\n"; + } + $this->x += $this->font_width; + } + + function color( Color $color ) + { + if ( $color->bright ) + { + switch( $color->color ) + { + case 0: return 'gray'; + case 1: return 'red'; + case 2: return 'lime'; + case 3: return 'yellow'; + case 4: return 'blue'; + case 5: return 'magenta'; + case 6: return 'cyan'; + case 7: return 'white'; + } + } + switch( $color->color ) + { + case 0: return 'black'; + case 1: return 'maroon'; + case 2: return 'green'; + case 3: return 'orange'; + case 4: return 'navy'; + case 5: return 'purple'; + case 6: return 'teal'; + case 7: return 'silver'; + } + return "silver"; + } +} + +class PlaintextColorOutput implements ColorOutput +{ + function begin() {} + function end() {} + function begin_line() {} + function end_line() + { + echo "\n"; + } + + function character( $char ) + { + if ( is_null($char) ) + echo ' '; + else + echo $this->color($char['color']).$this->escape($char['char']); + } + + function color( Color $color ) + { + return ""; + } + + function escape( $char ) + { + return $char; + } + +} + +class IRCColorOutput extends PlaintextColorOutput +{ + private $width_in_characters; + private $x; + + function __construct( $width_in_characters ) + { + $this->width_in_characters = $width_in_characters; + } + + function begin_line() + { + echo "\x0301,01"; + $this->x = 0; + } + + function end_line() + { + echo str_repeat(' ',$this->width_in_characters-$this->x)."\x03"; + echo "\n"; + } + + function character( $char ) + { + $this->x++; + parent::character( $char ); + } + + function color( Color $color ) + { + if ( $color->bright ) + { + switch( $color->color ) + { + case 0: return '14'; + case 1: return '04'; + case 2: return '09'; + case 3: return '08'; + case 4: return '12'; + case 5: return '13'; + case 6: return '11'; + case 7: return '00'; + } + } + switch( $color->color ) + { + case 0: return '01'; + case 1: return '05'; + case 2: return '03'; + case 3: return '07'; + case 4: return '02'; + case 5: return '06'; + case 6: return '10'; + case 7: return '15'; + } + return '15'; + } + +} +class AnsiColorOutput extends PlainTextColorOutput +{ + function end() + { + echo "\x1b[0m\n"; + } + + function color( Color $color ) + { + $bold = $color->bright ? "1" : "22"; + return "\x1b[{$color->color};{$bold}m"; + } + +} +class BashColorOutput extends AnsiColorOutput +{ + function begin() + { + echo "#!/bin/bash\n"; + echo "read -r -d '' Heredoc_var <<'Heredoc_var'\n\\x1b[0m"; + } + + function end() + { + echo "\\x1b[0m\nHeredoc_var\necho -e \"\$Heredoc_var\"\n"; + } + + function escape( $char ) + { + return $char == '\\' ? '\\\\' : $char; + } } $dir = isset($argv[1]) ? $argv[1] : getcwd(); @@ -143,90 +312,44 @@ foreach ( $files as $color => $lines ) for ( $j = 0, $l = strlen($lines[$i]); $j < $l; $j++ ) { if ( $lines[$i][$j] != ' ' ) - $chars[$i][$j] = array("color"=>$color,"char"=>$lines[$i][$j]); + $chars[$i][$j] = array("color"=>Color::from_ansi($color),"char"=>$lines[$i][$j]); } } - + +/// \todo factory if ( $output_type == SVG ) { - $font_size = 12; - $font_width = $font_size/2; - echo "\n"; - echo "\n"; - echo "\n"; - echo ""; - $y = 0; - - - foreach($chars as $line) - { - $y += $font_size; - $x = 0; - foreach($line as $char) - { - if ( !is_null($char) ) - { - echo "". - htmlspecialchars($char['char'],ENT_XML1)."\n"; - } - $x += $font_width; - } - echo "\n"; - } - echo ""; + $output = new SvgColorOutput($maxw, $maxh); +} +else if ( $output_type == BASH ) +{ + $output = new BashColorOutput(); +} +else if ( $output_type == IRC_TEXT ) +{ + $output = new IrcColorOutput($maxw); +} +else if ( $output_type == COLORED_TEXT ) +{ + $output = new AnsiColorOutput(); } else { - - - if ( $output_type == BASH ) - { - echo "#!/bin/bash\n"; - echo "read -r -d '' Heredoc_var <<'Heredoc_var'\n\\x1b[0m"; - } - - - - foreach($chars as $line) - { - if ( $output_type == IRC_TEXT ) - echo "\x0301,01"; - - foreach($line as $char) - { - if ( is_null($char) ) - echo ' '; - else if ( $output_type == COLORED_TEXT ) - echo "\x1b[$char[color]m$char[char]"; - else if ( $output_type == BASH ) - { - $c = $char['char']; - if ( $c == '\\') - $c = '\\\\'; - echo "\\x1b[$char[color]m$c"; - } - else if ( $output_type == IRC_TEXT ) - { - $col = color_ansi2irc($char['color']); - echo "\x03$col{$char['char']}"; - } - - else - echo $char['char']; - } - - if ( $output_type == IRC_TEXT ) - echo str_repeat(' ',$maxw-count($line))."\x03"; - - echo "\n"; - } - - if ( $output_type == COLORED_TEXT ) - echo "\x1b[0m\n"; - - if ( $output_type == BASH ) - { - echo "\\x1b[0m\nHeredoc_var\necho -e \"\$Heredoc_var\"\n"; - } + $output = new PlainTextColorOutput(); } +$output->begin(); + +foreach($chars as $line) +{ + $output->begin_line(); + foreach($line as $char) + { + $output->character( $char ); + } + $output->end_line(); +} + +$output->end(); + +