[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
texinfo/tp Texinfo/Common.pm Texinfo/Convert/Co...
From: |
Patrice Dumas |
Subject: |
texinfo/tp Texinfo/Common.pm Texinfo/Convert/Co... |
Date: |
Thu, 29 Sep 2011 20:01:39 +0000 |
CVSROOT: /sources/texinfo
Module name: texinfo
Changes by: Patrice Dumas <pertusus> 11/09/29 20:01:39
Modified files:
tp/Texinfo : Common.pm
tp/Texinfo/Convert: Converter.pm DocBook.pm HTML.pm Text.pm
XML.pm
tp/t : accents.t
Log message:
Add convert_tree for DocBook and XML.
Redesign the interface for accents formatting.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Common.pm?cvsroot=texinfo&r1=1.68&r2=1.69
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/Converter.pm?cvsroot=texinfo&r1=1.46&r2=1.47
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/DocBook.pm?cvsroot=texinfo&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/HTML.pm?cvsroot=texinfo&r1=1.157&r2=1.158
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/Text.pm?cvsroot=texinfo&r1=1.67&r2=1.68
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/XML.pm?cvsroot=texinfo&r1=1.43&r2=1.44
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/t/accents.t?cvsroot=texinfo&r1=1.13&r2=1.14
Patches:
Index: Texinfo/Common.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Common.pm,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -b -r1.68 -r1.69
--- Texinfo/Common.pm 29 Sep 2011 15:17:06 -0000 1.68
+++ Texinfo/Common.pm 29 Sep 2011 20:01:38 -0000 1.69
@@ -901,7 +901,7 @@
last;
}
push @accent_commands, $current;
- # A bogus accent
+ # A bogus accent, that may happen
if (!$current->{'args'}) {
return ([], address@hidden);
}
@@ -914,7 +914,7 @@
print STDERR "BUG: No content in accent command\n";
#print STDERR Data::Dumper->Dump([$current]);
#print STDERR Texinfo::Convert::Texinfo::convert($current)."\n";
- last;
+ return ([], address@hidden);
}
# inside the braces of an accent
my $text_contents = [];
Index: Texinfo/Convert/Converter.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/Converter.pm,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- Texinfo/Convert/Converter.pm 29 Sep 2011 15:17:07 -0000 1.46
+++ Texinfo/Convert/Converter.pm 29 Sep 2011 20:01:38 -0000 1.47
@@ -811,8 +811,9 @@
{
my $self = shift;
my $accent = shift;
- my $in_upper_case = shift;
my $format_accents = shift;
+ my $in_upper_case = shift;
+
if (!defined($format_accents)) {
if ($self->get_conf('USE_NUMERIC_ENTITY')) {
$format_accents = \&xml_accent_numeric_entities;
@@ -821,22 +822,32 @@
}
}
+ return $self->convert_accents($accent, $format_accents, $in_upper_case);
+}
+
+sub convert_accents($$$;$)
+{
+ my $self = shift;
+ my $accent = shift;
+ my $format_accents = shift;
+ my $in_upper_case = shift;
+
+ my ($contents, $stack)
+ = Texinfo::Common::find_innermost_accent_contents($accent);
+ my $result = $self->convert_tree({'contents' => $contents});
+
if ($self->get_conf('ENABLE_ENCODING')) {
if ($self->{'encoding_name'} and $self->{'encoding_name'} eq 'utf-8') {
- return Texinfo::Convert::Text::unicode_accents($accent, $format_accents,
- $in_upper_case);
+ return Texinfo::Convert::Text::unicode_accents($result, $stack,
+ $format_accents, $in_upper_case);
} elsif ($self->{'encoding_name'}
and
$Texinfo::Encoding::eight_bit_encoding_aliases{$self->{'encoding_name'}}) {
- return Texinfo::Convert::Text::eight_bit_accents($accent,
+ return Texinfo::Convert::Text::eight_bit_accents($result, $stack,
$self->{'encoding_name'},
$format_accents,
$in_upper_case);
}
}
- my ($contents, $stack)
- = Texinfo::Common::find_innermost_accent_contents($accent);
-
- my $result = $self->_convert({'contents' => $contents});
foreach my $accent_command (reverse(@$stack)) {
$result = &$format_accents ($result, $accent_command,
$in_upper_case);
Index: Texinfo/Convert/DocBook.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/DocBook.pm,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- Texinfo/Convert/DocBook.pm 29 Sep 2011 14:04:40 -0000 1.16
+++ Texinfo/Convert/DocBook.pm 29 Sep 2011 20:01:38 -0000 1.17
@@ -44,6 +44,8 @@
# will save memory.
%EXPORT_TAGS = ( 'all' => [ qw(
convert
+ convert_tree
+ output
) ] );
@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@@ -300,6 +302,14 @@
return $self->_convert_document_sections($root, $fh);
}
+sub convert_tree($$)
+{
+ my $self = shift;
+ my $root = shift;
+
+ return $self->_convert($root);
+}
+
sub output($$)
{
my $self = shift;
@@ -390,7 +400,7 @@
return '';
}
-sub docbook_accent($$;$$)
+sub docbook_accent($$;$)
{
my $text = shift;
my $command = shift;
@@ -405,10 +415,10 @@
return '&#' .
hex($Texinfo::Convert::Unicode::unicode_accented_letters{$accent}->{$text}).
';';
}
- return $text . '<' if ($accent eq 'v');
# FIXME it is not possible to call xml_protect_text since what is in $text
# may already be xml. But this means that each time ascii_accent changes
# it should be changed here too.
+ return $text . '<' if ($accent eq 'v');
return Texinfo::Convert::Text::ascii_accent($text, $command);
}
@@ -479,7 +489,8 @@
} elsif ($root->{'cmdname'} eq 'today') {
return $self->_convert(Texinfo::Common::expand_today($self));
} elsif ($Texinfo::Common::accent_commands{$root->{'cmdname'}}) {
- return $self->xml_accents($root, undef, \&docbook_accent);#,
$self->in_upper_case());
+ # FIXME handle in_upper_case
+ return $self->convert_accents($root, \&docbook_accent);
} elsif ($root->{'cmdname'} eq 'item' or $root->{'cmdname'} eq 'itemx'
or $root->{'cmdname'} eq 'headitem' or $root->{'cmdname'} eq
'tab') {
if ($root->{'cmdname'} eq 'item'
Index: Texinfo/Convert/HTML.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/HTML.pm,v
retrieving revision 1.157
retrieving revision 1.158
diff -u -b -r1.157 -r1.158
--- Texinfo/Convert/HTML.pm 29 Sep 2011 14:22:20 -0000 1.157
+++ Texinfo/Convert/HTML.pm 29 Sep 2011 20:01:38 -0000 1.158
@@ -1584,7 +1584,7 @@
my $command = shift;
my $args = shift;
- return $self->xml_accents($command, $self->in_upper_case());
+ return $self->xml_accents($command, undef, $self->in_upper_case());
}
foreach my $command (keys(%accent_commands)) {
Index: Texinfo/Convert/Text.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/Text.pm,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -b -r1.67 -r1.68
--- Texinfo/Convert/Text.pm 29 Sep 2011 16:37:21 -0000 1.67
+++ Texinfo/Convert/Text.pm 29 Sep 2011 20:01:39 -0000 1.68
@@ -156,38 +156,19 @@
$ignored_types{$type} = 1;
}
-# find the innermost accent and format the correspponding text contents
-sub _find_innermost_accent($;$$)
+sub eight_bit_accents($$$$;$)
{
- my $current = shift;
- my $encoding = shift;
- my $in_upper_case = shift;
- my ($contents, $stack)
- = Texinfo::Common::find_innermost_accent_contents($current);
-
- # FIXME shouldn't it be better to format the innermost contents with
- # a converter, if present?
- my $options = {};
- $options->{'enabled_encoding'} = $encoding if (defined($encoding));
- $options->{'sc'} = $in_upper_case if (defined($in_upper_case));
- return (convert({'contents' => $contents}, $options),
- $stack);
-}
-
-sub eight_bit_accents($$$;$)
-{
- my $current = shift;
+ my $unicode_formatted = shift;
+ my $stack = shift;
my $encoding = shift;
my $convert_accent = shift;
my $in_upper_case = shift;
+ my $result = $unicode_formatted;
+
my $debug;
#$debug = 1;
- my ($unicode_formatted, $stack)
- = _find_innermost_accent($current, $encoding, $in_upper_case);
- my $result = $unicode_formatted;
-
if ($debug) {
print STDERR "STACK: ".join('|', map {$_->{'cmdname'}} @$stack)."\n";
}
@@ -308,14 +289,12 @@
}
# format a stack of accents as ascii
-sub ascii_accents ($;$)
+sub ascii_accents ($$;$)
{
- my $current = shift;
+ my $result = shift;
+ my $stack = shift;
my $in_upper_case = shift;
- my ($result, $stack)
- = _find_innermost_accent($current, undef, $in_upper_case);
-
$result = uc($result) if ($in_upper_case and $result =~ /^\w$/);
foreach my $accent_command (reverse(@$stack)) {
$result = ascii_accent ($result, $accent_command);
@@ -324,13 +303,12 @@
}
# format a stack of accents as unicode
-sub unicode_accents ($$;$)
+sub unicode_accents ($$$;$)
{
- my $current = shift;
+ my $result = shift;
+ my $stack = shift;
my $format_accent = shift;
my $in_upper_case = shift;
- my ($result, $stack) = _find_innermost_accent($current,
- 'utf-8', $in_upper_case);
while (@$stack) {
my $formatted_result
@@ -355,13 +333,23 @@
my $in_upper_case = shift;
return '' if (!$accent->{'args'});
+
+ my ($contents, $stack)
+ = Texinfo::Common::find_innermost_accent_contents($accent);
+
+ my $options = {};
+ $options->{'enabled_encoding'} = $encoding if (defined($encoding));
+ $options->{'sc'} = $in_upper_case if (defined($in_upper_case));
+ my $text = convert({'contents' => $contents}, $options);
+
if ($encoding and $encoding eq 'utf-8') {
- return unicode_accents($accent, \&ascii_accent, $in_upper_case);
+ return unicode_accents($text, $stack, \&ascii_accent, $in_upper_case);
} elsif ($encoding
and $Texinfo::Encoding::eight_bit_encoding_aliases{$encoding}) {
- return eight_bit_accents($accent, $encoding, \&ascii_accent,
$in_upper_case);
+ return eight_bit_accents($text, $stack, $encoding, \&ascii_accent,
+ $in_upper_case);
} else {
- my $result = ascii_accents($accent, $in_upper_case);
+ my $result = ascii_accents($text, $stack, $in_upper_case);
}
}
Index: Texinfo/Convert/XML.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/XML.pm,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -b -r1.43 -r1.44
--- Texinfo/Convert/XML.pm 29 Sep 2011 13:57:21 -0000 1.43
+++ Texinfo/Convert/XML.pm 29 Sep 2011 20:01:39 -0000 1.44
@@ -43,6 +43,8 @@
# will save memory.
%EXPORT_TAGS = ( 'all' => [ qw(
convert
+ convert_tree
+ output
) ] );
@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@@ -53,7 +55,7 @@
$VERSION = '0.01';
my %defaults = (
- 'ENABLE_ENCODING' => 1,
+ 'ENABLE_ENCODING' => 0,
'SHOW_MENU' => 1,
'EXTENSION' => 'xml',
'perl_encoding' => 'utf8',
@@ -317,7 +319,17 @@
return $attribute;
}
-my @node_directions = ('Next', 'Prev', 'Up');
+sub _texinfo_xml_accent($$;$)
+{
+ my $text = shift;
+ my $root = shift;
+ my $in_upper_case = shift;
+
+ my $result = "<accent type=\"$xml_accent_types{$root->{'cmdname'}}\">";
+ $result .= $text;
+ $result .= '</accent>';
+ return $result;
+}
sub convert($$;$)
{
@@ -328,6 +340,16 @@
return $self->_convert_document_sections($root, $fh);
}
+sub convert_tree($$)
+{
+ my $self = shift;
+ my $root = shift;
+
+ return $self->_convert($root);
+}
+
+my @node_directions = ('Next', 'Prev', 'Up');
+
sub _convert($$;$);
sub _convert($$;$)
@@ -385,11 +407,16 @@
}
return $xml_commands_formatting{$root->{'cmdname'}};
} elsif ($xml_accent_types{$root->{'cmdname'}}) {
- $result = "<accent type=\"$xml_accent_types{$root->{'cmdname'}}\">";
- $result .= $self->_convert($root->{'args'}->[0])
- if ($root->{'args'} and $root->{'args'}->[0]);
- $result .= '</accent>';
- return $result;
+ if ($self->get_conf('ENABLE_ENCODING')) {
+ return $self->convert_accents($root, \&_texinfo_xml_accent);
+ } else {
+ if (!$root->{'args'}) {
+ $result = '';
+ } else {
+ $result = $self->_convert($root->{'args'}->[0]);
+ }
+ return _texinfo_xml_accent($result, $root);
+ }
} elsif ($root->{'cmdname'} eq 'item' or $root->{'cmdname'} eq 'itemx'
or $root->{'cmdname'} eq 'headitem' or $root->{'cmdname'} eq
'tab') {
if ($root->{'cmdname'} eq 'item'
Index: t/accents.t
===================================================================
RCS file: /sources/texinfo/texinfo/tp/t/accents.t,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- t/accents.t 29 Sep 2011 15:17:08 -0000 1.13
+++ t/accents.t 29 Sep 2011 20:01:39 -0000 1.14
@@ -22,8 +22,9 @@
my $reference = $test->[2];
my $parser = Texinfo::Parser::parser({'context' => 'preformatted'});
my $tree = $parser->parse_texi_text($texi);
- my ($text, $commands_stack) =
- Texinfo::Convert::Text::_find_innermost_accent($tree->{'contents'}->[0]);
+ my ($contents, $commands_stack) =
+ Texinfo::Common::find_innermost_accent_contents($tree->{'contents'}->[0]);
+ my $text = Texinfo::Convert::Text::convert({'contents' => $contents});
my @stack = map {$_->{'cmdname'}} @$commands_stack;
if (defined($reference)) {
ok ($reference eq join('|',($text, @stack)), 'innermost '.$name);
@@ -70,9 +71,15 @@
my $parser = Texinfo::Parser::parser({'context' => 'preformatted'});
my $text_root = $parser->parse_texi_text($texi);
my $tree = $text_root->{'contents'}->[0];
+
+ my ($contents, $commands_stack) =
+ Texinfo::Common::find_innermost_accent_contents($tree);
+ my $text = Texinfo::Convert::Text::convert({'contents' => $contents});
+
my $result =
- Texinfo::Convert::Text::eight_bit_accents($tree,
+ Texinfo::Convert::Text::eight_bit_accents($text, $commands_stack,
'iso-8859-1', \&Texinfo::Convert::Text::ascii_accent);
+
my $html_converter = Texinfo::Convert::HTML->converter();
$html_converter->{'conf'}->{'USE_NUMERIC_ENTITY'} = 0;
my $result_xml = Texinfo::Convert::Converter::xml_accents($html_converter,
@@ -80,8 +87,14 @@
$html_converter->{'conf'}->{'USE_NUMERIC_ENTITY'} = 1;
my $result_xml_entity
= Texinfo::Convert::Converter::xml_accents($html_converter, $tree);
- my $result_unicode = Texinfo::Convert::Text::unicode_accents($tree,
- \&Texinfo::Convert::Text::ascii_accent);
+
+ ($contents, $commands_stack) =
+ Texinfo::Common::find_innermost_accent_contents($tree);
+ $text = Texinfo::Convert::Text::convert({'contents' => $contents},
+ {'enabled_encoding' => 'utf-8'});
+
+ my $result_unicode = Texinfo::Convert::Text::unicode_accents($text,
+ $commands_stack, \&Texinfo::Convert::Text::ascii_accent);
if (defined($reference)) {
#ok (Encode::decode('iso-8859-1', $reference) eq $result, $name);
#ok ($reference eq Encode::encode('iso-8859-1', $result), $name);