#!/usr/bin/perl -w # encode_template.pl - Don Yang (uguu.org) # # Encode ASCII art template to run-length encoding. Accepts these characters: # @ = eye # + = toggle eye # X = other non-whitespace # # 07/06/10 use strict; my $newline = ord('!'); my $toggle_eye_code = ord('*'); my $toggle_eye_output = $toggle_eye_code + 1; my $eye_min = $newline + 2; my $eye_max = $toggle_eye_code - 1; my $space_min = $eye_max + 3; my $space_max = ord('\\') - 1; my $char_min = $space_max + 2; my $char_max = ord('~'); my $eye_range = $eye_max - $eye_min + 1; my $space_range = $space_max - $space_min + 1; my $char_range = $char_max - $char_min + 1; sub encode_run($$$$) { my ($index, $text, $range, $condition) = @_; my $length = 1; for(++$$index; $$index < length($$text) && $length < $range && eval($condition); ++$$index) { $length++; } return $length; } sub encode_text() { my $text = join '', <>; for(my $i = 0; $i < length($text);) { my $c = substr($text, $i, 1); if( $c eq "\n" ) { # Newline print chr($newline); $i++; } elsif( $c eq '`' ) { # Toggle eye print chr($toggle_eye_code); $i++; } elsif( $c eq ' ' ) { # Space my $length = encode_run(\$i, \$text, $space_range, q{substr($$text, $$index, 1) eq ' '}); print chr($space_min + $length - 1); } elsif( $c eq '@' ) { # Eye my $length = encode_run(\$i, \$text, $eye_range, q{substr($$text, $$index, 1) eq '@'}); print chr($eye_min + $length - 1); } else { # Non-space my $length = encode_run(\$i, \$text, $char_range, q{substr($$text, $$index, 1) !~ /[@`\s]/}); print chr($char_min + $length - 1); } } print "\n"; } encode_text();