BBS-Universal

 view release on metacpan or  search on metacpan

lib/BBS/Universal/PETSCII.pm  view on Meta::CPAN

package BBS::Universal::PETSCII;
BEGIN { our $VERSION = '0.005'; }

sub petscii_initialize {
    my $self = shift;

    $self->{'debug'}->DEBUG(['Start PETSCII Initialize']);

    my $inv = "\e[7m";
    my $ni  = "\e[27m";

    $self->{'petscii_meta'} = {
#       'NULL 0'                                  => { 'out' => chr(0),   'unicode' => ' ', 'desc' => 'NOP 0', },
#       'NULL 1'                                  => { 'out' => chr(1),   'unicode' => ' ', 'desc' => 'NOP 1', },
#       'NULL 2'                                  => { 'out' => chr(2),   'unicode' => ' ', 'desc' => 'NOP 2', },
        'STOP'                                    => { 'out' => chr(3),   'unicode' => ' ', 'desc' => 'PETSCII STOP', },
#       'NULL 4'                                  => { 'out' => chr(4),   'unicode' => ' ', 'desc' => 'NOP 4', },
        'WHITE'                                   => { 'out' => chr(5),   'unicode' => ' ', 'desc' => 'White text', },
        'RESET'                                   => { 'out' => chr(5),   'unicode' => ' ', 'desc' => 'Reset back to white text', },
#       'NULL 6'                                  => { 'out' => chr(6),   'unicode' => ' ', 'desc' => 'NOP 6', },
#       'NULL 7'                                  => { 'out' => chr(7),   'unicode' => ' ', 'desc' => 'NOP 7', },
        'DISABLE SHIFT'                           => { 'out' => chr(8),   'unicode' => ' ', 'desc' => 'Disable shift', },
        'ENABLE SHIFT'                            => { 'out' => chr(9),   'unicode' => ' ', 'desc' => 'Enable shift', },
#       'NULL 10'                                 => { 'out' => chr(10),  'unicode' => ' ', 'desc' => 'NOP 10', },
#       'NULL 11'                                 => { 'out' => chr(11),  'unicode' => ' ', 'desc' => 'NOP 11', },
#       'NULL 12'                                 => { 'out' => chr(12),  'unicode' => ' ', 'desc' => 'NOP 12', },
        'RETURN'                                  => { 'out' => chr(13),  'unicode' => ' ', 'desc' => 'Carriage Return', },
        'LOWERCASE'                               => { 'out' => chr(14),  'unicode' => ' ', 'desc' => 'Lowercase', },
#       'NULL 15'                                 => { 'out' => chr(15),  'unicode' => ' ', 'desc' => 'NOP 15', },
#       'NULL 16'                                 => { 'out' => chr(16),  'unicode' => ' ', 'desc' => 'NOP 16', },
        'DOWN'                                    => { 'out' => chr(17),  'unicode' => ' ', 'desc' => 'Cursor down', },
        'REVERSE ON'                              => { 'out' => chr(18),  'unicode' => ' ', 'desc' => 'Reverse on', },
        'HOME'                                    => { 'out' => chr(19),  'unicode' => ' ', 'desc' => 'Home', },
        'DELETE'                                  => { 'out' => chr(20),  'unicode' => ' ', 'desc' => 'Delete', },
#       'NULL 21'                                 => { 'out' => chr(21),  'unicode' => ' ', 'desc' => 'NOP 21', },
#       'NULL 22'                                 => { 'out' => chr(22),  'unicode' => ' ', 'desc' => 'NOP 22', },
#       'NULL 23'                                 => { 'out' => chr(23),  'unicode' => ' ', 'desc' => 'NOP 23', },
#       'NULL 24'                                 => { 'out' => chr(24),  'unicode' => ' ', 'desc' => 'NOP 24', },
#       'NULL 25'                                 => { 'out' => chr(25),  'unicode' => ' ', 'desc' => 'NOP 25', },
#       'NULL 26'                                 => { 'out' => chr(26),  'unicode' => ' ', 'desc' => 'NOP 26', },
#       'NULL 27'                                 => { 'out' => chr(27),  'unicode' => ' ', 'desc' => 'NOP 27', },
        'RED'                                     => { 'out' => chr(28),  'unicode' => ' ', 'desc' => 'Red', },
        'RIGHT'                                   => { 'out' => chr(29),  'unicode' => ' ', 'desc' => 'Cursor right', },
        'GREEN'                                   => { 'out' => chr(30),  'unicode' => ' ', 'desc' => 'Green', },
        'BLUE'                                    => { 'out' => chr(31),  'unicode' => ' ', 'desc' => 'Blue', },
#       'SPACE'                                   => { 'out' => ' ',      'unicode' => ' ', 'desc' => 'Space', },
#       'EXCLAMATION MARK'                        => { 'out' => '!',      'unicode' => '!', 'desc' => 'Exclamation mark', },
#       'DOUBLE QUOTE'                            => { 'out' => '"',      'unicode' => '"', 'desc' => 'Double quotation mark', },
#       'HASH'                                    => { 'out' => '#',      'unicode' => '#', 'desc' => 'Hash/pound', },
#       'DOLLAR'                                  => { 'out' => '$',      'unicode' => '$', 'desc' => 'Dollar sign', },
#       'PERCENT'                                 => { 'out' => '%',      'unicode' => '%', 'desc' => 'Percent sign', },
#       'AMPERSAND'                               => { 'out' => '&',      'unicode' => '&', 'desc' => 'Ampersand', },
#       'SINGLE QUOTE'                            => { 'out' => "'",      'unicode' => "'", 'desc' => 'Single quotation mark', },
#       'PARENTHESIS LEFT'                        => { 'out' => '(',      'unicode' => '(', 'desc' => 'Left parenthesis', },
#       'PARENTHESIS RIGHT'                       => { 'out' => ')',      'unicode' => ')', 'desc' => 'Right parenthesis', },
#       'ASTERISK'                                => { 'out' => '*',      'unicode' => '*', 'desc' => 'Asterisk', },
#       'PLUS'                                    => { 'out' => '+',      'unicode' => '+', 'desc' => 'Plus sign', },
#       'COMMA'                                   => { 'out' => ',',      'unicode' => ',', 'desc' => 'Comma', },
#       'HYPHEN'                                  => { 'out' => '-',      'unicode' => '-', 'desc' => 'Hyphen', },
#       'PERIOD'                                  => { 'out' => ',',      'unicode' => '.', 'desc' => 'Period', },
#       'FORWARD SLASH'                           => { 'out' => '/',      'unicode' => '/', 'desc' => 'Forward slash', },
#       'ZERO'                                    => { 'out' => '0',      'unicode' => '0', 'desc' => 'Zero', },
#       'ONE'                                     => { 'out' => '1',      'unicode' => '1', 'desc' => 'One', },
#       'TWO'                                     => { 'out' => '2',      'unicode' => '2', 'desc' => 'Two', },
#       'THREE'                                   => { 'out' => '3',      'unicode' => '3', 'desc' => 'Three', },
#       'FOUR'                                    => { 'out' => '4',      'unicode' => '4', 'desc' => 'Four', },
#       'FIVE'                                    => { 'out' => '5',      'unicode' => '5', 'desc' => 'Five', },
#       'SIX'                                     => { 'out' => '6',      'unicode' => '6', 'desc' => 'Six', },
#       'SEVEN'                                   => { 'out' => '7',      'unicode' => '7', 'desc' => 'Seven', },
#       'EIGHT'                                   => { 'out' => '8',      'unicode' => '8', 'desc' => 'Eight', },
#       'NINE'                                    => { 'out' => '9',      'unicode' => '9', 'desc' => 'Nine', },
#       'COLON'                                   => { 'out' => ':',      'unicode' => ':', 'desc' => 'Colon', },
#       'SEMICOLON'                               => { 'out' => ';',      'unicode' => ';', 'desc' => 'Semicolon', },
#       'LESS THAN'                               => { 'out' => '<',      'unicode' => '<', 'desc' => 'Less than', },
#       'EQUAL'                                   => { 'out' => '=',      'unicode' => '=', 'desc' => 'Equal sign', },
#       'GREATER THAN'                            => { 'out' => '>',      'unicode' => '>', 'desc' => 'Greater than', },
#       'QUESTION MARK'                           => { 'out' => '?',      'unicode' => '?', 'desc' => 'Question mark', },
#       'AT'                                      => { 'out' => '@',      'unicode' => '@', 'desc' => 'At symbol', },
#       'CHAR A'                                  => { 'out' => 'A',      'unicode' => 'A', 'desc' => 'A', },
#       'CHAR B'                                  => { 'out' => 'B',      'unicode' => 'B', 'desc' => 'B', },
#       'CHAR C'                                  => { 'out' => 'C',      'unicode' => 'C', 'desc' => 'C', },
#       'CHAR D'                                  => { 'out' => 'D',      'unicode' => 'D', 'desc' => 'D', },
#       'CHAR E'                                  => { 'out' => 'E',      'unicode' => 'E', 'desc' => 'E', },
#       'CHAR F'                                  => { 'out' => 'F',      'unicode' => 'F', 'desc' => 'F', },
#       'CHAR G'                                  => { 'out' => 'G',      'unicode' => 'G', 'desc' => 'G', },
#       'CHAR H'                                  => { 'out' => 'H',      'unicode' => 'H', 'desc' => 'H', },
#       'CHAR I'                                  => { 'out' => 'I',      'unicode' => 'I', 'desc' => 'I', },
#       'CHAR J'                                  => { 'out' => 'J',      'unicode' => 'J', 'desc' => 'J', },
#       'CHAR K'                                  => { 'out' => 'K',      'unicode' => 'K', 'desc' => 'K', },
#       'CHAR L'                                  => { 'out' => 'L',      'unicode' => 'L', 'desc' => 'L', },
#       'CHAR M'                                  => { 'out' => 'M',      'unicode' => 'M', 'desc' => 'M', },
#       'CHAR N'                                  => { 'out' => 'N',      'unicode' => 'N', 'desc' => 'N', },
#       'CHAR O'                                  => { 'out' => 'O',      'unicode' => 'O', 'desc' => 'O', },
#       'CHAR P'                                  => { 'out' => 'P',      'unicode' => 'P', 'desc' => 'P', },
#       'CHAR Q'                                  => { 'out' => 'Q',      'unicode' => 'Q', 'desc' => 'Q', },
#       'CHAR R'                                  => { 'out' => 'R',      'unicode' => 'R', 'desc' => 'R', },
#       'CHAR S'                                  => { 'out' => 'S',      'unicode' => 'S', 'desc' => 'S', },
#       'CHAR T'                                  => { 'out' => 'T',      'unicode' => 'T', 'desc' => 'T', },
#       'CHAR U'                                  => { 'out' => 'U',      'unicode' => 'U', 'desc' => 'U', },
#       'CHAR V'                                  => { 'out' => 'V',      'unicode' => 'V', 'desc' => 'V', },
#       'CHAR W'                                  => { 'out' => 'W',      'unicode' => 'W', 'desc' => 'W', },
#       'CHAR X'                                  => { 'out' => 'X',      'unicode' => 'X', 'desc' => 'X', },
#       'CHAR Y'                                  => { 'out' => 'Y',      'unicode' => 'Y', 'desc' => 'Y', },
#       'CHAR Z'                                  => { 'out' => 'Z',      'unicode' => 'Z', 'desc' => 'Z', },
#       'SQUARE BRACKET LEFT'                     => { 'out' => chr(91),  'unicode' => '[', 'desc' => 'Square left bracket', },
        'BRITISH POUND'                           => { 'out' => chr(92),  'unicode' => '£', 'desc' => 'British Pound', },
#       'SQUARE BRACKET RIGHT'                    => { 'out' => chr(93),  'unicode' => ']', 'desc' => 'Square right bracket', },
        'UP ARROW'                                => { 'out' => chr(94),  'unicode' => '↑', 'desc' => 'Up Arrow', },
        'LEFT ARROW'                              => { 'out' => chr(95),  'unicode' => '←', 'desc' => 'Left Arrow', },
        'HORIZONTAL BAR'                          => { 'out' => chr(96),  'unicode' => '─', 'desc' => 'Horizontal Bar', },
        'SPADE'                                   => { 'out' => chr(97),  'unicode' => 'â™ ', 'desc' => 'Spade', },
        'VERTICAL BAR CENTER'                     => { 'out' => chr(98),  'unicode' => '│', 'desc' => 'Giant Vertical Bar', },
        'HORIZONTAL BAR DUPLICATE'                => { 'out' => chr(99),  'unicode' => '─', 'desc' => 'Horizontal Bar', },
        'HORIZONTAL BAR SMALL UPPER BIAS'         => { 'out' => chr(100), 'unicode' => '🭸', 'desc' => 'Horizontal bar with a slight upper bias', },
        'HORIZONTAL BAR LARGE UPPER BIAS'         => { 'out' => chr(101), 'unicode' => '🭶', 'desc' => 'Horizontal bar with a strong upper bias', },
        'HORIZONTAL BAR SMALL LOWER BIAS'         => { 'out' => chr(102), 'unicode' => '🭺', 'desc' => 'Horizontal bar with a slight lower bias', },
        'VERTICAL BAR SMALL LEFT BIAS'            => { 'out' => chr(103), 'unicode' => ' ', 'desc' => 'Vertical bar with a slight left bias', },
        'VERTICAL BAR SMALL RIGHT BIAS'           => { 'out' => chr(104), 'unicode' => ' ', 'desc' => 'Vertical bar with a slight right bias', },
        'TOP RIGHT ROUNDED CORNER'                => { 'out' => chr(105), 'unicode' => 'â•®', 'desc' => 'Top Right Rounded Corner', },
        'BOTTOM LEFT ROUNDED CORNER'              => { 'out' => chr(106), 'unicode' => 'â•°', 'desc' => 'Bottom Left Rounded Corner', },
        'BOTTOM RIGHT ROUNDED CORNER'             => { 'out' => chr(107), 'unicode' => '╯', 'desc' => 'Bottom Right Rounded Corner', },
        'BOTTOM LEFT RIGHT ANGLE'                 => { 'out' => chr(108), 'unicode' => '⎿', 'desc' => 'Bottom left right angle', },
        'GIANT BACKSLASH'                         => { 'out' => chr(109), 'unicode' => '╲', 'desc' => 'Giant Backslash', },
        'GIANT FORWARD SLASH'                     => { 'out' => chr(110), 'unicode' => '╱', 'desc' => 'Giant Forward Slash', },
        'TOP LEFT RIGHT ANGLE'                    => { 'out' => chr(111), 'unicode' => '⎾', 'desc' => 'Top left right angle', },
        'TOP RIGHT RIGHT ANGLE'                   => { 'out' => chr(112), 'unicode' => ' ', 'desc' => 'Top right right angle', },
        'CENTER DOT'                              => { 'out' => chr(113), 'unicode' => '•', 'desc' => 'CENTER DOT', },
        'HORIZONTAL BAR LARGE LOWER BIAS'         => { 'out' => chr(114), 'unicode' => '🭻', 'desc' => 'Horizontal bar with a strong lower bias', },
        'HEART'                                   => { 'out' => chr(115), 'unicode' => '♥', 'desc' => 'Heart', },
        'VERTICAL BAR LARGE LEFT BIAS'            => { 'out' => chr(116), 'unicode' => ' ', 'desc' => 'Vertical bar with a strong left bias', },
        'TOP LEFT ROUNDED CORNER'                 => { 'out' => chr(117), 'unicode' => 'â•­', 'desc' => 'Top Left Rounded Corner', },
        'GIANT X'                                 => { 'out' => chr(118), 'unicode' => '╳', 'desc' => 'Giant X', },
        'THIN CIRCLE'                             => { 'out' => chr(119), 'unicode' => 'â—‹', 'desc' => 'Thin Circle', },
        'CLUB'                                    => { 'out' => chr(120), 'unicode' => '♣', 'desc' => 'Club', },
        'VERTICAL BAR LARGE RIGHT BIAS'           => { 'out' => chr(121), 'unicode' => ' ', 'desc' => 'Vertical bar with a strong right bias', },
        'DIAMOND'                                 => { 'out' => chr(122), 'unicode' => '♦', 'desc' => 'Diamond', },
        'CROSS BAR'                               => { 'out' => chr(123), 'unicode' => '┼', 'desc' => 'Cross Bar', },
        'SHADE LEFT'                              => { 'out' => chr(124), 'unicode' => '🮌', 'desc' => 'Shade left', },
        'VERTICAL BAR'                            => { 'out' => chr(125), 'unicode' => '┃', 'desc' => 'Vertical bar', },
        'PI'                                      => { 'out' => chr(126), 'unicode' => 'Ï€', 'desc' => 'Pi symbol', },
        'BOTTOM LEFT WEDGE'                       => { 'out' => chr(127), 'unicode' => 'â—¥', 'desc' => 'Bottom Left Wedge', },
#       'NULL 128'                                => { 'out' => chr(128), 'unicode' => ' ', 'desc' => 'NOP 128', },
        'ORANGE'                                  => { 'out' => chr(129), 'unicode' => ' ', 'desc' => 'Orange' },
#       'NULL 130'                                => { 'out' => chr(130), 'unicode' => ' ', 'desc' => 'NOP 130', },
        'RUN'                                     => { 'out' => chr(131), 'unicode' => ' ', 'desc' => 'Run key', },
#       'NULL 132'                                => { 'out' => chr(132), 'unicode' => ' ', 'desc' => 'NOP 132', },
#       'F1'                                      => { 'out' => chr(133), 'unicode' => ' ', 'desc' => 'F1', },
#       'F3'                                      => { 'out' => chr(134), 'unicode' => ' ', 'desc' => 'F3', },
#       'F5'                                      => { 'out' => chr(135), 'unicode' => ' ', 'desc' => 'F5', },
#       'F7'                                      => { 'out' => chr(136), 'unicode' => ' ', 'desc' => 'F7', },
#       'F2'                                      => { 'out' => chr(137), 'unicode' => ' ', 'desc' => 'F2', },
#       'F4'                                      => { 'out' => chr(138), 'unicode' => ' ', 'desc' => 'F4', },
#       'F6'                                      => { 'out' => chr(139), 'unicode' => ' ', 'desc' => 'F6', },
#       'F8'                                      => { 'out' => chr(140), 'unicode' => ' ', 'desc' => 'F8', },
        'SHIFT RETURN'                            => { 'out' => chr(141), 'unicode' => ' ', 'desc' => 'Shift-return', },
        'UPPERCASE'                               => { 'out' => chr(142), 'unicode' => ' ', 'desc' => 'Uppercase', },
#       'NULL 143'                                => { 'out' => chr(143), 'unicode' => ' ', 'desc' => 'NOP 143', },
        'BLACK'                                   => { 'out' => chr(144), 'unicode' => ' ', 'desc' => 'Black', },
        'UP'                                      => { 'out' => chr(145), 'unicode' => ' ', 'desc' => 'Cursor up', },
        'REVERSE OFF'                             => { 'out' => chr(146), 'unicode' => ' ', 'desc' => 'Reverse off', },
        'CLEAR'                                   => { 'out' => chr(147), 'unicode' => ' ', 'desc' => 'Clear', },
        'INSERT'                                  => { 'out' => chr(148), 'unicode' => ' ', 'desc' => 'Insert', },
        'BROWN'                                   => { 'out' => chr(149), 'unicode' => ' ', 'desc' => 'Brown', },
        'LIGHT RED'                               => { 'out' => chr(150), 'unicode' => ' ', 'desc' => 'Light/bright red', },
        'DARK GRAY'                               => { 'out' => chr(151), 'unicode' => ' ', 'desc' => 'Dark gray', },
        'MEDIUM GRAY'                             => { 'out' => chr(152), 'unicode' => ' ', 'desc' => 'Medium gray', },
        'LIGHT GREEN'                             => { 'out' => chr(153), 'unicode' => ' ', 'desc' => 'Light/bright green', },
        'LIGHT BLUE'                              => { 'out' => chr(154), 'unicode' => ' ', 'desc' => 'Light/bright blue', },
        'LIGHT GRAY'                              => { 'out' => chr(155), 'unicode' => ' ', 'desc' => 'Light gray', },
        'PURPLE'                                  => { 'out' => chr(156), 'unicode' => ' ', 'desc' => 'Purple', },
        'LEFT'                                    => { 'out' => chr(157), 'unicode' => ' ', 'desc' => 'Cursor left', },
        'YELLOW'                                  => { 'out' => chr(158), 'unicode' => ' ', 'desc' => 'Yellow', },
        'CYAN'                                    => { 'out' => chr(159), 'unicode' => ' ', 'desc' => 'Cyan', },
        'REVERSE SPACE'                           => { 'out' => chr(160), 'unicode' => "$inv $ni", 'desc' => 'Dithered Box Full', },
        'REVERSE LEFT HALF'                       => { 'out' => chr(161), 'unicode' => $inv . '▌' . $ni, 'desc' => 'Reversed Left Half', },
        'REVERSE BOTTOM BOX'                      => { 'out' => chr(162), 'unicode' => $inv . 'â–„' . $ni, 'desc' => 'Reversed Bottom Box', },
        'REVERSE TOP HORIZONTAL BAR'              => { 'out' => chr(163), 'unicode' => $inv . 'â–”' . $ni, 'desc' => 'Reversed Top Horizontal Bar', },
        'REVERSE BOTTOM HORIZONTAL BAR'           => { 'out' => chr(164), 'unicode' => $inv . '▁' . $ni, 'desc' => 'Reversed Bottom Horizontal Bar', },
        'REVERSE LEFT VERTICAL BAR'               => { 'out' => chr(165), 'unicode' => $inv . 'â–Ž' . $ni, 'desc' => 'Reversed Left Vertical Bar', },
        'REVERSE DITHERED BOX'                    => { 'out' => chr(166), 'unicode' => $inv . 'â–’' . $ni, 'desc' => 'Reversed Dithered Box', },
        'REVERSE RIGHT VERTICAL BAR'              => { 'out' => chr(167), 'unicode' => $inv . '🮈' . $ni, 'desc' => 'Reversed Right Vertical Bar', },
        'REVERSE DITHERED BOTTOM'                 => { 'out' => chr(168), 'unicode' => $inv . '🮏' . $ni, 'desc' => 'Reversed Dithered Left', },
        'REVERSE BOTTOM RIGHT WEDGE'              => { 'out' => chr(169), 'unicode' => $inv . 'â—¤' . $ni, 'desc' => 'Reversed Bottom Right Wedge', },
        'REVERSE VERTICAL BAR RIGHT'              => { 'out' => chr(170), 'unicode' => $inv . '🮈' . $ni, 'desc' => 'Reversed Vertical bar flushed right', },
        'REVERSE VERTICAL BAR MIDDLE LEFT'        => { 'out' => chr(171), 'unicode' => $inv . '├' . $ni, 'desc' => 'Reversed Vertical Bar Middle Left', },
        'REVERSE BOTTOM RIGHT BOX'                => { 'out' => chr(172), 'unicode' => $inv . 'â–—' . $ni, 'desc' => 'Reversed Bottom Right Box', },
        'REVERSE BOTTOM LEFT CORNER'              => { 'out' => chr(173), 'unicode' => $inv . 'â””' . $ni, 'desc' => 'Reversed Bottom Left Corner', },
        'REVERSE TOP RIGHT CORNER'                => { 'out' => chr(174), 'unicode' => $inv . '┐' . $ni, 'desc' => 'Reversed Top Right Corner', },
        'REVERSE HORIZONTAL BAR BOTTOM'           => { 'out' => chr(175), 'unicode' => $inv . 'â–‚' . $ni, 'desc' => 'Reversed Horizontal Bar Bottom', },
        'REVERSE TOP LEFT CORNER'                 => { 'out' => chr(176), 'unicode' => $inv . '┌' . $ni, 'desc' => 'Reversed Top Left Corner', },
        'REVERSE HORIZONTAL BAR MIDDLE BOTTOM'    => { 'out' => chr(177), 'unicode' => $inv . 'â”´' . $ni, 'desc' => 'Reversed Horizontal Bar Middle Bottom', },
        'REVERSE HORIZONTAL BAR MIDDLE TOP'       => { 'out' => chr(178), 'unicode' => $inv . '┬' . $ni, 'desc' => 'Reversed Horizontal Bar Middle Top', },
        'REVERSE VERTICAL BAR MIDDLE RIGHT'       => { 'out' => chr(179), 'unicode' => $inv . '┤' . $ni, 'desc' => 'Reversed Vertical Bar Middle Right', },
        'REVERSE VERTICAL BOX LEFT'               => { 'out' => chr(180), 'unicode' => $inv . '▍' . $ni, 'desc' => 'Reversed Vertical Box Left', },
        'REVERSE LEFT HALF BOX'                   => { 'out' => chr(181), 'unicode' => $inv . '▌' . $ni, 'desc' => 'Reversed Left Half Box', },
        'REVERSE RIGHT HALF BOX'                  => { 'out' => chr(182), 'unicode' => $inv . '🮈' . $ni, 'desc' => 'Reversed Right half box', },
        'REVERSE HORIZONTAL BAR TOP'              => { 'out' => chr(183), 'unicode' => $inv . '🮂' . $ni, 'desc' => 'Reversed Horizontal bar top', },
        'REVERSE HORIZONTAL BAR THICK TOP'        => { 'out' => chr(184), 'unicode' => $inv . '🮃' . $ni, 'desc' => 'Reversed Horizontal bar thick top', },
        'REVERSE HORIZONTAL BAR THICK BOTTOM'     => { 'out' => chr(185), 'unicode' => $inv . 'â–ƒ' . $ni, 'desc' => 'Reversed Horizontal bar thick bottom', },
        'REVERSE BOTTOM RIGHT RIGHT ANGLE'        => { 'out' => chr(186), 'unicode' => $inv . '🭿' . $ni, 'desc' => 'Reversed Bottom right right angle', },
        'REVERSE BOTTOM LEFT BOX'                 => { 'out' => chr(187), 'unicode' => $inv . 'â––' . $ni, 'desc' => 'Reversed Bottom Left Box', },
        'REVERSE TOP RIGHT BOX'                   => { 'out' => chr(188), 'unicode' => $inv . '▝' . $ni, 'desc' => 'Reversed Top Right Box', },
        'REVERSE BOTTOM RIGHT CORNER'             => { 'out' => chr(189), 'unicode' => $inv . '┘' . $ni, 'desc' => 'Reversed Bottom Right Corner', },
        'REVERSE TOP LEFT BOX'                    => { 'out' => chr(190), 'unicode' => $inv . 'â–˜' . $ni, 'desc' => 'Reversed Top Left Box', },
        'REVERSE TOP LEFT BOTTOM RIGHT BOX'       => { 'out' => chr(191), 'unicode' => $inv . 'â–š' . $ni, 'desc' => 'Reversed Top Left Bottom Right Box', },
        'REVERSE HORIZONTAL BAR'                  => { 'out' => chr(192), 'unicode' => $inv . '🭹' . $ni, 'desc' => 'Reversed Horizontal bar', },
#       'REVERSE SPADE DUPLICATE'                 => { 'out' => chr(193), 'unicode' => $inv . 'â™ ' . $ni, 'desc' => 'Reversed Spade duplicate', },
#       'REVERSE VERTICAL BAR CENTER DUPLICATE'   => { 'out' => chr(194), 'unicode' => $inv . '│' . $ni, 'desc' => 'Reversed Giant Vertical Bar duplicate', },
        'REVERSE HORIZONTAL BAR DUPLICATE'        => { 'out' => chr(195), 'unicode' => $inv . '─' . $ni, 'desc' => 'Reversed Horizontal Bar duplicate', },
        'REVERSE HORIZONTAL BAR SMALL UPPER BIAS' => { 'out' => chr(196), 'unicode' => $inv . '🭸' . $ni, 'desc' => 'Reversed Horizontal bar with a slight upper bias', },
        'REVERSE HORIZONTAL BAR LARGE UPPER BIAS' => { 'out' => chr(197), 'unicode' => $inv . '🭶' . $ni, 'desc' => 'Reversed Horizontal bar with a strong upper bias', },
        'REVERSE HORIZONTAL BAR SMALL LOWER BIAS' => { 'out' => chr(198), 'unicode' => $inv . '🭺' . $ni, 'desc' => 'Reversed Horizontal bar with a slight lower bias', },
        'REVERSE VERTICAL BAR SMALL LEFT BIAS'    => { 'out' => chr(199), 'unicode' => $inv . ' ' . $ni, 'desc' => 'Reversed Vertical bar with a slight left bias', },
        'REVERSE VERTICAL BAR SMALL RIGHT BIAS'   => { 'out' => chr(200), 'unicode' => $inv . ' ' . $ni, 'desc' => 'Reversed Vertical bar with a slight right bias', },
        'REVERSE TOP RIGHT ROUNDED CORNER'        => { 'out' => chr(201), 'unicode' => $inv . 'â•®' . $ni, 'desc' => 'Reversed Top Right Rounded Corner', },
        'REVERSE BOTTOM LEFT ROUNDED CORNER'      => { 'out' => chr(202), 'unicode' => $inv . 'â•°' . $ni, 'desc' => 'Reversed Bottom Left Rounded Corner', },
        'REVERSE BOTTOM RIGHT ROUNDED CORNER'     => { 'out' => chr(203), 'unicode' => $inv . '╯' . $ni, 'desc' => 'Reversed Bottom Right Rounded Corner', },
        'REVERSE BOTTOM LEFT RIGHT ANGLE'         => { 'out' => chr(204), 'unicode' => $inv . '⎿' . $ni, 'desc' => 'Reversed Bottom left right angle', },
        'REVERSE GIANT BACKSLASH'                 => { 'out' => chr(205), 'unicode' => $inv . '╲' . $ni, 'desc' => 'Reversed Giant Backslash', },
        'REVERSE GIANT FORWARD SLASH'             => { 'out' => chr(206), 'unicode' => $inv . '╱' . $ni, 'desc' => 'Reversed Giant Forward Slash', },
        'REVERSE TOP LEFT RIGHT ANGLE'            => { 'out' => chr(207), 'unicode' => $inv . '⎾' . $ni, 'desc' => 'Reversed Top left right angle', },
        'REVERSE TOP RIGHT RIGHT ANGLE'           => { 'out' => chr(208), 'unicode' => $inv . ' ' . $ni, 'desc' => 'Reversed Top right right angle', },
        'REVERSE CENTER DOT'                      => { 'out' => chr(209), 'unicode' => $inv . '•' . $ni, 'desc' => 'Reversed CENTER DOT', },
        'REVERSE HORIZONTAL BAR LARGE LOWER BIAS' => { 'out' => chr(210), 'unicode' => $inv . '🭻' . $ni, 'desc' => 'Reversed Horizontal bar with a strong lower bias', },
        'REVERSE HEART'                           => { 'out' => chr(211), 'unicode' => $inv . '♥' . $ni, 'desc' => 'Reversed Heart', },
        'REVERSE VERTICAL BAR LARGE LEFT BIAS'    => { 'out' => chr(212), 'unicode' => $inv . ' ' . $ni, 'desc' => 'Reversed Vertical bar with a strong left bias', },
        'REVERSE TOP LEFT ROUNDED CORNER'         => { 'out' => chr(213), 'unicode' => $inv . 'â•­' . $ni, 'desc' => 'Reversed Top Left Rounded Corner', },
        'REVERSE GIANT X'                         => { 'out' => chr(214), 'unicode' => $inv . '╳' . $ni, 'desc' => 'Reversed Giant X', },
        'REVERSE THIN CIRCLE'                     => { 'out' => chr(215), 'unicode' => $inv . 'â—‹' . $ni, 'desc' => 'Reversed Thin Circle', },
        'REVERSE CLUB'                            => { 'out' => chr(216), 'unicode' => $inv . '♣' . $ni, 'desc' => 'Reversed Club', },
        'REVERSE VERTICAL BAR LARGE RIGHT BIAS'   => { 'out' => chr(217), 'unicode' => $inv . ' ' . $ni, 'desc' => 'Reversed Vertical bar with a strong right bias', },
        'REVERSE DIAMOND'                         => { 'out' => chr(218), 'unicode' => $inv . '♦' . $ni, 'desc' => 'Reversed Diamond', },
        'REVERSE CROSS BAR'                       => { 'out' => chr(219), 'unicode' => $inv . '┼' . $ni, 'desc' => 'Reversed Cross Bar', },
        'REVERSE SHADE LEFT'                      => { 'out' => chr(220), 'unicode' => $inv . '🮌' . $ni, 'desc' => 'Reversed Shade left', },
        'REVERSE VERTICAL BAR'                    => { 'out' => chr(221), 'unicode' => $inv . '┃' . $ni, 'desc' => 'Reversed Vertical bar', },
        'REVERSE PI'                              => { 'out' => chr(222), 'unicode' => $inv . 'Ï€' . $ni, 'desc' => 'Reversed Pi symbol', },
        'REVERSE BOTTOM LEFT WEDGE'               => { 'out' => chr(223), 'unicode' => $inv . 'â—¥' . $ni, 'desc' => 'Reversed Bottom Left Wedge', },
#       'REVERSE SPACE 2'                         => { 'out' => chr(224), 'unicode' => $inv . ' ' . $ni, 'desc' => 'Reversed Dithered Box Full duplicate', },
#       'REVERSE LEFT HALF 2'                     => { 'out' => chr(225), 'unicode' => $inv . '▌' . $ni, 'desc' => 'Reversed Left Half duplicate', },
#       'REVERSE BOTTOM BOX 2'                    => { 'out' => chr(226), 'unicode' => $inv . 'â–„' . $ni, 'desc' => 'Reversed Bottom Box duplicate', },
#       'REVERSE TOP HORIZONTAL BAR 2'            => { 'out' => chr(227), 'unicode' => $inv . 'â–”' . $ni, 'desc' => 'Reversed Top Horizontal Bar duplicate', },
#       'REVERSE BOTTOM HORIZONTAL BAR 2'         => { 'out' => chr(228), 'unicode' => $inv . '▁' . $ni, 'desc' => 'Reversed Bottom Horizontal Bar duplicate', },
#       'REVERSE LEFT VERTICAL BAR 2'             => { 'out' => chr(229), 'unicode' => $inv . 'â–Ž' . $ni, 'desc' => 'Reversed Left Vertical Bar duplicate', },
#       'REVERSE DITHERED BOX 2'                  => { 'out' => chr(230), 'unicode' => $inv . 'â–’' . $ni, 'desc' => 'Reversed Dithered Box duplicate', },
#       'REVERSE RIGHT VERTICAL BAR 2'            => { 'out' => chr(231), 'unicode' => $inv . '🮈' . $ni, 'desc' => 'Reversed Right Vertical Bar duplicate', },
#       'REVERSE DITHERED BOTTOM 2'               => { 'out' => chr(232), 'unicode' => $inv . '🮏' . $ni, 'desc' => 'Reversed Dithered Left duplicate', },
#       'REVERSE BOTTOM RIGHT WEDGE 2'            => { 'out' => chr(233), 'unicode' => $inv . 'â—¤' . $ni, 'desc' => 'Reversed Bottom Right Wedge duplicate', },
#       'REVERSE VERTICAL BAR RIGHT 2'            => { 'out' => chr(234), 'unicode' => $inv . '🮈' . $ni, 'desc' => 'Reversed Vertical bar flushed right duplicate', },
#       'REVERSE VERTICAL BAR MIDDLE LEFT 2'      => { 'out' => chr(235), 'unicode' => $inv . '├' . $ni, 'desc' => 'Reversed Vertical Bar Middle Left duplicate', },
#       'REVERSE BOTTOM RIGHT BOX 2'              => { 'out' => chr(236), 'unicode' => $inv . 'â–—' . $ni, 'desc' => 'Reversed Bottom Right Box duplicate', },
#       'REVERSE BOTTOM LEFT CORNER 2'            => { 'out' => chr(237), 'unicode' => $inv . 'â””' . $ni, 'desc' => 'Reversed Bottom Left Corner duplicate', },
#       'REVERSE TOP RIGHT CORNER 2'              => { 'out' => chr(238), 'unicode' => $inv . '┐' . $ni, 'desc' => 'Reversed Top Right Corner duplicate', },
#       'REVERSE HORIZONTAL BAR BOTTOM 2'         => { 'out' => chr(239), 'unicode' => $inv . 'â–‚' . $ni, 'desc' => 'Reversed Horizontal Bar Bottom duplicate', },
#       'REVERSE TOP LEFT CORNER 2'               => { 'out' => chr(240), 'unicode' => $inv . '┌' . $ni, 'desc' => 'Reversed Top Left Corner duplicate', },
#       'REVERSE HORIZONTAL BAR MIDDLE BOTTOM 2'  => { 'out' => chr(241), 'unicode' => $inv . 'â”´' . $ni, 'desc' => 'Reversed Horizontal Bar Middle Bottom duplicate', },
#       'REVERSE HORIZONTAL BAR MIDDLE TOP 2'     => { 'out' => chr(242), 'unicode' => $inv . '┬' . $ni, 'desc' => 'Reversed Horizontal Bar Middle Top duplicate', },
#       'REVERSE VERTICAL BAR MIDDLE RIGHT 2'     => { 'out' => chr(243), 'unicode' => $inv . '┤' . $ni, 'desc' => 'Reversed Vertical Bar Middle Right duplicate', },
#       'REVERSE VERTICAL BOX LEFT 2'             => { 'out' => chr(244), 'unicode' => $inv . '▍' . $ni, 'desc' => 'Reversed Vertical Box Left duplicate', },
#       'REVERSE LEFT HALF BOX 2'                 => { 'out' => chr(245), 'unicode' => $inv . '▌' . $ni, 'desc' => 'Reversed Left Half Box duplicate', },
#       'REVERSE RIGHT HALF BOX 2'                => { 'out' => chr(246), 'unicode' => $inv . '🮈' . $ni, 'desc' => 'Reversed Right half box duplicate', },
#       'REVERSE HORIZONTAL BAR TOP 2'            => { 'out' => chr(247), 'unicode' => $inv . '🮂' . $ni, 'desc' => 'Reversed Horizontal bar top duplicate', },
#       'REVERSE HORIZONTAL BAR THICK TOP 2'      => { 'out' => chr(248), 'unicode' => $inv . '🮃' . $ni, 'desc' => 'Reversed Horizontal bar thick top duplicate', },
#       'REVERSE HORIZONTAL BAR THICK BOTTOM 2'   => { 'out' => chr(249), 'unicode' => $inv . 'â–ƒ' . $ni, 'desc' => 'Reversed Horizontal bar thick bottom duplicate', },
#       'REVERSE BOTTOM RIGHT RIGHT ANGLE 2'      => { 'out' => chr(250), 'unicode' => $inv . '🭿' . $ni, 'desc' => 'Reversed Bottom right right angle duplicate', },
#       'REVERSE BOTTOM LEFT BOX 2'               => { 'out' => chr(251), 'unicode' => $inv . 'â––' . $ni, 'desc' => 'Reversed Bottom Left Box duplicate', },
#       'REVERSE TOP RIGHT BOX 2'                 => { 'out' => chr(252), 'unicode' => $inv . '▝' . $ni, 'desc' => 'Reversed Top Right Box duplicate', },
#       'REVERSE BOTTOM RIGHT CORNER 2'           => { 'out' => chr(253), 'unicode' => $inv . '┘' . $ni, 'desc' => 'Reversed Bottom Right Corner duplicate', },
#       'REVERSE TOP LEFT BOX 2'                  => { 'out' => chr(254), 'unicode' => $inv . 'â–˜' . $ni, 'desc' => 'Reversed Top Left Box duplicate', },
#       'REVERSE PI 2'                            => { 'out' => chr(255), 'unicode' => $inv . 'Ï€' . $ni, 'desc' => 'Reversed Pi symbol duplicate', },
    };
    $self->{'debug'}->DEBUG(['End PETSCII Initialize']);
    return ($self);
} ## end sub petscii_initialize

