From eb97f47fde194a05f3a2dd07c7d61d003365efdb Mon Sep 17 00:00:00 2001 From: Steve Hancock Date: Mon, 20 Jan 2020 08:20:13 -0800 Subject: [PATCH] encode error output in utf8 when -utf8 flag is set --- CHANGES.md | 2 ++ lib/Perl/Tidy.pm | 31 +++++++++++++++++++++++++++---- lib/Perl/Tidy/Logger.pm | 7 ++++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ee0a50e5..d1e34212 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ ## 2020 01 10.01 + - When -utf8 is used, any error output is encoded as utf8 + - Fix for git#19, adjust line break around an 'xor' - Fix for git#18, added warning for missing comma before unknown bare word. diff --git a/lib/Perl/Tidy.pm b/lib/Perl/Tidy.pm index 0aae0404..ef9d5324 100644 --- a/lib/Perl/Tidy.pm +++ b/lib/Perl/Tidy.pm @@ -131,7 +131,13 @@ sub streamhandle { # object object # (check for 'print' method for 'w' mode) # (check for 'getline' method for 'r' mode) - my ( $filename, $mode ) = @_; + + # An optional flag $character_encoding may be given. + # The current options are: + # 1. '' or 'none' -> the file will not use binary encoding + # 2. 'utf8' -> the file will be utf8 encoded + # 3. Any other string: use simple binmode + my ( $filename, $mode, $character_encoding ) = @_; my $ref = ref($filename); my $New; @@ -140,10 +146,10 @@ sub streamhandle { # handle a reference if ($ref) { if ( $ref eq 'ARRAY' ) { - $New = sub { Perl::Tidy::IOScalarArray->new(@_) }; + $New = sub { Perl::Tidy::IOScalarArray->new( $filename, $mode ) }; } elsif ( $ref eq 'SCALAR' ) { - $New = sub { Perl::Tidy::IOScalar->new(@_) }; + $New = sub { Perl::Tidy::IOScalar->new( $filename, $mode ) }; } else { @@ -198,12 +204,29 @@ EOM $New = sub { $mode eq 'w' ? *STDOUT : *STDIN } } else { - $New = sub { IO::File->new(@_) }; + $New = sub { IO::File->new( $filename, $mode ) }; } } $fh = $New->( $filename, $mode ) or Warn("Couldn't open file:$filename in mode:$mode : $!\n"); + if ( $fh && $character_encoding && $character_encoding ne 'none' ) { + + if ( $character_encoding eq 'utf8' ) { + if ( ref($fh) eq 'IO::File' ) { + $fh->binmode(":raw:encoding(UTF-8)"); + } + elsif ( $fh eq '-' ) { + binmode STDOUT, ":raw:encoding(UTF-8)"; + } + } + + # Patch for RT 122030 + elsif ( ref($fh) eq 'IO::File' ) { $fh->binmode(); } + + elsif ( $fh eq '-' ) { binmode STDOUT } + } + return $fh, ( $ref or $filename ); } diff --git a/lib/Perl/Tidy/Logger.pm b/lib/Perl/Tidy/Logger.pm index d71be2b6..4c872b99 100644 --- a/lib/Perl/Tidy/Logger.pm +++ b/lib/Perl/Tidy/Logger.pm @@ -316,7 +316,8 @@ sub warning { if ( !$fh_warnings ) { my $warning_file = $self->{_warning_file}; ( $fh_warnings, my $filename ) = - Perl::Tidy::streamhandle( $warning_file, 'w' ); + Perl::Tidy::streamhandle( $warning_file, 'w', + $rOpts->{'character-encoding'} ); $fh_warnings or Perl::Tidy::Die("couldn't open $filename $!\n"); Perl::Tidy::Warn("## Please see file $filename\n") unless ref($warning_file); @@ -501,7 +502,8 @@ sub finish { if ($save_logfile) { my $log_file = $self->{_log_file}; - my ( $fh, $filename ) = Perl::Tidy::streamhandle( $log_file, 'w' ); + my ( $fh, $filename ) = Perl::Tidy::streamhandle( $log_file, 'w', + $rOpts->{'character-encoding'} ); if ($fh) { my $routput_array = $self->{_output_array}; foreach ( @{$routput_array} ) { $fh->print($_) } @@ -513,4 +515,3 @@ sub finish { return; } 1; - -- 2.39.5