diff options
Diffstat (limited to 'chromium/third_party/libvpx/source/libvpx/examples/includes/HTML-Toc-0.91/TocGenerator.pm')
-rw-r--r-- | chromium/third_party/libvpx/source/libvpx/examples/includes/HTML-Toc-0.91/TocGenerator.pm | 1793 |
1 files changed, 0 insertions, 1793 deletions
diff --git a/chromium/third_party/libvpx/source/libvpx/examples/includes/HTML-Toc-0.91/TocGenerator.pm b/chromium/third_party/libvpx/source/libvpx/examples/includes/HTML-Toc-0.91/TocGenerator.pm deleted file mode 100644 index 8c49194cdfb..00000000000 --- a/chromium/third_party/libvpx/source/libvpx/examples/includes/HTML-Toc-0.91/TocGenerator.pm +++ /dev/null @@ -1,1793 +0,0 @@ -#=== HTML::TocGenerator ======================================================= -# function: Generate 'HTML::Toc' table of contents. -# note: - 'TT' is an abbrevation of 'TocToken'. - - -package HTML::TocGenerator; - - -use strict; -use HTML::Parser; - - -BEGIN { - use vars qw(@ISA $VERSION); - - $VERSION = '0.91'; - - @ISA = qw(HTML::Parser); -} - - - # Warnings -use constant WARNING_NESTED_ANCHOR_PS_WITHIN_PS => 1; -use constant WARNING_TOC_ATTRIBUTE_PS_NOT_AVAILABLE_WITHIN_PS => 2; - - -use constant TOC_TOKEN_ID => 0; -use constant TOC_TOKEN_INCLUDE => 1; -use constant TOC_TOKEN_EXCLUDE => 2; -use constant TOC_TOKEN_TOKENS => 3; -use constant TOC_TOKEN_GROUP => 4; -use constant TOC_TOKEN_TOC => 5; - - # Token types -use constant TT_TAG_BEGIN => 0; -use constant TT_TAG_END => 1; -use constant TT_TAG_TYPE_END => 2; -use constant TT_INCLUDE_ATTRIBUTES_BEGIN => 3; -use constant TT_EXCLUDE_ATTRIBUTES_BEGIN => 4; -use constant TT_INCLUDE_ATTRIBUTES_END => 5; -use constant TT_EXCLUDE_ATTRIBUTES_END => 6; -use constant TT_GROUP => 7; -use constant TT_TOC => 8; -use constant TT_ATTRIBUTES_TOC => 9; - - -use constant CONTAINMENT_INCLUDE => 0; -use constant CONTAINMENT_EXCLUDE => 1; - -use constant TEMPLATE_ANCHOR => '$groupId."-".$node'; -use constant TEMPLATE_ANCHOR_HREF => - '"<a href=#".' . TEMPLATE_ANCHOR . '.">"'; -use constant TEMPLATE_ANCHOR_HREF_FILE => - '"<a href=".$file."#".' . TEMPLATE_ANCHOR . '.">"'; -use constant TEMPLATE_ANCHOR_NAME => - '"<a name=".' . TEMPLATE_ANCHOR . '.">"'; - -use constant TEMPLATE_TOKEN_NUMBER => '"$node  "'; - - -use constant TT_TOKENTYPE_START => 0; -use constant TT_TOKENTYPE_END => 1; -use constant TT_TOKENTYPE_TEXT => 2; -use constant TT_TOKENTYPE_COMMENT => 3; -use constant TT_TOKENTYPE_DECLARATION => 4; - - -END {} - - -#--- HTML::TocGenerator::new() ------------------------------------------------ -# function: Constructor - -sub new { - # Get arguments - my ($aType) = @_; - my $self = $aType->SUPER::new; - # Bias to not generate ToC - $self->{_doGenerateToc} = 0; - # Bias to not use global groups - $self->{_doUseGroupsGlobal} = 0; - # Output - $self->{output} = ""; - # Reset internal variables - $self->_resetBatchVariables(); - - $self->{options} = {}; - - return $self; -} # new() - - -#--- HTML::TocGenerator::_deinitializeBatch() --------------------------------- - -sub _deinitializeBatch() { - # Get arguments - my ($self) = @_; -} # _deinitializeBatch() - - -#--- HTML::TocGenerator::_deinitializeExtenderBatch() ------------------------- - -sub _deinitializeExtenderBatch() { - # Get arguments - my ($self) = @_; - # Do general batch deinitialization - $self->_deinitializeBatch(); - # Indicate end of ToC generation - $self->{_doGenerateToc} = 0; - # Reset batch variables - $self->_resetBatchVariables(); -} # _deinitializeExtenderBatch() - - -#--- HTML::TocGenerator::_deinitializeGeneratorBatch() ------------------------ - -sub _deinitializeGeneratorBatch() { - # Get arguments - my ($self) = @_; - # Do 'extender' batch deinitialization - $self->_deinitializeExtenderBatch(); -} # _deinitializeBatchGenerator() - - -#--- HTML::TocGenerator::_doesHashContainHash() ------------------------------- -# function: Determines whether hash1 matches regular expressions of hash2. -# args: - $aHash1 -# - $aHash2 -# - $aContainmentType: 0 (include) or 1 (exclude) -# returns: True (1) if hash1 satisfies hash2, 0 if not. For example, with the -# following hashes: -# -# %hash1 = { %hash2 = { -# 'class' => 'header' 'class' => '^h' -# 'id' => 'intro' } -# } -# -# the routine will return 1 if 'aContainmentType' equals 0, cause -# 'hash1' satisfies the conditions of 'hash2'. The routine will -# return 0 if 'aContainmentType' equals 1, cause 'hash1' doesn't -# exclude the conditions of 'hash2'. -# note: Class function. - -sub _doesHashContainHash { - # Get arguments - my ($aHash1, $aHash2, $aContainmentType) = @_; - # Local variables - my ($key1, $value1, $key2, $value2, $result); - # Bias to success - $result = 1; - # Loop through hash2 - HASH2: while (($key2, $value2) = each %$aHash2) { - # Yes, values are available; - # Get value1 - $value1 = $aHash1->{$key2}; - # Does value1 match criteria of value2? - if (defined($value1) && $value1 =~ m/$value2/) { - # Yes, value1 matches criteria of value2; - # Containment type was exclude? - if ($aContainmentType == CONTAINMENT_EXCLUDE) { - # Yes, containment type was exclude; - # Indicate condition fails - $result = 0; - # Reset 'each' iterator which we're going to break - keys %$aHash2; - # Break loop - last HASH2; - } - } - else { - # No, value1 didn't match criteria of value2; - # Containment type was include? - if ($aContainmentType == CONTAINMENT_INCLUDE) { - # Yes, containment type was include; - # Indicate condition fails - $result = 0; - # Reset 'each' iterator which we're going to break - keys %$aHash2; - # Break loop - last HASH2; - } - } - } - # Return value - return $result; -} # _doesHashContainHash() - - -#--- HTML::TocGenerator::_extend() -------------------------------------------- -# function: Extend ToC. -# - $aString: String to parse. - -sub _extend { - # Get arguments - my ($self, $aFile) = @_; - # Local variables - my ($file); - # Parse string - $self->parse($aFile); - # Flush remaining buffered text - $self->eof(); -} # _extend() - - -#--- HTML::TocGenerator::_extendFromFile() ------------------------------------ -# function: Extend ToC. -# - $aFile: (reference to array of) file to parse. - -sub _extendFromFile { - # Get arguments - my ($self, $aFile) = @_; - # Local variables - my ($file, @files); - # Dereference array reference or make array of file specification - @files = (ref($aFile) =~ m/ARRAY/) ? @$aFile : ($aFile); - # Loop through files - foreach $file (@files) { - # Store filename - $self->{_currentFile} = $file; - # Parse file - $self->parse_file($file); - # Flush remaining buffered text - $self->eof(); - } -} # _extendFromFile() - - -#--- HTML::TocGenerator::_formatHeadingLevel() -------------------------------- -# function: Format heading level. -# args: - $aLevel: Level of current heading -# - $aClass: Class of current heading -# - $aGroup: Group of current heading -# - $aToc: Toc of current heading - -sub _formatHeadingLevel { - # Get arguments - my ($self, $aLevel, $aClass, $aGroup, $aToc) = @_; - # Local variables - my ($result, $headingNumber, $numberingStyle); - - $headingNumber = $self->_getGroupIdManager($aToc)-> - {levels}{$aClass}[$aLevel - 1] || 0; - - # Alias numbering style of current group - $numberingStyle = $aGroup->{numberingStyle}; - - SWITCH: { - if ($numberingStyle eq "decimal") { - $result = $headingNumber; - last SWITCH; - } - if ($numberingStyle eq "lower-alpha") { - $result = chr($headingNumber + ord('a') - 1); - last SWITCH; - } - if ($numberingStyle eq "upper-alpha") { - $result = chr($headingNumber + ord('A') - 1); - last SWITCH; - } - if ($numberingStyle eq "lower-roman") { - require Roman; - $result = Roman::roman($headingNumber); - last SWITCH; - } - if ($numberingStyle eq "upper-roman") { - require Roman; - $result = Roman::Roman($headingNumber); - last SWITCH; - } - die "Unknown case: $numberingStyle"; - } - # Return value - return $result; -} # _formatHeadingLevel() - - -#--- HTML::TocGenerator::_formatTocNode() ------------------------------------- -# function: Format heading node. -# args: - $aLevel: Level of current heading -# - $aClass: Class of current heading -# - $aGroup: Group of current heading -# - $aToc: Toc of current heading - -sub _formatTocNode { - # Get arguments - my ($self, $aLevel, $aClass, $aGroup, $aToc) = @_; - # Local variables - my ($result, $level, $levelGroups); - - # Alias 'levelGroups' of right 'groupId' - $levelGroups = $aToc->{_levelGroups}{$aGroup->{'groupId'}}; - # Loop through levels - for ($level = 1; $level <= $aLevel; $level++) { - # If not first level, add dot - $result = ($result ? $result . "." : $result); - # Format heading level using argument group - $result .= $self->_formatHeadingLevel( - $level, $aClass, @{$levelGroups}[$level - 1], $aToc - ); - } - # Return value - return $result; -} # _formatTocNode() - - -#--- HTML::TocGenerator::_generate() ------------------------------------------ -# function: Generate ToC. -# args: - $aString: Reference to string to parse - -sub _generate { - # Get arguments - my ($self, $aString) = @_; - # Local variables - my ($toc); - # Loop through ToCs - foreach $toc (@{$self->{_tocs}}) { - # Clear ToC - $toc->clear(); - } - # Extend ToCs - $self->_extend($aString); -} # _generate() - - -#--- HTML::TocGenerator::_generateFromFile() ---------------------------------- -# function: Generate ToC. -# args: - $aFile: (reference to array of) file to parse. - -sub _generateFromFile { - # Get arguments - my ($self, $aFile) = @_; - # Local variables - my ($toc); - # Loop through ToCs - foreach $toc (@{$self->{_tocs}}) { - # Clear ToC - $toc->clear(); - } - # Extend ToCs - $self->_extendFromFile($aFile); -} # _generateFromFile() - - -#--- HTML::TocGenerator::_getGroupIdManager() --------------------------------- -# function: Get group id manager. -# args: - $aToc: Active ToC. -# returns: Group id levels. - -sub _getGroupIdManager { - # Get arguments - my ($self, $aToc) = @_; - # Local variables - my ($result); - # Global groups? - if ($self->{options}{'doUseGroupsGlobal'}) { - # Yes, global groups; - $result = $self; - } - else { - # No, local groups; - $result = $aToc; - } - # Return value - return $result; -} # _getGroupIdManager() - - -#--- HTML::TocGenerator::_initializeBatch() ----------------------------------- -# function: Initialize batch. This function is called once when a parse batch -# is started. -# args: - $aTocs: Reference to array of tocs. - -sub _initializeBatch { - # Get arguments - my ($self, $aTocs) = @_; - # Local variables - my ($toc); - - # Store reference to tocs - - # Is ToC specification reference to array? - if (ref($aTocs) =~ m/ARRAY/) { - # Yes, ToC specification is reference to array; - # Store array reference - $self->{_tocs} = $aTocs; - } - else { - # No, ToC specification is reference to ToC object; - # Wrap reference in array reference, containing only one element - $self->{_tocs} = [$aTocs]; - } - # Loop through ToCs - foreach $toc (@{$self->{_tocs}}) { - # Parse ToC options - $toc->parseOptions(); - } -} # _initializeBatch() - - -#--- HTML::TocGenerator::_initializeExtenderBatch() -------------------------- -# function: Initialize 'extender' batch. This function is called once when a -# parse batch is started. -# args: - $aTocs: Reference to array of tocs. - -sub _initializeExtenderBatch { - # Get arguments - my ($self, $aTocs) = @_; - # Do general batch initialization - $self->_initializeBatch($aTocs); - # Parse ToC options - $self->_parseTocOptions(); - # Indicate start of batch - $self->{_doGenerateToc} = 1; -} # _initializeExtenderBatch() - - -#--- HTML::TocGenerator::_initializeGeneratorBatch() -------------------------- -# function: Initialize generator batch. This function is called once when a -# parse batch is started. -# args: - $aTocs: Reference to array of tocs. -# - $aOptions: optional options - -sub _initializeGeneratorBatch { - # Get arguments - my ($self, $aTocs, $aOptions) = @_; - # Add invocation options - $self->setOptions($aOptions); - # Option 'doUseGroupsGlobal' specified? - if (!defined($self->{options}{'doUseGroupsGlobal'})) { - # No, options 'doUseGroupsGlobal' not specified; - # Default to no 'doUseGroupsGlobal' - $self->{options}{'doUseGroupsGlobal'} = 0; - } - # Global groups? - if ($self->{options}{'doUseGroupsGlobal'}) { - # Yes, global groups; - # Reset groups and levels - $self->_resetStackVariables(); - } - # Do 'extender' batch initialization - $self->_initializeExtenderBatch($aTocs); -} # _initializeGeneratorBatch() - - -#--- HTML::TocGenerator::_linkTocToToken() ------------------------------------ -# function: Link ToC to token. -# args: - $aToc: ToC to add token to. -# - $aFile -# - $aGroupId -# - $aLevel -# - $aNode -# - $aGroupLevel -# - $aLinkType -# - $aTokenAttributes: reference to hash containing attributes of -# currently parsed token - -sub _linkTocToToken { - # Get arguments - my ( - $self, $aToc, $aFile, $aGroupId, $aLevel, $aNode, $aGroupLevel, - $aDoLinkToId, $aTokenAttributes - ) = @_; - # Local variables - my ($file, $groupId, $level, $node, $anchorName); - my ($doInsertAnchor, $doInsertId); - - # Fill local arguments to be used by templates - $file = $aFile; - $groupId = $aGroupId; - $level = $aLevel; - $node = $aNode; - - # Assemble anchor name - $anchorName = - ref($aToc->{_templateAnchorName}) eq "CODE" ? - &{$aToc->{_templateAnchorName}}( - $aFile, $aGroupId, $aLevel, $aNode - ) : - eval($aToc->{_templateAnchorName}); - - # Bias to insert anchor name - $doInsertAnchor = 1; - $doInsertId = 0; - # Link to 'id'? - if ($aDoLinkToId) { - # Yes, link to 'id'; - # Indicate to insert anchor id - $doInsertAnchor = 0; - $doInsertId = 1; - # Id attribute is available? - if (defined($aTokenAttributes->{id})) { - # Yes, id attribute is available; - # Use existing ids? - if ($aToc->{options}{'doUseExistingIds'}) { - # Yes, use existing ids; - # Use existing id - $anchorName = $aTokenAttributes->{id}; - # Indicate to not insert id - $doInsertId = 0; - } - } - - } - else { - # No, link to 'name'; - # Anchor name is currently active? - if (defined($self->{_activeAnchorName})) { - # Yes, anchor name is currently active; - # Use existing anchors? - if ($aToc->{options}{'doUseExistingAnchors'}) { - # Yes, use existing anchors; - # Use existing anchor name - $anchorName = $self->{_activeAnchorName}; - # Indicate to not insert anchor name - $doInsertAnchor = 0; - } - else { - # No, don't use existing anchors; insert new anchor; - # - } - } - } - - # Add reference to ToC - $aToc->{_toc} .= - ref($aToc->{_templateAnchorHrefBegin}) eq "CODE" ? - &{$aToc->{_templateAnchorHrefBegin}}( - $aFile, $aGroupId, $aLevel, $aNode, $anchorName - ) : - eval($aToc->{_templateAnchorHrefBegin}); - - # Bias to not output anchor name end - $self->{_doOutputAnchorNameEnd} = 0; - # Must anchor be inserted? - if ($doInsertAnchor) { - # Yes, anchor must be inserted; - # Allow adding of anchor name begin token to text by calling - # 'anchorNameBegin' method - $self->anchorNameBegin( - ref($aToc->{_templateAnchorNameBegin}) eq "CODE" ? - &{$aToc->{_templateAnchorNameBegin}}( - $aFile, $aGroupId, $aLevel, $aNode, $anchorName - ) : - eval($aToc->{_templateAnchorNameBegin}), - $aToc - ); - } - - # Must anchorId attribute be inserted? - if ($doInsertId) { - # Yes, anchorId attribute must be inserted; - # Allow adding of anchorId attribute to text by calling 'anchorId' - # method - $self->anchorId($anchorName); - } -} # _linkTocToToken() - - -#--- HTML::TocGenerator::_outputAnchorNameEndConditionally() ------------------ -# function: Output 'anchor name end' if necessary -# args: - $aToc: ToC of which 'anchor name end' must be output. - -sub _outputAnchorNameEndConditionally { - # Get arguments - my ($self, $aToc) = @_; - # Must anchor name end be output? - if ($self->{_doOutputAnchorNameEnd}) { - # Yes, output anchor name end; - # Allow adding of anchor to text by calling 'anchorNameEnd' - # method - $self->anchorNameEnd( - ref($aToc->{_templateAnchorNameEnd}) eq "CODE" ? - &{$aToc->{_templateAnchorNameEnd}} : - eval($aToc->{_templateAnchorNameEnd}), - $aToc - ); - } -} # _outputAnchorNameEndConditionally() - - -#--- HTML::TocGenerator::_parseTocOptions() ----------------------------------- -# function: Parse ToC options. - -sub _parseTocOptions { - # Get arguments - my ($self) = @_; - # Local variables - my ($toc, $group, $tokens, $tokenType, $i); - # Create parsers for ToC tokens - $self->{_tokensTocBegin} = []; - my $tokenTocBeginParser = HTML::_TokenTocBeginParser->new( - $self->{_tokensTocBegin} - ); - my $tokenTocEndParser = HTML::_TokenTocEndParser->new(); - # Loop through ToCs - foreach $toc (@{$self->{_tocs}}) { - # Reference parser ToC to current ToC - $tokenTocBeginParser->setToc($toc); - # Loop through 'tokenToToc' groups - foreach $group (@{$toc->{options}{'tokenToToc'}}) { - # Reference parser group to current group - $tokenTocBeginParser->setGroup($group); - # Parse 'tokenToToc' group - $tokenTocBeginParser->parse($group->{'tokenBegin'}); - # Flush remaining buffered text - $tokenTocBeginParser->eof(); - $tokenTocEndParser->parse( - $group->{'tokenEnd'}, - $tokenTocBeginParser->{_lastAddedToken}, - $tokenTocBeginParser->{_lastAddedTokenType} - ); - # Flush remaining buffered text - $tokenTocEndParser->eof(); - } - } -} # _parseTocOptions() - - -#--- HTML::TocGenerator::_processTocEndingToken() ----------------------------- -# function: Process ToC-ending-token. -# args: - $aTocToken: token which acts as ToC-ending-token. - -sub _processTocEndingToken { - # Get arguments - my ($self, $aTocToken) = @_; - # Local variables - my ($toc); - # Aliases - $toc = $aTocToken->[TT_TOC]; - # Link ToC to tokens? - if ($toc->{options}{'doLinkToToken'}) { - # Yes, link ToC to tokens; - # Add anchor href end - $toc->{_toc} .= - (ref($toc->{_templateAnchorHrefEnd}) eq "CODE") ? - &{$toc->{_templateAnchorHrefEnd}} : - eval($toc->{_templateAnchorHrefEnd}); - - # Output anchor name end only if necessary - $self->_outputAnchorNameEndConditionally($toc); - } -} # _processTocEndingToken() - - -#--- HTML::TocGenerator::_processTocStartingToken() --------------------------- -# function: Process ToC-starting-token. -# args: - $aTocToken: token which acts as ToC-starting-token. -# - $aTokenType: type of token. Can be either TT_TOKENTYPE_START, -# _END, _TEXT, _COMMENT or _DECLARATION. -# - $aTokenAttributes: reference to hash containing attributes of -# currently parsed token -# - $aTokenOrigText: reference to original token text - -sub _processTocStartingToken { - # Get arguments - my ($self, $aTocToken, $aTokenType, $aTokenAttributes, $aTokenOrigText) = @_; - # Local variables - my ($i, $level, $doLinkToId, $node, $groupLevel); - my ($file, $tocTokenId, $groupId, $toc, $attribute); - # Aliases - $file = $self->{_currentFile}; - $toc = $aTocToken->[TT_TOC]; - $level = $aTocToken->[TT_GROUP]{'level'}; - $groupId = $aTocToken->[TT_GROUP]{'groupId'}; - - # Retrieve 'doLinkToId' setting from either group options or toc options - $doLinkToId = (defined($aTocToken->[TT_GROUP]{'doLinkToId'})) ? - $aTocToken->[TT_GROUP]{'doLinkToId'} : $toc->{options}{'doLinkToId'}; - - # Link to 'id' and tokenType isn't 'start'? - if (($doLinkToId) && ($aTokenType != TT_TOKENTYPE_START)) { - # Yes, link to 'id' and tokenType isn't 'start'; - # Indicate to *not* link to 'id' - $doLinkToId = 0; - } - - if (ref($level) eq "CODE") { - $level = &$level($self->{_currentFile}, $node); - } - if (ref($groupId) eq "CODE") { - $groupId = &$groupId($self->{_currentFile}, $node); - } - - # Determine class level - - my $groupIdManager = $self->_getGroupIdManager($toc); - # Known group? - if (!exists($groupIdManager->{groupIdLevels}{$groupId})) { - # No, unknown group; - # Add group - $groupIdManager->{groupIdLevels}{$groupId} = keys( - %{$groupIdManager->{groupIdLevels}} - ) + 1; - } - $groupLevel = $groupIdManager->{groupIdLevels}{$groupId}; - - # Temporarily allow symbolic references - #no strict qw(refs); - # Increase level - $groupIdManager->{levels}{$groupId}[$level - 1] += 1; - # Reset remaining levels of same group - for ($i = $level; $i < @{$groupIdManager->{levels}{$groupId}}; $i++) { - $groupIdManager->{levels}{$groupId}[$i] = 0; - } - - # Assemble numeric string indicating current level - $node = $self->_formatTocNode( - $level, $groupId, $aTocToken->[TT_GROUP], $toc - ); - - # Add newline if _toc not empty - if ($toc->{_toc}) { - $toc->{_toc} .= "\n"; - } - - # Add toc item info - $toc->{_toc} .= "$level $groupLevel $groupId $node " . - $groupIdManager->{levels}{$groupId}[$level - 1] . " "; - - # Add value of 'id' attribute if available - if (defined($aTokenAttributes->{id})) { - $toc->{_toc} .= $aTokenAttributes->{id}; - } - $toc->{_toc} .= " "; - # Link ToC to tokens? - if ($toc->{options}{'doLinkToToken'}) { - # Yes, link ToC to tokens; - # Link ToC to token - $self->_linkTocToToken( - $toc, $file, $groupId, $level, $node, $groupLevel, $doLinkToId, - $aTokenAttributes - ); - } - - # Number tokens? - if ( - $aTocToken->[TT_GROUP]{'doNumberToken'} || - ( - ! defined($aTocToken->[TT_GROUP]{'doNumberToken'}) && - $toc->{options}{'doNumberToken'} - ) - ) { - # Yes, number tokens; - # Add number by calling 'number' method - $self->number( - ref($toc->{_templateTokenNumber}) eq "CODE" ? - &{$toc->{_templateTokenNumber}}( - $node, $groupId, $file, $groupLevel, $level, $toc - ) : - eval($toc->{_templateTokenNumber}), - $toc - ); - } - - # Must attribute be used as ToC text? - if (defined($aTocToken->[TT_ATTRIBUTES_TOC])) { - # Yes, attribute must be used as ToC text; - # Loop through attributes - foreach $attribute (@{$aTocToken->[TT_ATTRIBUTES_TOC]}) { - # Attribute is available? - if (defined($$aTokenAttributes{$attribute})) { - # Yes, attribute is available; - # Add attribute value to ToC - $self->_processTocText($$aTokenAttributes{$attribute}, $toc); - } - else { - # No, attribute isn't available; - # Show warning - $self->_showWarning( - WARNING_TOC_ATTRIBUTE_PS_NOT_AVAILABLE_WITHIN_PS, - [$attribute, $$aTokenOrigText] - ); - } - # Output anchor name end only if necessary - #$self->_outputAnchorNameEndConditionally($toc); - # End attribute - $self->_processTocEndingToken($aTocToken); - } - } - else { - # No, attribute mustn't be used as ToC text; - # Add end token to 'end token array' - push( - @{$self->{_tokensTocEnd}[$aTocToken->[TT_TAG_TYPE_END]]}, $aTocToken - ); - } -} # _processTocStartingToken() - - -#--- HTML::TocGenerator::_processTocText() ------------------------------------ -# function: This function processes text which must be added to the preliminary -# ToC. -# args: - $aText: Text to add to ToC. -# - $aToc: ToC to add text to. - -sub _processTocText { - # Get arguments - my ($self, $aText, $aToc) = @_; - # Add text to ToC - $aToc->{_toc} .= $aText; -} # _processTocText() - - -#--- HTML::TocGenerator::_processTokenAsTocEndingToken() ---------------------- -# function: Check for token being a token to use for triggering the end of -# a ToC line and process it accordingly. -# args: - $aTokenType: type of token: 'start', 'end', 'comment' or 'text'. -# - $aTokenId: token id of currently parsed token - -sub _processTokenAsTocEndingToken { - # Get arguments - my ($self, $aTokenType, $aTokenId) = @_; - # Local variables - my ($i, $tokenId, $toc, $tokens); - # Loop through dirty start tokens - $i = 0; - - # Alias token array of right type - $tokens = $self->{_tokensTocEnd}[$aTokenType]; - # Loop through token array - while ($i < scalar @$tokens) { - # Aliases - $tokenId = $tokens->[$i][TT_TAG_END]; - # Does current end tag equals dirty tag? - if ($aTokenId eq $tokenId) { - # Yes, current end tag equals dirty tag; - # Process ToC-ending-token - $self->_processTocEndingToken($tokens->[$i]); - # Remove dirty tag from array, automatically advancing to - # next token - splice(@$tokens, $i, 1); - } - else { - # No, current end tag doesn't equal dirty tag; - # Advance to next token - $i++; - } - } -} # _processTokenAsTocEndingToken() - - -#--- HTML::TocGenerator::_processTokenAsTocStartingToken() -------------------- -# function: Check for token being a ToC-starting-token and process it -# accordingly. -# args: - $aTokenType: type of token. Can be either TT_TOKENTYPE_START, -# _END, _TEXT, _COMMENT or _DECLARATION. -# - $aTokenId: token id of currently parsed token -# - $aTokenAttributes: reference to hash containing attributes of -# currently parsed token -# - $aTokenOrigText: reference to original text of token -# returns: 1 if successful, i.e. token is processed as ToC-starting-token, 0 -# if not. - -sub _processTokenAsTocStartingToken { - # Get arguments - my ($self, $aTokenType, $aTokenId, $aTokenAttributes, $aTokenOrigText) = @_; - # Local variables - my ($level, $levelToToc, $groupId, $groupToToc); - my ($result, $tocToken, $tagBegin, @tokensTocBegin, $fileSpec); - # Bias to token not functioning as ToC-starting-token - $result = 0; - # Loop through start tokens of right type - foreach $tocToken (@{$self->{_tokensTocBegin}[$aTokenType]}) { - # Alias file filter - $fileSpec = $tocToken->[TT_GROUP]{'fileSpec'}; - # File matches? - if (!defined($fileSpec) || ( - defined($fileSpec) && - ($self->{_currentFile} =~ m/$fileSpec/) - )) { - # Yes, file matches; - # Alias tag begin - $tagBegin = $tocToken->[TT_TAG_BEGIN]; - # Tag and attributes match? - if ( - defined($tagBegin) && - ($aTokenId =~ m/$tagBegin/) && - HTML::TocGenerator::_doesHashContainHash( - $aTokenAttributes, $tocToken->[TT_INCLUDE_ATTRIBUTES_BEGIN], 0 - ) && - HTML::TocGenerator::_doesHashContainHash( - $aTokenAttributes, $tocToken->[TT_EXCLUDE_ATTRIBUTES_BEGIN], 1 - ) - ) { - # Yes, tag and attributes match; - # Aliases - $level = $tocToken->[TT_GROUP]{'level'}; - $levelToToc = $tocToken->[TT_TOC]{options}{'levelToToc'}; - $groupId = $tocToken->[TT_GROUP]{'groupId'}; - $groupToToc = $tocToken->[TT_TOC]{options}{'groupToToc'}; - # Must level and group be processed? - if ( - ($level =~ m/$levelToToc/) && - ($groupId =~ m/$groupToToc/) - ) { - # Yes, level and group must be processed; - # Indicate token acts as ToC-starting-token - $result = 1; - # Process ToC-starting-token - $self->_processTocStartingToken( - $tocToken, $aTokenType, $aTokenAttributes, $aTokenOrigText - ); - } - } - } - } - # Return value - return $result; -} # _processTokenAsTocStartingToken() - - -#--- HTML::TocGenerator::_resetBatchVariables() ------------------------------- -# function: Reset variables which are set because of batch invocation. - -sub _resetBatchVariables { - # Get arguments - my ($self) = @_; - - # Filename of current file being parsed, empty string if not available - $self->{_currentFile} = ""; - # Arrays containing start, end, comment, text & declaration tokens which - # must trigger the ToC assembling. Each array element may contain a - # reference to an array containing the following elements: - # - # TT_TAG_BEGIN => 0; - # TT_TAG_END => 1; - # TT_TAG_TYPE_END => 2; - # TT_INCLUDE_ATTRIBUTES_BEGIN => 3; - # TT_EXCLUDE_ATTRIBUTES_BEGIN => 4; - # TT_INCLUDE_ATTRIBUTES_END => 5; - # TT_EXCLUDE_ATTRIBUTES_END => 6; - # TT_GROUP => 7; - # TT_TOC => 8; - # TT_ATTRIBUTES_TOC => 9; - # - $self->{_tokensTocBegin} = [ - [], # TT_TOKENTYPE_START - [], # TT_TOKENTYPE_END - [], # TT_TOKENTYPE_COMMENT - [], # TT_TOKENTYPE_TEXT - [] # TT_TOKENTYPE_DECLARATION - ]; - $self->{_tokensTocEnd} = [ - [], # TT_TOKENTYPE_START - [], # TT_TOKENTYPE_END - [], # TT_TOKENTYPE_COMMENT - [], # TT_TOKENTYPE_TEXT - [] # TT_TOKENTYPE_DECLARATION - ]; - # TRUE if ToCs have been initialized, FALSE if not. - $self->{_doneInitializeTocs} = 0; - # Array of ToCs to process - $self->{_tocs} = []; - # Active anchor name - $self->{_activeAnchorName} = undef; -} # _resetBatchVariables() - - -#--- HTML::TocGenerator::_resetStackVariables() ------------------------------- -# function: Reset variables which cumulate during ToC generation. - -sub _resetStackVariables { - # Get arguments - my ($self) = @_; - # Reset variables - $self->{levels} = undef; - $self->{groupIdLevels} = undef; -} # _resetStackVariables() - - -#--- HTML::TocGenerator::_setActiveAnchorName() ------------------------------- -# function: Set active anchor name. -# args: - aAnchorName: Name of anchor name to set active. - -sub _setActiveAnchorName { - # Get arguments - my ($self, $aAnchorName) = @_; - # Set active anchor name - $self->{_activeAnchorName} = $aAnchorName; -} # _setActiveAnchorName() - - -#--- HTML::TocGenerator::_showWarning() --------------------------------------- -# function: Show warning. -# args: - aWarningNr: Number of warning to show. -# - aWarningArgs: Arguments to display within the warning. - -sub _showWarning { - # Get arguments - my ($self, $aWarningNr, $aWarningArgs) = @_; - # Local variables - my (%warnings); - # Set warnings - %warnings = ( - WARNING_NESTED_ANCHOR_PS_WITHIN_PS() => - "Nested anchor '%s' within anchor '%s'.", - WARNING_TOC_ATTRIBUTE_PS_NOT_AVAILABLE_WITHIN_PS() => - "ToC attribute '%s' not available within token '%s'.", - ); - # Show warning - print STDERR "warning ($aWarningNr): " . sprintf($warnings{"$aWarningNr"}, @$aWarningArgs) . "\n"; -} # _showWarning() - - -#--- HTML::TocGenerator::anchorId() ------------------------------------------- -# function: Anchor id processing method. Leave it up to the descendant to do -# something useful with it. -# args: - $aAnchorId -# - $aToc: Reference to ToC to which anchorId belongs. - -sub anchorId { -} # anchorId() - - -#--- HTML::TocGenerator::anchorNameBegin() ------------------------------------ -# function: Anchor name begin processing method. Leave it up to the descendant -# to do something useful with it. -# args: - $aAnchorName -# - $aToc: Reference to ToC to which anchorname belongs. - -sub anchorNameBegin { -} # anchorNameBegin() - - -#--- HTML::TocGenerator::anchorNameEnd() -------------------------------------- -# function: Anchor name end processing method. Leave it up to the descendant -# to do something useful with it. -# args: - $aAnchorName -# - $aToc: Reference to ToC to which anchorname belongs. - -sub anchorNameEnd { -} # anchorNameEnd() - - -#--- HTML::TocGenerator::comment() -------------------------------------------- -# function: Process comment. -# args: - $aComment: comment text with '<!--' and '-->' tags stripped off. - -sub comment { - # Get arguments - my ($self, $aComment) = @_; - # Must a ToC be generated? - if ($self->{_doGenerateToc}) { - # Yes, a ToC must be generated - # Process end tag as ToC-starting-token - $self->_processTokenAsTocStartingToken( - TT_TOKENTYPE_COMMENT, $aComment, undef, \$aComment - ); - # Process end tag as token which ends ToC registration - $self->_processTokenAsTocEndingToken( - TT_TOKENTYPE_COMMENT, $aComment - ); - } -} # comment() - - -#--- HTML::TocGenerator::end() ------------------------------------------------ -# function: This function is called every time a closing tag is encountered. -# args: - $aTag: tag name (in lower case). -# - $aOrigText: tag name including brackets. - -sub end { - # Get arguments - my ($self, $aTag, $aOrigText) = @_; - # Local variables - my ($tag, $toc, $i); - # Must a ToC be generated? - if ($self->{_doGenerateToc}) { - # Yes, a ToC must be generated - # Process end tag as ToC-starting-token - $self->_processTokenAsTocStartingToken( - TT_TOKENTYPE_END, $aTag, undef, \$aOrigText - ); - # Process end tag as ToC-ending-token - $self->_processTokenAsTocEndingToken( - TT_TOKENTYPE_END, $aTag - ); - # Tag is of type 'anchor'? - if (defined($self->{_activeAnchorName}) && ($aTag eq "a")) { - # Yes, tag is of type 'anchor'; - # Reset dirty anchor - $self->{_activeAnchorName} = undef; - } - } -} # end() - - -#--- HTML::TocGenerator::extend() --------------------------------------------- -# function: Extend ToCs. -# args: - $aTocs: Reference to array of ToC objects -# - $aString: String to parse. - -sub extend { - # Get arguments - my ($self, $aTocs, $aString) = @_; - # Initialize TocGenerator batch - $self->_initializeExtenderBatch($aTocs); - # Extend ToCs - $self->_extend($aString); - # Deinitialize TocGenerator batch - $self->_deinitializeExtenderBatch(); -} # extend() - - -#--- HTML::TocGenerator::extendFromFile() ------------------------------------- -# function: Extend ToCs. -# args: - @aTocs: Reference to array of ToC objects -# - @aFiles: Reference to array of files to parse. - -sub extendFromFile { - # Get arguments - my ($self, $aTocs, $aFiles) = @_; - # Initialize TocGenerator batch - $self->_initializeExtenderBatch($aTocs); - # Extend ToCs - $self->_extendFromFile($aFiles); - # Deinitialize TocGenerator batch - $self->_deinitializeExtenderBatch(); -} # extendFromFile() - - -#--- HTML::TocGenerator::generate() ------------------------------------------- -# function: Generate ToC. -# args: - $aToc: Reference to (array of) ToC object(s) -# - $aString: Reference to string to parse -# - $aOptions: optional options - -sub generate { - # Get arguments - my ($self, $aToc, $aString, $aOptions) = @_; - # Initialize TocGenerator batch - $self->_initializeGeneratorBatch($aToc, $aOptions); - # Do generate ToC - $self->_generate($aString); - # Deinitialize TocGenerator batch - $self->_deinitializeGeneratorBatch(); -} # generate() - - -#--- HTML::TocGenerator::generateFromFile() ----------------------------------- -# function: Generate ToC. -# args: - $aToc: Reference to (array of) ToC object(s) -# - $aFile: (reference to array of) file to parse. -# - $aOptions: optional options - -sub generateFromFile { - # Get arguments - my ($self, $aToc, $aFile, $aOptions) = @_; - # Initialize TocGenerator batch - $self->_initializeGeneratorBatch($aToc, $aOptions); - # Do generate ToC - $self->_generateFromFile($aFile); - # Deinitialize TocGenerator batch - $self->_deinitializeGeneratorBatch(); -} # generateFromFile() - - -#--- HTML::TocGenerator::number() --------------------------------------------- -# function: Heading number processing method. Leave it up to the descendant -# to do something useful with it. -# args: - $aNumber -# - $aToc: Reference to ToC to which anchorname belongs. - -sub number { - # Get arguments - my ($self, $aNumber, $aToc) = @_; -} # number() - - -#--- HTML::TocGenerator::parse() ---------------------------------------------- -# function: Parse scalar. -# args: - $aString: string to parse - -sub parse { - # Get arguments - my ($self, $aString) = @_; - # Call ancestor - $self->SUPER::parse($aString); -} # parse() - - -#--- HTML::TocGenerator::parse_file() ----------------------------------------- -# function: Parse file. - -sub parse_file { - # Get arguments - my ($self, $aFile) = @_; - # Call ancestor - $self->SUPER::parse_file($aFile); -} # parse_file() - - -#--- HTML::TocGenerator::setOptions() ----------------------------------------- -# function: Set options. -# args: - aOptions: Reference to hash containing options. - -sub setOptions { - # Get arguments - my ($self, $aOptions) = @_; - # Options are defined? - if (defined($aOptions)) { - # Yes, options are defined; add to options - %{$self->{options}} = (%{$self->{options}}, %$aOptions); - } -} # setOptions() - - -#--- HTML::TocGenerator::start() ---------------------------------------------- -# function: This function is called every time an opening tag is encountered. -# args: - $aTag: tag name (in lower case). -# - $aAttr: reference to hash containing all tag attributes (in lower -# case). -# - $aAttrSeq: reference to array containing all tag attributes (in -# lower case) in the original order -# - $aOrigText: the original HTML text - -sub start { - # Get arguments - my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_; - $self->{isTocToken} = 0; - # Start tag is of type 'anchor name'? - if ($aTag eq "a" && defined($aAttr->{name})) { - # Yes, start tag is of type 'anchor name'; - # Is another anchor already active? - if (defined($self->{_activeAnchorName})) { - # Yes, another anchor is already active; - # Is the first anchor inserted by 'TocGenerator'? - if ($self->{_doOutputAnchorNameEnd}) { - # Yes, the first anchor is inserted by 'TocGenerator'; - # Show warning - $self->_showWarning( - WARNING_NESTED_ANCHOR_PS_WITHIN_PS, - [$aOrigText, $self->{_activeAnchorName}] - ); - } - } - # Set active anchor name - $self->_setActiveAnchorName($aAttr->{name}); - } - # Must a ToC be generated? - if ($self->{_doGenerateToc}) { - # Yes, a ToC must be generated - # Process start tag as ToC token - $self->{isTocToken} = $self->_processTokenAsTocStartingToken( - TT_TOKENTYPE_START, $aTag, $aAttr, \$aOrigText - ); - # Process end tag as ToC-ending-token - $self->_processTokenAsTocEndingToken( - TT_TOKENTYPE_START, $aTag - ); - } -} # start() - - -#--- HTML::TocGenerator::text() ----------------------------------------------- -# function: This function is called every time plain text is encountered. -# args: - @_: array containing data. - -sub text { - # Get arguments - my ($self, $aText) = @_; - # Local variables - my ($text, $toc, $i, $token, $tokens); - # Must a ToC be generated? - if ($self->{_doGenerateToc}) { - # Yes, a ToC must be generated - # Are there dirty start tags? - - # Loop through token types - foreach $tokens (@{$self->{_tokensTocEnd}}) { - # Loop though tokens - foreach $token (@$tokens) { - # Add text to toc - - # Alias - $toc = $token->[TT_TOC]; - # Remove possible newlines from text - ($text = $aText) =~ s/\s*\n\s*/ /g; - # Add text to toc - $self->_processTocText($text, $toc); - } - } - } -} # text() - - - - -#=== HTML::_TokenTocParser ==================================================== -# function: Parse 'toc tokens'. 'Toc tokens' mark HTML code which is to be -# inserted into the ToC. -# note: Used internally. - -package HTML::_TokenTocParser; - - -BEGIN { - use vars qw(@ISA); - - @ISA = qw(HTML::Parser); -} - - -END {} - - -#--- HTML::_TokenTocParser::new() --------------------------------------------- -# function: Constructor - -sub new { - # Get arguments - my ($aType) = @_; - # Create instance - my $self = $aType->SUPER::new; - - # Return instance - return $self; -} # new() - - -#--- HTML::_TokenTocParser::_parseAttributes() -------------------------------- -# function: Parse attributes. -# args: - $aAttr: Reference to hash containing all tag attributes (in lower -# case). -# - $aIncludeAttributes: Reference to hash to which 'include -# attributes' must be added. -# - $aExcludeAttributes: Reference to hash to which 'exclude -# attributes' must be added. -# - $aTocAttributes: Reference to hash to which 'ToC attributes' -# must be added. - -sub _parseAttributes { - # Get arguments - my ( - $self, $aAttr, $aIncludeAttributes, $aExcludeAttributes, - $aTocAttributes - ) = @_; - # Local variables - my ($key, $value); - my ($attributeToExcludeToken, $attributeToTocToken); - # Get token which marks attributes which must be excluded - $attributeToExcludeToken = $self->{_toc}{options}{'attributeToExcludeToken'}; - $attributeToTocToken = $self->{_toc}{options}{'attributeToTocToken'}; - # Loop through attributes - while (($key, $value) = each %$aAttr) { - # Attribute value equals 'ToC token'? - if ($value =~ m/$attributeToTocToken/) { - # Yes, attribute value equals 'ToC token'; - # Add attribute to 'ToC attributes' - push @$aTocAttributes, $key; - } - else { - # No, attribute isn't 'ToC' token; - # Attribute value starts with 'exclude token'? - if ($value =~ m/^$attributeToExcludeToken(.*)/) { - # Yes, attribute value starts with 'exclude token'; - # Add attribute to 'exclude attributes' - $$aExcludeAttributes{$key} = "$1"; - } - else { - # No, attribute key doesn't start with '-'; - # Add attribute to 'include attributes' - $$aIncludeAttributes{$key} = $value; - } - } - } -} # _parseAttributes() - - - - -#=== HTML::_TokenTocBeginParser =============================================== -# function: Parse 'toc tokens'. 'Toc tokens' mark HTML code which is to be -# inserted into the ToC. -# note: Used internally. - -package HTML::_TokenTocBeginParser; - - -BEGIN { - use vars qw(@ISA); - - @ISA = qw(HTML::_TokenTocParser); -} - -END {} - - -#--- HTML::_TokenTocBeginParser::new() ---------------------------------------- -# function: Constructor - -sub new { - # Get arguments - my ($aType, $aTokenArray) = @_; - # Create instance - my $self = $aType->SUPER::new; - # Reference token array - $self->{tokens} = $aTokenArray; - # Reference to last added token - $self->{_lastAddedToken} = undef; - $self->{_lastAddedTokenType} = undef; - # Return instance - return $self; -} # new() - - -#--- HTML::_TokenTocBeginParser::_processAttributes() ------------------------- -# function: Process attributes. -# args: - $aAttributes: Attributes to parse. - -sub _processAttributes { - # Get arguments - my ($self, $aAttributes) = @_; - # Local variables - my (%includeAttributes, %excludeAttributes, @tocAttributes); - - # Parse attributes - $self->_parseAttributes( - $aAttributes, \%includeAttributes, \%excludeAttributes, \@tocAttributes - ); - # Include attributes are specified? - if (keys(%includeAttributes) > 0) { - # Yes, include attributes are specified; - # Store include attributes - @${$self->{_lastAddedToken}}[ - HTML::TocGenerator::TT_INCLUDE_ATTRIBUTES_BEGIN - ] = \%includeAttributes; - } - # Exclude attributes are specified? - if (keys(%excludeAttributes) > 0) { - # Yes, exclude attributes are specified; - # Store exclude attributes - @${$self->{_lastAddedToken}}[ - HTML::TocGenerator::TT_EXCLUDE_ATTRIBUTES_BEGIN - ] = \%excludeAttributes; - } - # Toc attributes are specified? - if (@tocAttributes > 0) { - # Yes, toc attributes are specified; - # Store toc attributes - @${$self->{_lastAddedToken}}[ - HTML::TocGenerator::TT_ATTRIBUTES_TOC - ] = \@tocAttributes; - } -} # _processAttributes() - - -#--- HTML::_TokenTocBeginParser::_processToken() ------------------------------ -# function: Process token. -# args: - $aTokenType: Type of token to process. -# - $aTag: Tag of token. - -sub _processToken { - # Get arguments - my ($self, $aTokenType, $aTag) = @_; - # Local variables - my ($tokenArray, $index); - # Push element on array of update tokens - $index = push(@{$self->{tokens}[$aTokenType]}, []) - 1; - # Alias token array to add element to - $tokenArray = $self->{tokens}[$aTokenType]; - # Indicate last updated token array element - $self->{_lastAddedTokenType} = $aTokenType; - $self->{_lastAddedToken} = \$$tokenArray[$index]; - # Add fields - $$tokenArray[$index][HTML::TocGenerator::TT_TAG_BEGIN] = $aTag; - $$tokenArray[$index][HTML::TocGenerator::TT_GROUP] = $self->{_group}; - $$tokenArray[$index][HTML::TocGenerator::TT_TOC] = $self->{_toc}; -} # _processToken() - - -#--- HTML::_TokenTocBeginParser::comment() ------------------------------------ -# function: Process comment. -# args: - $aComment: comment text with '<!--' and '-->' tags stripped off. - -sub comment { - # Get arguments - my ($self, $aComment) = @_; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_COMMENT, $aComment); -} # comment() - - -#--- HTML::_TokenTocBeginParser::declaration() -------------------------------- -# function: This function is called every time a markup declaration is -# encountered by HTML::Parser. -# args: - $aDeclaration: Markup declaration. - -sub declaration { - # Get arguments - my ($self, $aDeclaration) = @_; - # Process token - $self->_processToken( - HTML::TocGenerator::TT_TOKENTYPE_DECLARATION, $aDeclaration - ); -} # declaration() - - -#--- HTML::_TokenTocBeginParser::end() ---------------------------------------- -# function: This function is called every time a closing tag is encountered -# by HTML::Parser. -# args: - $aTag: tag name (in lower case). - -sub end { - # Get arguments - my ($self, $aTag, $aOrigText) = @_; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_END, $aTag); -} # end() - - -#--- HTML::_TokenTocBeginParser::parse() -------------------------------------- -# function: Parse begin token. -# args: - $aToken: 'toc token' to parse - -sub parse { - # Get arguments - my ($self, $aString) = @_; - # Call ancestor - $self->SUPER::parse($aString); -} # parse() - - -#--- HTML::_TokenTocBeginParser->setGroup() ----------------------------------- -# function: Set current 'tokenToToc' group. - -sub setGroup { - # Get arguments - my ($self, $aGroup) = @_; - # Set current 'tokenToToc' group - $self->{_group} = $aGroup; -} # setGroup() - - -#--- HTML::_TokenTocBeginParser->setToc() ------------------------------------- -# function: Set current ToC. - -sub setToc { - # Get arguments - my ($self, $aToc) = @_; - # Set current ToC - $self->{_toc} = $aToc; -} # setToc() - - -#--- HTML::_TokenTocBeginParser::start() -------------------------------------- -# function: This function is called every time an opening tag is encountered. -# args: - $aTag: tag name (in lower case). -# - $aAttr: reference to hash containing all tag attributes (in lower -# case). -# - $aAttrSeq: reference to array containing all attribute keys (in -# lower case) in the original order -# - $aOrigText: the original HTML text - -sub start { - # Get arguments - my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_START, $aTag); - # Process attributes - $self->_processAttributes($aAttr); -} # start() - - -#--- HTML::_TokenTocBeginParser::text() --------------------------------------- -# function: This function is called every time plain text is encountered. -# args: - @_: array containing data. - -sub text { - # Get arguments - my ($self, $aText) = @_; - # Was token already created and is last added token of type 'text'? - if ( - defined($self->{_lastAddedToken}) && - $self->{_lastAddedTokenType} == HTML::TocGenerator::TT_TOKENTYPE_TEXT - ) { - # Yes, token is already created; - # Add tag to existing token - @${$self->{_lastAddedToken}}[HTML::TocGenerator::TT_TAG_BEGIN] .= $aText; - } - else { - # No, token isn't created; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_TEXT, $aText); - } -} # text() - - - - -#=== HTML::_TokenTocEndParser ================================================= -# function: Parse 'toc tokens'. 'Toc tokens' mark HTML code which is to be -# inserted into the ToC. -# note: Used internally. - -package HTML::_TokenTocEndParser; - - -BEGIN { - use vars qw(@ISA); - - @ISA = qw(HTML::_TokenTocParser); -} - - -END {} - - -#--- HTML::_TokenTocEndParser::new() ------------------------------------------ -# function: Constructor -# args: - $aType: Class type. - -sub new { - # Get arguments - my ($aType) = @_; - # Create instance - my $self = $aType->SUPER::new; - # Reference to last added token - $self->{_lastAddedToken} = undef; - # Return instance - return $self; -} # new() - - -#--- HTML::_TokenTocEndParser::_processAttributes() --------------------------- -# function: Process attributes. -# args: - $aAttributes: Attributes to parse. - -sub _processAttributes { - # Get arguments - my ($self, $aAttributes) = @_; - # Local variables - my (%includeAttributes, %excludeAttributes); - - # Parse attributes - $self->_parseAttributes( - $aAttributes, \%includeAttributes, \%excludeAttributes - ); - # Include attributes are specified? - if (keys(%includeAttributes) > 0) { - # Yes, include attributes are specified; - # Store include attributes - @${$self->{_Token}}[ - HTML::TocGenerator::TT_INCLUDE_ATTRIBUTES_END - ] = \%includeAttributes; - } - # Exclude attributes are specified? - if (keys(%excludeAttributes) > 0) { - # Yes, exclude attributes are specified; - # Store exclude attributes - @${$self->{_Token}}[ - HTML::TocGenerator::TT_EXCLUDE_ATTRIBUTES_END - ] = \%excludeAttributes; - } -} # _processAttributes() - - -#--- HTML::_TokenTocEndParser::_processToken() -------------------------------- -# function: Process token. -# args: - $aTokenType: Type of token to process. -# - $aTag: Tag of token. - -sub _processToken { - # Get arguments - my ($self, $aTokenType, $aTag) = @_; - # Update token - @${$self->{_token}}[HTML::TocGenerator::TT_TAG_TYPE_END] = $aTokenType; - @${$self->{_token}}[HTML::TocGenerator::TT_TAG_END] = $aTag; - # Indicate token type which has been processed - $self->{_lastAddedTokenType} = $aTokenType; -} # _processToken() - - -#--- HTML::_TokenTocEndParser::comment() -------------------------------------- -# function: Process comment. -# args: - $aComment: comment text with '<!--' and '-->' tags stripped off. - -sub comment { - # Get arguments - my ($self, $aComment) = @_; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_COMMENT, $aComment); -} # comment() - - -#--- HTML::_TokenTocDeclarationParser::declaration() -------------------------- -# function: This function is called every time a markup declaration is -# encountered by HTML::Parser. -# args: - $aDeclaration: Markup declaration. - -sub declaration { - # Get arguments - my ($self, $aDeclaration) = @_; - # Process token - $self->_processToken( - HTML::TocGenerator::TT_TOKENTYPE_DECLARATION, $aDeclaration - ); -} # declaration() - - -#--- HTML::_TokenTocEndParser::end() ------------------------------------------ -# function: This function is called every time a closing tag is encountered -# by HTML::Parser. -# args: - $aTag: tag name (in lower case). - -sub end { - # Get arguments - my ($self, $aTag, $aOrigText) = @_; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_END, $aTag); -} # end() - - -#--- HTML::_TokenTocEndParser::parse() ---------------------------------------- -# function: Parse token. -# args: - $aString: 'toc token' to parse -# - $aToken: Reference to token -# - $aTokenTypeBegin: Type of begin token - -sub parse { - # Get arguments - my ($self, $aString, $aToken, $aTokenTypeBegin) = @_; - # Token argument specified? - if (defined($aToken)) { - # Yes, token argument is specified; - # Store token reference - $self->{_token} = $aToken; - } - # End tag defined? - if (! defined($aString)) { - # No, end tag isn't defined; - # Last added tokentype was of type 'start'? - if ( - (defined($aTokenTypeBegin)) && - ($aTokenTypeBegin == HTML::TocGenerator::TT_TOKENTYPE_START) - ) { - # Yes, last added tokentype was of type 'start'; - # Assume end tag - $self->_processToken( - HTML::TocGenerator::TT_TAG_END, - @${$self->{_token}}[HTML::TocGenerator::TT_TAG_BEGIN] - ); - } - } - else { - # Call ancestor - $self->SUPER::parse($aString); - } -} # parse() - - -#--- HTML::_TokenTocEndParser::start() ---------------------------------------- -# function: This function is called every time an opening tag is encountered. -# args: - $aTag: tag name (in lower case). -# - $aAttr: reference to hash containing all tag attributes (in lower -# case). -# - $aAttrSeq: reference to array containing all attribute keys (in -# lower case) in the original order -# - $aOrigText: the original HTML text - -sub start { - # Get arguments - my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_START, $aTag); - # Process attributes - $self->_processAttributes($aAttr); -} # start() - - -#--- HTML::_TokenTocEndParser::text() ----------------------------------------- -# function: This function is called every time plain text is encountered. -# args: - @_: array containing data. - -sub text { - # Get arguments - my ($self, $aText) = @_; - - # Is token already created? - if (defined($self->{_lastAddedTokenType})) { - # Yes, token is already created; - # Add tag to existing token - @${$self->{_token}}[HTML::TocGenerator::TT_TAG_END] .= $aText; - } - else { - # No, token isn't created; - # Process token - $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_TEXT, $aText); - } -} # text() - - -1; |