source: repository/lib/Metabrik/File/Text.pm

Last change on this file was 961:4904130851a0, checked in by GomoR <gomor@…>, 3 months ago
  • bugfix: file::text: undef internal file::read Attribute when file is closed
File size: 3.6 KB
Line 
1#
2# $Id$
3#
4# file::text Brik
5#
6package Metabrik::File::Text;
7use strict;
8use warnings;
9
10use base qw(Metabrik::File::Write);
11
12sub brik_properties {
13   return {
14      revision => '$Revision$',
15      tags => [ qw(unstable read write) ],
16      author => 'GomoR <GomoR[at]metabrik.org>',
17      license => 'http://opensource.org/licenses/BSD-3-Clause',
18      attributes => {
19         input => [ qw(file) ],
20         output => [ qw(file) ],
21         as_array => [ qw(0|1) ],
22         strip_crlf => [ qw(0|1) ],
23         encoding => [ qw(utf8|ascii) ],  # Inherited
24         _fr => [ qw(INTERNAL) ],
25      },
26      # encoding: see `perldoc Encode::Supported' for other types
27      attributes_default => {
28         encoding => 'utf8',
29         as_array => 0,
30         strip_crlf => 0,
31      },
32      commands => {
33         read => [ qw(input) ],
34         read_line => [ qw(input count|OPTIONAL) ],
35         read_split_by_blank_line => [ qw(input) ],
36         write => [ qw($data|$data_ref|$data_list output) ],
37      },
38      require_modules => {
39         'Metabrik::File::Read' => [ ],
40      },
41   };
42}
43
44sub _open {
45   my $self = shift;
46   my ($input) = @_;
47
48   my $fr = Metabrik::File::Read->new_from_brik_init($self) or return;
49   $fr->input($input);
50   $fr->encoding($self->encoding);
51   $fr->as_array($self->as_array);
52   $fr->strip_crlf($self->strip_crlf);
53
54   $fr->open or return;
55
56   return $fr;
57}
58
59#
60# Read everything available
61#
62sub read {
63   my $self = shift;
64   my ($input) = @_;
65
66   $input ||= $self->input;
67   $self->brik_help_run_undef_arg('read', $input) or return;
68
69   my $fr = $self->_open($input) or return;
70   my $data = $fr->read or return;
71   $fr->close;
72   $self->_fr(undef);
73
74   return $data;
75}
76
77#
78# Just return next available line
79#
80sub read_line {
81   my $self = shift;
82   my ($input, $count) = @_;
83
84   $input ||= $self->input;
85   $count ||= 1;
86   $self->brik_help_run_undef_arg('read_line', $input) or return;
87   $self->brik_help_run_file_not_found('read_line', $input) or return;
88
89   my $fr = $self->_fr;
90   if (! $fr) {
91      $fr = $self->_open($input) or return;
92      $self->_fr($fr);
93   }
94
95   if ($fr->eof) {
96      $fr->close;
97      $self->_fr(undef);
98      return 0;
99   }
100
101   my $data;
102   my @lines = ();
103   if ($count > 1) {
104      for (1..$count) {
105         $data = $fr->read_line;
106         push @lines, $data;
107      }
108   }
109   else {
110      $data = $fr->read_line;
111   }
112
113   return $count > 1 ? \@lines : $data;
114}
115
116#
117# Will read everything until eof
118#
119sub read_split_by_blank_line {
120   my $self = shift;
121   my ($input) = @_;
122
123   $input ||= $self->input;
124   $self->brik_help_run_undef_arg('read_split_by_blank_line', $input) or return;
125
126   my $fr = $self->_open($input) or return;
127
128   my @chunks = ();
129   while (my $this = $fr->read_until_blank_line) {
130      push @chunks, $this;
131      last if $fr->eof;
132   }
133
134   $fr->close;
135   $self->_fr(undef);
136
137   return \@chunks;
138}
139
140sub write {
141   my $self = shift;
142   my ($data, $output) = @_;
143
144   $output ||= $self->output;
145   $self->brik_help_run_undef_arg('write', $data) or return;
146   $self->brik_help_run_undef_arg('write', $output) or return;
147
148   $self->open($output) or return;
149   # We check definedness because if we write 0 byte write will return 0
150   my $r = $self->SUPER::write($data);
151   if (! defined($r)) {
152      return;
153   }
154   $self->close;
155
156   return 1;
157}
158
1591;
160
161__END__
162
163=head1 NAME
164
165Metabrik::File::Text - file::text Brik
166
167=head1 COPYRIGHT AND LICENSE
168
169Copyright (c) 2014-2018, Patrice E<lt>GomoRE<gt> Auffret
170
171You may distribute this module under the terms of The BSD 3-Clause License.
172See LICENSE file in the source distribution archive.
173
174=head1 AUTHOR
175
176Patrice E<lt>GomoRE<gt> Auffret
177
178=cut
Note: See TracBrowser for help on using the repository browser.