# -*- Perl -*- # Classes for dbtohtml # # $Id: dbtohtml.cls 2.17 2000/02/01 18:39:05 eray Exp $ # # ############################################################################## use vars qw($PROGNAME $VERSION); if ($VERBOSE) { my($VERSION) = '$Id: dbtohtml.cls 2.17 2000/02/01 18:39:05 eray Exp $'; # ' my($REQNAME) = (split(/\s+/, $VERSION))[1]; my($vers) = (split(/\s+/, $VERSION))[2]; print STDERR "$REQNAME version $vers.\n"; } ############################################################################## { package GENERIC_TAG; $TAG_NULL = "::TAG::NULL::"; %TAGLEVEL = (); # TAG = "tag" name of this tag # CONTENT->tag pointer to first subelement # CONTENT_LAST->tag pointer to last subelement # NEXT->tag pointer to next element at this level # PREV->tag pointer to prev element at this level # PARENT->tag pointer to parent element # ATTR->{} attributes of this tag # NEXT_ELEMENT->tag pointer to next element of this type # PREV_ELEMENT->tag pointer to prev element of this type sub new { my($type, %attributes) = @_; my($class) = ref($type) || $type; my($self) = {}; my($count, $element); bless $self, $class; $self->{'PROPER_INIT'} = 1; # make sure GENERIC_TAG->new is called $self->{'TAG'} = $type; $self->{'CONTENT'} = $GENERIC_TAG::TAG_NULL; $self->{'NEXT'} = $GENERIC_TAG::TAG_NULL; $self->{'PREV'} = $GENERIC_TAG::TAG_NULL; %{$self->{'ATTR'}} = %attributes; # TAGLEVEL counts the number of each kind of tag that we've seen. # For example, TAGLEVEL{SECT1} is incremented each time a SECT1 is # seen. # if (! defined($TAGLEVEL{$self->tag()})) { $TAGLEVEL{$self->tag()} = 1; } else { $TAGLEVEL{$self->tag()}++; } # If we see a SECTn, all SECTm (n>m) have to be reset (in other words # the sequence is 1, 1.1, 1.2, 2, 2.1, 2.2 and # not 1, 1.1, 1.2, 2.2, ... # if ($self->tag() =~ /^SECT(\d)/) { $count = $1; for ($count = $count+1; $count <= 5; $count++) { delete($TAGLEVEL{"SECT$count"}); } } # The same is true of REFSECTn # if ($self->tag() =~ /^REFSECT(\d)/) { $count = $1; for ($count = $count+1; $count <= 5; $count++) { delete($TAGLEVEL{"REFSECT$count"}); } } # Everything inside a table is cleared each time a table starts # if ($self->tag('TABLE') || $self->tag('INFORMALTABLE')) { delete($TAGLEVEL{'COLSPEC'}); delete($TAGLEVEL{'SPANSPEC'}); delete($TAGLEVEL{'TGROUP'}); delete($TAGLEVEL{'THEAD'}); delete($TAGLEVEL{'TBODY'}); delete($TAGLEVEL{'ROW'}); delete($TAGLEVEL{'ENTRY'}); } # Everything is cleared when a new chapter-level element starts... # %TAGLEVEL = () if ($self->tag('PREFACE') || $self->tag('CHAPTER') || $self->tag('GLOSSARY') || $self->tag('BIBLIOGRAPHY') || $self->tag('APPENDIX')); # Copy the "interesting" fields into the TAGLEVEL structure of the # current element: $self->{'TAGLEVEL'} = { }; foreach $element ($self->tag(), 'SECT1', 'SECT2', 'SECT3', 'SECT4', 'SECT5', 'REFSECT1', 'REFSECT2', 'REFSECT3', 'FIGURE', 'TABLE', 'EXAMPLE') { next if !defined($TAGLEVEL{$element}); $self->{'TAGLEVEL'}->{$element} = $TAGLEVEL{$element}; } return $self; } sub markup_start { my($self) = @_; my($tag) = $self; my($ref) = $main::WHENTREE{$tag->{'TAG'}}; while (ref $ref) { $tag = $tag->{'PARENT'}; if (defined($ref->{$tag->{'TAG'}})) { $ref = $ref->{$tag->{'TAG'}} } else { $ref = $ref->{"*tag"}; } } if (!defined($ref)) { &main::WARNING("Can\'t form markup_start for $self->{TAG}\n"); } return $ref; } sub markup_end { my($self) = @_; my($tag) = $self; my($ref) = $main::WHENTREE{"/" . $tag->{'TAG'}}; while (ref $ref) { $tag = $tag->{'PARENT'}; if (defined($ref->{"/" . $tag->{'TAG'}})) { $ref = $ref->{"/" . $tag->{'TAG'}} } else { $ref = $ref->{"*tag"}; } } if (!defined($ref)) { $ref = $self->markup_start(); if ($ref =~ /^\<([^<>]+)\>\s*$/) { $ref = "$1>"; } elsif ($ref eq "") { # ok... } else { &main::WARNING("Can\'t form markup_end for $self->{TAG}\n"); } } return $ref; } sub save_id { my($self) = @_; my($chap, $sect, $refsect, $count, $title, $basename, $sourcefile); my($s, $child, $id, $tag); $id = $self->{'ATTR'}->{'ID'}; $tag = $self->{'TAG'}; return if $id eq "" || $id =~ /^TMPTMP\.\d+$/; $chap = $main::PI_CHAPTER_NUMBER || "0"; $sect = $self->{'TAGLEVEL'}->{'SECT1'}; foreach $s ('SECT2', 'SECT3', 'SECT4', 'SECT5') { $sect .= "." . $self->{'TAGLEVEL'}->{$s} if defined($self->{'TAGLEVEL'}->{$s}); } $refsect = $self->{'TAGLEVEL'}->{'REFSECT1'}; foreach $s ('REFSECT2', 'REFSECT3', 'REFSECT4', 'REFSECT5') { $refsect .= "." . $self->{'TAGLEVEL'}->{$s} if defined($self->{'TAGLEVEL'}->{$s}); } $count = $self->{'TAGLEVEL'}->{$tag}; $title = ""; $child = $self->content(); if ($child && $child->{'TAG'} eq "TITLE") { $title = $child->markup(); } if ($self->tag('REFENTRY') && $child) { # title is either in REFMETA or REFNAMEDIV... my($subchild) = $child->content(); if ($subchild && (($child->tag('REFMETA') && $subchild->tag('REFENTRYTITLE')) || (($child->tag('REFNAMEDIV') && $subchild->tag('REFNAME'))))) { $title = $subchild->markup(); } } if ($self->tag('GLOSSENTRY') && $child) { $title = $child->markup(); } $title =~ s/<.lb>/ /g; $title =~ s/\n/ /g; # In order to be able to determine if an ID has expired, we # need to know what file it came from; so remember that... $sourcefile = $main::PI_SOURCE_FILE || $main::SOURCE_FILE; $sourcefile = $1 if $sourcefile =~ /.*\/([^\/]+)$/; $main::TAGID->{$id} = { } if !defined($main::TAGID->{$id}); $main::TAGID->{$id}->{'*TOUCHED'} = 1; $basename = $main::PI_BASENAME; if (!defined($basename)) { $basename = $main::PI_SOURCE_FILE || $main::SOURCE_FILE; $basename = $1 if $basename =~ /.*\/([^\/]+)$/; $basename = $1 if $basename =~ /^(.*)\.[^\.]+$/; } $self->{'CHP-NUM'} = $chap; $self->{'SECT-NUM'} = $sect; $self->{'RSECT-NUM'} = $refsect; $self->{'ITEM-NUM'} = $count; $self->{'TITLE'} = $title; $self->{'BASENAME'} = $basename; $main::TAGID->{$id} = { } if !defined($main::TAGID->{$id}); if ($tag ne 'INDEXTERM') { $main::TAGID_CHANGE = ($main::TAGID_CHANGE || $main::TAGID->{$id}->{'TAG'} ne $tag || $main::TAGID->{$id}->{'SOURCEFILE'} ne $sourcefile || $main::TAGID->{$id}->{'CHP-NUM'} ne $chap || $main::TAGID->{$id}->{'SECT-NUM'} ne $sect || $main::TAGID->{$id}->{'RSECT-NUM'} ne $refsect || $main::TAGID->{$id}->{'ITEM-NUM'} ne $count || $main::TAGID->{$id}->{'TITLE'} ne $title || $main::TAGID->{$id}->{'BASENAME'} ne $basename); } $main::TAGID->{$id}->{'TAG'} = $tag; $main::TAGID->{$id}->{'SOURCEFILE'} = $sourcefile; $main::TAGID->{$id}->{'CHP-NUM'} = $chap; $main::TAGID->{$id}->{'SECT-NUM'} = $sect; $main::TAGID->{$id}->{'RSECT-NUM'} = $refsect; $main::TAGID->{$id}->{'ITEM-NUM'} = $count; $main::TAGID->{$id}->{'TITLE'} = $title; $main::TAGID->{$id}->{'BASENAME'} = $basename; $main::TAGID->{$id}->{'CHUNK'} = $SECT1::SECT_COUNT if $SECT1::SECT_COUNT; } sub attr { my($self, $attr, $value) = @_; my($self_value); $self_value = uc($self->{'ATTR'}->{$attr}); if (defined($value)) { return $value eq $self_value; } else { return $self->{'ATTR'}->{$attr}; } } sub null { my($self, $ptr) = @_; return (!$ptr || $ptr eq $GENERIC_TAG::TAG_NULL); } sub tag { my($self, $tag) = @_; if (defined($tag)) { $tag =~ tr/a-z/A-Z/; return ($self->{'TAG'} eq $tag); } else { return $self->{'TAG'}; } } sub role { my($self, $role) = @_; return $self->attr('ROLE', $role); } sub id { my($self, $id) = @_; return $self->attr('ID', $id); } sub parent { my($self) = @_; return $self->{'PARENT'}; } sub next { my($self) = @_; while (($self->{'NEXT'} eq $TAG_NULL) && $main::parser->next_element()) { #nop; } $self->{'NEXT'} eq $TAG_NULL ? undef : $self->{'NEXT'}; } sub prev { my($self) = @_; $self->{'PREV'}; } sub content { my($self) = @_; while (($self->{'CONTENT'} eq $TAG_NULL) && $main::parser->next_element()) { #nop; } $self->{'CONTENT'} eq $TAG_NULL ? undef : $self->{'CONTENT'}; } sub next_element { my($self) = @_; while (($self->{'NEXT_ELEMENT'} eq $TAG_NULL) && $main::parser->next_element()) { #nop; } $self->{'NEXT_ELEMENT'} eq $TAG_NULL ? undef : $self->{'NEXT_ELEMENT'}; } sub prev_element { my($self) = @_; $self->{'PREV_ELEMENT'}; } sub add_child { my($self, $ref) = @_; my($prevelem); $ref->{'PARENT'} = $self; $ref->{'NEXT'} = 0; if ($self->{'CONTENT'} ne $TAG_NULL) { $ref->{'PREV'} = $self->{'CONTENT_LAST'}; $self->{'CONTENT_LAST'}->{'NEXT'} = $ref; $self->{'CONTENT_LAST'} = $ref; } else { $self->{'CONTENT'} = $ref; $self->{'CONTENT_LAST'} = $ref; $ref->{'PREV'} = 0; } $LAST_ELEM->{'NEXT_ELEMENT'} = $ref if $LAST_ELEM; $ref->{'PREV_ELEMENT'} = $LAST_ELEM; $LAST_ELEM = $ref; } sub unlink_child { my($self, $child) = @_; if ($child->{'PREV'}) { $child->{'PREV'}->{'NEXT'} = $child->{'NEXT'}; } else { $child->{'PARENT'}->{'CONTENT'} = $child->{'NEXT'}; } if ($child->{'NEXT'}) { $child->{'NEXT'}->{'PREV'} = $child->{'PREV'}; } else { $child->{'PARENT'}->{'CONTENT_LAST'} = $child->{'PREV'}; } $child->{'NEXT'} = ""; $child->{'PREV'} = ""; $child; } sub block_markup { # Extract "block markup" from the markup of a tag. In other # words if presented with the contents of # #
\nContents:
\n");
$self->markup_children($markup, $child);
$markup->output($self->markup_end());
# The basename only applies to this chapter...
undef $main::PI_BASENAME;
# What if there is no PI_CHAPTER_NUMBER? Then make sure we
# "fake it" for subsequent chapters that we encounter.
$chapnum++;
$main::PI_CHAPTER_NUMBER = $chapnum;
my($chapnum) = $main::PI_CHAPTER_NUMBER || "1";
$inmarkup ? $markup : $markup->formatted_markup();
}
sub prevnext {
my($self, $markup, $attop) = @_;
my($inmarkup) = defined($markup);
my($html) = "";
my($sfile) = $main::FILTERCFG;
my($telem, $title, $href, $chpnum, $id, $prev, $next, $up);
my($uptext, $prevtext, $nexttext);
local($_);
$uptext = &main::cfg($main::bookfiles, $sfile, 'html_uptext');
$prevtext = &main::cfg($main::bookfiles, $sfile, 'html_prevtext');
$nexttext = &main::cfg($main::bookfiles, $sfile, 'html_nexttext');
$markup = new MARKUP_OBJECT if !$inmarkup;
$markup->output("
"); if (!$attop) { $markup->output("\n
\n"); } if ($main::OUTPUT) { $up = &main::cfg($main::bookfiles, $main::PI_SOURCE_FILE, 'html_root'); $markup->output("$uptext\n") if $up ne ""; $prev = $self->prev_html_file(); $markup->output("$prevtext\n") if $prev ne ""; $next = $self->next_html_file(); $markup->output("$nexttext\n") if $next ne ""; } $markup->output("
"); if ($attop) { $markup->output("\n
\n");
}
$inmarkup ? $markup : $markup->formatted_markup();
}
sub toc {
my($self, $markup, $toc_header) = @_;
my($inmarkup) = defined($markup);
my($elem) = $self->content();
my($telem, $title, @tidcount, $href, $chpnum, $id, $chunk);
my($first);
local($_);
@tidcount = (0, 0, 0, 0, 0, 0);
$markup = new MARKUP_OBJECT if !$inmarkup;
if (!$self->{'BUILT_MENU'}) {
$first = 1;
while ($elem && $elem ne $GENERAL_TAG::TAG_NULL) {
if ($elem->tag() =~ 'SECT(\d)') {
my($level) = $1;
my($clevel);
for ($clevel = $level+1; $clevel <= 5; $clevel++) {
$tidcount[$clevel] = 0;
}
$id = $elem->id();
if (!$id) {
$tidcount[$level]++;
$id = sprintf("%s-DMYID.%d.%d.%d.%d.%d",
$self->basename(),
$tidcount[1],
$tidcount[2],
$tidcount[3],
$tidcount[4],
$tidcount[5]);
$id = $1 while $id =~ /^(.*)\.0$/;
$id = uc($id);
$elem->{'ATTR'}->{'ID'} = $id;
}
$telem = $elem->content();
$title = $telem->markup();
$title =~ s/<\001lb>//g;
$chunk = $main::TAGID->{$id}->{'CHUNK'};
if ($first) {
$markup->output($toc_header);
$markup->output($title);
$markup->output("
\n");
$first = 0;
$toc_header = "";
} else {
if ($elem->tag('SECT1')) {
if ($chunk) {
$href = sprintf("%s-%02d%s",
$self->basename(),
$chunk,
$main::HTML_EXT);
$markup->output("$title");
$markup->output("
\n");
} else {
$href = sprintf("#%s", $id);
$markup->output("$title");
$markup->output("
\n");
}
}
}
}
$elem = $elem->next_element();
last if (!$self->null($elem)
&& ($elem->tag('PREFACE')
|| $elem->tag('CHAPTER')
|| $elem->tag('APPENDIX')));
}
$markup->output("\n");
$self->{'BUILT_MENU'} = 1;
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GENERIC_INLINE;
@ISA = ('GENERIC_TAG');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GENERIC_NOP;
@ISA = ('GENERIC_INLINE');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$inmarkup ? $markup : undef;
}
}
{
package GENERIC_WRAPPER;
@ISA = ('GENERIC_TAG');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GENERIC_OBEYSPACES;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($parent, $next);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->{'OBEY_SPACES'}++;
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
$markup->{'OBEY_SPACES'}--;
# In HTML, a PRE cannot occur inside a paragraph, so we need to
# "restart" the paragraph after the pre
$parent = $self->parent();
# This is kind of funky; self->next_element is always the same
# as self->content if the element has content. Since we want
# the next element not in our content, we have to walk past
# it.
$next = $self->content();
while ($next && $next->next()) {
$next = $next->next();
}
$next = $next->next_element();
if ($parent->tag('PARA') && $next && $next->tag('PCDATA')) {
$markup->output("
");
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GENERIC_ASARG;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($text, $textmarkup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$textmarkup = new MARKUP_OBJECT;
$self->markup_children($textmarkup, $self->content());
$text = $textmarkup->formatted_markup();
$text =~ s/\n/ /g;
$markup->output($self->markup_start() . "$text");
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GENERIC_TITLED;
@ISA = ('GENERIC_TAG');
sub markup_title {
my($self, $markup) = @_;
my($child) = $self->content();
if ($child && ($child->tag('TITLE'))) {
my($block) = $child->block_markup($child);
my($title) = $child->markup();
# Handle in title
$title =~ s/<\001lb>/ /g;
if ($main::PI_NUMBERED_SECTIONS) {
if ($self->tag() =~ /^SECT\d/) {
$title = $self->{'CHP-NUM'} . "." .
$self->{'SECT-NUM'} . ". $title";
} elsif ($self->tag() =~ /^REFSECT\d/) {
$title = $self->{'CHP-NUM'} . "." .
$self->{'RSECT-NUM'} . ". $title";
} else {
#nop;
}
}
if ($self->tag('TABLE') || $self->tag('FIGURE')) {
my($objname);
$objname = "Table ";
$objname = "Figure " if $self->tag('FIGURE');
$objname .= $self->{'CHP-NUM'} . "-" . $self->{'ITEM-NUM'};
$title = "$objname: $title";
}
if ($self->attr('ID')) {
$title = "id() . "\">"
. $title . "";
}
if ($self->markup_end() =~ /^<\/h\d>$/) {
# ");
}
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package PARA;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($prev) = $self->prev();
my($parent) = $self->parent();
my($gparent) = "";
$gparent = $parent->parent() if defined ($parent);
$prev = $prev->tag() if $prev;
$parent = $parent->tag() if $parent;
$gparent = $gparent->tag() if $gparent;
$prev = "" if !$prev;
$parent = "" if !$parent;
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
# print STDERR "PARA: $gparent, $parent, $prev\n";
# Don't output after \n");
}
$self->markup_title($markup);
$child = $child->next() if $child->tag('TITLE');
$self->markup_children($markup, $child);
# Output the page footer...
$markup->output("\n \n");
$markup->output("\n \n");
if ($next) {
$markup->output("$nexttext ");
$markup->output("$nexttitle \n");
$markup->output("\n \n");
$markup->output("$hometxt \n");
$markup->output("$orahometxt");
$markup->output("\n\n");
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package BOOK;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($bktitle) = &main::cfg($main::bookfiles,
$main::FILTERCFG,
"book_title")
|| "No title supplied in $main::BOOKFILES";
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output("\n ");
}
}
while ($child->tag('TERM') || $child->tag('GLOSSTERM')) {
$block = $child->block_markup();
if ($last) {
$last->{'NEXT'} = $block;
$block->{'PREV'} = $last;
} else {
$blocklist = $block;
$last = $blocklist;
}
$last = $last->next() while $last && $last->next();
if ($child->tag('GLOSSTERM')) {
my($tdata) = $child->markup();
my($title) = $tdata;
my($key);
$title =~ s/<.*?>//g;
$key = $title;
$key =~ s/\s+/-/g;
$key = "G-$key";
$key =~ tr/a-z/A-Z/;
$child->{'ATTR'}->{'ID'} = $key; # for later...
$main::TAGID->{$key} = { } if !defined($main::TAGID->{$id});
$main::TAGID->{$key}->{'TAG'} = 'GLOSSTERM';
$main::TAGID->{$key}->{'TITLE'} = $title;
$terms .= "$tdata ";
} else {
$terms .= $child->markup() . " ";
}
$child = $child->next();
}
chop($terms); # get rid of the trailing blank
# Dumb browser bug, need another to make it look good.
if ($self && $self->prev() && ($self->prev())->tag('VARLISTENTRY')) {
$markup->output(" ");
}
$markup->output($self->markup_start());
$markup->output($terms) if $terms;
$markup->output($self->markup_end());
for ($block = $blocklist; $block; $block = $blocklist->next()) {
$block->markup($markup);
}
$self->markup_children($markup,$child);
if ($self->tag('GLOSSENTRY')) {
my($next) = $self->next();
if (!$next || !$next->tag('GLOSSENTRY')) {
$markup->output(" \n \n \n \nFootnotes:\n \n \n");
$FOOTNOTE::footnote_count = $FOOTNOTE::footnote_count_old;
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package TABLE;
@ISA = ('GENERIC_TITLED');
sub markup {
my($self, $markup) = @_;
my($child) = $self->content();
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$FOOTNOTE::footnote_count_old = $FOOTNOTE::footnote_count;
$FOOTNOTE::footnote_count = 0;
$self->{"FIRST_GROUP"} = 1;
$self->{"TABLE_STARTED"} = 0;
$self->{'SAVE_ABOVE_SPACE'} = $main::TABLE_ABOVE_RULE_SPACE;
$self->{'SAVE_BELOW_SPACE'} = $main::TABLE_BELOW_RULE_SPACE;
$self->{'SAVE_FRAME_RULE'} = $main::TABLE_FRAME_RULE;
&ColSpec::init();
&SpanSpec::init();
$main::ERR_TABLE_COUNT++;
$main::ERR_TABLE_TYPE = "TABLE";
$markup->output(" \n \nFootnotes:\n \n \n");
$FOOTNOTE::footnote_count = $FOOTNOTE::footnote_count_old;
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package TGROUP;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($parent) = $self->parent();
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$pgwide = $parent->attr('PGWIDE');
$frame = $parent->attr('FRAME');
$colsep = $self->attr('COLSEP');
$rowsep = $self->attr('ROWSEP');
$colsep = $parent->attr('COLSEP') if $colsep eq "";
$rowsep = $parent->attr('ROWSEP') if $rowsep eq "";
$ColSpec::DEFAULT_ALIGN = $self->attr('ALIGN');
$ColSpec::COLUMN = 1;
$ColSpec::DEFAULT_COLSEP = $colsep;
$ColSpec::DEFAULT_ROWSEP = $rowsep;
$ColSpec::DEFAULT_ROLE = $self->attr('ROLE');
$SpanSpec::DEFAULT_ALIGN = $self->attr('ALIGN');
$SpanSpec::DEFAULT_COLSEP = $colsep;
$SpanSpec::DEFAULT_ROWSEP = $rowsep;
$SpanSpec::DEFAULT_ROLE = $self->attr('ROLE');
$tgroup_count++;
$row_count = 0;
if ($parent->{"FIRST_GROUP"} == 1) {
if ($frame eq "ALL") {
if ($main::TABLE_FRAME_RULE eq $main::TABLE_DOUBLE_HORIZ_RULE){
$options = &add_option($options, "doublebox");
} else {
$options = &add_option($options, "box");
}
}
$options = &add_option($options, "expand") if $pgwide == 1;
$self->{"TABLE_OPTIONS"} = $options;
$parent->{"FIRST_GROUP"} = 0;
}
$needs_a_topframe = 0;
$needs_a_topframe = 1
if ($frame eq "TOP") || ($frame eq "TOPBOT");
$self->markup_children($markup, $self->content());
$inmarkup ? $markup : $markup->formatted_markup();
}
sub add_option {
my($options, $opt) = @_;
$options .= ", " if $options ne "";
$options .= $opt;
return $options;
}
}
{
package COLSPEC;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($column);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$column = $self->attr('COLNUM') || $ColSpec::COLUMN;
$ColSpec::COLUMN = $column+1;
$ColSpec::ALIGN{$column} = ($self->attr('ALIGN')
|| $ColSpec::DEFAULT_ALIGN);
if ($self->attr('COLNAME')) {
$ColSpec::NAME{$column} = $self->attr('COLNAME');
$ColSpec::COL{$self->attr('COLNAME')} = $column;
}
$ColSpec::COLSEP{$column} = $self->attr('COLSEP');
$ColSpec::ROWSEP{$column} = $self->attr('ROWSEP');
$ColSpec::CHAR{$column} = ($self->attr('CHAR'))
if $self->attr('CHAR');
$ColSpec::CHAROFF{$column} = ($self->attr('CHAROFF'))
if $self->attr('CHAROFF');
$ColSpec::COLWIDTH{$column} = ($self->attr('COLWIDTH'))
if $self->attr('COLWIDTH');
$ColSpec::ROLE{$column} = ($self->attr('ROLE'))
if $self->attr('ROLE');
$inmarkup ? $markup : undef;
}
}
{
package SPANSPEC;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($name);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$name = $self->attr('SPANNAME');
$SpanSpec::ALIGN{$name} = ($self->attr('ALIGN')
|| $SpanSpec::DEFAULT_ALIGN);
$SpanSpec::CHAR{$name} = ($self->attr('CHAR'))
if $self->attr('CHAR');
$SpanSpec::CHAROFF{$name} = ($self->attr('CHAROFF'))
if $self->attr('CHAROFF');
$SpanSpec::COLSEP{$name} = $self->attr('COLSEP');
$SpanSpec::ROWSEP{$name} = $self->attr('ROWSEP');
$SpanSpec::NAMEST{$name} = $self->attr('NAMEST');
$SpanSpec::NAMEEND{$name} = $self->attr('NAMEEND');
$SpanSpec::ROLE{$name} = $self->attr('ROLE');
$inmarkup ? $markup : undef;
}
}
{
package THEAD;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
@ROW::RowSpans = (0,0,0,0,0,0,0,0,0,0);
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
}
}
{
package TBODY;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
@ROW::RowSpans = (0,0,0,0,0,0,0,0,0,0);
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
}
}
{
package ROW;
@ISA = ('GENERIC_TAG');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($tgroup) = $self;
my($width) = 0;
while ($tgroup && !$tgroup->tag('TGROUP')) {
$tgroup = $tgroup->parent();
}
$width = $tgroup->attr('COLS') if $tgroup;
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
for ($ROW::CurCol = 0; $ROW::CurCol < 10; $ROW::CurCol++) {
if ($ROW::RowSpans[$ROW::CurCol] > 0) {
$ROW::RowSpans[$ROW::CurCol]--;
}
}
$ROW::CurCol = 1;
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
while ($ROW::CurCol <= $width) {
$markup->output(" [\n\s]*$/i) {
$markup->output(" ");
} else {
$markup->output($emarkup);
}
$markup->output("$name>\n");
if ($cspan) {
$ROW::CurCol += $cspan;
} else {
$ROW::CurCol++;
}
}
}
######################################################################
# Footnotes
######################################################################
{
package FOOTNOTEREF;
@ISA = ("GENERIC_INLINE");
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
&main::WARNING("Can\'t handle footnoteref.\n");
$inmarkup ? $markup : undef;
}
}
{
package FOOTNOTE;
@ISA = ("GENERIC_TAG");
$footnote_count = 0;
@footnotes = ();
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($f) = new MARKUP_OBJECT;
local($_);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$footnote_count++;
$markup->output("[$footnote_count]");
$self->markup_children($f, $self->content());
$_ = $f->formatted_markup();
if (/^\s* /i) {
$_ = " \[$footnote_count\] $'";
} else {
$_ = "[$footnote_count] $_";
}
push (@footnotes, $_);
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package LITERALLAYOUT;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($llcontentm, $llcontent);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->{'OBEY_SPACES'}++;
$markup->output($self->markup_start());
$llcontentm = new MARKUP_OBJECT;
$self->markup_children($llcontentm, $self->content());
$llcontent = $llcontentm->formatted_markup();
$llcontent =~ s/\n/ \n");
$self->markup_title($markup);
$child = $child->next() if $child->{'TAG'} eq 'TITLE';
$self->markup_children($markup, $child);
# Output the page footer...
$markup->output("\n \n");
$markup->output("\n \n");
if ($next) {
$markup->output("$nexttext ");
$markup->output("$nexttitle \n");
$markup->output("\n \n");
for ($count = 0; $count <= $#footerhrefs; $count++) {
my($hr, $txt) = ($footerhrefs[$count], $footertxts[$count]);
$markup->output("$txt \n");
}
$markup->output("\n\n");
$inmarkup ? $markup : $markup->formatted_markup();
}
sub prev_html_file {
return &GENERIC_TAG::prev_html_file(@_);
}
sub next_html_file {
return &GENERIC_TAG::next_html_file(@_);
}
}
{
package REFSYNOPSISDIV;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output($self->markup_start());
$markup->output("Synopsis");
$markup->output($self->markup_end());
$self->markup_children($markup, $self->content());
$inmarkup ? $markup : $markup->formatted_markup();
}
}
1;
) goes around the
# whole element
$markup->output($self->markup_start() . $title);
}
$block->markup($markup) if $block;
} else {
$markup->output($self->markup_start());
}
$markup;
}
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($child) = $self->content();
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$self->markup_title($markup);
$child = $child->next() if $child->tag('TITLE');
$self->markup_children($markup, $child);
$markup->output($self->markup_end())
if $self->markup_end() !~ /^<\/h\d>$/;
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GENERIC_INDEX_TERM;
@ISA = ('GENERIC_INLINE');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GENERIC_LIST;
@ISA = ('GENERIC_TAG');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($prev) = $self->prev() || $self->parent();
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
if ($prev && $prev->tag() !~ /^TITLE/) {
$markup->output("
");
while (@FOOTNOTE::footnotes) {
$_ = shift @FOOTNOTE::footnotes;
$markup->output($_);
}
$markup->output("
");
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package SECT1;
@ISA = ('GENERIC_TITLED');
$SECT_COUNT = 0;
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($child) = $self->content();
my($node) = $self->parent();
my($newfile) = 1;
my($sfile) = $main::FILTERCFG;
my($uptext, $prevtext, $nexttext);
my($up, $next, $prev, $title, $title_obj);
my($prevtitle, $nexttitle, $uptitle);
$markup = new MARKUP_OBJECT if !$inmarkup;
$uptext = &main::cfg($main::bookfiles, $sfile, 'html_uptext');
$prevtext = &main::cfg($main::bookfiles, $sfile, 'html_prevtext');
$nexttext = &main::cfg($main::bookfiles, $sfile, 'html_nexttext');
$home = &main::cfg($main::bookfiles, $sfile, 'html_home');
$orahome = &main::cfg($main::bookfiles, $sfile, 'html_orahome');
$hometxt = &main::cfg($main::bookfiles, $sfile, 'html_hometxt');
$orahometxt = &main::cfg($main::bookfiles, $sfile, 'html_orahometxt');
$SECT_COUNT++;
$self->{'CHUNK'} = $SECT_COUNT;
$newfile = 0 if $SECT_COUNT == 1;
$self->default_markup($markup);
($prev, $prevtitle) = $self->prev_html_file();
($next, $nexttitle) = $self->next_html_file();
if ($newfile) {
my($newname) = $self->newname(sprintf("-%02d", $SECT_COUNT));
$markup->change_output_files($newname);
}
($prev, $prevtitle) = $self->prev_html_file();
($next, $nexttitle) = $self->next_html_file();
# print STDERR "Sect1: prev=$prev, next=$next\n";
$up = &main::cfg($main::bookfiles,
$main::PI_SOURCE_FILE,
'html_root');
$uptitle = &main::cfg($main::bookfiles,
$main::PI_SOURCE_FILE,
'book_title');
$title_obj = $self->content();
if ($title_obj->tag('TITLE')) {
$title = "[Chapter " . $self->{'CHP-NUM'} . "] ";
$title .= $title_obj->markup();
# Handle in title
$title =~ s/<\001lb>/ /g;
} else {
$title = "SECT1: UNKNOWN TITLE\n";
}
if ($newfile) {
$markup->output("\n\n");
$markup->output("
\n
\n
\n");
$markup->output("\n
\n");
}
if ($prev) {
$markup->output("$prevtext ");
$markup->output("$prevtitle
\n");
}
if ($up ne "") {
$markup->output("$uptext ");
$markup->output("$uptitle
\n");
}
$markup->output("\n
\n");
$markup->output("\n";
$html .= "id() . "\">"
if $self->id();
if ($child && ($child->tag('TITLE'))) {
$title = $child->markup();
# Handle in title
$title =~ s/<\001lb>/ /g;
$html .= $self->{'CHP-NUM'} . ". "
if $main::PI_NUMBERED_SECTIONS;
$html .= $title;
$html .= "" if $self->id();
$html .= "
";
$child = $child->next();
} else {
$title = "";
$html = "";
&main::WARNING("No title on Chapter $chapnum");
}
$main::HTML_TITLE = $title;
$markup->output("");
$markup->output("");
$markup->output("\n");
# Build the TOC (to figure out IDs on sections), but
# discard the markup...
$self->toc();
$self->markup_children($markup, $child);
$self->prevnext($markup, 0);
$markup->output("
\n");
$markup->output($self->markup_end());
$markup->output("\n\n\n");
# The basename only applies to this chapter...
undef $main::PI_BASENAME;
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package PCDATA;
@ISA = ('GENERIC_INLINE');
sub markup_start {
my($self) = @_;
return "";
}
sub markup_end {
my($self) = @_;
return "";
}
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
local($_) = $self->{'DATA'};
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output_text($_);
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package SDATA;
@ISA = ('GENERIC_INLINE');
sub markup_start {
my($self) = @_;
return "";
}
sub markup_end {
my($self) = @_;
return "";
}
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($t);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$t = $self->{'SDATA'};
if ($t =~ /^\[\s*(\S+)\s*\]$/) {
$t = $1;
if (defined($main::ENTITIES{"&$t"})) {
if ($markup->{'OBEY_SPACES'}
&& ($t eq "ldquo" || $t eq "rdquo")) {
$t = "\"";
} else {
$t = $main::ENTITIES{"&$t"};
}
} else {
&main::WARNING("$0: Unrecognized entity: $t\n");
$t = "??ENTITY-$t";
}
} else {
# Just an ordinary textual replacement
}
$markup->output($t);
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package PI;
@ISA = ('GENERIC_INLINE');
sub markup_start {
my($self) = @_;
return "";
}
sub markup_end {
my($self) = @_;
return "";
}
sub parse_pi {
my($self) = @_;
my($pi, $rest);
local($_) = $self->{'PI'};
# Avoid regular expressions in case there are RE characters
# in the PI
while ($_ ne ""
&& (substr($_, 0, 1) eq " "
|| substr($_, 0, 1) eq "\t")) {
$_ = substr($_, 1);
}
$pi = "";
while ($_ ne ""
&& (substr($_, 0, 1) ne " "
&& substr($_, 0, 1) ne "\t")) {
$pi .= substr($_, 0, 1);
$_ = substr($_, 1);
}
while ($_ ne ""
&& (substr($_, 0, 1) eq " "
|| substr($_, 0, 1) eq "\t")) {
$_ = substr($_, 1);
}
$rest = $_;
$pi =~ s/-/_/g;
($pi, $rest);
}
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($pi, $rest, $sub);
local($_);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
($pi, $rest) = $self->parse_pi();
if (!$BAD_PI{$pi}) {
eval "\*stab = \*{\"main::\"}";
if ($stab{"PI_$pi"} ne "*main::PI_$pi") {
&main::WARNING("Unsupported processing instruction \"$pi\" ignored.\n");
$BAD_PI{$pi} = 1;
} else {
$sub = "main::PI_${pi}";
$subptr = \&$sub;
$_ = &$subptr($self, $markup, $rest);
}
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package SIMPLELIST;
@ISA = ('GENERIC_TAG');
sub new {
my($type) = shift @_;
my($self) = GENERIC_TAG->new(@_);
$self->{'COLSEP'} = "\t";
bless $self, $type;
return $self;
}
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($child) = $self->content();
my($child_markup) = "";
my(@STACK) = ();
my($type, $elements, $cols, $rows, $thiscol, $count, $table);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
while ($child) {
if ($child->tag('MEMBER')) {
$child_markup = $child->markup();
push(@STACK, $child_markup);
}
$child = $child->next();
}
$table = "";
while (@STACK) {
$_ = shift(@STACK);
if (@STACK) {
$table .= ", " if $table;
$table .= "$_";
} else {
$table .= ", and $_";
}
}
$markup->output($table);
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package XREF;
@ISA = ('GENERIC_INLINE');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($linkend) = $self->attr('LINKEND');
my($endterm) = $self->attr('ATTR');
my($pattern, $linkto);
my($xreftag, $xrefchap, $xrefsect, $xrefrsct, $xrefitem, $xreftxt);
my($xrefnum, $xrefwarning);
my($sep, $sep_config, $href);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$linkto = $linkend;
$linkto = $endterm if $endterm ne "";
if (defined($main::TAGID->{$linkto})) {
$main::TAGCOUNT{$linkto}++;
$xreftag = $main::TAGID->{$linkto}->{'TAG'};
$xrefchap = $main::TAGID->{$linkto}->{'CHP-NUM'};
$xrefsect = $main::TAGID->{$linkto}->{'SECT-NUM'};
$xrefrsct = $main::TAGID->{$linkto}->{'RSECT-NUM'};
$xrefitem = $main::TAGID->{$linkto}->{'ITEM-NUM'};
$xreftxt = $main::TAGID->{$linkto}->{'TITLE'};
$pattern = &main::cfg($main::bookfiles,
$main::FILTERCFG,
"xref_$xreftag");
if ($main::TAGCOUNT{"$linkto"} > 1) {
my($spattern) = &main::cfg($main::bookfiles,
$main::FILTERCFG,
"xrefs_$xreftag");
$pattern = $spattern if $spattern ne "";
}
&main::WARNING("Warning: no pattern for $xreftag ($linkto)\n")
if !$pattern;
($sep_config = "${xreftag}_xref_num_sep") =~ tr/A-Z/a-z/;
$sep = &main::cfg($main::bookfiles,
$main::FILTERCFG,
$sep_config)
|| &main::cfg($main::bookfiles,
$main::FILTERCFG,
'xref_num_sep');
$xrefnum = $xrefchap;
$xrefwarning = 0;
if (($xreftag eq "TABLE")
|| ($xreftag eq "FIGURE")
|| ($xreftag eq "EXAMPLE")) {
$xrefnum .= ".$xrefitem";
} elsif ($xreftag =~ /^SECT[1-5]$/) {
$xrefnum .= ".$xrefsect";
} elsif ($xreftag =~ /^REFSECT[1-5]$/) {
$xrefnum .= ".$xrefrsct";
} elsif (($xreftag ne "CHAPTER")
&& ($xreftag ne "APPENDIX")
&& ($xreftag ne "PREFACE")) {
$xrefwarning = 1;
}
$xrefnum =~ s/\./$sep/g if ($sep && ($sep ne '.'));
&main::WARNING("Numeric cross reference to $xreftag contains only the chapter number.\n")
if $xrefwarning && ($pattern =~ /\%n/);
$pattern =~ s/\%n/$xrefnum/g;
$pattern =~ s/\%t/$xreftxt/g;
} else {
&main::WARNING("Warning: xref ID \"$linkto\" is unknown.\n");
$pattern = "";
}
$pattern = "**UNKNOWN XREF**" if $pattern eq "";
if ($main::TAGID->{$linkto}) {
$basename = $main::TAGID->{$linkto}->{'BASENAME'};
$chunk = $main::TAGID->{$linkto}->{'CHUNK'};
$inaspec = $main::TAGID->{$linkto}->{'IN_A_SPEC'};
$tag = $main::TAGID->{$linkto}->{'TAG'};
$chunk = 1 if (!$chunk &&
($main::TAGID->{$linkto}->{'TAG'} eq 'CHAPTER'
|| $main::TAGID->{$linkto}->{'TAG'} eq 'APPENDIX'
|| $main::TAGID->{$linkto}->{'TAG'} eq 'PREFACE'));
if ($chunk) {
$href = sprintf("%s-%02d%s", $basename, $chunk,
$main::HTML_EXT);
} else {
$href = sprintf("%s%s", $basename, $main::HTML_EXT);
}
$href .= "#$linkto" if ($tag ne 'CHAPTER'
&& $tag ne 'APPENDIX'
&& $tag ne 'PREFACE'
&& $tag ne 'GLOSSARY'
&& $tag ne 'REFENTRY');
} else {
&main::WARNING("Warning: link ID \"$linkto\" is unknown.\n");
}
$markup->output("$pattern");
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package VARLISTENTRY;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($child) = $self->content();
my($terms) = "";
my($blocklist, $last, $block) = (0, 0, 0);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
if ($self->tag('GLOSSENTRY')) {
my($parent) = $self->parent();
if ($parent && !$parent->{'IN_DL'}) {
$markup->output("");
$parent->{'IN_DL'} = 1;
} else {
$markup->output ("
");
$parent->{'IN_DL'} = 0;
}
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package LISTITEM;
@ISA = ('GENERIC_INLINE');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
if (!$self->parent()->tag('VARLISTENTRY')) {
$markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
$markup->output($self->markup_end());
} else {
$self->markup_children($markup, $self->content());
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package SYSTEMITEM;
@ISA = ('GENERIC_INLINE');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($content);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$content = $self->markup_children(undef, $self->content());
if ($content =~ /[a-z]:\/\/[^\/]/) {
$content =~ s/\s+//g;
$content = "$content";
}
$markup->output($content);
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package GRAPHIC;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($format, $fileref) = ($self->attr('FORMAT'),
$self->attr('FILEREF'));
my($imageok, $gif);
my($parent, $figure_number, $alt_text);
my($eref) = $self->attr('ENTITYREF');
if ($eref && defined($sgmlsESIS::ExternalEntity{$eref})) {
$fileref = $sgmlsESIS::ExternalEntity{$eref};
print STDERR "Entity $eref=>$fileref\n" if $VERBOSE;
}
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$figure_number = "from the text";
$parent = $self->parent();
if ($parent && $parent->tag('FIGURE') && $parent->id()) {
my($id, $chap, $item);
$id = $parent->id();
$chap = $main::TAGID->{$id}->{'CHP-NUM'};
$item = $main::TAGID->{$id}->{'ITEM-NUM'};
$figure_number = "$chap-$item";
}
# If the format is unspecified, try to figure it out...
if ($format =~ /^\s*$/) {
$format = "gif" if $fileref =~ /\.gif$/;
$format = "jpg" if $fileref =~ /\.jpg$/;
$format = "eps" if $fileref =~ /\.eps\.?g?z?/i;
# PS is an EPS?
$format = "eps" if $fileref =~ /\.ps\.?g?z?/i;
# GIF if nothing else?
$format = "gif" if $format =~ /^\s*$/;
}
# For print books, the most common format (at ORA) is EPS.
# If this looks like an EPS figure, see if there's a gif
# instead/also.
$gif = $fileref;
if ($format =~ /eps/i || $fileref =~ /\.eps/) {
$gif = $1 if $gif =~ /.*\/([^\/]+)$/;
$gif =~ s/\.gz$//;
$gif =~ s/\.Z$//;
$gif =~ s/\.eps$//;
$gif =~ s/\.ps$//;
}
# Massage the gif file to make it 8.3 if possible
{
my($path) = "";
if ($gif =~ /^(.*\/)([^\/]+)$/) {
$path = $1;
$gif = $2;
}
$gif = "g$1" if $gif =~ /^gff\.(.*)$/;
$gif =~ s/\.//g;
$gif = "$path$gif";
}
$gif .= ".gif";
$gif = "figs.gif/$gif" if -f "figs.gif/$gif";
$gif = "gifs/$gif" if -f "gifs/$gif";
$gif = "figs/$gif" if -f "figs/$gif";
if (-f $gif) {
$format = 'gif';
$fileref = $gif;
} else {
&main::WARNING("Cannot find $gif; leaving EPS\n");
}
if ($format =~ /^tbl$/i) {
&main::WARNING("$0: Can\'t handle TBL graphics!\n");
$markup->output("[TBL GRAPHIC: $fileref]");
} elsif ($format =~ /^eqn$/i) {
&main::WARNING("$0: Can\'t handle EQN graphics!\n");
$markup->output("[EQN GRAPHIC: $fileref]");
} elsif ($format =~ /^eps$/i || $format =~ /^postscript$/i) {
&main::WARNING("$0: Can\'t handle PostScript graphics!\n");
$markup->output("[EPS GRAPHIC: $fileref]");
} elsif ($format !~ /^gif$/i) {
&main::WARNING("$0: unrecognized format $format in tag.\n");
} else { # ASSUME ITS GIF!
my (@figdirs, @figfiles, $figdir, $figfile, $found);
@figdirs = (".", "./figs", "./figs.gif", "./gifs");
@figfiles = ("$fileref", "$fileref.gif");
$found = "";
foreach $figdir (@figdirs) {
foreach $figfile (@figfiles) {
$found = "$figdir/$figfile"
if -f "$figdir/$figfile" && -r "$figdir/$figfile";
last if $found;
}
last if $found;
}
$fileref = $found if $found;
if (! -f $fileref) {
&main::WARNING("$0: Cannot find image $fileref from
tag!\n");
return;
} else {
$fileref =~ s/^.*\/([^\/]+)$/$1/;
$fileref = "figs/$fileref";
}
$alt_text = "[Graphic: Figure $figure_number]";
$markup->output("\n
");
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package ULINK;
@ISA = ('GENERIC_TAG');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($type) = $self->attr('TYPE');
my($url) = $self->attr('URL');
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
&main::WARNING("Warning: unknown ULINK type: $type\n")
if ($type && $type !~ /^cprog$/i);
open (F, $url)
|| &main::WARNING("Warning: cannot open URL in ULINK: $url\n");
while (
\n");
} else {
$markup->output("
\n");
}
# ---
$self->markup_children($markup, $child);
# ---
$main::TABLE_ABOVE_RULE_SPACE = $self->{'SAVE_ABOVE_SPACE'};
$main::TABLE_BELOW_RULE_SPACE = $self->{'SAVE_BELOW_SPACE'};
$main::TABLE_FRAME_RULE = $self->{'SAVE_FRAME_RULE'};
if (@FOOTNOTE::table_footnotes) {
die ("TGROUP expected and not found")
unless ($self->content->tag('TGROUP'));
$markup->output("
\n\n ");
}
$markup->output("\n ");
while (@FOOTNOTE::table_footnotes) {
$_ = shift @FOOTNOTE::table_footnotes;
$markup->output($_);
}
$markup->output("
");
$self->markup_title($markup);
$child = $child->next() if $child->tag('TITLE');
# ---
$self->markup_children($markup, $child);
# ---
$main::TABLE_ABOVE_RULE_SPACE = $self->{'SAVE_ABOVE_SPACE'};
$main::TABLE_BELOW_RULE_SPACE = $self->{'SAVE_BELOW_SPACE'};
$main::TABLE_FRAME_RULE = $self->{'SAVE_FRAME_RULE'};
if (@FOOTNOTE::table_footnotes) {
die ("TGROUP expected and not found")
unless ($self->content()->tag('TGROUP'));
$markup->output("
\n\n ");
}
$markup->output("\n ");
while (@FOOTNOTE::table_footnotes) {
$_ = shift @FOOTNOTE::table_footnotes;
$markup->output($_);
}
$markup->output("
\n");
$ROW::CurCol++;
}
$markup->output($self->markup_end());
}
}
{
package ENTRY;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($parent) = $self->parent();
my($gparent) = $parent->parent();
my($name, $attr) = ("TD", "");
my($rspan, $cspan, $align, $col);
my($emarkup);
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
while ($ROW::RowSpans[$ROW::CurCol]) {
$ROW::CurCol++;
}
if ($gparent->tag('THEAD')) {
$name = "TH";
} else {
$name = "TD";
}
$rspan = $self->attr('MOREROWS');
if ($rspan) {
$rspan++;
$attr .= " ROWSPAN=$rspan";
$ROW::RowSpans[$ROW::CurCol] = $rspan;
}
$cspan = $self->attr('SPANNAME');
if ($cspan) {
my($namest, $nameend);
my($firstcol, $lastcol);
my($count);
$namest = $SpanSpec::NAMEST{$cspan};
$nameend = $SpanSpec::NAMEEND{$cspan};
$firstcol = "";
$lastcol = "";
for ($count = 0; $count < 10; $count++) {
$firstcol = $count
if $ColSpec::NAME{$count} eq $namest;
$lastcol = $count
if $ColSpec::NAME{$count} eq $nameend;
}
$cspan = $lastcol - $firstcol + 1;
$attr .= " COLSPAN=$cspan";
}
$align = $self->attr('ALIGN'); # entry alignment
if ($align eq "") {
$align = $self->parent()->attr('ALIGN'); # row alignment
}
# Default alignment for tgroup is left, bet we want to make it
# center for c-spanning entries unless there's a more local
# override
if ($align eq "" && $cspan) {
$align="center";
}
if ($align eq "") {
$align = $ColSpec::ALIGN{$ROW::CurCol}; # column alignment
}
if ($align eq "") {
$align = "left";
}
if ($align) {
$attr .= " ALIGN=\"$align\"";
}
$markup->output("<$name$attr>");
$emarkup = $self->markup_children(undef, $self->content());
if ($emarkup =~ /^\s*$/
|| $emarkup =~ /^[\n\s]*
\n/g;
$markup->output($llcontent);
undef $llcontentm;
undef $llcontent;
$markup->output($self->markup_end());
$markup->{'OBEY_SPACES'}--;
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package xREFMETA;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($child) = $self->content();
my($title) = "";
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output($self->markup_start());
while (!$self->null($child)) {
$title = $child->markup() if $child->tag('REFENTRYTITLE');
$child = $child->next();
}
$markup->output($title) if $title;
$markup->output($self->markup_end());
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package REFNAMEDIV;
@ISA = ('GENERIC_WRAPPER');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($child) = $self->content();
my($name, $purpose) = ("", "");
$markup = new MARKUP_OBJECT if !$inmarkup;
$self->default_markup($markup);
$markup->output($self->markup_start());
while (!$self->null($child)) {
if ($child->tag('REFNAME')) {
$name = $child->markup();
} elsif ($child->tag('REFPURPOSE')) {
$purpose = $child->markup();
} elsif ($child->tag('INDEXTERM')) {
$markup->output ($child->markup());
} else {
print STDERR "Unexpected tag in refnamediv: ", $child-tag(), "\n";
}
$child = $child->next();
}
$markup->output("$name
");
$markup->output("Name
");
if ($purpose) {
$markup->output("$name---$purpose");
} else {
$markup->output($name);
}
$markup->output($self->markup_end());
$inmarkup ? $markup : $markup->formatted_markup();
}
}
{
package PHRASE;
@ISA = ('GENERIC_TAG');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
$markup = new MARKUP_OBJECT if !$inmarkup;
if ($self->role('GFFCD') || ($self->role() eq "")) {
$self->default_markup($markup);
# $markup->output($self->markup_start());
$self->markup_children($markup, $self->content());
# $markup->output($self->markup_end());
}
$inmarkup ? $markup : $markup->formatted_markup();
}
}
# ======================================================================
{
package REFENTRY;
@ISA = ('GENERIC_TITLED');
sub markup {
my($self, $markup) = @_;
my($inmarkup) = defined($markup);
my($child) = $self->content();
my($node) = $self->{'PARENT'};
my($newname) = "-";
my($sfile) = $main::FILTERCFG;
my($uptext, $prevtext, $nexttext);
my($up, $next, $prev, $title, $title_obj);
my($prevtitle, $nexttitle, $uptitle);
my($footer, @footers, @footerhrefs, @footertxts, $count);
$markup = new MARKUP_OBJECT if !$inmarkup;
$uptext = &main::cfg($main::bookfiles, $sfile, 'html_uptext');
$prevtext = &main::cfg($main::bookfiles, $sfile, 'html_prevtext');
$nexttext = &main::cfg($main::bookfiles, $sfile, 'html_nexttext');
$footer = &main::cfg($main::bookfiles,
$main::PI_SOURCE_FILE,
'page_footer')
|| &main::cfg($main::bookfiles,
$main::FILTERCFG,
'page_footer');
@footers = split(/\s+/, $footer);
foreach $footer (@footers) {
my($footh) = &main::cfg($main::bookfiles,
$main::PI_SOURCE_FILE,
$footer)
|| &main::cfg($main::bookfiles,
$main::FILTERCFG,
$footer);
my($foott) = &main::cfg($main::bookfiles,
$main::PI_SOURCE_FILE,
$footer . "txt")
|| &main::cfg($main::bookfiles,
$main::FILTERCFG,
$footer . "txt");
push (@footerhrefs, $footh);
push (@footertxts, $foott);
}
$self->default_markup($markup);
($prev, $prevtitle) = $self->prev_html_file();
($next, $nexttitle) = $self->next_html_file();
$newname = $self->newname();
$markup->change_output_files($newname);
$prev = $self->prev_html_file();
$next = $self->next_html_file();
$up = &main::cfg($main::bookfiles,
$main::PI_SOURCE_FILE,
'html_root');
$uptitle = &main::cfg($main::bookfiles,
$main::PI_SOURCE_FILE,
'html_roottitle');
$title_obj = $self->content();
$title_obj = $title_obj->content()
if $title_obj && $title_obj->tag('REFMETA');
$title_obj = $title_obj->content()
if $title_obj && $title_obj->tag('REFNAMEDIV');
if ($title_obj
&& ($title_obj->tag('REFNAME')
|| $title_obj->tag('REFENTRYTITLE'))) {
$title = "[Reference] ";
$title .= $title_obj->markup();
# Handle in title
$title =~ s/<\001lb>/ /g;
} else {
$title = "REFENTRY: UNKNOWN REFNAME\n";
}
$markup->output("\n\n");
$markup->output("
\n
\n
\n");
$markup->output("\n
\n");
}
if ($prev) {
$markup->output("$prevtext ");
$markup->output("$prevtitle
\n");
}
if ($up ne "") {
$markup->output("$uptext ");
$markup->output("$uptitle
\n");
}
$markup->output("\n
\n");
$markup->output("\n