package HeaderDoc::APIOwner;
BEGIN {
foreach (qw(Mac::Files)) {
$MOD_AVAIL{$_} = eval "use $_; 1";
}
}
use HeaderDoc::HeaderElement;
use HeaderDoc::Group;
use HeaderDoc::DBLookup;
use HeaderDoc::Utilities qw(findRelativePath safeName getAPINameAndDisc printArray printHash resolveLink sanitize dereferenceUIDObject validTag objName byLinkage byAccessControl objGroup linkageAndObjName byMethodType html_fixup_links xml_fixup_links calcDepth);
use HeaderDoc::BlockParse qw(blockParseOutside);
use File::Basename;
use Cwd;
use Carp qw(cluck);
use strict;
use vars qw(@ISA);
$HeaderDoc::APIOwner::VERSION = '$Revision: 1340150018 $';
my $addToDebug = 0;
@ISA = qw(HeaderDoc::HeaderElement);
my $isMacOS;
my $pathSeparator;
if ($^O =~ /MacOS/io) {
$pathSeparator = ":";
$isMacOS = 1;
} else {
$pathSeparator = "/";
$isMacOS = 0;
}
my $debugging = 0;
my $theTime = time();
my ($sec, $min, $hour, $dom, $moy, $year, @rest);
($sec, $min, $hour, $dom, $moy, $year, @rest) = localtime($theTime);
$year += 1900;
my $dateStamp = HeaderDoc::HeaderElement::strdate($moy, $dom, $year, "UTF-8");
{
my $_copyrightOwner;
my $_defaultFrameName;
my $_compositePageName;
my $_htmlHeader;
my $_htmlFooter;
my $_apiUIDPrefix;
sub copyrightOwner {
my $class = shift;
if (@_) {
$_copyrightOwner = shift;
}
return $_copyrightOwner;
}
sub defaultFrameName {
my $class = shift;
if (@_) {
$_defaultFrameName = shift;
}
return $_defaultFrameName;
}
sub compositePageName {
my $class = shift;
if (@_) {
$_compositePageName = shift;
}
if ($HeaderDoc::use_iframes) {
return $class->defaultFrameName(); }
return $_compositePageName;
}
sub htmlHeader {
my $self = shift;
if (@_) {
$_htmlHeader = shift;
$_htmlHeader =~ s/{\@docroot}/\@\@docroot/sg;
}
if ($self eq "HeaderDoc::APIOwner") { return $_htmlHeader; }
if ($self->outputformat eq "hdxml") {
return xml_fixup_links($self, $_htmlHeader);
} else {
return html_fixup_links($self, $_htmlHeader);
}
}
sub htmlFooter {
my $self = shift;
if (@_) {
$_htmlFooter = shift;
$_htmlFooter =~ s/{\@docroot}/\@\@docroot/sg;
}
if ($self eq "HeaderDoc::APIOwner") { return $_htmlFooter; }
if ($self->outputformat eq "hdxml") {
return xml_fixup_links($self, $_htmlFooter);
} else {
return html_fixup_links($self, $_htmlFooter);
}
}
sub apiUIDPrefix {
my $class = shift;
if (@_) {
$_apiUIDPrefix = shift;
}
return $_apiUIDPrefix;
}
}
sub headerObject {
my $class = shift;
if (@_) {
$class->{HEADEROBJECT} = shift;
}
return $class->{HEADEROBJECT};
}
sub fix_date($)
{
my $encoding = shift;
$dateStamp = HeaderDoc::HeaderElement::strdate($moy, $dom, $year, $encoding);
return $dateStamp;
}
sub _initialize {
my($self) = shift;
$self->SUPER::_initialize();
$self->{CONSTANTS} = ();
$self->{FUNCTIONS} = ();
$self->{METHODS} = ();
$self->{TYPEDEFS} = ();
$self->{STRUCTS} = ();
$self->{VARS} = ();
$self->{PDEFINES} = ();
$self->{ENUMS} = ();
$self->{TOCTITLEPREFIX} = 'GENERIC_OWNER:';
$self->{NAMESPACE} = "";
$self->{UPDATED} = "";
$self->{EXPLICITSUPER} = 0;
$self->{CLASSES} = ();
$self->{ISFRAMEWORK} = 0;
$self->{ISMERGED} = 0;
$self->{CCLASS} = 0;
$self->{HEADEROBJECT} = 0;
$self->{CLASS} = "HeaderDoc::APIOwner";
my %groups = ();
$self->{GROUPS} = \%groups;
}
sub clone {
my $self = shift;
my $clone = undef;
if (@_) {
$clone = shift;
} else {
$clone = HeaderDoc::APIOwner->new("LANG" => $self->{LANG}, "SUBLANG" => $self->{SUBLANG});
}
$self->SUPER::clone($clone);
$clone->{OUTPUTDIR} = $self->{OUTPUTDIR};
$clone->{CONSTANTS} = ();
if ($self->{CONSTANTS}) {
my @params = @{$self->{CONSTANTS}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{CONSTANTS}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{FUNCTIONS} = ();
if ($self->{FUNCTIONS}) {
my @params = @{$self->{FUNCTIONS}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{FUNCTIONS}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{METHODS} = ();
if ($self->{METHODS}) {
my @params = @{$self->{METHODS}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{METHODS}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{TYPEDEFS} = ();
if ($self->{TYPEDEFS}) {
my @params = @{$self->{TYPEDEFS}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{TYPEDEFS}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{STRUCTS} = ();
if ($self->{STRUCTS}) {
my @params = @{$self->{STRUCTS}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{STRUCTS}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{VARS} = ();
if ($self->{VARS}) {
my @params = @{$self->{VARS}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{VARS}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{PDEFINES} = ();
if ($self->{PDEFINES}) {
my @params = @{$self->{PDEFINES}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{PDEFINES}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{ENUMS} = ();
if ($self->{ENUMS}) {
my @params = @{$self->{ENUMS}};
foreach my $param (@params) {
my $cloneparam = $param->clone();
push(@{$clone->{ENUMS}}, $cloneparam);
$cloneparam->apiOwner($clone);
}
}
$clone->{CONSTANTSDIR} = $self->{CONSTANTSDIR};
$clone->{DATATYPESDIR} = $self->{DATATYPESDIR};
$clone->{STRUCTSDIR} = $self->{STRUCTSDIR};
$clone->{VARSDIR} = $self->{VARSDIR};
$clone->{PROPSDIR} = $self->{PROPSDIR};
$clone->{FUNCTIONSDIR} = $self->{FUNCTIONSDIR};
$clone->{METHODSDIR} = $self->{METHODSDIR};
$clone->{PDEFINESDIR} = $self->{PDEFINESDIR};
$clone->{ENUMSDIR} = $self->{ENUMSDIR};
$clone->{EXPORTSDIR} = $self->{EXPORTSDIR};
$clone->{EXPORTINGFORDB} = $self->{EXPORTINGFORDB};
$clone->{TOCTITLEPREFIX} = $self->{TOCTITLEPREFIX};
$clone->{HEADEROBJECT} = $self->{HEADEROBJECT};
$clone->{NAMESPACE} = $self->{NAMESPACE};
$clone->{UPDATED} = $self->{UPDATED};
$clone->{EXPLICITSUPER} = $self->{EXPLICITSUPER};
$clone->{CLASSES} = $self->{CLASSES};
$clone->{ISFRAMEWORK} = $self->{ISFRAMEWORK};
$clone->{ISMERGED} = $self->{ISMERGED};
$clone->{CCLASS} = $self->{CCLASS};
$clone->{ENCODING} = $self->{ENCODING};
$clone->{HEADEROBJECT} = $self->{HEADEROBJECT} = 0;
return $clone;
}
sub CClass
{
my $self = shift;
if (@_) {
$self->{CCLASS} = shift;
}
return $self->{CCLASS};
}
sub classType
{
my $self = shift;
my $type = $self->{CLASS};
if ($type =~ /CPPClass/) {
if ($self->CClass()) { return "C"; }
return $self->sublang();
} elsif ($type =~ /ObjCProtocol/) {
return "intf";
} elsif ($type =~ /ObjCCategory/) {
return "occCat";
} elsif ($type =~ /ObjCClass/) {
return "occ";
} else {
warn "Couldn't determine my own class type....\n";
}
}
sub isCOMInterface
{
return 0;
}
sub isAPIOwner
{
return 1;
}
sub explicitSuper
{
my $self = shift;
if (@_) {
my $value = shift;
$self->{EXPLICITSUPER} = $value;
}
return $self->{EXPLICITSUPER};
}
sub isMerged
{
my $self = shift;
if (@_) {
my $value = shift;
$self->{ISMERGED} = $value;
}
return $self->{ISMERGED};
}
sub isFramework
{
my $self = shift;
if (@_) {
my $value = shift;
$self->{ISFRAMEWORK} = $value;
}
return $self->{ISFRAMEWORK};
}
sub isModule
{
my $self = shift;
if (@_) {
my $value = shift;
$self->{ISMODULE} = $value;
$self->noRegisterUID($value);
}
return $self->{ISMODULE};
}
sub classes
{
my $self = shift;
if (@_) {
@{ $self->{CLASSES} } = @_;
}
($self->{CLASSES}) ? return @{ $self->{CLASSES} } : return ();
}
sub findClass {
my $self = shift;
my $name = shift;
foreach my $class (@{ $self->{CLASSES} }) {
if ($class->name() eq $name) {
return $class;
}
}
return undef;
}
sub protocolsDir {
my $self = shift;
if (@_) {
$self->{PROTOCOLSDIR} = shift;
}
return $self->{PROTOCOLSDIR};
}
sub protocols {
my $self = shift;
if (@_) {
@{ $self->{PROTOCOLS} } = @_;
}
($self->{PROTOCOLS}) ? return @{ $self->{PROTOCOLS} } : return ();
}
sub addToProtocols {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO PROTOCOLS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{PROTOCOLS} }, $item);
}
}
return @{ $self->{PROTOCOLS} };
}
sub categoriesDir {
my $self = shift;
if (@_) {
$self->{CATEGORIESDIR} = shift;
}
return $self->{CATEGORIESDIR};
}
sub categories {
my $self = shift;
if (@_) {
@{ $self->{CATEGORIES} } = @_;
}
($self->{CATEGORIES}) ? return @{ $self->{CATEGORIES} } : return ();
}
sub addToCategories {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO CATEGORIES\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{CATEGORIES} }, $item);
}
}
return @{ $self->{CATEGORIES} };
}
sub removeFromCategories {
my $self = shift;
my $objToRemove = shift;
my $nameOfObjToRemove = $objToRemove->name();
my @tempArray;
my @categories = $self->categories();
my $localDebug = 0;
if (!@categories) {return;};
foreach my $obj (@categories) {
if (ref($obj) eq "HeaderDoc::ObjCCategory") {
my $fullName = $obj->name();
if ($fullName ne $nameOfObjToRemove) {
push (@tempArray, $obj);
} else {
print STDERR "Removing $fullName from Header object.\n" if ($localDebug);
}
}
}
@{ $self->{CATEGORIES} } = @tempArray;
}
sub addToClasses {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO CLASSES\n"; }
$self->currentClass($item);
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{CLASSES} }, $item);
}
}
return @{ $self->{CLASSES} };
}
sub currentClass {
my $self = shift;
if (@_) {
@{ $self->{CURRENTCLASS} } = @_;
}
return @{ $self->{CURRENTCLASS} };
}
sub outputDir {
my $self = shift;
if (@_) {
my $rootOutputDir = shift;
if (!$self->use_stdout() && !$HeaderDoc::running_test) {
if (-e $rootOutputDir) {
if (! -d $rootOutputDir) {
die "Error: $rootOutputDir is not a directory. Exiting.\n\t$!\n";
} elsif (! -w $rootOutputDir) {
die "Error: Output directory $rootOutputDir is not writable (in APIOwner). Exiting.\n$!\n";
}
} else {
unless (mkdir ("$rootOutputDir", 0777)) {
die ("Error: Can't create output folder $rootOutputDir.\n$!\n");
}
}
}
$self->{OUTPUTDIR} = $rootOutputDir;
$self->constantsDir("$rootOutputDir$pathSeparator"."Constants");
$self->datatypesDir("$rootOutputDir$pathSeparator"."DataTypes");
$self->structsDir("$rootOutputDir$pathSeparator"."Structs");
$self->functionsDir("$rootOutputDir$pathSeparator"."Functions");
$self->methodsDir("$rootOutputDir$pathSeparator"."Methods");
$self->varsDir("$rootOutputDir$pathSeparator"."Vars");
$self->propsDir("$rootOutputDir$pathSeparator"."Properties");
$self->pDefinesDir("$rootOutputDir$pathSeparator"."PDefines");
$self->enumsDir("$rootOutputDir$pathSeparator"."Enums");
$self->classesDir("$rootOutputDir$pathSeparator"."Classes");
$self->classesDir("$rootOutputDir$pathSeparator"."Classes");
$self->protocolsDir("$rootOutputDir$pathSeparator"."Protocols");
$self->categoriesDir("$rootOutputDir$pathSeparator"."Categories");
}
return $self->{OUTPUTDIR};
}
sub tocTitlePrefix {
my $self = shift;
if (@_) {
$self->{TOCTITLEPREFIX} = shift;
}
return $self->{TOCTITLEPREFIX};
}
sub constantsDir {
my $self = shift;
if (@_) {
$self->{CONSTANTSDIR} = shift;
}
return $self->{CONSTANTSDIR};
}
sub datatypesDir {
my $self = shift;
if (@_) {
$self->{DATATYPESDIR} = shift;
}
return $self->{DATATYPESDIR};
}
sub structsDir {
my $self = shift;
if (@_) {
$self->{STRUCTSDIR} = shift;
}
return $self->{STRUCTSDIR};
}
sub varsDir {
my $self = shift;
if (@_) {
$self->{VARSDIR} = shift;
}
return $self->{VARSDIR};
}
sub propsDir {
my $self = shift;
if (@_) {
$self->{PROPSDIR} = shift;
}
return $self->{PROPSDIR};
}
sub pDefinesDir {
my $self = shift;
if (@_) {
$self->{PDEFINESDIR} = shift;
}
return $self->{PDEFINESDIR};
}
sub classesDir {
my $self = shift;
if (@_) {
$self->{CLASSESDIR} = shift;
}
return $self->{CLASSESDIR};
}
sub enumsDir {
my $self = shift;
if (@_) {
$self->{ENUMSDIR} = shift;
}
return $self->{ENUMSDIR};
}
sub functionsDir {
my $self = shift;
if (@_) {
$self->{FUNCTIONSDIR} = shift;
}
return $self->{FUNCTIONSDIR};
}
sub methodsDir {
my $self = shift;
if (@_) {
$self->{METHODSDIR} = shift;
}
return $self->{METHODSDIR};
}
sub arrayToJSON
{
my $optional_bits = shift;
my @bits = @{$optional_bits};
my $retstring = "";
foreach my $bit (@bits) {
my $class = ref($bit) || $bit;
if ($class =~ /HASH/) {
$retstring .= "{\n".keysToJSON($bit)."},\n";
} else {
$retstring .= "\"$bit\",\n";
}
}
$retstring =~ s/,\n$//s;
return $retstring;
}
sub keysToJSON
{
my $optional_bits = shift;
my %bits = %{$optional_bits};
my $retstring = "";
foreach my $key (keys %bits) {
my $val = $bits{$key};
my $class = ref($val) || $val;
if ($val eq "false") {
$retstring .= "\"$key\":false,\n";
} elsif ($val eq "true") {
$retstring .= "\"$key\":true,\n";
} elsif ($class =~ /ARRAY/) {
$retstring .= "\"$key\": [\n".arrayToJSON($val)."\n],\n";
} elsif ($class =~ /HASH/) {
$retstring .= "\"$key\": {\n".keysToJSON($val)."\n},\n";
} else {
$retstring .= "\"$key\":\"$val\",\n";
}
}
$retstring =~ s/,\n$//s;
return $retstring;
}
sub tocJSON
{
my $href = shift;
my $title = shift;
my $mode = shift;
my $pos = shift;
my $optional_bits = shift;
$title =~ s/[\n\r]+/ /sg;
my $retstring = "";
my $debugMode = 1;
if ($title eq "") { $title = "[Uncategorized]"; }
my $aref = $href;
if ($aref =~ / $aref =~ s/^.* } else {
$aref = "";
}
if ($mode == 2 || $mode == 3) {
my $comma = ",";
if ($mode == 3) { $comma = ""; }
$retstring .= "]\n";
$retstring .= ",\"closedAt\":\"$pos\"\n" if ($debugMode);
$retstring .= "}$comma\n";
}
if ($mode == 0 || $mode == 1) {
$retstring .= "{\n";
$retstring .= "\"insertedAt\":\"$pos\",\n" if ($debugMode);
$retstring .= "\"href\":\"$href\",\n";
$retstring .= "\"aref\":\"$aref\",\n";
$retstring .= "\"title\":\"".striptitle($title)."\",\n";
if ($optional_bits) {
$retstring .= keysToJSON($optional_bits).",\n";
}
$retstring .= "\"sections\": [\n";
}
if ($mode == 0) {
$retstring .= tocJSON($href, $title, 2, $pos, undef);
}
return $retstring;
}
sub tocStringSubForClasses
{
my $self = shift;
my $head = shift;
my $groupref = shift;
my $objref = shift;
my $compositePageName = shift;
my $baseref = shift;
my $composite = shift;
my $ignore_access = shift;
my $tag = shift;
my $newTOC = shift;
if (!($self->langSupportsAccess())) {
$ignore_access = 1;
}
my $localDebug = 0;
my $class = ref($self) || $self;
my @groups = @{$groupref};
my @objs = @{$objref};
my $tocString = "";
my $jumpLabel = "";
if ($tag && $tag ne "") {
$jumpLabel = "#HeaderDoc_$tag";
}
my $firstgroup = 1;
my $preface = " ";
my $entrypreface = " ";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @objs;
} else {
@tempobjs = @objs;
}
foreach my $obj (@tempobjs) {
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
my $name = $obj->name();
my $urlname = $obj->apiuid(); my $safename = &safeName(filename => $name);
my $class_baseref = $baseref;
$class_baseref =~ s/{}/\Q$safename\E/g;
if ($self->outputformat eq "hdxml") {
$tocString .= "XMLFIX<nobr>$entrypreface<a href=\"$class_baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC == 3) {
$tocString .= tocJSON("$class_baseref#$urlname", $name, 0, "tocStringSubForClasses", undef);
} elsif ($newTOC) {
$tocString .= tocSubEntry("$class_baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<nobr>$entrypreface<a href=\"$class_baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocString .= "<nobr>$entrypreface<a href=\"$class_baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
} else {
}
}
return tocWrapSubEntries("<!-- from class -->".$tocString);
}
sub tocStringSub {
my $self = shift;
my $head = shift;
my $groupref = shift;
my $objref = shift;
my $compositePageName = shift;
my $baseref = shift;
my $composite = shift;
my $ignore_access = shift;
my $tag = shift;
my $newTOC = shift;
if (!($self->langSupportsAccess())) {
$ignore_access = 1;
}
my $localDebug = 0;
my $class = ref($self) || $self;
my @groups = @{$groupref};
my @objs = @{$objref};
my $tocString = "";
my $jumpLabel = "";
if ($tag && $tag ne "") {
$jumpLabel = "#HeaderDoc_$tag";
}
my $tempurl = "";
if ($composite) {
$tempurl = "$compositePageName$jumpLabel";
} else {
$tempurl = "$baseref$jumpLabel";
}
if ($newTOC) {
$tocString .= $self->tocHeading($tempurl, $head, "doc");
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<h4><a href=\"$tempurl\" target=\"_top\">$head</a></h4>\n";
} else {
$tocString .= "<h4><a href=\"$tempurl\" target=\"doc\">$head</a></h4>\n";
}
my $firstgroup = 1;
foreach my $group (@groups) {
my $firstaccess = 1;
my $done_one = 0;
print STDERR "Sorting group $group\n" if ($localDebug);
my @groupobjs = ();
my @tempobjs = ();
my @cdobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @objs;
} else {
@tempobjs = @objs;
}
foreach my $obj (@tempobjs) {
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
if ($obj->group() eq $group) {
$done_one = 1;
if (!!$self->unsorted() || !$obj->constructor_or_destructor()) {
push(@groupobjs, $obj);
} else {
push(@cdobjs, $obj);
}
}
}
if (!$done_one) {
next;
}
my $preface = " ";
my $entrypreface = " ";
if (!length($group) && ($newTOC != 3)) {
} else {
if ($newTOC) {
$tocString .= tocGroup($group, $firstgroup);
} else {
$tocString .= "$preface<font size=\"-1\"><i>$group:</i></font><br>";
}
}
my @Cs;
my @publics;
my @protecteds;
my @privates;
if (!$self->unsorted()) {
@tempobjs = sort byAccessControl @groupobjs;
} else {
@tempobjs = @groupobjs;
}
foreach my $obj (@tempobjs) {
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
my $access = $obj->accessControl();
$firstgroup = 0;
if ($access =~ /public/o || $ignore_access){
push (@publics, $obj);
} elsif ($access =~ /protected/o){
push (@protecteds, $obj);
} elsif ($access =~ /private/o){
push (@privates, $obj);
} elsif ($access eq "") {
push (@Cs, $obj);
} else {
push (@publics, $obj);
}
}
if (@cdobjs) {
$tocString .= "\n";
my $tocStringLocal = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @cdobjs;
} else {
@tempobjs = @cdobjs;
}
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $urlname = $obj->apiuid(); if ($self->outputformat eq "hdxml") {
$tocStringLocal .= "XMLFIX<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocStringLocal .= tocSubEntry("$baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
} else {
}
}
$tocString .= tocWrapSubEntries("<!-- cdobj -->".$tocStringLocal);
}
if (@Cs) {
$tocString .= "\n";
my $tocStringLocal = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @Cs;
} else {
@tempobjs = @Cs;
}
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $urlname = $obj->apiuid(); if ($self->outputformat eq "hdxml") {
$tocStringLocal .= "XMLFIX<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocStringLocal .= tocSubEntry("$baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
} else {
}
}
$tocString .= tocWrapSubEntries("<!-- C -->".$tocStringLocal);
}
if (@publics) {
if ($class eq "HeaderDoc::Header" || $ignore_access) {
if ($newTOC != 3) { $tocString .= "\n"; }
} elsif ($self->outputformat eq "hdxml") {
$tocString .= "XMLFIX<h5>Public</h5>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocString .= $self->tocAccess("Public", $firstaccess);
} else {
$tocString .= "<h5 class='hd_tocAccess'>Public</h5>\n";
}
} else {
}
$firstaccess = 0;
my $tocStringLocal = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @publics;
} else {
@tempobjs = @publics;
}
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $urlname = $obj->apiuid(); if ($self->outputformat eq "hdxml") {
$tocStringLocal .= "XMLFIX<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocStringLocal .= tocSubEntry("$baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
} else {
}
}
$tocString .= tocWrapSubEntries("<!-- public -->".$tocStringLocal);
if ($newTOC) {
if (!($class eq "HeaderDoc::Header" || $ignore_access)) {
$tocString .= $self->tocAccessEnd();
}
}
}
if (@protecteds) {
my $tocStringLocal = "";
if ($class eq "HeaderDoc::Header" || $ignore_access) {
$tocString .= "\n";
} elsif ($self->outputformat eq "hdxml") {
$tocString .= "XMLFIX<h5>Protected</h5>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocString .= $self->tocAccess("Protected", $firstaccess);
} else {
$tocString .= "<h5 class='hd_tocAccess'>Protected</h5>\n";
}
} else {
}
$firstaccess = 0;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @protecteds;
} else {
@tempobjs = @protecteds;
}
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $urlname = $obj->apiuid(); if ($self->outputformat eq "hdxml") {
$tocStringLocal .= "XMLFIX<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocStringLocal .= tocSubEntry("$baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
} else {
}
}
$tocString .= tocWrapSubEntries("<!-- protected -->".$tocStringLocal);
if ($newTOC) {
$tocString .= $self->tocAccessEnd();
}
}
if (@privates) {
if ($class eq "HeaderDoc::Header" || $ignore_access) {
$tocString .= "\n";
} elsif ($self->outputformat eq "hdxml") {
$tocString .= "XMLFIX<h5>Private</h5>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocString .= $self->tocAccess("Protected", $firstaccess);
} else {
$tocString .= "<h5 class='hd_tocAccess'>Private</h5>\n";
}
} else {
}
$firstaccess = 0;
my $tocStringLocal = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @privates;
} else {
@tempobjs = @privates;
}
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $urlname = $obj->apiuid(); if ($self->outputformat eq "hdxml") {
$tocStringLocal .= "XMLFIX<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocStringLocal .= tocSubEntry("$baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocStringLocal .= "<nobr>$entrypreface<a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
} else {
}
}
$tocString .= tocWrapSubEntries("<!-- private -->".$tocStringLocal);
if ($newTOC) {
$tocString .= $self->tocAccessEnd();
}
}
$tocString .= $self->tocGroupEnd();
}
if ($newTOC) {
$tocString .= $self->tocHeadingEnd();
}
return $tocString;
}
sub inarray
{
my $name = shift;
my $arrayref = shift;
my @array = @{$arrayref};
foreach my $arrname (@array) {
if ($name eq $arrname) { return 1; }
}
return 0;
}
sub tocString {
my $self = shift;
my $newTOC = shift;
if ($self->outputformat() eq "functions") { return ""; }
my $contentFrameName = $self->filename();
my @classes = $self->classes();
my @protocols = $self->protocols();
my @categories = $self->categories();
my $class = ref($self) || $self;
$contentFrameName =~ s/(.*)\.h/$1/o;
$contentFrameName = &safeName(filename => $contentFrameName);
$contentFrameName = $contentFrameName . ".html";
my $composite = $HeaderDoc::ClassAsComposite;
my $compositePageName = HeaderDoc::APIOwner->compositePageName();
my $defaultFrameName = HeaderDoc::APIOwner->defaultFrameName();
my @funcs = $self->functions();
my @methods = $self->methods();
my @constants = $self->constants();
my @typedefs = $self->typedefs();
my @structs = $self->structs();
my @enums = $self->enums();
my @ALLpDefines = $self->pDefines();
my @vars = $self->vars();
my $tocString = "";
my @properties = $self->props();
my $baseref = $contentFrameName;
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= "<!-- headerDoc TOC style: $newTOC -->\n";
if ($newTOC) {
$tocString .= $self->tocEntry("$baseref#top", $HeaderDoc::introductionName);
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<h4><br><nobr><a href=\"$baseref#top\" target=\"_top\">".$HeaderDoc::introductionName."</a></nobr></h4>\n";
} else {
$tocString .= "<h4><br><nobr><a href=\"$baseref#top\" target=\"doc\">".$HeaderDoc::introductionName."</a></nobr></h4>\n";
}
my @groups = ("");
my $localDebug = 0;
my @pDefines = ();
foreach my $define (@ALLpDefines) {
if ($define->isInternal() && !$HeaderDoc::document_internal) { next; }
if (!$define->parseOnly()) {
push(@pDefines, $define);
}
}
my @objs = ( @funcs, @methods, @constants, @typedefs, @structs, @enums,
@pDefines, @vars, @properties );
if (!$self->unsorted()) { @objs = sort objGroup @objs; }
foreach my $obj (@objs) {
$obj->apirefSetup();
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
my $group = $obj->group();
if (!inarray($group, \@groups)) {
push (@groups, $group);
if ($localDebug) {
print STDERR "Added $group\n";
print STDERR "List is:";
foreach my $printgroup (@groups) {
print STDERR " $printgroup";
}
print STDERR "\n";
}
}
}
if (@funcs) {
my $funchead = "Functions";
if ($class ne "HeaderDoc::Header") {
$funchead = "Member Functions";
}
my $baseref = "Functions/Functions.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($funchead, \@groups, \@funcs,
$compositePageName, $baseref, $composite, 0, "functions", $newTOC);
}
if (@methods) {
my $baseref = "Methods/Methods.html";
if ($composite) {
$baseref = $compositePageName;
}
if ($newTOC) {
$tocString .= $self->tocHeading("$baseref#HeaderDoc_methods", "Methods", "doc");
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_methods\" target=\"_top\">Methods</a></h4>\n";
} else {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_methods\" target=\"doc\">Methods</a></h4>\n";
}
my $firstgroup = 1;
foreach my $group (@groups) {
my $done_one = 0;
my $firstaccess = 1;
print STDERR "Sorting group $group\n" if ($localDebug);
my @groupmeths = ();
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @methods;
} else {
@tempobjs = @methods;
}
foreach my $obj (@tempobjs) {
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
if ($obj->group() eq $group) {
$done_one = 1;
push(@groupmeths, $obj);
}
}
if (!$done_one) {
next;
}
if ($newTOC == 3 || (!($group eq ""))) {
if ($newTOC) {
$tocString .= tocGroup($group, $firstgroup);
} else {
$tocString .= "<dl><dt> <font size=\"-1\"><i>$group:</i><br></font></dt><dd>";
}
}
my @classMethods;
my @instanceMethods;
foreach my $obj (sort byMethodType @groupmeths) {
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
my $type = $obj->isInstanceMethod();
$firstgroup = 0;
if ($type =~ /NO/o){
push (@classMethods, $obj);
} elsif ($type =~ /YES/o){
push (@instanceMethods, $obj);
} else {
push (@instanceMethods, $obj);
}
}
if (@classMethods) {
if ($class eq "HeaderDoc::Header") {
$tocString .= "\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocString .= $self->tocAccess("Class Methods", $firstaccess);
} else {
$tocString .= "<h5 class='hd_tocAccess'>Class Methods</h5>\n";
}
} else {
}
$firstaccess = 0;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @classMethods;
} else {
@tempobjs = @classMethods;
}
my $tocStringLocal = "";
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $urlname = $obj->apiuid();
if (length($name) > 30) {
$name =~ s/:/:\‍/g;
}
if ($newTOC) {
$tocStringLocal .= tocSubEntry("$baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocStringLocal .= "<nobr> <font size=\"-1\">+</font><a href=\"$baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocStringLocal .= "<nobr> <font size=\"-1\">+</font><a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
}
if ($newTOC) {
$tocString .= $self->tocAccessEnd();
}
$tocString .= tocWrapSubEntries("<!-- class method -->".$tocStringLocal);
}
if (@instanceMethods) {
if ($class eq "HeaderDoc::Header") {
$tocString .= "\n";
} elsif ($self->outputformat eq "html") {
if ($newTOC) {
$tocString .= $self->tocAccess("Instance Methods", $firstaccess);
} else {
$tocString .= "<h5 class='hd_tocAccess'>Instance Methods</h5>\n";
}
} else {
}
$firstaccess = 0;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @instanceMethods;
} else {
@tempobjs = @instanceMethods;
}
my $tocStringLocal = "";
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $urlname = $obj->apiuid();
if (length($name) > 30) {
$name =~ s/:/:\‍/g;
}
$baseref = "Methods/Methods.html";
if ($composite) {
$baseref = $compositePageName;
}
if ($newTOC) {
$tocStringLocal .= tocSubEntry("$baseref#$urlname", "doc", $name);
} elsif ($HeaderDoc::use_iframes) {
$tocStringLocal .= "<nobr> <font size=\"-1\">-</font><a href=\"$baseref#$urlname\" target=\"_top\">$name</a></nobr><br>\n";
} else {
$tocStringLocal .= "<nobr> <font size=\"-1\">-</font><a href=\"$baseref#$urlname\" target=\"doc\">$name</a></nobr><br>\n";
}
}
$tocString .= tocWrapSubEntries("<!-- instance method -->".$tocStringLocal);
if ($newTOC) {
$tocString .= $self->tocAccessEnd();
}
}
if (!($group eq "")) {
if ($newTOC) {
} else {
$tocString .= "</dd></dl><p>\n";
}
}
}
$tocString .= $self->tocGroupEnd();
if ($newTOC) {
$tocString .= $self->tocHeadingEnd();
}
}
if (@typedefs) {
my $head = "Defined Types\n";
my $baseref = "DataTypes/DataTypes.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($head, \@groups, \@typedefs,
$compositePageName, $baseref, $composite, 1, "datatypes", $newTOC);
}
if (@structs) {
my $head = "Structs and Unions\n";
my $baseref = "Structs/Structs.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($head, \@groups, \@structs,
$compositePageName, $baseref, $composite, 1, "structs", $newTOC);
}
if (@constants) {
my $head = "Constants\n";
my $baseref = "Constants/Constants.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($head, \@groups, \@constants,
$compositePageName, $baseref, $composite, 1, "constants", $newTOC);
}
if (@enums) {
my $head = "Enumerations\n";
my $baseref = "Enums/Enums.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($head, \@groups, \@enums,
$compositePageName, $baseref, $composite, 1, "enums", $newTOC);
}
if (@pDefines) {
my $head = "#defines\n";
my $baseref = "PDefines/PDefines.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($head, \@groups, \@pDefines,
$compositePageName, $baseref, $composite, 1, "defines", $newTOC);
}
if (@classes) {
my @realclasses = ();
my @comints = ();
foreach my $obj (@classes) {
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
if ($obj->isCOMInterface()) {
push(@comints, $obj);
} else {
push(@realclasses, $obj);
}
}
if (@realclasses) {
@classes = @realclasses;
if ($newTOC) {
$tocString .= $self->tocHeading("$baseref#HeaderDoc_classes", "Classes", "doc");
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_classes\" target=\"_top\">Classes</a></h4>\n";
} else {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_classes\" target=\"doc\">Classes</a></h4>\n";
}
$tocString .= $self->tocStringSubForClasses("", \@groups, \@classes,
$compositePageName, "Classes/{}/$defaultFrameName", $composite, 1, "", $newTOC);
$tocString .= $self->tocHeadingEnd() if ($newTOC);
}
if (@comints) {
@classes = @comints;
if ($newTOC) {
$tocString .= $self->tocHeading("$baseref#HeaderDoc_cominterfaces", "C Pseudoclasses", "doc");
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_comints\" target=\"_top\">C Pseudoclasses</a></h4>\n";
} else {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_comints\" target=\"doc\">C Pseudoclasses</a></h4>\n";
}
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @classes;
} else {
@tempobjs = @classes;
}
$tocString .= $self->tocStringSubForClasses("", \@groups, \@comints,
$compositePageName, "Classes/{}/$defaultFrameName", $composite, 1, "", $newTOC);
$tocString .= $self->tocHeadingEnd() if ($newTOC);
}
}
if (@protocols) {
if ($newTOC) {
$tocString .= $self->tocHeading("$baseref#HeaderDoc_protocols", "Protocols", "doc");
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_protocols\" target=\"_top\">Protocols</a></h4>\n";
} else {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_protocols\" target=\"doc\">Protocols</a></h4>\n";
}
$tocString .= $self->tocStringSubForClasses("", \@groups, \@protocols,
$compositePageName, "Protocols/{}/$defaultFrameName", $composite, 1, "", $newTOC);
$tocString .= $self->tocHeadingEnd() if ($newTOC);
}
if (@categories) {
if ($newTOC) {
$tocString .= $self->tocHeading("$baseref#HeaderDoc_categories", "Categories", "doc");
} elsif ($HeaderDoc::use_iframes) {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_categories\" target=\"_top\">Categories</a></h4>\n";
} else {
$tocString .= "<h4><a href=\"$baseref#HeaderDoc_categories\" target=\"doc\">Categories</a></h4>\n";
}
$tocString .= $self->tocStringSubForClasses("", \@groups, \@categories,
$compositePageName, "Categories/{}/$defaultFrameName", $composite, 1, "", $newTOC);
$tocString .= $self->tocHeadingEnd() if ($newTOC);
}
if (@properties) {
my $propname = "Properties";
my $baseref = "Properties/Properties.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($propname, \@groups, \@properties,
$compositePageName, $baseref, $composite, 1, "props", $newTOC);
}
if (@vars) {
my $globalname = "Globals";
if ($class ne "HeaderDoc::Header") {
$globalname = "Member Data";
}
my $baseref = "Vars/Vars.html";
if ($composite) {
$baseref = $compositePageName;
}
$tocString .= $self->tocStringSub($globalname, \@groups, \@vars,
$compositePageName, $baseref, $composite, 0, "vars", $newTOC);
}
if ($class ne "HeaderDoc::Header") {
if ($newTOC) {
$tocString .= $self->tocSeparator("Other Reference", $newTOC);
$tocString .= $self->tocEntry("../../$defaultFrameName", "Header", "_top");
} else {
$tocString .= "<br><h4>Other Reference</h4><hr class=\"TOCSeparator\">\n";
$tocString .= "<nobr> <a href=\"../../$defaultFrameName\" target=\"_top\">Header</a></nobr><br>\n";
}
$tocString .= "<!-- HeaderDoc TOC framework link begin -->\n";
$tocString .= "<!-- HeaderDoc TOC framework link end -->\n";
} else {
$tocString .= "<!-- HeaderDoc TOC framework link block begin -->\n";
$tocString .= "<!-- HeaderDoc TOC framework link block end -->\n";
}
if (!$composite) {
if ($newTOC) {
$tocString .= $self->tocEntry("$compositePageName", "[Printable HTML Page]", "_blank");
} else {
if ($HeaderDoc::use_iframes) {
$tocString .= "<br><hr class=\"TOCSeparator\"><a href=\"$compositePageName?hidetoc\" target=\"_blank\">[Printable HTML Page]</a>\n";
} else {
$tocString .= "<br><hr class=\"TOCSeparator\"><a href=\"$compositePageName\" target=\"_blank\">[Printable HTML Page]</a>\n";
}
}
}
if ($newTOC != 3) {
my $availability = $self->availability();
my $updated = $self->updated();
if (length($availability)) {
$tocString .= "<p><i>Availability: $availability</i><p>";
}
if (length($updated)) {
$tocString .= "<p><i>Updated: $updated</i><p>";
}
}
return $tocString;
}
sub tocSeparator
{
my $self = shift;
my $string = shift;
my $newTOC = shift;
my $tocString = "";
if ($newTOC == 5) {
$tocString .= "<hr class=\"tocSeparator\">\n";
$tocString .= "<h4 class=\"tocSubheading\">Other Reference</h4>\n";
}
return $tocString;
}
sub tocHeading
{
my $self = shift;
my $url = shift;
my $name = shift;
my $target = shift;
my $string = "";
if ($HeaderDoc::use_iframes && $target eq "_top" || $target eq "doc") {
$target = "_top";
}
if ($HeaderDoc::newTOC == 3) {
return tocJSON($url, $name, 1, "tocHeading", undef);
} elsif ($HeaderDoc::newTOC == 2) {
$string = "<li class=\"section children\"><span class=\"sectionName\">";
if ($target ne "") {
$string .= "<a href=\"$url\" target=\"$target\">$name</a>\n";
} else {
$string .= "<a href=\"#\">$name</a>\n";
}
$string .= "</span>\n<ul class=\"collapsible\" style=\"display:none;\">\n";
return $string;
}
my $opentriangle = "<img src=\"/Resources/Images/top_level_open.gif\" open=\"/Resources/Images/top_level_open.gif\" closed=\"/Resources/Images/top_level_closed.gif\" border=\"0\" alt=\"\" />";
my $usethis = "";
my $opentriangle_class = "";
if ($HeaderDoc::newTOC == 5) {
$opentriangle = "▷"; $opentriangle_class = "closed_disclosure_triangle";
$usethis = "this";
}
$string .= "<div toc=\"section\">\n";
my $style1 = "";
my $style2 = "";
my $style3 = "";
my $style4 = "";
my $style5 = "";
if ($HeaderDoc::newTOC != 5) {
$style1 = "width=\"5\" style='min-width: 5px; min-height: 1px;'";
$style2 = "style=\"margin-left: 5px; margin-right: 5px; padding-top: 4px;\"";
$style3 = "style=\"color: #000000; font-size: 12px; text-decoration: none\" toc=\"section_link\"";
$style4 = "width=\"10\" style='min-width: 6px; min-height: 1px;'";
$style5 = "style=\"padding-right: 5px; padding-top: 3px; padding-bottom: 3px;\"";
}
$string .= "<table class=\"hd_toc_heading_table\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">";
if ($HeaderDoc::newTOC != 5) {
$string .= "<tr><td width=\"10\" scope=\"row\"></td><td width=\"20\"></td><td width=\"20\"></td><td width=\"20\"></td><td width=\"20\"></td><td width=\"99%\"></td></tr>\n";
}
$string .= "<tr><td class=\"toc_leadspace\" $style1></td><td class=\"disclosure_triangle_td\" valign=\"top\" align=\"left\" $style2><a $style3 href=\"#\" class=\"$opentriangle_class\" onclick=\"disclosure_triangle($usethis)\">$opentriangle</a></td><td class=\"disclosure_padding\" $style4></td><td valign=\"top\" colspan=\"4\" class=\"toc_contents_text\" toc=\"section_link\" $style5>\n";
if ($target ne "") {
$string .= "<a href=\"$url\" target=$target>$name</a></td></tr>\n";
} else {
$string .= "<a href=\"#\">$name</a></td></tr>\n";
}
$string .= "</table>\n";
my $display = "";
if ($HeaderDoc::newTOC == 5) { $display = " class=\"collapsible\" "; }
$string .= "<div toc=\"collapsible\"$display>\n";
return $string;
}
sub tocHeadingEnd
{
my $self = shift;
if ($HeaderDoc::newTOC == 3) {
return tocJSON("","", 2, "tocHeadingEnd", undef);
} elsif ($HeaderDoc::newTOC == 2) {
return "</ul></li>\n";
}
my $string = "";
$string .= "</div></div>\n";
return $string;
}
sub tocEntry
{
my $self = shift;
my $url = shift;
my $name = shift;
my $target = "doc";
if (@_) { $target = shift; }
if ($HeaderDoc::use_iframes && $target eq "_top" || $target eq "doc") {
$target = "_top";
}
if ($HeaderDoc::newTOC == 3) {
return tocJSON($url, $name, 0, "tocEntry", undef);
} elsif ($HeaderDoc::newTOC == 2) {
return "<li class=\"section\"><span class=\"sectionName\"><div><a href=\"$url\" target=\"$target\">$name</a></div></span></li>\n";
}
my $tocString = "";
$tocString .= "<div>\n";
$tocString .= "<table class=\"hd_toc_entry_table\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n";
my $style1 = ""; my $style2 = ""; my $style3 = ""; my $width1 = "";
if ($HeaderDoc::newTOC != 5) {
$tocString .= "<tr><td width=\"10\" scope=\"row\"></td><td width=\"20\"></td><td width=\"20\"></td><td width=\"20\"></td><td width=\"20\"></td><td width=\"99%\"></td></tr>\n";
$style1 = "width=\"10\" style='min-width: 10px; min-height: 1px;'";
$style2 = "width=\"10\" style='min-width: 10px; min-height: 1px;'";
$style3 = "style=\"padding-right: 5px; padding-top: 3px; padding-bottom: 3px;\"";
$width1 = "width=\"10\"";
}
$tocString .= "<tr><td class=\"toc_leadspace\" $style1></td><td class=\"disclosure_triangle_td\" $style2></td><td class=\"disclosure_padding\" $width1></td><td valign=\"top\" colspan=\"3\" class=\"toc_contents_text\" $style3 toc=\"section_link\"><a href=\"$url\" target=\"$target\">$name</a></td></tr>\n";
$tocString .= "</table>\n";
$tocString .= "</div>\n";
return $tocString;
}
sub tocGroupEnd
{
my $group = shift;
my $tocString = "";
if ($HeaderDoc::newTOC == 3) {
return tocJSON("", "", 2, "tocGroupEnd", undef);
}
return "";
}
sub tocGroup
{
my $group = shift;
my $firstgroup = shift;
my $tocString = "";
if (!$firstgroup) { $tocString .= "<span class='hd_tocGroupSpace'> <br></span>\n"; }
my $preface = " ";
$tocString .= "<span class=\"hd_tocGroup\">$group</span>\n";
if ($HeaderDoc::newTOC == 3) {
my $url = "index.html#";
return tocJSON($url, $group, 1, "tocGroup", undef);
} elsif ($HeaderDoc::newTOC == 2) {
$tocString = "<li class=\"section\">$tocString</li>\n";
}
return $tocString;
}
sub langSupportsAccess
{
my $self = shift;
my $lang = $self->lang();
if ($lang eq "perl" || $lang eq "php" || $lang eq "tcl") { return 0; }
return 1;
}
sub tocAccess
{
my $self = shift;
my $access = shift;
my $firstaccess = shift;
my $tocString = "";
my $lang = $self->lang();
if (!($self->langSupportsAccess())) { return ""; }
if (!$firstaccess) { $tocString .= "<span class='hd_tocAccessSpace'> <br></span>\n"; }
$tocString .= "<span class=\"hd_tocAccess\">$access</span>\n";
if ($HeaderDoc::newTOC == 3) {
my $url = "index.html#";
return tocJSON($url, $access, 1, "tocAccess", undef);
} elsif ($HeaderDoc::newTOC == 2) {
$tocString = "<li class=\"entry_2\">$tocString</li>\n";
}
return $tocString;
}
sub tocAccessEnd
{
my $self = shift;
my $access = shift;
my $tocString = "";
my $lang = $self->lang();
if ($lang eq "perl" || $lang eq "php" || $lang eq "tcl") { return ""; }
if ($HeaderDoc::newTOC == 3) {
my $url = "";
return tocJSON($url, $access, 2, "tocAccessEnd", undef);
}
return $tocString;
}
sub tocSubEntry
{
my $url = shift;
my $target = shift;
my $name = shift;
my $tocString = "";
if ($HeaderDoc::use_iframes && $target eq "_top" || $target eq "doc") {
$target = "_top";
}
my $entrypreface = " ";
if ($HeaderDoc::newTOC == 3) {
return tocJSON($url, $name, 0, "tocSubEntry", undef);
} elsif ($HeaderDoc::newTOC == 2) {
$tocString .= "<li class=\"entry_2\"><a href=\"$url\" target=\"$target\">$name</a></li>\n";
} else {
$tocString .= "<li class=\"tocSubEntry\"><a href=\"$url\" target=\"$target\">$name</a></li>\n";
}
return $tocString;
}
sub tocWrapSubEntries
{
my $input = shift;
if (($HeaderDoc::newTOC == 5) && ($input)) {
return "<ul class=\"tocSubEntryList\">$input</ul>";
} else {
return $input;
}
}
sub enums {
my $self = shift;
if (@_) {
@{ $self->{ENUMS} } = @_;
}
($self->{ENUMS}) ? return @{ $self->{ENUMS} } : return ();
}
sub addToEnums {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO ENUMS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{ENUMS} }, $item);
}
}
return @{ $self->{ENUMS} };
}
sub pDefines {
my $self = shift;
if (@_) {
@{ $self->{PDEFINES} } = @_;
}
($self->{PDEFINES}) ? return @{ $self->{PDEFINES} } : return ();
}
sub addToPDefines {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO PDEFINES\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{PDEFINES} }, $item);
}
}
return @{ $self->{PDEFINES} };
}
sub constants {
my $self = shift;
if (@_) {
@{ $self->{CONSTANTS} } = @_;
}
($self->{CONSTANTS}) ? return @{ $self->{CONSTANTS} } : return ();
}
sub addToConstants {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO CONSTANTS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{CONSTANTS} }, $item);
}
}
return @{ $self->{CONSTANTS} };
}
sub functions {
my $self = shift;
if (@_) {
@{ $self->{FUNCTIONS} } = @_;
}
($self->{FUNCTIONS}) ? return @{ $self->{FUNCTIONS} } : return ();
}
sub addToFunctions {
my $self = shift;
my $localDebug = 0;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO FUNCTIONS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
foreach my $compare (@{ $self->{FUNCTIONS} }) {
my $name1 = $item->name();
my $name2 = $compare->name();
if ($item->name() eq $compare->name() && $item != $compare) {
my $oldconflict = ($item->conflict() && $compare->conflict());
$item->conflict(1);
$compare->conflict(1);
my $prevignore = $HeaderDoc::ignore_apiuid_errors;
$HeaderDoc::ignore_apiuid_errors = 1;
my $junk = $item->apirefSetup(1);
$junk = $compare->apirefSetup(1);
$HeaderDoc::ignore_apiuid_errors = $prevignore;
print STDERR "$name1 = $name2\n" if ($localDebug);
if (!$oldconflict) {
my $apio = $self; my $apioclass = ref($apio) || $apio;
if ($apioclass ne "HeaderDoc::CPPClass") {
if ($apioclass !~ /HeaderDoc::ObjC/o) {
warn "----------------------------------------------------------------------------\n";
warn "Conflicting declarations for function/method ($name1) outside a\n"."class (apioclass=$apioclass). This is probably not what\n"."you want. This warning is usually caused by failing to include a\n"."HeaderDoc comment for the enclosing class or by using the wrong name\n"."with an old-style HeaderDoc tag such as \@function.\n";
warn "----------------------------------------------------------------------------\n";
}
}
}
} elsif ($item == $compare) {
return;
}
}
push (@{ $self->{FUNCTIONS} }, $item);
}
}
return @{ $self->{FUNCTIONS} };
}
sub removeFromFunctions
{
my $self = shift;
my $obj = shift;
$self->removeObject("FUNCTIONS", $obj);
}
sub removeFromPDefines
{
my $self = shift;
my $obj = shift;
$self->removeObject("PDEFINES", $obj);
}
sub removeObject
{
my $self = shift;
my $key = shift;
my $objectToRemove = shift;
my @orig = @{$self->{$key}};
my @new = ();
my $found = 0;
foreach my $obj (@orig) {
if ($obj == $objectToRemove) {
$found = 1;
} else {
push(@new, $obj);
}
}
if ($found) {
$self->{$key} = \@new;
} else {
warn "Could not remove ".$objectToRemove->name()." from ".$self->name()."\n";
}
}
sub methods {
my $self = shift;
if (@_) {
@{ $self->{METHODS} } = @_;
}
($self->{METHODS}) ? return @{ $self->{METHODS} } : return ();
}
sub addToMethods {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO METHODS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
foreach my $compare (@{ $self->{METHODS} }) {
if ($item->name() eq $compare->name()) {
$item->conflict(1);
$compare->conflict(1);
}
}
push (@{ $self->{METHODS} }, $item);
}
}
return @{ $self->{METHODS} };
}
sub typedefs {
my $self = shift;
if (@_) {
@{ $self->{TYPEDEFS} } = @_;
}
($self->{TYPEDEFS}) ? return @{ $self->{TYPEDEFS} } : return ();
}
sub addToTypedefs {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO TYPEDEFS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{TYPEDEFS} }, $item);
}
}
return @{ $self->{TYPEDEFS} };
}
sub structs {
my $self = shift;
if (@_) {
@{ $self->{STRUCTS} } = @_;
}
($self->{STRUCTS}) ? return @{ $self->{STRUCTS} } : return ();
}
sub addToStructs {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO STRUCTS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{STRUCTS} }, $item);
}
}
return @{ $self->{STRUCTS} };
}
sub props {
my $self = shift;
if (@_) {
@{ $self->{PROPS} } = @_;
}
($self->{PROPS}) ? return @{ $self->{PROPS} } : return ();
}
sub addToProps {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO PROPS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{PROPS} }, $item);
}
}
return @{ $self->{PROPS} };
}
sub vars {
my $self = shift;
if (@_) {
@{ $self->{VARS} } = @_;
}
($self->{VARS}) ? return @{ $self->{VARS} } : return ();
}
sub addToVars {
my $self = shift;
if (@_) {
foreach my $item (@_) {
if ($addToDebug) { print STDERR "ADDED $item TO VARS\n"; }
if (!$item->{INSERTED}) { $item->{INSERTED} = 42; }
push (@{ $self->{VARS} }, $item);
}
}
return @{ $self->{VARS} };
}
sub fields {
my $self = shift;
if (@_) {
@{ $self->{FIELDS} } = @_;
}
($self->{FIELDS}) ? return @{ $self->{FIELDS} } : return ();
}
sub availability {
my $self = shift;
if (@_) {
$self->{AVAILABILITY} = shift;
}
return $self->{AVAILABILITY};
}
sub updated {
my $self = shift;
my $localDebug = 0;
if (@_) {
my $updated = shift;
my $month; my $day; my $year;
$month = $day = $year = $updated;
print STDERR "updated is $updated\n" if ($localDebug);
if (!($updated =~ /\d\d\d\d-\d\d-\d\d/o )) {
if (!($updated =~ /\d\d-\d\d-\d\d\d\d/o )) {
if (!($updated =~ /\d\d-\d\d-\d\d/o )) {
my $fullpath = $self->fullpath();
my $linenum = $self->linenum();
print STDERR "$fullpath:$linenum: warning: Bogus date format: $updated. Valid formats are MM-DD-YYYY, MM-DD-YY, and YYYY-MM-DD\n";
return $self->{UPDATED};
} else {
$month =~ s/(\d\d)-\d\d-\d\d/$1/smog;
$day =~ s/\d\d-(\d\d)-\d\d/$1/smog;
$year =~ s/\d\d-\d\d-(\d\d)/$1/smog;
my $century;
$century = `date +%C`;
$century *= 100;
$year += $century;
print STDERR "YEAR: $year" if ($localDebug);
}
} else {
print STDERR "03-25-2003 case.\n" if ($localDebug);
$month =~ s/(\d\d)-\d\d-\d\d\d\d/$1/smog;
$day =~ s/\d\d-(\d\d)-\d\d\d\d/$1/smog;
$year =~ s/\d\d-\d\d-(\d\d\d\d)/$1/smog;
}
} else {
$year =~ s/(\d\d\d\d)-\d\d-\d\d/$1/smog;
$month =~ s/\d\d\d\d-(\d\d)-\d\d/$1/smog;
$day =~ s/\d\d\d\d-\d\d-(\d\d)/$1/smog;
}
$month =~ s/\n*//smog;
$day =~ s/\n*//smog;
$year =~ s/\n*//smog;
$month =~ s/\s*//smog;
$day =~ s/\s*//smog;
$year =~ s/\s*//smog;
my $invalid = 0;
my $mdays = 28;
if ($month == 2) {
if ($year % 4) {
$mdays = 28;
} elsif ($year % 100) {
$mdays = 29;
} elsif ($year % 400) {
$mdays = 28;
} else {
$mdays = 29;
}
} else {
my $bitcheck = (($month & 1) ^ (($month & 8) >> 3));
if ($bitcheck) {
$mdays = 31;
} else {
$mdays = 30;
}
}
if ($month > 12 || $month < 1) { $invalid = 1; }
if ($day > $mdays || $day < 1) { $invalid = 1; }
if ($year < 1970) { $invalid = 1; }
if ($invalid) {
my $fullpath = $self->fullpath();
my $linenum = $self->linenum();
print STDERR "$fullpath:$linenum: warning: Invalid date (year = $year, month = $month, day = $day). Valid formats are MM-DD-YYYY, MM-DD-YY, and YYYY-MM-DD\n";
return $self->{UPDATED};
} else {
$self->{UPDATED} =HeaderDoc::HeaderElement::strdate($month-1, $day, $year, $self->encoding());
}
}
return $self->{UPDATED};
}
sub createFramesetFile {
my $self = shift;
my $docNavigatorComment = $self->docNavigatorComment();
my $class = ref($self);
my $defaultFrameName = $class->defaultFrameName();
if ($HeaderDoc::use_iframes) {
return;
}
my $jsnav = 1;
my $newTOC = $HeaderDoc::newTOC;
my $cols = "190,100%";
my $frameatts = "";
my $bordercolor = "";
my $framesetatts = "";
if ($newTOC) {
$cols = "210, *";
$bordercolor = "bordercolor=\"#999999\"";
$frameatts = "border=\"0\" frameborder=\"0\"";
$framesetatts = "frameborder=\"NO\" border=\"0\""; }
my $HTMLmeta = "";
$HTMLmeta = $self->HTMLmeta();
my $filename = $self->filename();
my $name = $self->name();
my $title = $filename;
if (!length($name)) {
$name = "$filename";
} else {
$title = "$name ($filename)";
}
my $outDir = $self->outputDir();
my $outputFile = "$outDir$pathSeparator$defaultFrameName";
my $rootFileName = $self->filename();
$rootFileName =~ s/(.*)\.h/$1/o;
$rootFileName = &safeName(filename => $rootFileName);
my $compositePageName = $self->compositePageName();
my $composite = $HeaderDoc::ClassAsComposite;
my $script = "";
if ($jsnav) {
$script .= "<script language=\"JavaScript\" type=\"text/javascript\"><!--\n";
$script .= "origURL = parent.document.URL;\n";
$script .= "contentURL = origURL.substring(origURL.indexOf('?')+1, origURL.length);\n";
$script .= "if (contentURL.length == origURL.length) {\n";
$script .= " jumpPos = origURL.substring(origURL.indexOf('#')+1, origURL.length);\n";
if ($composite) {
$script .= " contentURL = '$compositePageName';\n";
} else {
$script .= " contentURL = '$rootFileName.html';\n";
}
$script .= " if (jumpPos.length != origURL.length) {\n";
$script .= " contentURL += '#' + jumpPos;\n";
$script .= " }\n";
$script .= " // document.write('contentURL: ' + contentURL + '<br>\\n');\n";
$script .= " // document.write('Length: ' + contentURL.length + '<br>\\n');\n";
$script .= "}\n";
$script .= "document.write('<frameset id=\"frameset\" cols=\"$cols\" $framesetatts><frame src=\"toc.html\" name=\"nav\" $bordercolor $frameatts><frame src=\"' + contentURL + '\" name=\"doc\" $frameatts><\\/frameset>');\n";
$script .= "--></script>\n";
}
open(OUTFILE, ">$outputFile") || die "Can't write $outputFile. \n$!\n";
if ($isMacOS) {MacPerl::SetFileInfo('MSIE', 'TEXT', "$outputFile");};
print OUTFILE "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"\n \"http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd\">\n";
print OUTFILE "<html><head>\n <title>Documentation for $title</title>\n$HTMLmeta\n <meta name=\"generator\" content=\"HeaderDoc\" />\n<meta name=\"xcode-display\" content=\"render\" />\n$script"."</head>\n";
print OUTFILE "<meta name=\"ROBOTS\" content=\"NOINDEX\" />\n";
print OUTFILE "<body bgcolor=\"#e6e6e6\">\n";
if ($jsnav) {
print OUTFILE "<noscript>\n";
}
print OUTFILE "<frameset cols=\"$cols\" $framesetatts>\n";
print OUTFILE "<frame src=\"toc.html\" name=\"toc\" $bordercolor $frameatts>\n";
if ($composite) {
print OUTFILE "<frame src=\"$compositePageName\" name=\"doc\" $frameatts>\n";
} else {
print OUTFILE "<frame src=\"$rootFileName.html\" name=\"doc\" $frameatts>\n";
}
print OUTFILE "</frameset>\n";
print OUTFILE "<noframes>\n";
print OUTFILE "<h2>This document set is best viewed in a browser that supports frames. To access the TOC, <a href=\"toc.html\">Click here</a></h2>\n";
print OUTFILE "</noframes>\n";
if ($jsnav) {
print OUTFILE "</noscript>\n";
}
print OUTFILE "</body>\n";
print OUTFILE "$docNavigatorComment\n";
print OUTFILE "</html>\n";
close OUTFILE;
}
sub docNavigatorComment {
return "";
}
sub createTOCFile {
my $self = shift;
my $rootDir = $self->outputDir();
my $tocTitlePrefix = $self->tocTitlePrefix();
my $outputFileName = "toc.html";
my $depthFile = "$rootDir$pathSeparator$outputFileName";
calcDepth($depthFile);
my $newTOC = $HeaderDoc::newTOC;
if ($newTOC == 3) {
$outputFileName = "book.js";
}
my $outputFile = "$rootDir$pathSeparator$outputFileName";
my $fileString = $self->tocString($newTOC);
my $filename = $self->filename();
my $name = $self->name();
my $title = $filename;
if (!length($name)) {
$name = "$filename";
} elsif ($name eq $filename) {
$name = "$filename";
} else {
$title = "$name ($filename)";
}
my $HTMLmeta = "";
$HTMLmeta = $self->HTMLmeta();
open(OUTFILE, ">$outputFile") || die "Can't write $outputFile.\n$!\n";
if ($isMacOS) {MacPerl::SetFileInfo('MSIE', 'TEXT', "$outputFile");};
if ($newTOC != 3) {
print OUTFILE "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n \"http://www.w3.org/TR/1998/REC-html40-19980424/loose.dtd\">\n";
}
if ($newTOC == 3) {
my @related = ();
my %info = (
"technology" => "",
"topic" => "",
"subtopic" => "",
"layer" => "",
"framework" => "",
"companionFiles" => "",
"needsAdditionalLinksSeparator" => "false",
"relatedBooks" => \@related
);
print OUTFILE tocJSON("", "$tocTitlePrefix $name", 1, "Top", \%info);
print OUTFILE $fileString;
print OUTFILE tocJSON("", "", 3, "Top", undef);
} elsif ($newTOC == 2) {
print OUTFILE "<head><meta name=\"ROBOTS\" content=\"NOINDEX\" /></head>\n";
print OUTFILE "<meta name=\"generator\" content=\"HeaderDoc\" />";
print OUTFILE "<h1 id=\"book_title\">$tocTitlePrefix $name</h1>\n";
print OUTFILE $fileString;
} elsif ($newTOC && $newTOC != 5) {
print OUTFILE "<html>";
print OUTFILE "<head>\n";
print OUTFILE "<meta name=\"ROBOTS\" content=\"NOINDEX\" />\n";
print OUTFILE "<meta name=\"xcode-display\" content=\"render\" />\n";
print OUTFILE "<script language=\"JavaScript\" src=\"/Resources/JavaScript/toc.js\" type=\"text/javascript\"></script>\n";
print OUTFILE "<script language=\"JavaScript\" src=\"/Resources/JavaScript/page.js\" type=\"text/javascript\"></script>\n";
print OUTFILE "<title>Documentation for $title</title>\n$HTMLmeta\n <meta name=\"generator\" content=\"HeaderDoc\" />\n";
print OUTFILE $self->styleSheet(1);
print OUTFILE "</head>\n";
if ($HeaderDoc::use_iframes) {
print OUTFILE "<body bgcolor=\"#ffffff\" link=\"#000099\" vlink=\"#660066\"\n";
print OUTFILE "style=\"margin: 0; border-left: 10px solid white; border-right: 5px solid white;\n";
print OUTFILE "border-top: 10px solid white\" onload=\"initialize_toc();\">\n";
} else {
print OUTFILE "<body bgcolor=\"#ffffff\" link=\"#000099\" vlink=\"#660066\"\n";
print OUTFILE "leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\"\n";
print OUTFILE "marginheight=\"0\" style=\"border-left: 10px solid white; border-right: 5px solid white;\n";
print OUTFILE "border-top: 10px solid white\" onload=\"initialize_toc();\">\n";
}
print OUTFILE "<div id=\"toc\">\n";
print OUTFILE "<table class=\"tocTable\" width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td scope=\"row\">\n";
print OUTFILE "<h2>$tocTitlePrefix $name</h2>\n";
print OUTFILE "<div id=\"toc_PDFbottomborder\"></div>\n";
print OUTFILE $fileString;
print OUTFILE "</td></tr></table>\n";
print OUTFILE "</div><p> <p>\n";
print OUTFILE "</body></html>\n";
} else {
print OUTFILE "<html>";
print OUTFILE "<head>\n";
print OUTFILE "<meta name=\"ROBOTS\" content=\"NOINDEX\" />\n";
print OUTFILE "<title>Documentation for $title</title>\n$HTMLmeta\n <meta name=\"generator\" content=\"HeaderDoc\" />\n<meta name=\"xcode-display\" content=\"render\" />\n";
print OUTFILE $self->styleSheet(1);
print OUTFILE "</head>\n";
print OUTFILE "<body bgcolor=\"#edf2f6\" link=\"#000099\" vlink=\"#660066\"\n";
print OUTFILE "leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\"\n";
print OUTFILE "marginheight=\"0\">\n";
print OUTFILE "<table class=\"headerdoc_content_table\" width=\"100%\" cellpadding=0 cellspacing=0 border=0>";
print OUTFILE "<tr id=\"colorbox\" height=51 width=\"100%\" bgcolor=\"#466C9B\"><td width=\"100%\"> </td></tr>";
print OUTFILE "<tr><td class=\"hd_toc_box\">";
if ($newTOC != "5") { print OUTFILE "<br>"; }
print OUTFILE "<table class=\"hd_toc_table\" border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"148\">\n";
print OUTFILE "<tr><td class=\"toc_leadspace\"></td><td colspan=\"2\"><font size=\"5\" color=\"#330066\"><b>$tocTitlePrefix</b></font></td></tr>\n";
print OUTFILE "<tr><td class=\"toc_leadspace\"> </td><td class=\"disclosure_triangle_td\"> </td><td class=\"toc_contents_text\"><b><font size=\"+1\">$name</font></b></td></tr>\n";
print OUTFILE "<tr><td></td><td colspan=\"2\">\n";
print OUTFILE $fileString;
print OUTFILE "</td></tr>\n";
print OUTFILE "</table><p> <p>\n";
print OUTFILE "</td></tr></table>\n";
print OUTFILE "</body></html>\n";
}
close OUTFILE;
if ($newTOC == 3) {
$HeaderDoc::newTOC = 2;
$self->createTOCFile();
$HeaderDoc::newTOC = 3;
}
}
sub createContentFile {
my $self = shift;
my $class = ref($self);
my $copyrightOwner = $class->copyrightOwner();
my $filename = $self->filename();
my $name = $self->name();
my $title = $filename;
my $throws = $self->throws();
if (!length($name)) {
$name = "$filename";
} else {
$title = "$name ($filename)";
}
my $short_attributes = $self->getAttributes(0);
my $long_attributes = $self->getAttributes(1);
my $list_attributes = $self->getAttributeLists(0);
my $newTOC = $HeaderDoc::newTOC;
my $rootFileName = $self->filename();
my $fullpath = $self->fullpath();
if ($class eq "HeaderDoc::Header") {
my $headercopyright = $self->headerCopyrightOwner();
if (!($headercopyright eq "")) {
$copyrightOwner = $headercopyright;
}
}
my $HTMLmeta = "";
$HTMLmeta = $self->HTMLmeta();
my $fileString = "";
$rootFileName =~ s/(.*)\.h/$1/o;
if (1 || $isMacOS) {$rootFileName = &safeName(filename => $rootFileName);};
my $outputFileName = "$rootFileName.html";
my $rootDir = $self->outputDir();
my $outputFile = "$rootDir$pathSeparator$outputFileName";
calcDepth($outputFile);
open (OUTFILE, ">$outputFile") || die "Can't write header-wide content page $outputFile. \n$!\n";
if ($isMacOS) {MacPerl::SetFileInfo('MSIE', 'TEXT', "$outputFile");};
my $headerDiscussion = $self->discussion();
my $checkDisc = $self->halfbaked_discussion();
my $headerAbstract = $self->abstract();
if (($checkDisc !~ /\S/) && ($headerAbstract !~ /\S/)) {
my $linenum = $self->linenum();
warn "$fullpath:$linenum: No header or class discussion/abstract found. Creating dummy file for default content page.\n";
$headerAbstract .= $HeaderDoc::defaultHeaderComment; }
$fileString .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n \"http://www.w3.org/TR/1998/REC-html40-19980424/loose.dtd\">\n";
$fileString .= "<html><HEAD>\n <title>API Documentation</title>\n $HTMLmeta <meta name=\"generator\" content=\"HeaderDoc\" />\n<meta name=\"xcode-display\" content=\"render\" />\n";
$fileString .= $self->styleSheet(0);
$fileString .= "</HEAD>\n<BODY bgcolor=\"#ffffff\">\n";
if ($HeaderDoc::insert_header) {
$fileString .= "<!-- start of header -->\n";
$fileString .= $self->htmlHeader()."\n";
$fileString .= "<!-- end of header -->\n";
}
$fileString .= "<a name=\"top\"></a>\n";
$fileString .= "<H1>$name</H1><hr class=\"afterClassOrHeaderHeading\">\n";
my $namespace = $self->namespace();
my $availability = $self->availability();
my $updated = $self->updated();
my $includeList = "";
if ($class eq "HeaderDoc::Header") {
my $includeref = $HeaderDoc::perHeaderIncludes{$filename};
if ($includeref) {
my @includes = @{$includeref};
my $first = 1;
foreach my $include (@includes) {
my $localDebug = 0;
print STDERR "Included file: $include\n" if ($localDebug);
if (!$first) {
if ($newTOC) { $includeList .= "<br>\n"; }
else { $includeList .= ",\n"; }
}
my $xmlinc = $self->textToXML($include);
my $includeguts = $include;
$includeguts =~ s/[<\"](.*)[>\"]/$1/so;
my $includefile = basename($includeguts);
my $ref = $self->genRefSub("doc", "header", $includefile, "");
$includeList .= "<!-- a logicalPath=\"$ref\" machineGenerated=\"true\" -->$xmlinc<!-- /a -->";
$first = 0;
}
}
}
if (length($updated) || length($namespace) || length($availability) || length($includeList)) {
$fileString .= "<p></p>\n";
}
my $attstring = ""; my $c = 0;
if (length($namespace)) {
if ($newTOC) {
if (!$c) {
$attstring .= "<div class=\"spec_sheet_info_box\"><table cellspacing=\"0\" class=\"specbox\">\n";
}
$attstring .= "<tr><td scope=\"row\"><b>Namespace:</b></td><td><div class=\"spec_sheet_namespace spec_sheet_line\" style=\"margin-bottom:1px\"><div class=\"content_text\">$namespace</div></div></td></tr>\n";
} else {
$attstring .= "<b>Namespace:</b> $namespace<br>\n";
}
$c++;
}
if (length($availability)) {
if ($newTOC) {
if (!$c) {
$attstring .= "<div class=\"spec_sheet_info_box\"><table cellspacing=\"0\" class=\"specbox\">\n";
}
$attstring .= "<tr><td scope=\"row\"><b>Availability:</b></td><td><div class=\"spec_sheet_availability spec_sheet_line\" style=\"margin-bottom:1px\"><div class=\"content_text\">$availability</div></div></td></tr>\n";
} else {
$attstring .= "<b>Availability:</b> $availability<br>\n";
}
$c++;
}
if (length($updated)) {
if ($newTOC) {
if (!$c) {
$attstring .= "<div class=\"spec_sheet_info_box\"><table cellspacing=\"0\" class=\"specbox\">\n";
}
$attstring .= "<tr><td scope=\"row\"><b>Updated:</b></td><td><div class=\"spec_sheet_updated spec_sheet_line\" style=\"margin-bottom:1px\"><div class=\"content_text\">$updated</div></div></td></tr>\n";
} else {
$attstring .= "<b>Updated:</b> $updated<br>\n";
}
$c++;
}
if (length($includeList)) {
if ($newTOC) {
if (!$c) {
$attstring .= "<div class=\"spec_sheet_info_box\"><table cellspacing=\"0\" class=\"specbox\">\n";
}
$attstring .= "<tr><td scope=\"row\"><b>Includes:</b></td><td><div class=\"spec_sheet_includes spec_sheet_line\" style=\"margin-bottom:1px\"><div class=\"content_text\">$includeList</div></div></td></tr>\n";
} else {
$attstring .= "<b>Includes:</b> ";
$attstring .= $includeList;
$attstring .= "<br>\n";
}
$c++;
}
my $tempstring; my $oldc = $c;
if (length($short_attributes)) {
$tempstring .= "$short_attributes"; $c++;
}
if (length($list_attributes)) {
$tempstring .= "$list_attributes"; $c++;
}
if ($newTOC) {
if ($c == 2) {
$tempstring =~ s/<\/table><\/div>\s*<div.*?><table.*?>//s;
}
if ($oldc) { $tempstring =~ s/^\s*<div.*?><table.*?>//s; }
$tempstring =~ s/<\/table><\/div>\s*$//s;
}
$attstring .= $tempstring;
if (!$newTOC) { $attstring .= "<dl>"; }
if (length($throws)) {
if ($newTOC) {
if (!$c) {
$attstring .= "<div class=\"spec_sheet_info_box\"><table cellspacing=\"0\" class=\"specbox\">\n";
}
$attstring .= "<tr><td scope=\"row\"><b>Throws:</b></td><td><div class=\"spec_sheet_throws spec_sheet_line\" style=\"margin-bottom:1px\"><div class=\"content_text\">$throws</div></div></td></tr>\n";
} else {
$attstring .= "<dt><i>Throws:</i></dt>\n<dd>$throws</dd>\n";
}
$c++;
}
if ($newTOC) {
if ($c) { $attstring .= "</table></div>\n"; }
$fileString .= $attstring;
} else {
$attstring .= "</dl>";
}
my $uid = $self->apiuid();
if (length($headerAbstract)) {
if ($self->can("isFramework") && $self->isFramework()) {
$fileString .= "<!-- headerDoc=frameworkabstract;uid=".$uid.";name=start -->\n";
}
$fileString .= "$headerAbstract\n";
if ($self->can("isFramework") && $self->isFramework()) {
$fileString .= "<!-- headerDoc=frameworkabstract;uid=".$uid.";name=end -->\n";
}
$fileString .= "<br>\n";
}
if (!$newTOC) {
$fileString .= $attstring;
}
if (length($updated) || length($availability) || length($namespace) || length($headerAbstract) || length($short_attributes) || length($list_attributes) || length($includeList)) {
$fileString .= "<p></p>\n";
$fileString .= "<hr class=\"afterAttributes\"><br>\n";
}
my $discstart = $self->headerDocMark("discussion", "start");
my $discend = $self->headerDocMark("discussion", "end");
if ($self->can("isFramework") && $self->isFramework()) {
$fileString .= "<!-- headerDoc=frameworkdiscussion;uid=".$uid.";name=start -->\n";
} else {
$fileString .= $discstart;
}
$fileString .= "$headerDiscussion\n";
if ($self->can("isFramework") && $self->isFramework()) {
$fileString .= "<!-- headerDoc=frameworkdiscussion;uid=".$uid.";name=end -->\n";
} else {
$fileString .= $discend;
}
$fileString .= "<br><br>\n";
if (length($long_attributes)) {
$fileString .= "$long_attributes";
}
my @fields = $self->fields();
if (@fields) {
$fileString .= "<hr class=\"beforeTemplateParameters\"><h5 class='hd_templateparms'>Template Parameters</h5>";
$fileString .= "<dl>";
for my $field (@fields) {
my $name = $field->name();
my $desc = $field->discussion();
$fileString .= "<dt><tt>$name</tt></dt><dd>$desc</dd>";
}
$fileString .= "</dl>\n";
}
$fileString .= "<hr class=\"beforeGroups\"><br><center>";
$fileString .= $self->groupDoc("<h2 class=\"h2tight\" >Groups</h2>");
if ($HeaderDoc::insert_header) {
$fileString .= "<!-- start of footer -->\n";
$fileString .= $self->htmlFooter()."\n";
$fileString .= "<!-- end of footer -->\n";
}
$fileString .= "<hr class=\"afterFooter\">";
$fileString .= "© $copyrightOwner " if (length($copyrightOwner));
my $filedate = $self->updated();
if (length($filedate)) {
$fileString .= "Last Updated: $filedate\n";
} else {
$fileString .= "Last Updated: $dateStamp\n";
}
$fileString .= "<br>";
$fileString .= "<font size=\"-1\">HTML documentation generated by <a href=\"http://www.opensource.apple.com/projects\" target=\"_blank\">HeaderDoc</a></font>\n";
$fileString .= "</center>\n";
$fileString .= "</body>\n</html>\n";
print OUTFILE $self->fixup_inheritDoc(html_fixup_links($self, $fileString));
close OUTFILE;
}
sub writeFunctionListToStdOut {
my $self = shift;
my @functions = $self->functions();
my @classes = $self->classes();
my @protocols = $self->protocols();
my @categories = $self->categories();
foreach my $function (@functions) {
print "FUNCTION: ".$function->name()."\n";
my @lines = split(/\n/, $function->functionContents());
foreach my $line (@lines) {
print "\t$line\n"; }
}
foreach my $class (@classes) {
$class->writeFunctionListToStdOut();
}
foreach my $protocol (@protocols) {
$protocol->writeFunctionListToStdOut();
}
foreach my $category (@categories) {
$category->writeFunctionListToStdOut();
}
return;
}
sub setupAPIReferences {
my $self = shift;
my @functions = $self->functions();
my @methods = $self->methods();
my @constants = $self->constants();
my @typedefs = $self->typedefs();
my @structs = $self->structs();
my @vars = $self->vars();
my @local_vars = ();
if ($self->can("variables")) { @local_vars = $self->variables(); }
my @enums = $self->enums();
my @pDefines = $self->pDefines();
my @classes = $self->classes();
my @categories = $self->categories();
my @protocols = $self->protocols();
my @properties = $self->props();
my $prevignore = $HeaderDoc::ignore_apiuid_errors;
$HeaderDoc::ignore_apiuid_errors = 1;
my $junk = "";
if (@functions) { foreach my $obj (@functions) { $junk = $obj->apirefSetup();}}
if (@methods) { foreach my $obj (@methods) { $junk = $obj->apirefSetup();}}
if (@constants) { foreach my $obj (@constants) { $junk = $obj->apirefSetup();}}
if (@typedefs) { foreach my $obj (@typedefs) { $junk = $obj->apirefSetup();}}
if (@structs) { foreach my $obj (@structs) { $junk = $obj->apirefSetup();}}
if (@local_vars) { foreach my $obj (@local_vars) { $junk = $obj->apirefSetup();}}
if (@vars) { foreach my $obj (@vars) { $junk = $obj->apirefSetup();}}
if (@enums) { foreach my $obj (@enums) { $junk = $obj->apirefSetup();}}
if (@pDefines) { foreach my $obj (@pDefines) { $junk = $obj->apirefSetup();}}
if (@classes) { foreach my $obj (@classes) { $junk = $obj->apirefSetup(); $junk = $obj->docNavigatorComment(); $obj->setupAPIReferences(); }}
if (@categories) { foreach my $obj (@categories) { $junk = $obj->apirefSetup(); $junk = $obj->docNavigatorComment(); $obj->setupAPIReferences(); }}
if (@protocols) { foreach my $obj (@protocols) { $junk = $obj->apirefSetup(); $junk = $obj->docNavigatorComment(); $obj->setupAPIReferences(); }}
if (@properties) { foreach my $obj (@properties) { $junk = $obj->apirefSetup();}}
$HeaderDoc::ignore_apiuid_errors = $prevignore;
}
sub writeHeaderElements {
my $self = shift;
my $rootOutputDir = $self->outputDir();
my $functionsDir = $self->functionsDir();
my $methodsDir = $self->methodsDir();
my $dataTypesDir = $self->datatypesDir();
my $structsDir = $self->structsDir();
my $constantsDir = $self->constantsDir();
my $varsDir = $self->varsDir();
my $propsDir = $self->propsDir();
my $enumsDir = $self->enumsDir();
my $pDefinesDir = $self->pDefinesDir();
my $classesDir = $self->classesDir();
my $protocolsDir = $self->protocolsDir();
my $categoriesDir = $self->categoriesDir();
if (! -e $rootOutputDir) {
unless (mkdir ("$rootOutputDir", 0777)) {die ("Can't create output folder $rootOutputDir. \n$!");};
}
my $junk = "";
my @functions = $self->functions();
my @methods = $self->methods();
my @constants = $self->constants();
my @typedefs = $self->typedefs();
my @structs = $self->structs();
my @vars = $self->vars();
my @local_vars = ();
if ($self->can("variables")) { @local_vars = $self->variables(); }
my @enums = $self->enums();
my @pDefines = $self->pDefines();
my @classes = $self->classes();
my @properties = $self->props();
if (!$HeaderDoc::ClassAsComposite) {
if ($self->functions()) {
if (! -e $functionsDir) {
unless (mkdir ("$functionsDir", 0777)) {die ("Can't create output folder $functionsDir. \n$!");};
}
$self->writeFunctions();
}
if ($self->methods()) {
if (! -e $methodsDir) {
unless (mkdir ("$methodsDir", 0777)) {die ("Can't create output folder $methodsDir. \n$!");};
}
$self->writeMethods();
}
if ($self->constants()) {
if (! -e $constantsDir) {
unless (mkdir ("$constantsDir", 0777)) {die ("Can't create output folder $constantsDir. \n$!");};
}
$self->writeConstants();
}
if ($self->typedefs()) {
if (! -e $dataTypesDir) {
unless (mkdir ("$dataTypesDir", 0777)) {die ("Can't create output folder $dataTypesDir. \n$!");};
}
$self->writeTypedefs();
}
if ($self->structs()) {
if (! -e $structsDir) {
unless (mkdir ("$structsDir", 0777)) {die ("Can't create output folder $structsDir. \n$!");};
}
$self->writeStructs();
}
if ($self->props()) {
if (! -e $propsDir) {
unless (mkdir ("$propsDir", 0777)) {die ("Can't create output folder $propsDir. \n$!");};
}
$self->writeProps();
}
if ($self->vars()) {
if (! -e $varsDir) {
unless (mkdir ("$varsDir", 0777)) {die ("Can't create output folder $varsDir. \n$!");};
}
$self->writeVars();
}
if ($self->enums()) {
if (! -e $enumsDir) {
unless (mkdir ("$enumsDir", 0777)) {die ("Can't create output folder $enumsDir. \n$!");};
}
$self->writeEnums();
}
if ($self->pDefines()) {
if (! -e $pDefinesDir) {
unless (mkdir ("$pDefinesDir", 0777)) {die ("Can't create output folder $pDefinesDir. \n$!");};
}
$self->writePDefines();
}
}
if ($self->classes()) {
if (! -e $classesDir) {
unless (mkdir ("$classesDir", 0777)) {die ("Can't create output folder $classesDir. \n$!");};
}
$self->writeClasses();
}
if ($self->protocols()) {
if (! -e $protocolsDir) {
unless (mkdir ("$protocolsDir", 0777)) {die ("Can't create output folder $protocolsDir. \n$!\n");};
}
$self->writeProtocols();
}
if ($self->categories()) {
if (! -e $categoriesDir) {
unless (mkdir ("$categoriesDir", 0777)) {die ("Can't create output folder $categoriesDir. \n$!\n");};
}
$self->writeCategories();
}
}
sub writeHeaderElementsToDoxyFile
{
my $self = shift;
my $prespace = "";
my $class = ref($self);
my $doxyFilename = "doxytags.doxytagtemp";
my $rootOutputDir = $self->outputDir();
my $name = $self->name();
my $doxyFileString = "<tagfile>\n".$self->_getDoxyTagString($prespace." ")."</tagfile>\n";
my $outputFile = $rootOutputDir.$pathSeparator.$doxyFilename;
if (! -e $rootOutputDir) {
unless (mkdir ("$rootOutputDir", 0777)) {die ("Can't create output folder $rootOutputDir. $!");};
}
if ($self->use_stdout()) {
open(OUTFILE, ">&STDOUT");
} else {
open(OUTFILE, ">$outputFile") || die "Can't write $outputFile.\n";
}
print OUTFILE $doxyFileString;
close OUTFILE;
}
sub _getDoxyTagString {
my $self = shift;
my $prespace = shift;
my $name = $self->name();
my $doxykind = $self->getDoxyKind();
my $doxyFileString = "$prespace<compound kind=\"$doxykind\">\n";
$doxyFileString .= "$prespace<name>".$self->textToXML($self->rawname())."</name>\n";
if ($doxykind eq "file") {
$doxyFileString .= "$prespace<path>".$self->textToXML($self->fullpath())."</path>\n";
}
if ($self->checkShortLongAttributes("Superclass")) {
my $inherits = $self->textToXML($self->checkShortLongAttributes("Superclass"));
$inherits =~ s/\cA/,/sg;
$inherits =~ s/\s+/ /sg;
$inherits =~ s/^\s*//sg;
$inherits =~ s/\s*$//sg;
$doxyFileString .= "$prespace <inherits>".$inherits."</inherits>\n";
}
if ($self->checkShortLongAttributes("Implements Class")) {
$doxyFileString .= "$prespace <implements>".$self->textToXML($self->checkShortLongAttributes("Extends Class"))."</implements>\n";
}
if ($self->checkShortLongAttributes("Extends Class")) {
$doxyFileString .= "$prespace <extendsClass>".$self->textToXML($self->checkShortLongAttributes("Extends Class"))."</extendsClass>\n";
}
if ($self->checkShortLongAttributes("Extends Protocol")) {
$doxyFileString .= "$prespace <extendsProtocol>".$self->textToXML($self->checkShortLongAttributes("Extends Class"))."</extendsProtocol>\n";
}
my @objects = $self->classes();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->protocols();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->categories();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->functions();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->methods();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->constants();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->typedefs();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->structs();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->props();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->vars();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->enums();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
@objects = $self->pDefines();
foreach my $obj (@objects) {
$doxyFileString .= $obj->_getDoxyTagString($prespace." ");
}
$doxyFileString .= "$prespace</compound>\n";
return $doxyFileString;
}
sub writeHeaderElementsToManPage {
my $self = shift;
my $class = ref($self);
my $compositePageName = $self->filename();
my $localDebug = 0;
$compositePageName .= ".mxml";
my $rootOutputDir = $self->outputDir();
my $tempOutputDir = $rootOutputDir."/mantemp";
my $XMLPageString = $self->_getXMLPageString();
my $section = $HeaderDoc::man_section;
mkdir($tempOutputDir, 0777);
my $cwd = cwd();
chdir($tempOutputDir);
open(OUTFILE, "|/usr/bin/hdxml2manxml -M $section");
print OUTFILE $XMLPageString;
print STDERR "WROTE: $XMLPageString\n" if ($localDebug);
close(OUTFILE);
my @files = <*.mxml>;
foreach my $file (@files) {
system("/usr/bin/xml2man \"$file\"");
unlink($file);
}
chdir($cwd);
@files = <${tempOutputDir}/*>;
foreach my $file (@files) {
my $filename = basename($file);
print STDERR "RENAMING $file to $rootOutputDir/$filename\n" if ($localDebug);
rename($file, "$rootOutputDir/$filename");
}
rmdir("$tempOutputDir");
}
sub writeHeaderElementsToXMLPage { my $self = shift;
my $class = ref($self);
my $compositePageName = $self->filename();
$compositePageName .= ".xml";
my $rootOutputDir = $self->outputDir();
my $name = $self->textToXML($self->name());
my $XMLPageString = $self->_getXMLPageString();
my $outputFile = $rootOutputDir.$pathSeparator.$compositePageName;
if (!$self->use_stdout()) {
if (! -e $rootOutputDir) {
unless (mkdir ("$rootOutputDir", 0777)) {die ("Can't create output folder $rootOutputDir. $!");};
}
}
$self->_createXMLOutputFile($outputFile, xml_fixup_links($self, $XMLPageString), "$name");
}
sub writeHeaderElementsToCompositePage { my $self = shift;
my $class = ref($self);
my $compositePageName = $class->compositePageName();
my $rootOutputDir = $self->outputDir();
my $name = $self->name();
my $compositePageString = $self->_getCompositePageString();
my $outputFile = $rootOutputDir.$pathSeparator.$compositePageName;
if (! -e $rootOutputDir) {
unless (mkdir ("$rootOutputDir", 0777)) {die ("Can't create output folder $rootOutputDir. $!");};
}
my $processed_string = html_fixup_links($self, $compositePageString);
$self->_createHTMLOutputFile($outputFile, $processed_string, "$name", 1);
}
sub writeProtocols {
my $self = shift;
my @protocolObjs = $self->protocols();
my $protocolsRootDir = $self->protocolsDir();
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @protocolObjs;
} else {
@tempobjs = @protocolObjs;
}
foreach my $obj (@tempobjs) {
my $protocolName = $obj->name();
if (1 || $isMacOS) {$protocolName = &safeName(filename => $protocolName);};
$obj->outputDir("$protocolsRootDir$pathSeparator$protocolName");
$obj->createFramesetFile();
$obj->createContentFile() if (!$HeaderDoc::ClassAsComposite);
$obj->writeHeaderElementsToCompositePage();
$obj->createTOCFile();
$obj->writeHeaderElements();
}
}
sub writeCategories {
my $self = shift;
my @categoryObjs = $self->categories();
my $categoriesRootDir = $self->categoriesDir();
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @categoryObjs;
} else {
@tempobjs = @categoryObjs;
}
foreach my $obj (@tempobjs) {
my $categoryName = $obj->name();
if (1 || $isMacOS) {$categoryName = &safeName(filename => $categoryName);};
$obj->outputDir("$categoriesRootDir$pathSeparator$categoryName");
$obj->createFramesetFile();
$obj->createContentFile() if (!$HeaderDoc::ClassAsComposite);
$obj->writeHeaderElementsToCompositePage();
$obj->createTOCFile();
$obj->writeHeaderElements();
}
}
sub _getXMLPageString {
my $self = shift;
my $name = $self->name();
my $compositePageString;
my $contentString;
return $self->XMLdocumentationBlock(0);
}
sub _getCompositePageString {
my $self = shift;
my $name = $self->name();
my $compositePageString;
my $list_attributes = $self->getAttributeLists(1);
my $short_attributes = $self->getAttributes(0);
my $long_attributes = $self->getAttributes(1);
if (!$HeaderDoc::use_iframes) {
$compositePageString .= $self->compositePageAPIRef();
}
$compositePageString .= $self->documentationBlock();
my $firstsection = 1;
my $classEmbeddedTOC = $self->_getClassEmbeddedTOC(1);
my $groupDocString = $self->groupDoc("<h2 class=\"h2tight\" >Groups</h2>");
my $functionDocString = $self->_getFunctionDetailString(1);
my $methodDocString = $self->_getMethodDetailString(1);
my $constantDocString = $self->_getConstantDetailString(1);
my $typedefDocString = $self->_getTypedefDetailString(1);
my $structDocString = $self->_getStructDetailString(1);
my $propDocString = $self->_getPropDetailString(1);
my $varDocString = $self->_getVarDetailString(1);
my $enumDocString = $self->_getEnumDetailString(1);
my $defineDocString = $self->_getPDefineDetailString(1);
my $onlyClasses = 1;
if ($groupDocString || $functionDocString || $methodDocString ||
$constantDocString || $typedefDocString || $structDocString ||
$propDocString || $varDocString || $enumDocString ||
$defineDocString) {
$onlyClasses = 0;
}
if ((!$onlyClasses) || $classEmbeddedTOC) {
$compositePageString .= "<hr class=\"afterClassOrHeaderInfo\"><br>";
}
if (length($classEmbeddedTOC)) {
$compositePageString .= $classEmbeddedTOC;
if (!$onlyClasses) {
$compositePageString .= "<hr class=\"afterClassEmbeddedTOC\"><br>";
}
}
if (length($groupDocString)) {
$compositePageString .= $groupDocString;
}
if (length($functionDocString)) {
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $functionDocString;
}
if (length($methodDocString)) {
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $methodDocString;
}
if (length($constantDocString)) {
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $constantDocString;
}
if (length($typedefDocString)) {
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $typedefDocString;
}
if (length($structDocString)) {
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $structDocString;
}
if (length($propDocString)) {
my $class = ref($self) || $self;
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $propDocString;
}
if (length($varDocString)) {
my $class = ref($self) || $self;
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $varDocString;
}
if (length($enumDocString)) {
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $enumDocString;
}
if (length($defineDocString)) {
if (!$firstsection) { $compositePageString .= "<hr class=\"betweenSections\">\n"; }
$firstsection = 0;
$compositePageString .= $defineDocString;
}
return $compositePageString;
}
sub stripAppleRefs {
my $self = shift;
my $string = shift;
my $apiUIDPrefix = HeaderDoc::APIOwner->apiUIDPrefix();
$string =~ s|<a\s+name\s*=\s*\"//\Q$apiUIDPrefix\E/[^"]+?\">(.*?)<\s*/a\s*>|$1|g;
return $string;
}
sub compositePageAPIRef
{
my $self = shift;
my $name = $self->name();
my $uid = $self->compositePageAPIUID();
my $apiref = "<a name=\"$uid\" title=\"$name\"></a>\n";
return $apiref;
}
sub compositePageAPIUID
{
my $self = shift;
my $class = ref($self) || $self;
my $apiUIDPrefix = HeaderDoc::APIOwner->apiUIDPrefix();
my $type = "header";
SWITCH : {
($class eq "HeaderDoc::CPPClass") && do {
$type = "class";
};
($class eq "HeaderDoc::ObjCCategory") && do {
$type = "class";
};
($class eq "HeaderDoc::ObjCClass") && do {
$type = "class";
};
($class eq "HeaderDoc::ObjCContainer") && do {
$type = "class";
};
($class eq "HeaderDoc::ObjCProtocol") && do {
$type = "protocol";
};
}
my $shortname = $self->name();
if ($class eq "HeaderDoc::Header") {
$shortname = $self->filename();
$shortname =~ s/\.hdoc$//so;
}
$shortname = sanitize($shortname, 1);
if ($self->isFramework()) { $type = "framework"; }
my $apiuid = "//$apiUIDPrefix/doc/$type/$shortname";
my $requested = $self->requestedUID();
if ($requested) { return $requested; };
return $apiuid;
}
sub writeFunctions {
my $self = shift;
my $functionFile = $self->functionsDir().$pathSeparator."Functions.html";
my $class = ref($self) || $self;
my $funchead = "Functions";
if ($class ne "HeaderDoc::Header") {
$funchead = "Member Functions";
}
$self->_createHTMLOutputFile($functionFile, $self->_getFunctionDetailString(0), $funchead, 0);
}
sub _getFunctionDetailString {
my $self = shift;
my $composite = shift;
my @funcObjs = $self->functions();
my $contentString = "";
my $class = ref($self) || $self;
my $funchead = "Functions";
if ($class ne "HeaderDoc::Header") {
$funchead = "Member Functions";
}
$contentString .= $self->_getDetailString(\@funcObjs, $composite, "functions", $funchead);
return $contentString;
}
sub _getFunctionXMLDetailString {
my $self = shift;
my @funcObjs = $self->functions();
my $contentString = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @funcObjs;
} else {
@tempobjs = @funcObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub _getClassXMLDetailString {
my $self = shift;
my @classObjs = $self->classes();
my $contentString = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @classObjs;
} else {
@tempobjs = @classObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub _getCategoryXMLDetailString {
my $self = shift;
my @classObjs = $self->categories();
my $contentString = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @classObjs;
} else {
@tempobjs = @classObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub _getProtocolXMLDetailString {
my $self = shift;
my @classObjs = $self->protocols();
my $contentString = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @classObjs;
} else {
@tempobjs = @classObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writeMethods {
my $self = shift;
my $methodFile = $self->methodsDir().$pathSeparator."Methods.html";
$self->_createHTMLOutputFile($methodFile, $self->_getMethodDetailString(0), "Methods", 0);
}
sub _getEmbeddedTOC
{
my $self = shift;
my $listref = shift;
my $typeFile = shift;
my $tag = shift;
my $displaytype = shift;
my $compositePage = shift;
my $includeObjectName = shift;
my $group_mode = 0;
if (@_) {
$group_mode = shift;
}
my $localDebug = 0;
print STDERR "CPAGE: $compositePage\n" if ($localDebug);
my @objlist = @{ $listref };
my $eTOCString = "";
my $class = ref($self) || $self;
my $compositePageName = $self->compositePageName();
my $processed_tag = $tag;
$processed_tag =~ s/\s//sg;
$processed_tag = lc($processed_tag);
if (!$group_mode) {
$eTOCString .= "<a name=\"HeaderDoc_$processed_tag\"></a>\n";
}
if ($includeObjectName) {
$eTOCString .= "<h2 class=\"h2tight\">$displaytype</h2>\n";
}
print STDERR "My class is $class\n" if ($localDebug);
if (!scalar(@objlist)) {
print STDERR "empty objlist\n" if ($localDebug);
return "";
}
$eTOCString .= "<dl>\n";
foreach my $obj (@objlist) {
if ($obj->isInternal() && !$HeaderDoc::document_internal) { next; }
my $name = $obj->name();
my $abstract = $obj->abstract();
my $url = "";
my $target = "doc";
my $composite = $HeaderDoc::ClassAsComposite;
if ($compositePage && !$composite) { $composite = 1; $target = "_top"; }
if ($obj->isAPIOwner()) {
$target = "_top";
$composite = 0;
}
if ($HeaderDoc::use_iframes) {
$target = "_top";
}
my $safeName = $name;
$safeName = &safeName(filename => $name);
my $urlname = $obj->apiuid(); if ($composite && !$HeaderDoc::ClassAsComposite) {
$urlname = $obj->compositePageUID();
}
if (($includeObjectName == 1) && $composite) {
$url = "$typeFile/$safeName/$compositePageName#$urlname";
} elsif ($includeObjectName == 1) {
$url = "$typeFile/$safeName/index.html#$urlname";
} elsif ($composite) {
$url = "$compositePageName#$urlname"
} else {
$url = "$typeFile#$urlname"
}
my $parentclass = $obj->origClass();
if (length($parentclass)) { $parentclass .= "::"; }
if ($self->CClass()) {
$parentclass = "";
}
my $objclass = ref($obj) || $obj;
if ($obj =~ /HeaderDoc::Method/) {
if ($obj->isInstanceMethod() eq "YES") {
$parentclass = "-";
} else {
$parentclass = "+";
}
}
$eTOCString .= "<dt><tt>";
if (!$group_mode) {
$eTOCString .= "<a href=\"$url\" target=\"$target\">$parentclass$name</a>";
} else {
$eTOCString .= "<!-- a logicalPath=\"".$obj->apiuid()."\" target=\"$target\" machineGenerated=\"true\" -->$parentclass$name<!-- /a -->";
}
$eTOCString .= "</tt></dt>\n";
$eTOCString .= "<dd>$abstract</dd>\n";
}
$eTOCString .= "</dl>\n";
print STDERR "etoc: $eTOCString\n" if ($localDebug);
return $eTOCString;
}
sub _getClassEmbeddedTOC
{
my $self = shift;
my $composite = shift;
my @possclasses = $self->classes();
my @protocols = $self->protocols();
my @categories = $self->categories();
my $localDebug = 0;
my $retval = "";
print STDERR "getClassEmbeddedTOC: processing ".$self->name()."\n" if ($localDebug);
my @classes = ();
my @comints = ();
foreach my $class (@possclasses) {
if ($class->isCOMInterface()) {
push(@comints, $class);
} else {
push(@classes, $class);
}
}
if (scalar(@classes)) {
print STDERR "getClassEmbeddedTOC: classes found.\n" if ($localDebug);
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @classes;
} else {
@tempobjs = @classes;
}
if ($localDebug) {
foreach my $item(@tempobjs) {
print STDERR "TO: $item : ".$item->name()."\n";
}
}
$retval .= $self->_getEmbeddedTOC(\@tempobjs, "Classes", "classes", "Classes", $composite, 1);
}
if (scalar(@comints)) {
print STDERR "getClassEmbeddedTOC: comints found.\n" if ($localDebug);
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @comints;
} else {
@tempobjs = @comints;
}
if ($localDebug) {
foreach my $item(@tempobjs) {
print STDERR "TO: $item : ".$item->name()."\n";
}
}
$retval .= $self->_getEmbeddedTOC(\@tempobjs, "Classes", "classes", "C Pseudoclasses", $composite, 1);
}
if (scalar(@protocols)) {
print STDERR "getClassEmbeddedTOC: protocols found.\n" if ($localDebug);
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @protocols;
} else {
@tempobjs = @protocols;
}
if ($localDebug) {
foreach my $item(@tempobjs) {
print STDERR "TO: $item : ".$item->name()."\n";
}
}
$retval .= $self->_getEmbeddedTOC(\@tempobjs, "Protocols", "protocols", "Protocols", $composite, 1);
}
if (scalar(@categories)) {
print STDERR "getClassEmbeddedTOC: categories found.\n" if ($localDebug);
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @categories;
} else {
@tempobjs = @categories;
}
if ($localDebug) {
foreach my $item(@tempobjs) {
print STDERR "TO: $item : ".$item->name()."\n";
}
}
$retval .= $self->_getEmbeddedTOC(\@tempobjs, "Categories", "categories", "Categories", $composite, 1);
}
print STDERR "eClassTOC = $retval\n" if ($localDebug);
return $retval;
}
sub _getMethodDetailString {
my $self = shift;
my $composite = shift;
my @methObjs = $self->methods();
my $contentString = "";
my $localDebug = 0;
$contentString .= $self->_getDetailString(\@methObjs, $composite, "methods", "Methods");
return $contentString;
}
sub _getMethodXMLDetailString {
my $self = shift;
my @methObjs = $self->methods();
my $contentString = "";
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @methObjs;
} else {
@tempobjs = @methObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writeConstants {
my $self = shift;
my $constantsFile = $self->constantsDir().$pathSeparator."Constants.html";
$self->_createHTMLOutputFile($constantsFile, $self->_getConstantDetailString(0), "Constants", 0);
}
sub _getConstantDetailString {
my $self = shift;
my $composite = shift;
my @constantObjs = $self->constants();
my $contentString;
return $self->_getDetailString(\@constantObjs, $composite, "constants", "Constants");
}
sub _getConstantXMLDetailString {
my $self = shift;
my @constantObjs = $self->constants();
my $contentString;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @constantObjs;
} else {
@tempobjs = @constantObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writeTypedefs {
my $self = shift;
my $typedefsFile = $self->datatypesDir().$pathSeparator."DataTypes.html";
$self->_createHTMLOutputFile($typedefsFile, $self->_getTypedefDetailString(0), "Defined Types", 0);
}
sub _getTypedefDetailString {
my $self = shift;
my $composite = shift;
my @typedefObjs = $self->typedefs();
my $contentString;
return $self->_getDetailString(\@typedefObjs, $composite, "DataTypes", "Typedefs");
}
sub _getTypedefXMLDetailString {
my $self = shift;
my @typedefObjs = $self->typedefs();
my $contentString;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @typedefObjs;
} else {
@tempobjs = @typedefObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writeStructs {
my $self = shift;
my $structsFile = $self->structsDir().$pathSeparator."Structs.html";
$self->_createHTMLOutputFile($structsFile, $self->_getStructDetailString(0), "Structs", 0);
}
sub _getStructDetailString {
my $self = shift;
my $composite = shift;
my @structObjs = $self->structs();
my $contentString;
return $self->_getDetailString(\@structObjs, $composite, "structs", "Structs and Unions");
}
sub _getStructXMLDetailString {
my $self = shift;
my @structObjs = $self->structs();
my $contentString;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @structObjs;
} else {
@tempobjs = @structObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writeVars {
my $self = shift;
my $class = ref($self) || $self;
my $globalname = "Globals";
if ($class ne "HeaderDoc::Header") {
$globalname = "Member Data";
}
my $varsFile = $self->varsDir().$pathSeparator."Vars.html";
$self->_createHTMLOutputFile($varsFile, $self->_getVarDetailString(0), "$globalname", 0);
}
sub writeProps {
my $self = shift;
my $propsFile = $self->propsDir().$pathSeparator."Properties.html";
$self->_createHTMLOutputFile($propsFile, $self->_getPropDetailString(0), "Properties", 0);
}
sub _getPropDetailString {
my $self = shift;
my $composite = shift;
my @propObjs = $self->props();
return $self->_getDetailString(\@propObjs, $composite, "props", "Properties");
}
sub _getVarDetailString {
my $self = shift;
my $composite = shift;
my @varObjs = $self->vars();
my $globalname = "Globals";
my $class = ref($self) || $self;
if ($class ne "HeaderDoc::Header") {
$globalname = "Member Data";
}
return $self->_getDetailString(\@varObjs, $composite, "vars", $globalname);
}
sub _getPropXMLDetailString {
my $self = shift;
my @propObjs = $self->props();
my $contentString;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @propObjs;
} else {
@tempobjs = @propObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub _getVarXMLDetailString {
my $self = shift;
my @varObjs = $self->vars();
my $contentString;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @varObjs;
} else {
@tempobjs = @varObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writeEnums {
my $self = shift;
my $enumsFile = $self->enumsDir().$pathSeparator."Enums.html";
$self->_createHTMLOutputFile($enumsFile, $self->_getEnumDetailString(0), "Enumerations", 0);
}
sub _getEnumDetailString {
my $self = shift;
my $composite = shift;
my @enumObjs = $self->enums();
my $contentString;
return $self->_getDetailString(\@enumObjs, $composite, "enums", "Enumerated Types");
}
sub _getEnumXMLDetailString {
my $self = shift;
my @enumObjs = $self->enums();
my $contentString;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @enumObjs;
} else {
@tempobjs = @enumObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writePDefines {
my $self = shift;
my $pDefinesFile = $self->pDefinesDir().$pathSeparator."PDefines.html";
$self->_createHTMLOutputFile($pDefinesFile, $self->_getPDefineDetailString(0), "#defines", 0);
}
sub _getPDefineDetailString {
my $self = shift;
my $composite = shift;
my @ALLpDefineObjs = $self->pDefines();
my $contentString;
my @pDefineObjs = ();
foreach my $define (@ALLpDefineObjs) {
if (!$define->parseOnly()) {
push(@pDefineObjs, $define);
}
}
return $self->_getDetailString(\@pDefineObjs, $composite, "PDefines", "Macro Definitions");
}
sub _getDetailString
{
my $self = shift;
my $arrayref = shift;
my $composite = shift;
my $type = shift;
my $displaytype = shift;
my @objs = @{$arrayref};
my $contentString = "";
my $count = @objs;
if (!$count) { return ""; }
my @tempobjs;
if (!$self->unsorted()) {
@tempobjs = sort objName @objs;
} else {
@tempobjs = @objs;
}
$contentString .= $self->_getEmbeddedTOC(\@tempobjs, ucfirst($type).".html", $type, $displaytype, $composite, 2);
my %groups = ( "" => "" );
if ($HeaderDoc::groupright) {
foreach my $obj (@objs) {
my $group = $obj->group();
if (length($group)) {
$groups{$group} = $group;
}
}
}
foreach my $group (keys %groups) {
if ($HeaderDoc::groupright) {
my $show = 1;
my $tempgroup = $group;
if (!length($group)) { $tempgroup = "Untagged"; $show = 0; }
$contentString .= "<a name=\"".$type."_group_".$tempgroup."\"></a>\n";
$contentString .= "<h2 class=\"h2tight\"><i>$tempgroup $displaytype</i></h2>\n";
$contentString .= "<div class='group_indent'>\n";
}
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @objs;
} else {
@tempobjs = @objs;
}
foreach my $obj (@tempobjs) {
if (!$HeaderDoc::groupright || ($obj->group() eq $group)) {
my $documentationBlock = $obj->documentationBlock($composite);
$contentString .= $documentationBlock;
}
}
if ($HeaderDoc::groupright) {
$contentString .= "</div>\n";
}
}
return $contentString;
}
sub _getPDefineXMLDetailString {
my $self = shift;
my @pDefineObjs = $self->pDefines();
my $contentString;
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @pDefineObjs;
} else {
@tempobjs = @pDefineObjs;
}
foreach my $obj (@tempobjs) {
my $documentationBlock = $obj->XMLdocumentationBlock();
$contentString .= $documentationBlock;
}
return $contentString;
}
sub writeClasses {
my $self = shift;
my @classObjs = $self->classes();
my $classRootDir = $self->classesDir();
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @classObjs;
} else {
@tempobjs = @classObjs;
}
foreach my $obj (@tempobjs) {
my $className = $obj->name();
if (1 || $isMacOS) {$className = &safeName(filename => $className);};
my $classclass = ref($obj) || $obj;
if ($classclass eq "HeaderDoc::CPPClass") {
$obj->fixupTypeRequests();
}
$obj->outputDir("$classRootDir$pathSeparator$className");
$obj->createFramesetFile();
$obj->createTOCFile();
$obj->writeHeaderElements();
$obj->writeHeaderElementsToCompositePage();
$obj->createContentFile() if (!$HeaderDoc::ClassAsComposite);
}
}
sub _createXMLOutputFile {
my $self = shift;
my $class = ref($self);
my $outputFile = shift;
my $orig_fileString = shift;
my $heading = shift;
my $fullpath = $self->fullpath();
my $HTMLmeta = "";
$HTMLmeta = $self->HTMLmeta();
calcDepth($outputFile);
my $fileString = $self->xml_fixup_links($orig_fileString);
if ($self->use_stdout()) {
open(OUTFILE, ">&STDOUT");
} else {
open(OUTFILE, ">$outputFile") || die "Can't write $outputFile.\n";
}
if ($^O =~ /MacOS/io) {MacPerl::SetFileInfo('MSIE', 'TEXT', "$outputFile");};
my $encoding = $self->encoding();
if ($encoding eq "utf8") { $encoding = "UTF-8"; }
print OUTFILE "<?xml version=\"1.0\" encoding=\"$encoding\"?>\n";
my $doctype = "header";
if ($self->isFramework()) {
$doctype = "framework";
}
print OUTFILE "<!DOCTYPE $doctype PUBLIC \"-//Apple Computer//DTD HEADERDOC 1.2//EN\" \"/System/Library/DTDs/HeaderDoc-1.2.dtd\">\n";
print OUTFILE $fileString;
close OUTFILE;
}
sub _createHTMLOutputFile {
my $self = shift;
my $class = ref($self);
my $copyrightOwner = $class->copyrightOwner();
my $outputFile = shift;
my $orig_fileString = shift;
my $heading = shift;
my $includeDocNavComment = shift;
my $newTOC = $HeaderDoc::newTOC;
if ($class eq "HeaderDoc::Header") {
my $headercopyright = $self->headerCopyrightOwner();
if (!($headercopyright eq "")) {
$copyrightOwner = $headercopyright;
}
}
my $HTMLmeta = "";
$HTMLmeta = $self->HTMLmeta();
calcDepth($outputFile);
my $fileString = html_fixup_links($self, $orig_fileString);
open(OUTFILE, ">$outputFile") || die "Can't write $outputFile.\n";
if ($^O =~ /MacOS/io) {MacPerl::SetFileInfo('MSIE', 'TEXT', "$outputFile");};
print OUTFILE "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n \"http://www.w3.org/TR/1998/REC-html40-19980424/loose.dtd\">\n";
print OUTFILE "<html>";
print OUTFILE "<head>\n <title>$heading</title>\n $HTMLmeta <meta name=\"generator\" content=\"HeaderDoc\" />\n<meta name=\"xcode-display\" content=\"render\" />\n";
if ($HeaderDoc::use_iframes || $HeaderDoc::newTOC == 5) {
if (!$HeaderDoc::suppressDefaultStyles) {
print OUTFILE "<style><!--\n";
if ($HeaderDoc::newTOC == 5) {
print OUTFILE ".toc_contents_text {\n";
print OUTFILE " padding-left: 1em;\n";
print OUTFILE " text-indent: -1em;\n";
print OUTFILE "}\n";
print OUTFILE "\n";
print OUTFILE "ul.tocSubEntryList li.tocSubEntry {\n";
print OUTFILE " list-style: none;\n";
print OUTFILE "}\n";
print OUTFILE "\n";
print OUTFILE "#colorbox {\n";
print OUTFILE " display: none;\n";
print OUTFILE "}\n";
print OUTFILE ".spec_sheet_line {\n";
print OUTFILE " margin-bottom: 1px;\n";
print OUTFILE "}\n";
print OUTFILE ".collapsible {\n";
print OUTFILE " display: none;\n";
print OUTFILE "}\n";
print OUTFILE ".toc_leadspace {\n";
print OUTFILE " width: 10; min-width: 10;\n";
print OUTFILE "}\n";
print OUTFILE ".disclosure_triangle_td {\n";
print OUTFILE " width: 14; min-width: 14;\n";
print OUTFILE " font-size: 10px;\n";
print OUTFILE " vertical-align: middle;\n";
print OUTFILE "}\n";
print OUTFILE ".specbox td {\n";
print OUTFILE " font-size: 13px;\n";
print OUTFILE "}\n";
print OUTFILE ".specbox td a {\n";
print OUTFILE " font-size: 13px;\n";
print OUTFILE "}\n";
print OUTFILE ".specbox td code {\n";
print OUTFILE " font-size: 13px;\n";
print OUTFILE "}\n";
print OUTFILE ".specbox td tt {\n";
print OUTFILE " font-size: 13px;\n";
print OUTFILE "}\n";
print OUTFILE ".specbox td pre {\n";
print OUTFILE " font-size: 13px;\n";
print OUTFILE "}\n";
print OUTFILE ".specbox a {\n";
print OUTFILE " font-size: 12px;\n";
print OUTFILE "}\n";
print OUTFILE ".disclosure_triangle_td a:hover {\n";
print OUTFILE " text-decoration: none;\n";
print OUTFILE "}\n";
print OUTFILE ".disclosure_triangle_td a:hover {\n";
print OUTFILE " text-decoration: none;\n";
print OUTFILE "}\n";
print OUTFILE ".hd_toc_box {\n";
print OUTFILE " padding-top: 10px;\n";
print OUTFILE " padding-right: 15px;\n";
print OUTFILE "}";
print OUTFILE ".tocSeparator {\n";
print OUTFILE " margin-top: 15px;\n";
print OUTFILE " padding-bottom: 0px;\n";
print OUTFILE " margin-bottom: 0px;\n";
print OUTFILE "}\n";
print OUTFILE ".tocSubEntryList {\n";
print OUTFILE " margin-left: 0px;\n";
print OUTFILE " padding-left: 40px;\n";
print OUTFILE " padding-top: 0px;\n";
print OUTFILE " margin-top: 2px;\n";
print OUTFILE " padding-bottom: 0px;\n";
print OUTFILE " margin-bottom: 8px;\n";
print OUTFILE "}\n";
print OUTFILE ".hd_toc_heading_table {\n";
print OUTFILE " margin-top: 2px;\n";
print OUTFILE " margin-bottom: 2px;\n";
print OUTFILE "}\n";
print OUTFILE ".hd_toc_entry_table {\n";
print OUTFILE " margin-top: 2px;\n";
print OUTFILE " margin-bottom: 2px;\n";
print OUTFILE "}\n";
print OUTFILE ".tocSubEntry {\n";
print OUTFILE " margin-left: 0px;\n";
print OUTFILE " padding-left: 0px;\n";
print OUTFILE " margin-top: 0px;\n";
print OUTFILE " margin-bottom: 1px;\n";
print OUTFILE "}\n";
print OUTFILE ".tocSubEntry a {\n";
print OUTFILE " font-size: 10pt;\n";
print OUTFILE "}\n";
print OUTFILE ".tocSubheading {\n";
print OUTFILE " padding-left: 14px;\n"; print OUTFILE " margin-left: 0px;\n";
print OUTFILE " margin-top: 5px;\n";
print OUTFILE " padding-top: 0px;\n";
print OUTFILE " font-size: 16px;\n";
print OUTFILE " color: #808080;\n";
print OUTFILE "}\n";
print OUTFILE "\n";
}
print OUTFILE "#tocMenu {\n";
if ($HeaderDoc::newTOC == 5) {
print OUTFILE " border-right: 1px solid #c0c0c0;\n";
print OUTFILE " background-color: #f4f4ff;\n";
} else {
print OUTFILE " display: block;\n";
print OUTFILE " position:fixed;\n";
print OUTFILE " background:transparent;\n";
}
print OUTFILE " top:0px;\n";
print OUTFILE " left:0px;\n";
print OUTFILE " width:230px;\n";
print OUTFILE " height:100%;\n";
print OUTFILE "}\n";
if ($HeaderDoc::newTOC == 5) {
print OUTFILE "#bodyContents {\n";
print OUTFILE " width: auto;\n";
print OUTFILE " padding-left: 15px;\n";
} else {
print OUTFILE "#bodyText {\n";
print OUTFILE " top: 0px;\n";
print OUTFILE " margin-left: 230px;\n";
}
print OUTFILE "}\n";
print OUTFILE "--></style>\n";
}
if (!$HeaderDoc::suppressDefaultJavaScript) {
if ($newTOC && $newTOC != 5) {
print OUTFILE "<meta id=\"toc-file\" name=\"toc-file\" content=\"toc.html\" />\n";
if ($newTOC == 2 || $newTOC == 3) {
my $squoname = $self->name();
$squoname =~ s/'/'+"'"+'/sg;
if ($newTOC == 3) {
print OUTFILE "<meta name='book-json' content='book.js' id='book-json'>\n";
print OUTFILE "<meta id='book-resource-type' name='book-resource-type' content='Reference'>\n";
print OUTFILE "<meta id='book-root' name='book-root' content='./'/>\n";
}
print OUTFILE " <script id='prototype_js' type=\"text/javascript\" src=\"/Resources/JavaScript/lib/prototype.js\"></script>\n";
print OUTFILE " <script type=\"text/javascript\" src=\"/Resources/JavaScript/lib/scriptaculous.js?load=effects\"></script>\n";
print OUTFILE " <script type=\"text/javascript\" src=\"/Resources/JavaScript/lib/event_mixins.js\"></script>\n";
print OUTFILE " <script type=\"text/javascript\" src=\"/Resources/JavaScript/lib/browserdetect.js\"></script>\n";
print OUTFILE " <script type=\"text/javascript\" src=\"/Resources/JavaScript/lib/ac_media.js\"></script>\n";
if ($newTOC == 2) {
print OUTFILE " <script language=\"JavaScript\" src=\"/Resources/JavaScript/page.js\" type=\"text/javascript\"></script>\n";
}
print OUTFILE " <script type=\"text/javascript\">\n";
if ($newTOC == 2 || $newTOC == 3) {
print OUTFILE "function getResourcesPath_HD() {\n";
print OUTFILE " var uri = document.getElementById('prototype_js').getAttribute('src');\n";
print OUTFILE " uri = uri.substr(0, uri.indexOf('/JavaScript/'));\n";
print OUTFILE " return uri;\n";
print OUTFILE "}\n";
print OUTFILE " var Book={\n";
print OUTFILE " isReference: true,\n";
print OUTFILE " language: document.getElementsByTagName('html')[0].getAttribute('xml:lang'),\n";
print OUTFILE " resourcesURI: getResourcesPath_HD(),\n";
print OUTFILE " tocURI: './toc.html',\n";
print OUTFILE " bookTitle: '".$squoname."',\n";
print OUTFILE " indexTitle: '".$squoname."',\n";
print OUTFILE " indexURI: './index.html',\n";
print OUTFILE " nextPage: '',\n";
print OUTFILE " previousPage: ''\n";
print OUTFILE " };\n";
print OUTFILE "\n";
}
if ($newTOC == 2 || $newTOC == 3) {
print OUTFILE "function delete_styles()\n";
print OUTFILE "{\n";
print OUTFILE " var elt = document.getElementById('breadcrumbsrc');\n";
print OUTFILE " var elt_b = document.getElementById('breadcrumbs');\n";
print OUTFILE " if (elt && elt_b) {\n";
print OUTFILE " elt_b.innerHTML = elt.innerHTML;\n";
print OUTFILE " }\n";
print OUTFILE "\n";
print OUTFILE " if (!document.styleSheets) { return; }\n";
print OUTFILE " for (var i=0; i<document.styleSheets.length; i++) {\n";
print OUTFILE " var stylesheet = document.styleSheets[i];\n";
print OUTFILE " if (stylesheet.href && stylesheet.href.indexOf('static.css') != -1) {\n";
print OUTFILE " stylesheet.disabled = 1;\n";
print OUTFILE " }\n";
print OUTFILE " }\n";
print OUTFILE "}\n";
}
if ($newTOC == 3) {
print OUTFILE " var Page={\n";
print OUTFILE " type: \"Reference\",\n";
print OUTFILE " language: document.getElementsByTagName('html')[0].getAttribute('xml:lang'),\n";
# print OUTFILE " resourcesURI: '/Resources',\n";
print OUTFILE " resourcesURI: getResourcesPath_HD(),\n";
print OUTFILE " tocURI: './book.js',\n";
print OUTFILE " indexTitle: '$squoname',\n";
print OUTFILE " indexURI: './index.html',\n";
print OUTFILE " nextPage: '',\n";
print OUTFILE " previousPage: '',\n";
print OUTFILE " root : \$('INDEX') ? \$('INDEX').href.slice(0, \$('INDEX').href.lastIndexOf('/')) + '/': \"\"\n";
print OUTFILE " };\n";
}
print OUTFILE " </script>\n";
print OUTFILE " <script type=\"text/javascript\" src=\"/Resources/JavaScript/devpubs.js\"></script>\n";
print OUTFILE " <script type=\"text/javascript\" src=\"/Resources/JavaScript/header_toc.js\"></script>\n";
print OUTFILE " <script type=\"text/javascript\" src=\"/Resources/JavaScript/pedia.js\"></script>\n";
}
} else {
print OUTFILE "<script language=\"JavaScript\" type=\"text/javascript\"><!--\n";
if ($HeaderDoc::newTOC == 5) {
print OUTFILE "function getNewHTTPObject()\n";
print OUTFILE "{\n";
print OUTFILE " var xmlhttp;\n";
print OUTFILE "\n";
print OUTFILE " /** Special IE only code ... */\n";
print OUTFILE " /*\@cc_on\n";
print OUTFILE " \@if (\@_jscript_version >= 5)\n";
print OUTFILE " try\n";
print OUTFILE " {\n";
print OUTFILE " xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');\n";
print OUTFILE " }\n";
print OUTFILE " catch (e)\n";
print OUTFILE " {\n";
print OUTFILE " try\n";
print OUTFILE " {\n";
print OUTFILE " xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');\n";
print OUTFILE " }\n";
print OUTFILE " catch (E)\n";
print OUTFILE " {\n";
print OUTFILE " xmlhttp = false;\n";
print OUTFILE " }\n";
print OUTFILE " }\n";
print OUTFILE " \@else\n";
print OUTFILE " xmlhttp = false;\n";
print OUTFILE " \@end \@*/\n";
print OUTFILE "\n";
print OUTFILE " /** Every other browser on the planet */\n";
print OUTFILE " if (!xmlhttp && typeof XMLHttpRequest != 'undefined')\n";
print OUTFILE " {\n";
print OUTFILE " try\n";
print OUTFILE " {\n";
print OUTFILE " xmlhttp = new XMLHttpRequest();\n";
print OUTFILE " }\n";
print OUTFILE " catch (e)\n";
print OUTFILE " {\n";
print OUTFILE " xmlhttp = false;\n";
print OUTFILE " }\n";
print OUTFILE " }\n";
print OUTFILE "\n";
print OUTFILE " return xmlhttp;\n";
print OUTFILE "}\n";
}
print OUTFILE "\n";
print OUTFILE "function hidetoc() {\n";
if ($HeaderDoc::newTOC == 5) {
print OUTFILE " var toc = document.getElementById('tocMenu');\n";
print OUTFILE " var src = toc.getAttribute('src');\n";
print OUTFILE " var xhr = getNewHTTPObject();\n";
print OUTFILE " xhr.open('GET', src, true);\n";
print OUTFILE " xhr.onreadystatechange = function() {\n";
print OUTFILE " if(xhr.readyState == 4) {\n";
print OUTFILE " var toc = document.getElementById('tocMenu');\n";
print OUTFILE " toc.innerHTML = xhr.responseText;\n";
# print OUTFILE " } else {\n";
# print OUTFILE " alert('RS: '+xhr.readyState+' STATUS: '+xhr.status);\n";
print OUTFILE " }\n";
print OUTFILE " }\n";
print OUTFILE " xhr.send(null);\n";
}
print OUTFILE " var origURL = parent.document.URL;\n";
print OUTFILE " var contentURL = origURL.substring(origURL.indexOf('?')+1, origURL.length);\n";
print OUTFILE " if (contentURL.length == origURL.length) {\n";
print OUTFILE " jumpPos = origURL.substring(origURL.indexOf(' print OUTFILE " }\n";
print OUTFILE " if (contentURL == \"hidetoc\") {\n";
if ($HeaderDoc::newTOC == 5) {
print OUTFILE " var body = document.getElementById('bodyContents');\n";
} else {
print OUTFILE " var body = document.getElementById('bodyText');\n";
}
print OUTFILE " if (toc && body) {\n";
print OUTFILE " toc.style.display = 'none';\n";
print OUTFILE " body.style.marginLeft = '0px';\n";
print OUTFILE " }\n";
print OUTFILE " }\n";
print OUTFILE "}\n";
print OUTFILE "\n";
print OUTFILE "function disclosure_triangle(elt) {\n";
print OUTFILE " var linkelt = elt;\n";
print OUTFILE " while (elt && elt.tagName != 'TABLE') { elt = elt.parentNode;}\n";
print OUTFILE " if (!elt) { return; }\n";
print OUTFILE " while (elt && elt.tagName != 'DIV') { elt = elt.nextSibling;}\n";
print OUTFILE " if (!elt) { return; }\n";
print OUTFILE " if (parseInt(linkelt.getAttribute('state'))) {\n";
print OUTFILE " // It's open. Close it\n";
print OUTFILE " linkelt.innerHTML = '▷';\n";
print OUTFILE " linkelt.setAttribute('state', 0);\n";
print OUTFILE " linkelt.setAttribute('class', 'closed_disclosure_triangle');\n";
print OUTFILE " elt.style.display = 'none';\n";
print OUTFILE " } else {\n";
print OUTFILE " // It's closed. Open it\n";
print OUTFILE " linkelt.innerHTML = '▼';\n";
print OUTFILE " linkelt.setAttribute('state', 1);\n";
print OUTFILE " linkelt.setAttribute('class', 'open_disclosure_triangle');\n";
print OUTFILE " elt.style.display = 'block';\n";
print OUTFILE " }\n";
print OUTFILE "}\n";
print OUTFILE "--></script>\n";
}
}
}
print OUTFILE $self->styleSheet(0);
my $onload = "";
if ($HeaderDoc::use_iframes) {
if ($newTOC == 1) {
$onload = "onload=\"initialize_page();\"";
} elsif ((!$newTOC) || $newTOC == 5) {
$onload = "onload=\"hidetoc();\"";
}
}
my $style = "";
if ($HeaderDoc::newTOC == 2 || $HeaderDoc::newTOC == 3) {
$style = "class=\"hasjs\"";
$onload = "onload=\"delete_styles();\"";
}
print OUTFILE "</head><body bgcolor=\"#ffffff\" $onload $style>\n";
if ($HeaderDoc::use_iframes && $includeDocNavComment) {
my $docNavigatorComment = $self->docNavigatorComment();
print OUTFILE $docNavigatorComment;
}
my $tocString = "";
if ($newTOC == 2 || $newTOC == 3) {
$tocString = $self->tocString($newTOC);
my $heading = "";
if ($newTOC == 2) {
$heading .= <<FOO
<div id="adcHeader" class="hideOnPrint hideInXcode">
<script src="http://devimages.apple.com/assets/scripts/browserdetect.js" type="text/javascript" charset="utf-8"></script>
<script src="http://devimages.apple.com/assets/scripts/apple_core.js" type="text/javascript" charset="utf-8"></script>
<script src="http://devimages.apple.com/assets/scripts/search_decorator.js" type="text/javascript" charset="utf-8"></script>
<script src="http://devimages.apple.com/assets/scripts/adc_core.js" type="text/javascript" charset="utf-8"></script>
<div style='height:36px; background-image: url(\"/Resources/includes/header_sm_mid.png\");'>
<a href='/mac/library/navigation/index.html'><img src='/Resources/includes/mac_header_sm_left.png' alt="Mac OS X Reference Library" height='36' width='264' style='border:none'></a>
<a href='/'><img src='/Resources/includes/developer_header_sm.png' alt="Apple Developer Connection" height='36' width='179' style='position:absolute; right:60px; border:none'></a>
<img id='adc_search' src='/Resources/includes/header_sm_search.png' alt="spyglass button" height='36' width='60' style='position:absolute; right:0px; border:none' />
</div>
FOO
;
} else {
$heading .= <<FOO
<div id="adcHeader" class="hideOnPrint hideInXcode" tabindex="1">
<!--</div>
FOO
;
}
$heading .= <<FOO
<form id='search_menu' method='get' action='/mac/search/search.php' accept-charset='utf-8' style='display: none; background-image: url("/Resources/includes/search_panel.png"); height:45px; width:220px; position:absolute; top: 35px; right: 0px; z-index: 100000;-webkit-box-shadow: rgba(0, 0, 0, .25) -4px 4px 4px; padding: 14px'>
<input type="hidden" name="simp" value="1"/>
<input type="hidden" name="num" value="10"/>
<input type="hidden" name="site" value="mac"/>
<label>Search Mac Reference Library</label>
<label for='gh-adcsearch'>
<input class='adcsearch prettysearch' type='search' id='gh-adcsearch' name='q' accesskey='s' results='5' /></label>
</form>
FOO
;
if ($newTOC == 2) {
$heading .= <<FOO
<script type='text/javascript'>
var Search = {
openMenu: function (event) {
event.stop();
if (\$('search_menu').style.display === 'block') {
Search.closeMenu(event);
} else {
\$('adc_search').src = '/Resources/includes/sm_search_active.png';
\$('search_menu').style.display = 'block';
\$('gh-adcsearch').focus();
}
},
closeMenu: function (event) {
if (!event.element().descendantOf('search_menu')){
\$('adc_search').src = '/Resources/includes/header_sm_search.png';
\$('search_menu').style.display = 'none';
}
}
};
\$('adc_search').observe('click', Search.openMenu);
document.observe('click', Search.closeMenu);
</script>
FOO
;
}
my $titleLink = "../../index.html";
my $class = ref($self);
if ($class eq "HeaderDoc::Header") {
$titleLink = "../index.html";
}
$heading .= <<FOO
<div id="header">
<div id="title"><a id="titleLink" href="$titleLink"><h1></h1></a><span id="file_links"></span></div>
<ul id="headerButtons" class="hideOnPrint">
<li id="toc_button" style="display:none"><button id="table_of_contents" class="open">Table of Contents</button></li>
<li id="jumpto_button" style="display:none"><select id="jumpTo"><option value="top">Jump To...</option></select>
</li>
<li id="page_buttons" style="display:none">
<button id="previousPage" title="Previous"><a id='previousLink' name='bogus_prev'></a></button>
<button id="nextPage" title='Next'><a id='nextLink' name='bogus_next'></a></button>
</li>
</ul>
</div>
<div id="tocContainer" class="isShowingTOC"><ul id="toc"></ul></div>
<div id="contents" class="isShowingTOC">
FOO
;
print OUTFILE "$heading";
} elsif ($newTOC == 5) {
print OUTFILE "<table id=\"hd_outermost_table\" height=\"100%\" width=\"100%\"><tr><td valign='top' id='tocMenu' src='toc.html'></td>\n";
} elsif ($HeaderDoc::use_iframes) {
if ($newTOC) {
print OUTFILE "<noscript>\n";
}
print OUTFILE "<div id='tocMenu'>\n";
print OUTFILE "<iframe id='toc_content' name='toc_content' SRC='toc.html' width='210' height='100%' align='left' frameborder='0'>This document set is best viewed in a browser that supports iFrames.</iframe>\n";
print OUTFILE "</div>\n";
if ($newTOC) {
print OUTFILE "</noscript>\n";
}
print OUTFILE "<div id='bodyText'>\n";
}
if ($HeaderDoc::insert_header && ($newTOC != 2)) {
print OUTFILE "<!-- start of header -->\n";
print OUTFILE $self->htmlHeader()."\n";
print OUTFILE "<!-- end of header -->\n";
}
if ($newTOC == 5) {
print OUTFILE "<td id='bodyContents' valign='top'>\n";
} else {
print OUTFILE "<div id='bodyContents'>\n";
}
print OUTFILE "<a name=\"top\"></a>\n";
print OUTFILE $fileString;
print OUTFILE "<p class=\"gapBeforeFooter\"> </p>";
if ($HeaderDoc::insert_header) {
print OUTFILE "<!-- start of footer -->\n";
print OUTFILE $self->htmlFooter()."\n";
print OUTFILE "<!-- end of footer -->\n";
}
print OUTFILE "<hr class=\"afterFooter\">";
print OUTFILE "<div class=\"hd_copyright_and_timestamp\">\n";
if (length($copyrightOwner)) {
print OUTFILE "<p class=\"hd_copyright\">";
print OUTFILE "© $copyrightOwner ";
print OUTFILE "</p>";
}
my $filedate = $self->updated();
print OUTFILE "<p class=\"hd_timestamp\">";
if (length($filedate)) {
print OUTFILE "Last Updated: $filedate\n";
} else {
print OUTFILE "Last Updated: $dateStamp\n";
}
print OUTFILE "</p>";
print OUTFILE "</div>\n";
if ($newTOC == 5) {
print OUTFILE "</td></tr></table>\n"; } else {
print OUTFILE "</div>\n"; }
if ($newTOC == 2) {
print OUTFILE "</div>\n"; }
if ($HeaderDoc::use_iframes && ($newTOC != 5)) {
print OUTFILE "</div>\n";
}
print OUTFILE "</body></html>\n";
close OUTFILE;
}
sub printObject {
my $self = shift;
print STDERR "------------------------------------\n";
print STDERR "APIOwner\n";
print STDERR "outputDir: $self->{OUTPUTDIR}\n";
print STDERR "constantsDir: $self->{CONSTANTSDIR}\n";
print STDERR "datatypesDir: $self->{DATATYPESDIR}\n";
print STDERR "functionsDir: $self->{FUNCTIONSDIR}\n";
print STDERprint STDERR "methodsDir: $self->{METHODSDIR}\n";
print STDERR "typedefsDir: $self->{TYPEDEFSDIR}\n";
print STDERR "constants:\n";
&printArray(@{$self->{CONSTANTS}});
print STDERR "functions:\n";
&printArray(@{$self->{FUNCTIONS}});
print STDERR "methods:\n";
&printArray(@{$self->{METHODS}});
print STDERR "typedefs:\n";
&printArray(@{$self->{TYPEDEFS}});
print STDERR "structs:\n";
&printArray(@{$self->{STRUCTS}});
print STDERR "Inherits from:\n";
$self->SUPER::printObject();
}
sub processComment
{
my $self = shift;
my $fieldArrayRef = shift;
my $embedded = shift;
my $parseTree = shift;
my $soc = shift;
my $ilc = shift;
my $ilc_b = shift;
my $commentTree = shift;
my $hashtreecur = shift;
my $hashtreeroot = shift;
my $localDebug = 0;
my $headerObj = $self->apiOwner();
my $apiOwner = $self;
my $outputdirtemp = "";
my $outputdirtempbase = "";
my $hofirst = 1;
my $curobj = $headerObj;
if ($headerObj !~ /HeaderDoc::Header/) {
my $name = $curobj->name();
my $safename = &safeName(filename => $name);
$outputdirtemp = "Classes".$pathSeparator.$safename.$pathSeparator.$outputdirtemp;
if ($hofirst) {
$hofirst = 0;
} else {
$outputdirtempbase = "Classes".$pathSeparator.$safename.$pathSeparator.$outputdirtempbase;
}
$curobj = $curobj->apiOwner();
}
if (!$hofirst) {
my $name = $headerObj->name();
my $safename = &safeName(filename => $name);
mkdir( $self->outputDir().$pathSeparator.$outputdirtempbase.$pathSeparator."Classes", 0777);
mkdir( $self->outputDir().$pathSeparator.$outputdirtempbase.$pathSeparator."Classes".$pathSeparator.$safename, 0777);
}
$outputdirtemp = $self->outputDir().$pathSeparator.$outputdirtemp;
if ($self->outputDir()) {
$apiOwner->outputDir($outputdirtemp);
}
if ($localDebug) {
print STDERR "PROCESSCOMMENT\n";
print STDERR "SELF: $self\nFAR: $fieldArrayRef\nEMBEDDED: $embedded\nPTP: $parseTree\nSOC: $soc\nILC: $ilc\nILC_B: $ilc_b";
print STDERR "COMMENT RESEMBLES THE FOLLOWING:\n";
foreach my $field (@{$fieldArrayRef}) {
print STDERR "\@$field\n";
}
print STDERR "EOCOMMENT\n";
}
my @fields = @$fieldArrayRef;
my $fullpath = $apiOwner->fullpath();
my $lang = $self->lang();
my $sublang = $self->sublang();
my $linenum = $self->linenum();
my $linenuminblock = $self->linenuminblock();
my $blockOffset = $self->linenum();
if ($embedded) {
my $embedDebug = 0 || $localDebug;
my $localDebug = $embedDebug;
if ($self =~ /HeaderDoc::APIOwner/) {
return (0, $hashtreecur, $hashtreeroot);
}
if ($parseTree) {
print STDERR "GOT PT: SODEC WAS $parseTree (".$parseTree->token().")\n" if ($localDebug);
print STDERR "EMBEDDED DECLARATION:\n" if ($localDebug);
$parseTree->printTree() if ($localDebug);
print STDERR "EODEC\n" if ($localDebug);
my $s = $parseTree->parserState();
if ($s) {
print STDERR "PARSERSTATE EOTREE: $s->{lastTreeNode}\n" if ($localDebug);
}
$parseTree->dbprint() if ($localDebug);
}
my $keyfield = $fields[0];
if (!length($keyfield) || $keyfield =~ /^\s+$/) { $keyfield = $fields[1]; }
my $inFunction = my $inClass = my $inMethod = my $inTypedef = my $inUnion = my $inStruct = my $inConstant = my $inVar = my $inPDefine = my $inEnum = my $inUnknown = my $inInterface = 0;
$localDebug = 0;
my $classType = $self->classType();
my $lang = $self->lang();
my $sublang = $self->sublang();
my $first_field = 1;
SWITCH: {
($keyfield =~ /^\/(\*|\/)\!\s*/) && do {
my $short = $keyfield;
$short =~ s/^\/(\*|\/)\!\s*//s;
if (length($short)) {
$inUnknown = 1;
print STDERR "nested inUnknown\n" if ($localDebug);
last SWITCH;
}
$keyfield = $fields[1];
}; ($keyfield =~ /^template\s+/) && do {
$inFunction = 1;
print STDERR "nested template\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^class\s+/) && do {
$inClass = 1;
print STDERR "nested class\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^interface\s+/) && do {
print STDERR "nested interface\n" if ($localDebug);
warn("$fullpath:$linenum: warning: Interface not supported here. Assuming class.\n"); $inClass = 1;
last SWITCH;
};
($keyfield =~ /^protocol\s+/) && do {
print STDERR "nested protocol\n" if ($localDebug);
warn("$fullpath:$linenum: warning: Protocol not supported here. Assuming class.\n"); $inClass = 1;
last SWITCH;
};
($keyfield =~ /^category\s+/) && do {
print STDERR "nested category\n" if ($localDebug);
warn("$fullpath:$linenum: warning: Category not supported here. Assuming class.\n"); $inClass = 1;
last SWITCH;
};
($keyfield =~ /^language\s+/) && do {
print STDERR "nested language\n" if ($localDebug);
warn("$fullpath:$linenum: warning: \@language is deprecated.\n");
return (0, $hashtreecur, $hashtreeroot);
last SWITCH;
};
($keyfield =~ /^(function|method)group\s+/) && do {
print STDERR "nested function/methodgroup\n" if ($localDebug);
my $group = HeaderDoc::Group->new("LANG" => $lang, "SUBLANG" => $sublang);
$group->fullpath($self->fullpath);
$group->filename($self->filename());
$group->linenuminblock($linenuminblock);
$group->blockoffset($blockOffset);
$group->apiOwner($apiOwner);
$group = $group->processComment(\@fields);
print STDERR "group name is ".$group->name()."\n" if ($debugging);
$apiOwner->addGroup($group, 0);
$self->{FUNCTIONGROUPSTATE} = $group->name();
return (0, $hashtreecur, $hashtreeroot);
};
($keyfield =~ /^group\s+/) && do {
print STDERR "nested group\n" if ($localDebug);
my $group = $keyfield;
$group =~ s/^group\s+//s;
$group =~ s/\s*\*\/\s*$//s;
$HeaderDoc::globalGroup = $group;
return (0, $hashtreecur, $hashtreeroot);
};
($keyfield =~ /^indexgroup\s+/) && do {
print STDERR "nested indexgroup\n" if ($localDebug);
my $group = $keyfield;
$group =~ s/^indexgroup\s+//s;
$group =~ s/\s*\*\/\s*$//s;
$self->indexgroup($group);
return (0, $hashtreecur, $hashtreeroot);
};
($keyfield =~ /^(function)\s+/) && do {
$inFunction = 1;
print STDERR "nested function $keyfield\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^method\s+/) && do {
$inMethod = 1;
print STDERR "nested method\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^(typedef|callback)\s+/) && do {
$inTypedef = 1;
print STDERR "nested typedef\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^union\s+/) && do {
$inUnion = 1;
print STDERR "nested union\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^struct\s+/) && do {
$inStruct = 1;
print STDERR "nested struct\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^const(ant)?\s+/) && do {
$inConstant = 1;
print STDERR "nested constant\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^var\s+/) && do {
$inVar = 1;
print STDERR "nested var\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^define(d)?block\s+/) && do {
$inPDefine = 2;
print STDERR "nested defineblock\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^define(d)?\s+/) && do {
$inPDefine = 1;
print STDERR "nested define\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^enum\s+/) && do {
$inEnum = 1;
print STDERR "nested enum\n" if ($localDebug);
last SWITCH;
};
($keyfield =~ /^serial(Data|Field|)\s+/) && do {
warn("$fullpath:$linenum: warning: serialData not supported here.\n"); return (0, $hashtreecur, $hashtreeroot);
};
($keyfield eq "") && do {
$inUnknown = 1;
print STDERR "nested inUnknown[???]\n" if ($localDebug);
last SWITCH;
};
if (!validTag($keyfield)) {
warn("$fullpath:$linenum: warning: UNKNOWN FIELD[EMBEDDED]: \"$keyfield\".\n");
return (0, $hashtreecur, $hashtreeroot);
} else {
$inUnknown = 1;
print STDERR "nested inUnknown[???]\n" if ($localDebug);
}
}
$first_field = 0;
my $categoryObjectsref = undef;
my $classObjectsref = \@{$self->{CLASSES}};
my $cppAccessControlState = "protected:";
my $fieldsref = \@fields;
my $filename = $self->filename;
my $functionGroup = $self->{FUNCTIONGROUPSTATE} || "";
my $headerObject = $self;
my $inputCounter = 1;
my @fakelines = ( "This is a test.", "BOGUSFOOBOGUSFOOBOGUS", "This is only a test.");
my $inputlinesref = \@fakelines;
my $nlines = 42;
my $preAtPart = "";
if ($inUnknown == 1) {
if ($fields[0] =~ s/^\s*\/(\*|\/)!\s*(\w.*?)\@/\/\*! \@/sio) {
$preAtPart = $1;
} elsif ($fields[0] !~ /^\s*\/(\*|\/)!\s*.*\@/o) {
$preAtPart = $fields[0];
$preAtPart =~ s/^\s*\/(\*|\/)!\s*//sio;
if ($1 eq "*") {
$preAtPart =~ s/\s*\*\/\s*$//sio;
}
$fields[0] = "/*! "; }
print STDERR "preAtPart: \"$preAtPart\"\n" if ($localDebug);
print STDERR "fields[0]: \"$fields[0]\"\n" if ($localDebug);
}
my $xml_output = 0;
if ($self->outputformat() eq "hdxml") { $xml_output = 1; }
$localDebug = 0;
my $hangDebug = 0;
my $parmDebug = 0;
my $blockDebug = 0;
my $subparse = 1;
if ($self->can("isCOMInterface") && $self->isCOMInterface()) {
$subparse = 2;
}
my $subparseTree = $parseTree;
my $nodec = 0;
my $oldcur = $HeaderDoc::currentClass;
$HeaderDoc::currentClass = $self;
my $ps = $self->parserState();
my ($inputCounterToss, $cppAccessControlStateToss, $classTypeToss, $classObjectRefToss, $catObjectRefToss, $blockOffsetToss, $numcurlybraces, $foundmatch, $newlang, $newsublang, $hashtreecur, $hashtreeroot) = blockParseOutside($apiOwner, $inFunction, $inUnknown,
$inTypedef, $inStruct, $inEnum, $inUnion,
$inConstant, $inVar, $inMethod, $inPDefine,
$inClass, $inInterface, $blockOffset, $categoryObjectsref,
$classObjectsref, $classType, $cppAccessControlState,
$fieldsref, $fullpath, $functionGroup,
$headerObject, $inputCounter, $inputlinesref,
$lang, $nlines, $preAtPart, $xml_output, $localDebug,
$hangDebug, $parmDebug, $blockDebug, $subparse,
$subparseTree, $nodec, $HeaderDoc::allow_multi, $commentTree, $sublang, $hashtreecur, $hashtreeroot);
$HeaderDoc::currentClass = $oldcur;
return ($numcurlybraces, $hashtreecur, $hashtreeroot);
}
return $self->SUPER::processComment($fieldArrayRef);
my $class = ref($self) || $self;
my $superclassfieldname = "Superclass";
if ($class =~ /HeaderDoc::ObjCCategory/) {
$superclassfieldname = "Extends Class";
} elsif ($class =~ /HeaderDoc::ObjCProtocol/) {
$superclassfieldname = "Extends Protocol";
}
my $first_field = 1;
foreach my $field (@fields) {
my $fieldname = "";
my $top_level_field = 0;
if ($field =~ /^(\w+)(\s|$)/) {
$fieldname = $1;
$top_level_field = validTag($fieldname, 1);
}
SWITCH: {
($field =~ /^\/(\*|\/)\!/o && $first_field) && do {
my $copy = $field;
$copy =~ s/^\/(\*|\/)\!\s*//s;
if (length($copy)) {
$self->discussion($copy);
}
last SWITCH;
};
($field =~ s/^templatefield(\s+)/$1/io) && do {
$field =~ s/^\s+|\s+$//go;
$field =~ /(\w*)\s*(.*)/so;
my $fName = $1;
my $fDesc = $2;
my $fObj = HeaderDoc::MinorAPIElement->new("LANG" => $lang, "SUBLANG" => $sublang);
$fObj->linenuminblock($linenuminblock);
$fObj->blockoffset($blockOffset);
$fObj->linenum($linenum);
$fObj->apiOwner($apiOwner);
$fObj->outputformat($apiOwner->outputformat);
$fObj->name($fName);
$fObj->discussion($fDesc);
$apiOwner->addToFields($fObj);
last SWITCH;
};
($field =~ s/^super(class|)(\s+)/$2/io) && do { $apiOwner->attribute($superclassfieldname, $field, 0); $apiOwner->explicitSuper(1); last SWITCH; };
($field =~ s/^(throws|exception)(\s+)/$2/io) && do {$apiOwner->throws($field); last SWITCH;};
($field =~ s/^abstract(\s+)/$1/io) && do {$apiOwner->abstract($field); last SWITCH;};
($field =~ s/^brief(\s+)/$1/io) && do {$apiOwner->abstract($field, 1); last SWITCH;};
($field =~ s/^details(\s+|$)/$1/io) && do {$apiOwner->discussion($field); last SWITCH;};
($field =~ s/^discussion(\s+|$)/$1/io) && do {$apiOwner->discussion($field); last SWITCH;};
($field =~ s/^availability(\s+)/$1/io) && do {$apiOwner->availability($field); last SWITCH;};
($field =~ s/^since(\s+)/$1/io) && do {$apiOwner->availability($field); last SWITCH;};
($field =~ s/^author(\s+)/$1/io) && do {$apiOwner->attribute("Author", $field, 0); last SWITCH;};
($field =~ s/^version(\s+)/$1/io) && do {$apiOwner->attribute("Version", $field, 0); last SWITCH;};
($field =~ s/^deprecated(\s+)/$1/io) && do {$apiOwner->attribute("Deprecated", $field, 0); last SWITCH;};
($field =~ s/^version(\s+)/$1/io) && do {$apiOwner->attribute("Version", $field, 0); last SWITCH;};
($field =~ s/^updated(\s+)/$1/io) && do {$apiOwner->updated($field); last SWITCH;};
($field =~ s/^attribute(\s+)/$1/io) && do {
my ($attname, $attdisc, $namedisc) = &getAPINameAndDisc($field, $lang);
if (length($attname) && length($attdisc)) {
$apiOwner->attribute($attname, $attdisc, 0);
} else {
warn "$fullpath:$linenum: warning: Missing name/discussion for attribute\n";
}
last SWITCH;
};
($field =~ s/^attributelist(\s+)/$1/io) && do {
$field =~ s/^\s*//so;
$field =~ s/\s*$//so;
my ($name, $lines) = split(/\n/, $field, 2);
$name =~ s/^\s*//so;
$name =~ s/\s*$//so;
$lines =~ s/^\s*//so;
$lines =~ s/\s*$//so;
if (length($name) && length($lines)) {
my @attlines = split(/\n/, $lines);
foreach my $line (@attlines) {
$apiOwner->attributelist($name, $line);
}
} else {
warn "$fullpath:$linenum: warning: Missing name/discussion for attributelist\n";
}
last SWITCH;
};
($field =~ s/^attributeblock(\s+)/$1/io) && do {
my ($attname, $attdisc, $namedisc) = &getAPINameAndDisc($field, $lang);
if (length($attname) && length($attdisc)) {
$apiOwner->attribute($attname, $attdisc, 1);
} else {
warn "$fullpath:$linenum: warning: Missing name/discussion for attributeblock\n";
}
last SWITCH;
};
($field =~ s/^namespace(\s+)/$1/io) && do {$apiOwner->namespace($field); last SWITCH;};
($field =~ s/^instancesize(\s+)/$1/io) && do {$apiOwner->attribute("Instance Size", $field, 0); last SWITCH;};
($field =~ s/^performance(\s+)/$1/io) && do {$apiOwner->attribute("Performance", $field, 1); last SWITCH;};
($field =~ s/^nestedclass(\s+)/$1/io) && do {$apiOwner->attributelist("Nested Classes", $field); last SWITCH;};
($field =~ s/^coclass(\s+)/$1/io) && do {$apiOwner->attributelist("Co-Classes", $field); last SWITCH;};
($field =~ s/^helper(class|)(\s+)/$2/io) && do {$apiOwner->attributelist("Helper Classes", $field); last SWITCH;};
($field =~ s/^helps(\s+)/$1/io) && do {$apiOwner->attribute("Helps", $field, 0); last SWITCH;};
($field =~ s/^classdesign(\s+)/$1/io) && do {$apiOwner->attribute("Class Design", $field, 1); last SWITCH;};
($field =~ s/^dependency(\s+)/$1/io) && do {$apiOwner->attributelist("Dependencies", $field); last SWITCH;};
($field =~ s/^ownership(\s+)/$1/io) && do {$apiOwner->attribute("Ownership Model", $field, 1); last SWITCH;};
($field =~ s/^security(\s+)/$1/io) && do {$apiOwner->attribute("Security", $field, 1); last SWITCH;};
($field =~ s/^whysubclass(\s+)/$1/io) && do {$apiOwner->attribute("Reason to Subclass", $field, 1); last SWITCH;};
($top_level_field == 1) &&
do {
my $keepname = 1;
my $pattern = "";
if ($field =~ s/^(class|interface|category|protocol|template)(\s+)/$2/io) {
if ($1 eq "category") {
$pattern = "[()]";
} elsif ($1 eq "class") {
$pattern = ":";
}
$keepname = 1;
} else {
$field =~ s/(\w+)(\s|$)/$2/io;
$keepname = 0;
}
my ($name, $disc, $namedisc);
my $filename = $HeaderDoc::headerObject->filename();
my $fullpath = $HeaderDoc::headerObject->fullpath();
($name, $disc, $namedisc) = &getAPINameAndDisc($field, $lang, $pattern);
my $classID = ref($apiOwner);
if ($keepname) { $apiOwner->name($name); }
$apiOwner->filename($filename);
$apiOwner->fullpath($fullpath);
if (length($disc)) {
if ($namedisc) {
$apiOwner->nameline_discussion($disc);
} else {
$apiOwner->discussion($disc);
}
}
last SWITCH;
};
warn "$fullpath:$linenum: warning: Unknown field (\@$field) in class comment (".$apiOwner->name().")[2]\n";
}
$first_field = 0;
}
return $apiOwner;
}
sub encoding
{
my $self = shift;
my $apio = $self->apiOwner();
if (@_) {
my $encoding = shift;
$encoding =~ s/^\s*//sg;
$encoding =~ s/\s*$//sg;
if ($encoding eq "ascii") { $encoding = "UTF-8"; }
$self->{ENCODING} = $encoding;
HeaderDoc::APIOwner::fix_date($encoding);
}
if ($self->{ENCODING}) {
return $self->{ENCODING};
} elsif ($apio && ($apio != $self)) {
return $apio->encoding();
} else {
return "UTF-8";
}
}
sub HTMLmeta
{
my $self = shift;
my $apio = $self->apiOwner();
if ($apio && ($apio != $self)) {
return $apio->HTMLmeta();
}
return "";
}
sub dbprint
{
my $self = shift;
print STDERR "NAME: ".$self->name()."\n";
}
sub free
{
my $self = shift;
my $freechildrenraw = shift;
my $keepParseTreeAndState = shift;
my $newParseTreeOwner = shift;
my $freeclasses = 1;
my $freechildren = 1;
if ($freechildrenraw == 2) {
$freechildren = 0;
$freeclasses = 0;
print STDERR "FREEING $self\n" if ($HeaderDoc::debugAllocations);
} elsif ($freechildrenraw) {
$freeclasses = 0;
print STDERR "FREEING $self and children (except classes).\n" if ($HeaderDoc::debugAllocations);
} else {
print STDERR "FREEING $self and children.\n" if ($HeaderDoc::debugAllocations);
}
$self->setAPIOBackReferences( $self->{CONSTANTS}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{FUNCTIONS}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{METHODS}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{TYPEDEFS}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{STRUCTS}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{VARS}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{PDEFINES}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{ENUMS}, $freechildren, $newParseTreeOwner);
$self->setAPIOBackReferences( $self->{CLASSES}, $freeclasses, $newParseTreeOwner);
$self->{CONSTANTS} = undef;
$self->{FUNCTIONS} = undef;
$self->{METHODS} = undef;
$self->{TYPEDEFS} = undef;
$self->{STRUCTS} = undef;
$self->{VARS} = undef;
$self->{PDEFINES} = undef;
$self->{ENUMS} = undef;
$self->{CLASSES} = undef;
$self->{HEADEROBJECT} = undef;
$self->{APIOWNER} = undef;
$self->{GROUPS} = undef;
$self->{KEYWORDHASH} = undef;
if (!$self->noRegisterUID()) {
dereferenceUIDObject($self->apiuid(), $self);
}
$self->SUPER::free($freechildrenraw, $keepParseTreeAndState, $newParseTreeOwner);
}
sub removeFromGroup()
{
my $self = shift;
my $groupname = shift;
my $object = shift;
my $localDebug = 0;
$object->clearGroup();
if ($addToDebug) { print STDERR "REMOVED $object FROM GROUP\n"; }
if ($object =~ /HeaderDoc::HeaderElement/) { return; }
print STDERR "Removed object $object from group $groupname\n" if ($localDebug);
my %groups = %{$self->{GROUPS}};
my $group = $groups{$groupname};
if (!$group) {
$group = HeaderDoc::Group->new("LANG" => $self->lang(), "SUBLANG" => $self->sublang());
$group->fullpath($self->fullpath);
$group->filename($self->filename());
$group->linenuminblock($self->linenuminblock());
$group->blockoffset($self->blockoffset());
}
my @array = ();
if ($group->{MEMBEROBJECTS}) {
@array = @{$group->{MEMBEROBJECTS}};
}
my @newarray = ();
my $found = 0;
foreach my $item (@array) {
if ($item != $object) {
push(@newarray, $object);
} else {
$found = 1;
}
}
if (!$found) {
warn("NOT FOUND. GROUP REMOVAL FAILED. FILE A BUG.\n");
cluck("backtrace follows:\n");
warn("OBJ: $object NAME: ".$object->name()."\n");
warn("APIO: $self NAME: ".$self->name()."\n");
} else {
warn("FOUND.\n") if ($localDebug);
}
$group->{MEMBEROBJECTS} = \@newarray;
$groups{$groupname} = $group;
$self->{GROUPS} = \%groups;
}
sub addToGroup()
{
my $self = shift;
my $groupname = shift;
my $object = shift;
my $localDebug = 0;
if ($addToDebug) { print STDERR "ADDED $object TO GROUP $groupname\n"; }
if ($object =~ /HeaderDoc::HeaderElement/) { return; }
print STDERR "Added object $object to group $groupname\n" if ($localDebug);
my %groups = %{$self->{GROUPS}};
my $group = $groups{$groupname};
my $lang = $self->lang();
my $sublang = $self->sublang();
if ($lang eq "C" || $lang eq "Csource") {
if ($sublang eq "cpp" || $sublang eq "occ") {
$sublang = "C";
}
}
if (!$group) {
$group = HeaderDoc::Group->new("LANG" => $self->lang(), "SUBLANG" => $self->sublang());
$group->fullpath($self->fullpath);
$group->filename($self->filename());
$group->linenuminblock($self->linenuminblock());
$group->blockoffset($self->blockoffset());
}
my @array = ();
if ($group->{MEMBEROBJECTS}) {
@array = @{$group->{MEMBEROBJECTS}};
}
foreach my $obj (@array) {
if ($obj == $object) { return; }
}
push(@array, $object);
$group->{MEMBEROBJECTS} = \@array;
$groups{$groupname} = $group;
$self->{GROUPS} = \%groups;
}
sub addGroup()
{
my $self = shift;
my $group = shift;
my %groups = %{$self->{GROUPS}};
my $groupname = $group->name();
$groups{$groupname} = $group;
$self->{GROUPS} = \%groups;
return $group;
}
sub findGroup
{
my $self = shift;
my $groupname = shift;
my %groups = %{$self->{GROUPS}};
return $groups{$groupname};
}
sub groupDoc()
{
my $self = shift;
my $title = shift;
my $string = "";
my %groups = %{$self->{GROUPS}};
my $xml = 0;
if (!$title) {
$xml = 1;
}
my $localDebug = 0;
if (scalar(keys %groups)) {
my $first = 1;
foreach my $group (keys %groups) {
my $group = $groups{$group};
my $groupname = $group->name();
if ($groupname ne "") {
if ($first) { $first = 0; }
elsif (!$xml) { $string .= "<p> </p>\n"; }
my $abs = $group->abstract();
my $desc = $group->discussion();
if ($xml) {
$string .= "<groupinfo>\n";
$string .= "<name>".$self->textToXML($groupname)."</name>\n";
if ($abs =~ /\S/) {
$string .= "<abstract>".$self->htmlToXML($abs)."</abstract>";
}
if ($desc =~ /\S/) {
$string .= "<desc>".$self->htmlToXML($desc)."</desc>";
}
$string .= "</groupinfo>\n";
} else {
$string .= "<h3>$groupname</h3>\n<div class='group_desc_indent'>\n";
if ($abs =~ /\S/) {
$string .= "<p>$abs</p>";
if ($desc =~ /\S/) {
$string .= "<h5 class=\"tight\"><font face=\"Lucida Grande,Helvetica,Arial\">Discussion</font></h5>\n";
}
}
if ($desc =~ /\S/) {
$string .= "<p>$desc</p>";
}
$string .= "</div>\n";
}
if ($group->{MEMBEROBJECTS} && !$xml) {
my @array = @{$group->{MEMBEROBJECTS}};
if (scalar(@array)) {
$string .= "<h4>Group members:</h4>\n<div class='group_indent'>\n";
print STDERR "getClassEmbeddedTOC: group members found.\n" if ($localDebug);
my @tempobjs = ();
if (!$self->unsorted()) {
@tempobjs = sort objName @array;
} else {
@tempobjs = @array;
}
my @newtempobjs = ();
foreach my $item (@tempobjs) {
if ($item->{INSERTED}) {
push(@newtempobjs, $item);
}
}
if ($localDebug) {
foreach my $item(@newtempobjs) {
print STDERR "TO: $item : ".$item->name()."\n";
}
}
my $composite = 0;
$string .= $self->_getEmbeddedTOC(\@newtempobjs, "Group Members", "groups", "Group Members", $composite, 0, 1);
$string .= "</div>\n";
}
}
}
}
}
if ($string =~ /\S/) {
if ($xml) {
$string = "<groups>\n".$string."</groups>\n";
} else {
$string = "<a name='HeaderDoc_groups'>$title</a>\n\n".$string;
$string .= "<hr class=\"afterGroupHeading\">";
}
}
return $string;
}
sub reparentModuleMembers
{
my $self = shift;
my $localDebug = 0;
if ($self->isModule()) {
my $apiOwner = $self->apiOwner();
print STDERR "$self IS module\n" if ($localDebug);
my @objs = $self->classes();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
if ($obj->reparentModuleMembers()) {
print STDERR "ADDING OBJ: $obj\n" if ($localDebug);
$apiOwner->addToClasses(($obj));
} else {
print STDERR "Failed reparent check\n" if ($localDebug);
}
}
@objs = $self->protocols();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToProtocols($obj);
}
@objs = $self->categories();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToCategories($obj);
}
@objs = $self->functions();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToFunctions($obj);
}
@objs = $self->methods();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToMethods($obj);
}
@objs = $self->constants();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToConstants($obj);
}
@objs = $self->typedefs();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToTypedefs($obj);
}
@objs = $self->structs();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToStructs($obj);
}
@objs = $self->enums();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToEnums($obj);
}
@objs = $self->pDefines();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToPDefines($obj);
}
@objs = $self->vars();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToVars($obj);
}
@objs = $self->props();
foreach my $obj (@objs) {
print STDERR "Reparenting $obj (".$obj->name().") as child of $apiOwner\n" if ($localDebug);
$obj->apiOwner($apiOwner);
if (!$obj->indexgroup()) {
$obj->indexgroup($self->name());
}
$obj->attribute("Module", $self->name(), 0);
$apiOwner->addToProps($obj);
}
return 0;
} else {
print STDERR "$self is NOT module\n" if ($localDebug);
my @classes = $self->classes();
$self->{CLASSES} = ();
my $apiOwner = $self->apiOwner();
foreach my $class (@classes) {
print STDERR "Checking $class (".$class->name().")\n" if ($localDebug);
if (!$class->isModule()) {
print STDERR "Keeping $class (".$class->name().")\n" if ($localDebug);
$self->addToClasses(($class));
} else {
print STDERR "Dropping $class (".$class->name().")\n" if ($localDebug);
$class->reparentModuleMembers();
}
}
if ($localDebug) {
my @cltemp = $self->classes();
print STDERR "Dumping list for $self (".$self->name().")\n";
foreach my $class (@cltemp) {
print STDERR "CLASS $class (".$class->name().")\n";
}
print STDERR "End dump\n";
}
}
return 1;
}
sub alsoInclude
{
my $self = shift;
if (@_) {
my $value = shift;
if (!$self->{ALSOINCLUDE}) {
my @temp = ($value);
$self->{ALSOINCLUDE} = \@temp;
} else {
push(@{$self->{ALSOINCLUDE}}, $value);
}
}
return $self->{ALSOINCLUDE};
}
sub unsorted {
my $self = shift;
if (@_) {
my $newval = shift;
$self->{UNSORTED} = $newval;
}
return $self->{UNSORTED};
}
sub striptitle {
my $data = shift;
$data =~ s/ / /sg;
$data =~ s/&/&/sg;
return $data;
}
sub fixupTypeRequests
{
my $self = shift;
my @objs = $self->pDefines();
my @newobjs = ();
foreach my $obj (@objs) {
if ($obj->origType() eq "function") {
$self->addToFunctions($obj);
} else {
push(@newobjs, $obj);
}
}
$self->{PDEFINES} = \@newobjs;
}
sub appleRefUsed
{
my $self = shift;
my $uid = shift;
my %map = ();
if ($self->{APPLEREFUSED}) {
%map = %{$self->{APPLEREFUSED}};
}
my $retval = $map{$uid};
if (@_) {
$map{$uid} = 1;
$self->{APPLEREFUSED} = \%map;
}
return $retval;
}
sub resetAppleRefUsed
{
my $self = shift;
delete $self->{APPLEREFUSED};
}
1;