[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
texinfo/tp/Texinfo/Convert IXIN.pm
From: |
Patrice Dumas |
Subject: |
texinfo/tp/Texinfo/Convert IXIN.pm |
Date: |
Sun, 27 Jan 2013 20:17:36 +0000 |
CVSROOT: /sources/texinfo
Module name: texinfo
Changes by: Patrice Dumas <pertusus> 13/01/27 20:17:36
Modified files:
tp/Texinfo/Convert: IXIN.pm
Log message:
Add floats.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/IXIN.pm?cvsroot=texinfo&r1=1.4&r2=1.5
Patches:
Index: IXIN.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/IXIN.pm,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- IXIN.pm 27 Jan 2013 14:46:29 -0000 1.4
+++ IXIN.pm 27 Jan 2013 20:17:36 -0000 1.5
@@ -92,9 +92,12 @@
my %attribute_string_names = (
'nodeentry' => {'name' => 1},
'nodelabel' => {'name' => 1},
+ 'floatentry' => {'name' => 1},
+ 'label' => {'name' => 1},
'filename' => {'name' => 1},
'settingvalue' => {'value' => 1},
'nodetweakvalue' => {'value' => 1},
+ 'floatindex' => {'type' => 1},
);
sub _ixin_attributes($$$)
@@ -433,7 +436,7 @@
}
$node_label_number{$normalized_node_name} = $node_nr;
- my $node_result = $self->convert_tree($node_element);
+ my $node_result = $self->convert_tree($node_element)."\n";
$document_output .= $node_result;
# get node length.
@@ -566,6 +569,7 @@
my $non_node_labels_text = '';
my $labels_nr = 0;
+ my %floats_associated_node_id;
if ($self->{'labels'}) {
foreach my $label (sort(keys(%{$self->{'labels'}}))) {
my $command = $self->{'labels'}->{$label};
@@ -576,6 +580,11 @@
$non_node_labels_text .= $self->ixin_element('label', ['name', $label,
'nodeid', $associated_node_id,
'type', $command->{'cmdname'}]);
+
+ # register floats to avoid doing it twice for the float specific index
+ if ($command->{'cmdname'} eq 'float') {
+ $floats_associated_node_id{$command} = $associated_node_id;
+ }
}
}
@@ -590,8 +599,7 @@
# do document-term sets (indices counts and indices)
- my $dts_index = '';
- my $dts_text = $self->ixin_open_element('dtssets');
+ my %dts_information;
if ($self->{'parser'}) {
my ($index_names, $merged_indices)
@@ -602,7 +610,6 @@
= $self->Texinfo::Structuring::sort_indices($merged_index_entries,
$index_names);
# first do the dts_text as the counts are needed for the dts index
- my %dts_information;
foreach my $index_name (sort(keys(%$entries))) {
my $dts_text_result = '';
my $dts_entries_nr = 0;
@@ -637,13 +644,11 @@
. $self->ixin_close_element('dts') . "\n";
$dts_information{$index_name}->{'dts_text'} = $dts_text_result;
}
+ }
- # Gather informations on node id with printindex
- my $printindex_commands = $self->{'extra'}->{'printindex'}
- if ($self->{'extra'}->{'printindex'});
-
- if ($printindex_commands) {
- foreach my $command (@$printindex_commands) {
+ # Gather informations on printindex @-commands associated node id
+ if ($self->{'extra'}->{'printindex'}) {
+ foreach my $command (@{$self->{'extra'}->{'printindex'}}) {
my $associated_node_id = $self->_associated_node_id($command,
\%node_label_number);
if ($command->{'extra'} and $command->{'extra'}->{'misc_args'}
@@ -653,6 +658,10 @@
}
}
}
+
+ # now construct dts_index and dts_text
+ my $dts_index = '';
+ my $dts_text = $self->ixin_open_element('dtssets');
foreach my $index_name (sort(keys(%dts_information))) {
my $dts_len = 0;
if (exists($dts_information{$index_name}->{'dts_text'})) {
@@ -661,7 +670,6 @@
$dts_text .= $dts_information{$index_name}->{'dts_text'};
}
my @attributes = ('name', $index_name, 'dtslen', $dts_len);
-
$dts_index .= $self->ixin_open_element('dtsindexentry', address@hidden);
if ($dts_information{$index_name}->{'node_id'}) {
foreach my $node_id
(sort(@{$dts_information{$index_name}->{'node_id'}})) {
@@ -672,16 +680,132 @@
$dts_index =~ s/ $//;
$dts_index .= $self->ixin_close_element('dtsindexentry');
}
- }
$dts_text .= $self->ixin_close_element('dtssets') ."\n";
+
if ($dts_index ne '') {
$dts_index = $self->ixin_open_element('dtsindex', ['dtsindexlen',
$self->_count_bytes($dts_text)])
. $dts_index . $self->ixin_close_element('dtsindex');
+ } else {
+ $dts_index = $self->ixin_none_element('dtsindex')
}
# do floats
+ my %floats_information;
+
+ # collect all float types corresponding to float commands
+ if ($self->{'floats'}) {
+ foreach my $type (keys(%{$self->{'floats'}})) {
+ $floats_information{$type} = {};
+ }
+ }
+
+ # collect listoffloats information
+ if ($self->{'extra'}->{'listoffloats'}) {
+ foreach my $command (@{$self->{'extra'}->{'listoffloats'}}) {
+ my $associated_node_id = $self->_associated_node_id($command,
+ \%node_label_number);
+ my $type = $command->{'extra'}->{'type'}->{'normalized'};
+ if ($command->{'extra'}->{'type'}->{'content'}) {
+ $floats_information{$type}->{'type'}
+ = $self->convert_tree({'contents'
+ => $command->{'extra'}->{'type'}->{'content'}});
+ }
+ push @{$floats_information{$type}->{'node_id'}}, $associated_node_id;
+ }
+ }
+
+ # now do the floats sets and the floats index
+ my $floats_text = $self->ixin_open_element('floatsset');
+ my $floats_index = '';
+ foreach my $type (sort(keys(%floats_information))) {
+ my $float_text_len = 0;
+ if ($self->{'floats'}->{$type}) {
+ my $float_nr = 0;
+ my $float_text = '';
+ foreach my $float (@{$self->{'floats'}->{$type}}) {
+ $float_nr++;
+ my $associated_node_id;
+ # associated node already found when collecting labels
+ if (exists($floats_associated_node_id{$float})) {
+ $associated_node_id = $floats_associated_node_id{$float};
+ } else {
+ $associated_node_id = $self->_associated_node_id($float,
+ \%node_label_number);
+ }
+ my @attribute = ('nodeid', $associated_node_id);
+ $float_text .= $self->ixin_open_element('floatentry', address@hidden);
+ if ($float->{'extra'}->{'normalized'}) {
+ $float_text .= $self->ixin_list_element('floatlabel',
+ ['name', $float->{'extra'}->{'normalized'}]);
+ $float_text .= ' ';
+ } else {
+ $float_text .= $self->ixin_none_element('floatlabel');
+ }
+ if ($float->{'extra'}->{'node_content'}) {
+ $float_text .= $self->ixin_open_element('floatname');
+ $float_text .= $self->convert_tree({'contents'
+ => $float->{'extra'}->{'node_content'}});
+ $float_text .= $self->ixin_close_element('floatname');
+ } else {
+ $float_text .= $self->ixin_none_element('floatname');
+ }
+ if ($float->{'extra'}->{'shortcaption'}) {
+ $float_text .=
$self->convert_tree($float->{'extra'}->{'shortcaption'});
+ } elsif ($float->{'extra'}->{'caption'}) {
+ $float_text .= $self->convert_tree($float->{'extra'}->{'caption'});
+ } else {
+ $float_text .= $self->ixin_none_element('caption');
+ }
+ $float_text .= $self->ixin_close_element('floatentry')."\n";
+ }
+ $float_text = $self->ixin_open_element('floatset', ['count', $float_nr])
+ . $float_text .$self->ixin_close_element('floatset')."\n";
+ $float_text_len = $self->_count_bytes($float_text);
+ $floats_text .= $float_text;
+
+ # determine type expandable string from first float if it was not
+ # already determined from listoffloats
+ if (!defined($floats_information{$type}->{'type'})) {
+ my $command = $self->{'floats'}->{$type}->[0];
+ if ($command->{'extra'}->{'type'}
+ and $command->{'extra'}->{'type'}->{'content'}) {
+ $floats_information{$type}->{'type'}
+ = $self->convert_tree({'contents'
+ => $command->{'extra'}->{'type'}->{'content'}});
+ }
+ }
+ }
+ my @attribute = ('type', $type, 'floatentrylen', $float_text_len);
+ $floats_index .= $self->ixin_open_element('floatindex', address@hidden);
+ if ($floats_information{$type}->{'type'}) {
+ $floats_index .= $self->ixin_open_element('floatindextype');
+ $floats_index .= $floats_information{$type}->{'type'};
+ $floats_index .= $self->ixin_close_element('floatindextype');
+ } else {
+ $floats_index .= $self->ixin_none_element('floatindextype');
+ }
+ if ($floats_information{$type}->{'node_id'}) {
+ foreach my $associated_node_id
(@{$floats_information{$type}->{'node_id'}}) {
+ $floats_index .= ' ';
+ $floats_index .= $self->ixin_list_element('floatindexnode',
+ ['nodeid', $associated_node_id]);
+ }
+ }
+ $floats_index .= $self->ixin_close_element('floatindex');
+ }
+ $floats_text .= $self->ixin_close_element('floatsset')."\n";
+
+ if ($floats_index ne '') {
+ $floats_index = $self->ixin_open_element('floatsindex', ['floatsindexlen',
+ $self->_count_bytes($floats_text)])
+
+ .$floats_index .$self->ixin_close_element('floatsindex');
+ } else {
+ $floats_index = $self->ixin_none_element('floatsindex');
+ }
+
# do blobs
my @counts_attributes = ('nodeindexlen', $self->_count_bytes($nodes_index),
@@ -692,11 +816,8 @@
my $output = $self->_output_text($result, $fh);
my $counts_text = $self->ixin_open_element('counts', address@hidden);
- if ($dts_index eq '') {
- $counts_text .= $self->ixin_none_element('dtsindex');
- } else {
$counts_text .= $dts_index;
- }
+ $counts_text .= $floats_index;
$counts_text .= $self->ixin_close_element('counts') . "\n";
$output .= $self->_output_text($counts_text, $fh);
@@ -704,6 +825,7 @@
$output .= $self->_output_text($sectioning_tree, $fh);
$output .= $self->_output_text($labels_text, $fh);
$output .= $self->_output_text($dts_text, $fh);
+ $output .= $self->_output_text($floats_text, $fh);
$output .= $self->_output_text($document_output ."\n", $fh);