Text-FIGlet

 view release on metacpan or  search on metacpan

lib/Text/FIGlet/Control.pm  view on Meta::CPAN

sub new{
  my $proto = shift;
  my $self = {-C=>[]};
  local($_, *FLC);

  my $code = '';
  my(@t_pre, @t_post);
  while( @_ ){
    my $s = shift;
    if( $s eq '-C' ){
	push(@{$self->{-C}}, shift); }
    else{
	$self->{$s} = shift; }
  }
  $self->{-d} ||= $ENV{FIGLIB}  || '/usr/games/lib/figlet/';
  $self->{"_\\"} = 1 if $^O =~ /MSWin32|DOS/i;


#  my $no = qr/0x[\da-fA-F]+|\d+/;

  foreach my $flc ( @{$self->{-C}} ){
    $self->{'_file'} = _canonical($self->{-d},
						$flc,
						qr/\.flc/,
						$self->{"_\\"});
    open(FLC, $self->{'_file'}) || croak("$!: $flc [$self->{_file}]");
    while(<FLC>){
      next if /^flc2a|\s*#|^\s*$/;

      #XXX Is this adequate?
      $code .= 'use utf8;' if /^\s*u/;

      if( /^\s*$Text::FIGlet::RE{no}\s+$Text::FIGlet::RE{no}\s*/ ){
	#Only needed for decimals?!

	push @t_pre,  sprintf('\\x{%x}', _no($1, $2, $3));
	push @t_post, sprintf('\\x{%x}', _no($4, $5, $6));
      }
      elsif( /^\s*t\s+\\?$Text::FIGlet::RE{no}(?:-\\$Text::FIGlet::RE{no})?\s+\\?$Text::FIGlet::RE{no}(?:-\\$Text::FIGlet::RE{no})?\s*/ ){
	push @t_pre,  sprintf( '\\x{%x}', _no( $1, $2, $3));
	push @t_post, sprintf( '\\x{%x}', _no( $7, $8, $9));
	$t_pre[-1] .= sprintf('-\\x{%x}', _no( $4, $5, $6)) if$5;
	$t_post[-1].= sprintf('-\\x{%x}', _no($10,$11,$12))if$11;
      }
      elsif( /^\s*t\s+([^\s](?:-[^\s])?)\s+([^\s](?:-[^\s])?)\s*/ ){
	push @t_pre,  $1;
	push @t_post, $2;
      }
      if( /^\s*f/ || eof(FLC) ){
	@{$_} = map { s%/%\\/%g, $_ } @{$_} for( \@t_pre, \@t_post );
	$code  .= 'tr/' . join('', @t_pre) . '/' . join('', @t_post) . '/;';
	@t_pre = @t_post = ();
      }
    }
    close(FLC);
  }
  $self->{_sub} = eval "sub { local \$_ = shift; $code; return \$_ }";
  bless($self);
}

sub tr($){
  my $self = shift;
  $self->{_sub}->( shift || $_ );
}
1;
__END__
=pod

=head1 NAME

Text::FIGlet::Control - control file support for Text::FIGlet

=head1 SYNOPSIS

  use Text::FIGlet;

  my $flc = Text::FIGlet->new(-C=>'upper.flc');

  print $flc->tr("Hello World");

=head1 DESCRIPTION

Text::FIGlet::Control uses control files, which tell it to
map certain input characters to certain other characters,
similar to the Unix tr command. Control files can be
identified by the suffix I<.flc>. Most Text::FIGlet::Control
control files will be stored in FIGlet's default font directory.

The following control file commands are supported, for more
detail see F<figfont.txt> included with this distribution.

=over

=item f Freeze

A kind of "save state",
executes all previously accumulated translations before continuing.

=item t Translate

Both the explicit forms "t in out" and "t in-range out-range"
as well as the implicit form "number number".

B<Note that if you are mapping in negative characters,
you will need to C<figify> in Unicode mode I<-U>>. See also B<u> below.

=item u Unicode

Process text as Unicode (UTF-8).

Note that this is required for perl 5.6 if you are doing negative mapping.

=back

=head1 OPTIONS

=head2 C<new>

=over

=item B<-C=E<gt>>F<controlfile>



( run in 0.585 second using v1.01-cache-2.11-cpan-524268b4103 )