blob: 25308a231354ec48ec6b1847d7b177aa59df9a69 [file] [log] [blame]
# UnFilled.pm: handle unfilled line of text.
#
# Copyright 2010, 2011 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License,
# or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Original author: Patrice Dumas <pertusus@free.fr>
# this module has nothing Texinfo specific. It is similar with
# Texinfo::Convert::Line, but simpler.
package Texinfo::Convert::UnFilled;
use 5.006;
use strict;
use Unicode::EastAsianWidth;
# initialize a paragraph object.
sub new($;$)
{
my $class = shift;
my $conf = shift;
my $self = {'indent_length' => 0, 'counter' => 0, 'line_beginning' => 1,
'leading_spaces' => '', 'only_spaces' => 1, 'lines_counter' => 0,
'end_line_count' => 0};
if (defined($conf)) {
foreach my $key (keys(%$conf)) {
if ($key eq 'text') {
$self->{'counter'} = Texinfo::Convert::Unicode::string_width($conf->{$key});
$self->{'line_beginning'} = 0 if ($self->{'counter'});
} else {
$self->{$key} = $conf->{$key};
}
}
}
bless $self, $class;
}
# for debug
sub dump($)
{
my $self = shift;
my $word = 'UNDEF';
my $end_sentence = 'UNDEF';
print STDERR "unfilled ($self->{'line_beginning'},$self->{'only_spaces'}) space `$self->{'leading_spaces'}'\n";
}
sub end_line($)
{
my $line = shift;
$line->{'end_line_count'} = 0;
return $line->_end_line();
}
# end a line.
sub _end_line($)
{
my $line = shift;
$line->{'line_beginning'} = 1;
$line->{'leading_spaces'} = '';
$line->{'only_spaces'} = 1;
$line->{'lines_counter'}++;
$line->{'end_line_count'}++;
$line->{'counter'} = 0;
print STDERR "END_LINE.U\n" if ($line->{'DEBUG'});
return "\n";
}
sub end_line_count($)
{
my $line = shift;
return $line->{'end_line_count'};
}
sub _add_text($$)
{
my $line = shift;
my $text = shift;
$text =~ s/\x08//g;
if ($line->{'line_beginning'}) {
if ($line->{'indent_length'}) {
my $nspaces = $line->{'indent_length'} - $line->{'counter'};
($line->{'leading_spaces'} .= ' ' x $nspaces) if $nspaces > 0;
print STDERR "INDENT.U($line->{'counter'})\n" if ($line->{'DEBUG'});
}
$line->{'line_beginning'} = 0;
}
if ($line->{'only_spaces'}) {
if ($text =~ /\S/) {
$text = $line->{'leading_spaces'}.$text;
$line->{'leading_spaces'} = '';
$line->{'only_spaces'} = 0;
}
if ($text =~ /\n/) {
$text =~ s/\s*$//;
$text .= $line->_end_line;
}
} else {
if ($text =~ /\n/) {
$text =~ s/\s*$//;
$text .= $line->_end_line;
}
}
return $text;
}
sub get_pending($)
{
return '';
}
# put a pending word and spaces in the result string.
sub add_pending_word($;$)
{
my $line = shift;
my $add_spaces = shift;
$line->{'end_line_count'} = 0;
if ($add_spaces) {
# this set the indentation, if needed
$line->_add_text('');
my $text = $line->{'leading_spaces'};
$line->{'leading_spaces'} = '';
return $text;
}
return '';
}
# end
sub end($)
{
my $line = shift;
$line->{'end_line_count'} = 0;
return '';
}
# add a word and/or end of sentence.
sub add_next($;$$)
{
my $line = shift;
my $word = shift;
my $transparent = shift;
$line->{'end_line_count'} = 0;
my $result = '';
if (defined($word)) {
$result .= $line->_add_text($word);
}
return $result;
}
sub remove_end_sentence($)
{
my $line = shift;
}
sub add_end_sentence($;$)
{
my $line = shift;
}
sub allow_end_sentence($)
{
my $line = shift;
}
sub set_space_protection($$;$$$)
{
return '';
}
# wrap a text.
sub add_text($$)
{
my $line = shift;
my $text = shift;
$line->{'end_line_count'} = 0;
return $line->_add_text($text);
}
1;