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 "";
+ }
+
+ 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 "";
+ $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();
+
+