sub petscii_output {
    my $self = shift;
    my $text = shift;

    $self->{'debug'}->DEBUG(['Start PETSCII Output']);
    my $mlines = (exists($self->{'USER'}->{'max_rows'})) ? $self->{'USER'}->{'max_rows'} - 3 : 21;
    my $lines  = $mlines;

    if (length($text) > 1) {
        while ($text =~ /\[\%\s+HORIZONTAL RULE (.*?)\s+\%\]/) {
            my $rule = "[% $1 %]" . '[% TOP HORIZONTAL BAR %]' x $self->{'USER'}->{'max_columns'} . '[% RESET %]';
            $text =~ s/\[\%\s+HORIZONTAL RULE (.*?)\s+\%\]/$rule/gs;
        }
        foreach my $string (keys %{ $self->{'petscii_meta'} }) {    # Decode macros
            if ($string =~ /CLEAR|CLS/i && ($self->{'sysop'} || $self->{'local_mode'})) {
                my $ch = locate(($self->{'CACHE'}->get('START_ROW') + $self->{'CACHE'}->get('ROW_ADJUST')), 1) . cldown;
                $text =~ s/\[\%\s+$string\s+\%\]/$ch/gi;
            } else {
                $text =~ s/\[\%\s+$string\s+\%\]/$self->{'petscii_meta'}->{$string}->{'out'}/gi;
            }
        } ## end foreach my $string (keys %{...})
    } ## end if (length($text) > 1)
    my $s_len = length($text);
    my $nl    = $self->{'petscii_meta'}->{'NEWLINE'}->{'out'};
    foreach my $count (0 .. $s_len) {
        my $char = substr($text, $count, 1);
        if ($char eq "\n") {
            if ($text !~ /$nl/ && !$self->{'local_mode'}) {    # translate only if the file doesn't have ASCII newlines
                $char = $nl;
            }
            $lines--;
            if ($lines <= 0) {
                $lines = $mlines;
                last unless ($self->scroll($nl));
            }
        } ## end if ($char eq "\n")
        $self->send_char($char);
    } ## end foreach my $count (0 .. $s_len)
    $self->{'debug'}->DEBUG(['End PETSCII Output']);
    return (TRUE);
} ## end sub petscii_output
1;



( run in 0.924 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )