190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#=== HTML::TocGenerator ======================================================= 290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Generate 'HTML::Toc' table of contents. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note: - 'TT' is an abbrevation of 'TocToken'. 490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::TocGenerator; 790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse strict; 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse HTML::Parser; 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberBEGIN { 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber use vars qw(@ISA $VERSION); 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $VERSION = '0.91'; 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @ISA = qw(HTML::Parser); 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Warnings 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant WARNING_NESTED_ANCHOR_PS_WITHIN_PS => 1; 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant WARNING_TOC_ATTRIBUTE_PS_NOT_AVAILABLE_WITHIN_PS => 2; 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TOC_TOKEN_ID => 0; 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TOC_TOKEN_INCLUDE => 1; 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TOC_TOKEN_EXCLUDE => 2; 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TOC_TOKEN_TOKENS => 3; 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TOC_TOKEN_GROUP => 4; 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TOC_TOKEN_TOC => 5; 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Token types 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TAG_BEGIN => 0; 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TAG_END => 1; 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TAG_TYPE_END => 2; 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_INCLUDE_ATTRIBUTES_BEGIN => 3; 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_EXCLUDE_ATTRIBUTES_BEGIN => 4; 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_INCLUDE_ATTRIBUTES_END => 5; 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_EXCLUDE_ATTRIBUTES_END => 6; 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_GROUP => 7; 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TOC => 8; 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_ATTRIBUTES_TOC => 9; 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant CONTAINMENT_INCLUDE => 0; 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant CONTAINMENT_EXCLUDE => 1; 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TEMPLATE_ANCHOR => '$groupId."-".$node'; 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TEMPLATE_ANCHOR_HREF => 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber '"<a href=#".' . TEMPLATE_ANCHOR . '.">"'; 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TEMPLATE_ANCHOR_HREF_FILE => 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber '"<a href=".$file."#".' . TEMPLATE_ANCHOR . '.">"'; 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TEMPLATE_ANCHOR_NAME => 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber '"<a name=".' . TEMPLATE_ANCHOR . '.">"'; 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TEMPLATE_TOKEN_NUMBER => '"$node  "'; 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TOKENTYPE_START => 0; 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TOKENTYPE_END => 1; 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TOKENTYPE_TEXT => 2; 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TOKENTYPE_COMMENT => 3; 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TT_TOKENTYPE_DECLARATION => 4; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {} 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::new() ------------------------------------------------ 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new { 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($aType) = @_; 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my $self = $aType->SUPER::new; 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Bias to not generate ToC 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_doGenerateToc} = 0; 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Bias to not use global groups 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_doUseGroupsGlobal} = 0; 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Output 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{output} = ""; 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset internal variables 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_resetBatchVariables(); 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{options} = {}; 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $self; 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # new() 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_deinitializeBatch() --------------------------------- 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _deinitializeBatch() { 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self) = @_; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _deinitializeBatch() 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_deinitializeExtenderBatch() ------------------------- 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _deinitializeExtenderBatch() { 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self) = @_; 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Do general batch deinitialization 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_deinitializeBatch(); 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate end of ToC generation 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_doGenerateToc} = 0; 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset batch variables 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_resetBatchVariables(); 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _deinitializeExtenderBatch() 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_deinitializeGeneratorBatch() ------------------------ 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _deinitializeGeneratorBatch() { 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self) = @_; 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Do 'extender' batch deinitialization 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_deinitializeExtenderBatch(); 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _deinitializeBatchGenerator() 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_doesHashContainHash() ------------------------------- 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Determines whether hash1 matches regular expressions of hash2. 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aHash1 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aHash2 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aContainmentType: 0 (include) or 1 (exclude) 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# returns: True (1) if hash1 satisfies hash2, 0 if not. For example, with the 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# following hashes: 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# %hash1 = { %hash2 = { 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# 'class' => 'header' 'class' => '^h' 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# 'id' => 'intro' } 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# } 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# the routine will return 1 if 'aContainmentType' equals 0, cause 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# 'hash1' satisfies the conditions of 'hash2'. The routine will 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# return 0 if 'aContainmentType' equals 1, cause 'hash1' doesn't 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# exclude the conditions of 'hash2'. 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note: Class function. 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _doesHashContainHash { 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($aHash1, $aHash2, $aContainmentType) = @_; 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($key1, $value1, $key2, $value2, $result); 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Bias to success 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = 1; 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through hash2 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HASH2: while (($key2, $value2) = each %$aHash2) { 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, values are available; 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get value1 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $value1 = $aHash1->{$key2}; 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Does value1 match criteria of value2? 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($value1) && $value1 =~ m/$value2/) { 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, value1 matches criteria of value2; 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Containment type was exclude? 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($aContainmentType == CONTAINMENT_EXCLUDE) { 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, containment type was exclude; 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate condition fails 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = 0; 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset 'each' iterator which we're going to break 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber keys %$aHash2; 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Break loop 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last HASH2; 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, value1 didn't match criteria of value2; 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Containment type was include? 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($aContainmentType == CONTAINMENT_INCLUDE) { 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, containment type was include; 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate condition fails 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = 0; 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset 'each' iterator which we're going to break 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber keys %$aHash2; 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Break loop 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last HASH2; 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return value 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $result; 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _doesHashContainHash() 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_extend() -------------------------------------------- 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Extend ToC. 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aString: String to parse. 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _extend { 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aFile) = @_; 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($file); 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Parse string 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->parse($aFile); 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Flush remaining buffered text 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->eof(); 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _extend() 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_extendFromFile() ------------------------------------ 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Extend ToC. 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aFile: (reference to array of) file to parse. 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _extendFromFile { 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aFile) = @_; 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($file, @files); 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Dereference array reference or make array of file specification 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @files = (ref($aFile) =~ m/ARRAY/) ? @$aFile : ($aFile); 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through files 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $file (@files) { 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store filename 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_currentFile} = $file; 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Parse file 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->parse_file($file); 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Flush remaining buffered text 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->eof(); 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _extendFromFile() 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_formatHeadingLevel() -------------------------------- 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Format heading level. 23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aLevel: Level of current heading 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aClass: Class of current heading 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aGroup: Group of current heading 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToc: Toc of current heading 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _formatHeadingLevel { 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aLevel, $aClass, $aGroup, $aToc) = @_; 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($result, $headingNumber, $numberingStyle); 24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $headingNumber = $self->_getGroupIdManager($aToc)-> 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber {levels}{$aClass}[$aLevel - 1] || 0; 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Alias numbering style of current group 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $numberingStyle = $aGroup->{numberingStyle}; 24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber SWITCH: { 24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($numberingStyle eq "decimal") { 24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = $headingNumber; 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last SWITCH; 25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($numberingStyle eq "lower-alpha") { 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = chr($headingNumber + ord('a') - 1); 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last SWITCH; 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($numberingStyle eq "upper-alpha") { 25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = chr($headingNumber + ord('A') - 1); 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last SWITCH; 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($numberingStyle eq "lower-roman") { 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber require Roman; 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = Roman::roman($headingNumber); 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last SWITCH; 26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($numberingStyle eq "upper-roman") { 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber require Roman; 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = Roman::Roman($headingNumber); 26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber last SWITCH; 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber die "Unknown case: $numberingStyle"; 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return value 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $result; 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _formatHeadingLevel() 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_formatTocNode() ------------------------------------- 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Format heading node. 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aLevel: Level of current heading 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aClass: Class of current heading 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aGroup: Group of current heading 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToc: Toc of current heading 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _formatTocNode { 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aLevel, $aClass, $aGroup, $aToc) = @_; 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($result, $level, $levelGroups); 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Alias 'levelGroups' of right 'groupId' 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $levelGroups = $aToc->{_levelGroups}{$aGroup->{'groupId'}}; 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through levels 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($level = 1; $level <= $aLevel; $level++) { 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # If not first level, add dot 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = ($result ? $result . "." : $result); 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Format heading level using argument group 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result .= $self->_formatHeadingLevel( 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $level, $aClass, @{$levelGroups}[$level - 1], $aToc 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return value 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $result; 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _formatTocNode() 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_generate() ------------------------------------------ 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Generate ToC. 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aString: Reference to string to parse 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _generate { 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aString) = @_; 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($toc); 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through ToCs 31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $toc (@{$self->{_tocs}}) { 31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Clear ToC 31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->clear(); 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Extend ToCs 32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_extend($aString); 32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _generate() 32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_generateFromFile() ---------------------------------- 32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Generate ToC. 32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aFile: (reference to array of) file to parse. 32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _generateFromFile { 33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aFile) = @_; 33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($toc); 33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through ToCs 33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $toc (@{$self->{_tocs}}) { 33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Clear ToC 33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->clear(); 33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Extend ToCs 34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_extendFromFile($aFile); 34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _generateFromFile() 34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_getGroupIdManager() --------------------------------- 34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Get group id manager. 34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aToc: Active ToC. 34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# returns: Group id levels. 34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _getGroupIdManager { 35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aToc) = @_; 35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($result); 35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Global groups? 35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{options}{'doUseGroupsGlobal'}) { 35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, global groups; 35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = $self; 35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, local groups; 36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = $aToc; 36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return value 36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $result; 36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _getGroupIdManager() 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_initializeBatch() ----------------------------------- 36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Initialize batch. This function is called once when a parse batch 37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# is started. 37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTocs: Reference to array of tocs. 37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _initializeBatch { 37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTocs) = @_; 37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($toc); 37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store reference to tocs 38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Is ToC specification reference to array? 38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ref($aTocs) =~ m/ARRAY/) { 38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, ToC specification is reference to array; 38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store array reference 38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_tocs} = $aTocs; 38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, ToC specification is reference to ToC object; 38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Wrap reference in array reference, containing only one element 39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_tocs} = [$aTocs]; 39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through ToCs 39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $toc (@{$self->{_tocs}}) { 39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Parse ToC options 39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->parseOptions(); 39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _initializeBatch() 39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_initializeExtenderBatch() -------------------------- 40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Initialize 'extender' batch. This function is called once when a 40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# parse batch is started. 40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTocs: Reference to array of tocs. 40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _initializeExtenderBatch { 40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTocs) = @_; 40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Do general batch initialization 40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_initializeBatch($aTocs); 41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Parse ToC options 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_parseTocOptions(); 41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate start of batch 41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_doGenerateToc} = 1; 41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _initializeExtenderBatch() 41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_initializeGeneratorBatch() -------------------------- 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Initialize generator batch. This function is called once when a 41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# parse batch is started. 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTocs: Reference to array of tocs. 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aOptions: optional options 42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _initializeGeneratorBatch { 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTocs, $aOptions) = @_; 42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add invocation options 42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->setOptions($aOptions); 42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Option 'doUseGroupsGlobal' specified? 42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!defined($self->{options}{'doUseGroupsGlobal'})) { 43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, options 'doUseGroupsGlobal' not specified; 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Default to no 'doUseGroupsGlobal' 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{options}{'doUseGroupsGlobal'} = 0; 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Global groups? 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{options}{'doUseGroupsGlobal'}) { 43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, global groups; 43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset groups and levels 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_resetStackVariables(); 43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Do 'extender' batch initialization 44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_initializeExtenderBatch($aTocs); 44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _initializeGeneratorBatch() 44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_linkTocToToken() ------------------------------------ 44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Link ToC to token. 44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aToc: ToC to add token to. 44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aFile 44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aGroupId 45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aLevel 45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aNode 45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aGroupLevel 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aLinkType 45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenAttributes: reference to hash containing attributes of 45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# currently parsed token 45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _linkTocToToken { 45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ( 46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self, $aToc, $aFile, $aGroupId, $aLevel, $aNode, $aGroupLevel, 46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aDoLinkToId, $aTokenAttributes 46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) = @_; 46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($file, $groupId, $level, $node, $anchorName); 46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($doInsertAnchor, $doInsertId); 46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Fill local arguments to be used by templates 46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $file = $aFile; 46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupId = $aGroupId; 47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $level = $aLevel; 47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node = $aNode; 47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Assemble anchor name 47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $anchorName = 47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ref($aToc->{_templateAnchorName}) eq "CODE" ? 47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber &{$aToc->{_templateAnchorName}}( 47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aFile, $aGroupId, $aLevel, $aNode 47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) : 47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber eval($aToc->{_templateAnchorName}); 48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Bias to insert anchor name 48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doInsertAnchor = 1; 48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doInsertId = 0; 48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Link to 'id'? 48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($aDoLinkToId) { 48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, link to 'id'; 48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate to insert anchor id 48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doInsertAnchor = 0; 48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doInsertId = 1; 49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Id attribute is available? 49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($aTokenAttributes->{id})) { 49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, id attribute is available; 49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Use existing ids? 49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($aToc->{options}{'doUseExistingIds'}) { 49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, use existing ids; 49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Use existing id 49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $anchorName = $aTokenAttributes->{id}; 49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate to not insert id 49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doInsertId = 0; 50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, link to 'name'; 50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Anchor name is currently active? 50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($self->{_activeAnchorName})) { 50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, anchor name is currently active; 50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Use existing anchors? 51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($aToc->{options}{'doUseExistingAnchors'}) { 51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, use existing anchors; 51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Use existing anchor name 51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $anchorName = $self->{_activeAnchorName}; 51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate to not insert anchor name 51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doInsertAnchor = 0; 51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, don't use existing anchors; insert new anchor; 51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # 52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add reference to ToC 52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aToc->{_toc} .= 52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ref($aToc->{_templateAnchorHrefBegin}) eq "CODE" ? 52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber &{$aToc->{_templateAnchorHrefBegin}}( 52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aFile, $aGroupId, $aLevel, $aNode, $anchorName 52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) : 53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber eval($aToc->{_templateAnchorHrefBegin}); 53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Bias to not output anchor name end 53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_doOutputAnchorNameEnd} = 0; 53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must anchor be inserted? 53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($doInsertAnchor) { 53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, anchor must be inserted; 53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Allow adding of anchor name begin token to text by calling 53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # 'anchorNameBegin' method 53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->anchorNameBegin( 54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ref($aToc->{_templateAnchorNameBegin}) eq "CODE" ? 54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber &{$aToc->{_templateAnchorNameBegin}}( 54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aFile, $aGroupId, $aLevel, $aNode, $anchorName 54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) : 54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber eval($aToc->{_templateAnchorNameBegin}), 54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aToc 54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must anchorId attribute be inserted? 55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($doInsertId) { 55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, anchorId attribute must be inserted; 55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Allow adding of anchorId attribute to text by calling 'anchorId' 55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # method 55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->anchorId($anchorName); 55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _linkTocToToken() 55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_outputAnchorNameEndConditionally() ------------------ 56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Output 'anchor name end' if necessary 56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aToc: ToC of which 'anchor name end' must be output. 56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _outputAnchorNameEndConditionally { 56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aToc) = @_; 56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must anchor name end be output? 56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{_doOutputAnchorNameEnd}) { 56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, output anchor name end; 56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Allow adding of anchor to text by calling 'anchorNameEnd' 57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # method 57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->anchorNameEnd( 57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ref($aToc->{_templateAnchorNameEnd}) eq "CODE" ? 57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber &{$aToc->{_templateAnchorNameEnd}} : 57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber eval($aToc->{_templateAnchorNameEnd}), 57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aToc 57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _outputAnchorNameEndConditionally() 57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_parseTocOptions() ----------------------------------- 58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse ToC options. 58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _parseTocOptions { 58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self) = @_; 58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($toc, $group, $tokens, $tokenType, $i); 58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Create parsers for ToC tokens 59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_tokensTocBegin} = []; 59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my $tokenTocBeginParser = HTML::_TokenTocBeginParser->new( 59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_tokensTocBegin} 59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my $tokenTocEndParser = HTML::_TokenTocEndParser->new(); 59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through ToCs 59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $toc (@{$self->{_tocs}}) { 59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reference parser ToC to current ToC 59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocBeginParser->setToc($toc); 59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through 'tokenToToc' groups 60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $group (@{$toc->{options}{'tokenToToc'}}) { 60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reference parser group to current group 60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocBeginParser->setGroup($group); 60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Parse 'tokenToToc' group 60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocBeginParser->parse($group->{'tokenBegin'}); 60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Flush remaining buffered text 60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocBeginParser->eof(); 60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocEndParser->parse( 60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $group->{'tokenEnd'}, 60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocBeginParser->{_lastAddedToken}, 61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocBeginParser->{_lastAddedTokenType} 61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Flush remaining buffered text 61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenTocEndParser->eof(); 61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _parseTocOptions() 61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_processTocEndingToken() ----------------------------- 62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process ToC-ending-token. 62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTocToken: token which acts as ToC-ending-token. 62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTocEndingToken { 62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTocToken) = @_; 62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($toc); 62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Aliases 62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc = $aTocToken->[TT_TOC]; 63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Link ToC to tokens? 63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($toc->{options}{'doLinkToToken'}) { 63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, link ToC to tokens; 63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add anchor href end 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->{_toc} .= 63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (ref($toc->{_templateAnchorHrefEnd}) eq "CODE") ? 63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber &{$toc->{_templateAnchorHrefEnd}} : 63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber eval($toc->{_templateAnchorHrefEnd}); 63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Output anchor name end only if necessary 64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_outputAnchorNameEndConditionally($toc); 64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processTocEndingToken() 64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_processTocStartingToken() --------------------------- 64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process ToC-starting-token. 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTocToken: token which acts as ToC-starting-token. 64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenType: type of token. Can be either TT_TOKENTYPE_START, 64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# _END, _TEXT, _COMMENT or _DECLARATION. 65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenAttributes: reference to hash containing attributes of 65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# currently parsed token 65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenOrigText: reference to original token text 65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTocStartingToken { 65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTocToken, $aTokenType, $aTokenAttributes, $aTokenOrigText) = @_; 65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($i, $level, $doLinkToId, $node, $groupLevel); 65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($file, $tocTokenId, $groupId, $toc, $attribute); 66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Aliases 66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $file = $self->{_currentFile}; 66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc = $aTocToken->[TT_TOC]; 66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $level = $aTocToken->[TT_GROUP]{'level'}; 66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupId = $aTocToken->[TT_GROUP]{'groupId'}; 66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Retrieve 'doLinkToId' setting from either group options or toc options 66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doLinkToId = (defined($aTocToken->[TT_GROUP]{'doLinkToId'})) ? 66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aTocToken->[TT_GROUP]{'doLinkToId'} : $toc->{options}{'doLinkToId'}; 66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Link to 'id' and tokenType isn't 'start'? 67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (($doLinkToId) && ($aTokenType != TT_TOKENTYPE_START)) { 67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, link to 'id' and tokenType isn't 'start'; 67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate to *not* link to 'id' 67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $doLinkToId = 0; 67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ref($level) eq "CODE") { 67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $level = &$level($self->{_currentFile}, $node); 67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (ref($groupId) eq "CODE") { 68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupId = &$groupId($self->{_currentFile}, $node); 68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Determine class level 68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my $groupIdManager = $self->_getGroupIdManager($toc); 68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Known group? 68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!exists($groupIdManager->{groupIdLevels}{$groupId})) { 68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, unknown group; 69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add group 69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupIdManager->{groupIdLevels}{$groupId} = keys( 69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %{$groupIdManager->{groupIdLevels}} 69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) + 1; 69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupLevel = $groupIdManager->{groupIdLevels}{$groupId}; 69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Temporarily allow symbolic references 69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber #no strict qw(refs); 69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Increase level 70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupIdManager->{levels}{$groupId}[$level - 1] += 1; 70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset remaining levels of same group 70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = $level; $i < @{$groupIdManager->{levels}{$groupId}}; $i++) { 70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupIdManager->{levels}{$groupId}[$i] = 0; 70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Assemble numeric string indicating current level 70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node = $self->_formatTocNode( 70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $level, $groupId, $aTocToken->[TT_GROUP], $toc 70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add newline if _toc not empty 71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($toc->{_toc}) { 71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->{_toc} .= "\n"; 71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add toc item info 71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->{_toc} .= "$level $groupLevel $groupId $node " . 71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupIdManager->{levels}{$groupId}[$level - 1] . " "; 71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add value of 'id' attribute if available 72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($aTokenAttributes->{id})) { 72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->{_toc} .= $aTokenAttributes->{id}; 72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->{_toc} .= " "; 72590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Link ToC to tokens? 72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($toc->{options}{'doLinkToToken'}) { 72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, link ToC to tokens; 72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Link ToC to token 72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_linkTocToToken( 73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc, $file, $groupId, $level, $node, $groupLevel, $doLinkToId, 73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aTokenAttributes 73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Number tokens? 73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( 73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aTocToken->[TT_GROUP]{'doNumberToken'} || 73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ( 73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ! defined($aTocToken->[TT_GROUP]{'doNumberToken'}) && 74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc->{options}{'doNumberToken'} 74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) 74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) { 74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, number tokens; 74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add number by calling 'number' method 74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->number( 74690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ref($toc->{_templateTokenNumber}) eq "CODE" ? 74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber &{$toc->{_templateTokenNumber}}( 74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node, $groupId, $file, $groupLevel, $level, $toc 74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) : 75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber eval($toc->{_templateTokenNumber}), 75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc 75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must attribute be used as ToC text? 75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($aTocToken->[TT_ATTRIBUTES_TOC])) { 75790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, attribute must be used as ToC text; 75890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through attributes 75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $attribute (@{$aTocToken->[TT_ATTRIBUTES_TOC]}) { 76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Attribute is available? 76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($$aTokenAttributes{$attribute})) { 76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, attribute is available; 76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add attribute value to ToC 76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTocText($$aTokenAttributes{$attribute}, $toc); 76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, attribute isn't available; 76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Show warning 76990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_showWarning( 77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber WARNING_TOC_ATTRIBUTE_PS_NOT_AVAILABLE_WITHIN_PS, 77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [$attribute, $$aTokenOrigText] 77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 77490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Output anchor name end only if necessary 77590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber #$self->_outputAnchorNameEndConditionally($toc); 77690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # End attribute 77790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTocEndingToken($aTocToken); 77890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 77990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 78090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 78190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, attribute mustn't be used as ToC text; 78290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add end token to 'end token array' 78390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push( 78490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @{$self->{_tokensTocEnd}[$aTocToken->[TT_TAG_TYPE_END]]}, $aTocToken 78590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 78690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 78790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processTocStartingToken() 78890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 78990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_processTocText() ------------------------------------ 79190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function processes text which must be added to the preliminary 79290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# ToC. 79390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aText: Text to add to ToC. 79490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToc: ToC to add text to. 79590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTocText { 79790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 79890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aText, $aToc) = @_; 79990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add text to ToC 80090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aToc->{_toc} .= $aText; 80190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processTocText() 80290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 80390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 80490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_processTokenAsTocEndingToken() ---------------------- 80590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Check for token being a token to use for triggering the end of 80690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# a ToC line and process it accordingly. 80790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTokenType: type of token: 'start', 'end', 'comment' or 'text'. 80890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenId: token id of currently parsed token 80990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTokenAsTocEndingToken { 81190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 81290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTokenType, $aTokenId) = @_; 81390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 81490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($i, $tokenId, $toc, $tokens); 81590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through dirty start tokens 81690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $i = 0; 81790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Alias token array of right type 81990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokens = $self->{_tokensTocEnd}[$aTokenType]; 82090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through token array 82190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber while ($i < scalar @$tokens) { 82290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Aliases 82390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenId = $tokens->[$i][TT_TAG_END]; 82490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Does current end tag equals dirty tag? 82590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($aTokenId eq $tokenId) { 82690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, current end tag equals dirty tag; 82790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process ToC-ending-token 82890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTocEndingToken($tokens->[$i]); 82990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Remove dirty tag from array, automatically advancing to 83090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # next token 83190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber splice(@$tokens, $i, 1); 83290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 83390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 83490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, current end tag doesn't equal dirty tag; 83590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Advance to next token 83690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $i++; 83790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 83890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 83990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processTokenAsTocEndingToken() 84090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 84190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 84290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_processTokenAsTocStartingToken() -------------------- 84390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Check for token being a ToC-starting-token and process it 84490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# accordingly. 84590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTokenType: type of token. Can be either TT_TOKENTYPE_START, 84690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# _END, _TEXT, _COMMENT or _DECLARATION. 84790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenId: token id of currently parsed token 84890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenAttributes: reference to hash containing attributes of 84990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# currently parsed token 85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenOrigText: reference to original text of token 85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# returns: 1 if successful, i.e. token is processed as ToC-starting-token, 0 85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# if not. 85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 85490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTokenAsTocStartingToken { 85590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTokenType, $aTokenId, $aTokenAttributes, $aTokenOrigText) = @_; 85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 85890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($level, $levelToToc, $groupId, $groupToToc); 85990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($result, $tocToken, $tagBegin, @tokensTocBegin, $fileSpec); 86090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Bias to token not functioning as ToC-starting-token 86190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = 0; 86290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through start tokens of right type 86390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $tocToken (@{$self->{_tokensTocBegin}[$aTokenType]}) { 86490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Alias file filter 86590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $fileSpec = $tocToken->[TT_GROUP]{'fileSpec'}; 86690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # File matches? 86790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!defined($fileSpec) || ( 86890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber defined($fileSpec) && 86990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($self->{_currentFile} =~ m/$fileSpec/) 87090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber )) { 87190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, file matches; 87290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Alias tag begin 87390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tagBegin = $tocToken->[TT_TAG_BEGIN]; 87490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Tag and attributes match? 87590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( 87690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber defined($tagBegin) && 87790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($aTokenId =~ m/$tagBegin/) && 87890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::_doesHashContainHash( 87990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aTokenAttributes, $tocToken->[TT_INCLUDE_ATTRIBUTES_BEGIN], 0 88090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) && 88190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::_doesHashContainHash( 88290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aTokenAttributes, $tocToken->[TT_EXCLUDE_ATTRIBUTES_BEGIN], 1 88390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) 88490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) { 88590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, tag and attributes match; 88690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Aliases 88790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $level = $tocToken->[TT_GROUP]{'level'}; 88890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $levelToToc = $tocToken->[TT_TOC]{options}{'levelToToc'}; 88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupId = $tocToken->[TT_GROUP]{'groupId'}; 89090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $groupToToc = $tocToken->[TT_TOC]{options}{'groupToToc'}; 89190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must level and group be processed? 89290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( 89390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($level =~ m/$levelToToc/) && 89490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($groupId =~ m/$groupToToc/) 89590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) { 89690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, level and group must be processed; 89790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate token acts as ToC-starting-token 89890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $result = 1; 89990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process ToC-starting-token 90090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTocStartingToken( 90190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tocToken, $aTokenType, $aTokenAttributes, $aTokenOrigText 90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 90390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 90490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 90590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 90690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 90790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return value 90890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $result; 90990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processTokenAsTocStartingToken() 91090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 91190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 91290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_resetBatchVariables() ------------------------------- 91390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Reset variables which are set because of batch invocation. 91490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 91590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _resetBatchVariables { 91690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 91790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self) = @_; 91890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 91990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Filename of current file being parsed, empty string if not available 92090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_currentFile} = ""; 92190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Arrays containing start, end, comment, text & declaration tokens which 92290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # must trigger the ToC assembling. Each array element may contain a 92390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # reference to an array containing the following elements: 92490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # 92590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_TAG_BEGIN => 0; 92690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_TAG_END => 1; 92790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_TAG_TYPE_END => 2; 92890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_INCLUDE_ATTRIBUTES_BEGIN => 3; 92990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_EXCLUDE_ATTRIBUTES_BEGIN => 4; 93090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_INCLUDE_ATTRIBUTES_END => 5; 93190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_EXCLUDE_ATTRIBUTES_END => 6; 93290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_GROUP => 7; 93390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_TOC => 8; 93490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TT_ATTRIBUTES_TOC => 9; 93590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # 93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_tokensTocBegin} = [ 93790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_START 93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_END 93990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_COMMENT 94090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_TEXT 94190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [] # TT_TOKENTYPE_DECLARATION 94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ]; 94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_tokensTocEnd} = [ 94490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_START 94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_END 94690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_COMMENT 94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [], # TT_TOKENTYPE_TEXT 94890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [] # TT_TOKENTYPE_DECLARATION 94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ]; 95090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # TRUE if ToCs have been initialized, FALSE if not. 95190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_doneInitializeTocs} = 0; 95290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Array of ToCs to process 95390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_tocs} = []; 95490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Active anchor name 95590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_activeAnchorName} = undef; 95690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _resetBatchVariables() 95790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 95890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 95990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_resetStackVariables() ------------------------------- 96090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Reset variables which cumulate during ToC generation. 96190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 96290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _resetStackVariables { 96390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 96490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self) = @_; 96590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset variables 96690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{levels} = undef; 96790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{groupIdLevels} = undef; 96890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _resetStackVariables() 96990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 97090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 97190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_setActiveAnchorName() ------------------------------- 97290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Set active anchor name. 97390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - aAnchorName: Name of anchor name to set active. 97490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 97590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _setActiveAnchorName { 97690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 97790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aAnchorName) = @_; 97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Set active anchor name 97990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_activeAnchorName} = $aAnchorName; 98090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _setActiveAnchorName() 98190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 98290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 98390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::_showWarning() --------------------------------------- 98490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Show warning. 98590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - aWarningNr: Number of warning to show. 98690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - aWarningArgs: Arguments to display within the warning. 98790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 98890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _showWarning { 98990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 99090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aWarningNr, $aWarningArgs) = @_; 99190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 99290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my (%warnings); 99390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Set warnings 99490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %warnings = ( 99590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber WARNING_NESTED_ANCHOR_PS_WITHIN_PS() => 99690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber "Nested anchor '%s' within anchor '%s'.", 99790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber WARNING_TOC_ATTRIBUTE_PS_NOT_AVAILABLE_WITHIN_PS() => 99890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber "ToC attribute '%s' not available within token '%s'.", 99990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 100090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Show warning 100190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber print STDERR "warning ($aWarningNr): " . sprintf($warnings{"$aWarningNr"}, @$aWarningArgs) . "\n"; 100290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _showWarning() 100390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 100490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 100590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::anchorId() ------------------------------------------- 100690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Anchor id processing method. Leave it up to the descendant to do 100790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# something useful with it. 100890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aAnchorId 100990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToc: Reference to ToC to which anchorId belongs. 101090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 101190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorId { 101290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # anchorId() 101390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 101490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 101590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::anchorNameBegin() ------------------------------------ 101690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Anchor name begin processing method. Leave it up to the descendant 101790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# to do something useful with it. 101890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aAnchorName 101990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToc: Reference to ToC to which anchorname belongs. 102090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorNameBegin { 102290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # anchorNameBegin() 102390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 102490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::anchorNameEnd() -------------------------------------- 102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Anchor name end processing method. Leave it up to the descendant 102790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# to do something useful with it. 102890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aAnchorName 102990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToc: Reference to ToC to which anchorname belongs. 103090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 103190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorNameEnd { 103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # anchorNameEnd() 103390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 103490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 103590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::comment() -------------------------------------------- 103690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process comment. 103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aComment: comment text with '<!--' and '-->' tags stripped off. 103890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 103990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub comment { 104090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 104190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aComment) = @_; 104290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must a ToC be generated? 104390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{_doGenerateToc}) { 104490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, a ToC must be generated 104590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process end tag as ToC-starting-token 104690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTokenAsTocStartingToken( 104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber TT_TOKENTYPE_COMMENT, $aComment, undef, \$aComment 104890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process end tag as token which ends ToC registration 105090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTokenAsTocEndingToken( 105190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber TT_TOKENTYPE_COMMENT, $aComment 105290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 105390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 105490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # comment() 105590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 105690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 105790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::end() ------------------------------------------------ 105890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a closing tag is encountered. 105990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTag: tag name (in lower case). 106090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aOrigText: tag name including brackets. 106190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 106290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub end { 106390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 106490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTag, $aOrigText) = @_; 106590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 106690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($tag, $toc, $i); 106790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must a ToC be generated? 106890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{_doGenerateToc}) { 106990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, a ToC must be generated 107090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process end tag as ToC-starting-token 107190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTokenAsTocStartingToken( 107290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber TT_TOKENTYPE_END, $aTag, undef, \$aOrigText 107390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 107490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process end tag as ToC-ending-token 107590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTokenAsTocEndingToken( 107690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber TT_TOKENTYPE_END, $aTag 107790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 107890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Tag is of type 'anchor'? 107990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($self->{_activeAnchorName}) && ($aTag eq "a")) { 108090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, tag is of type 'anchor'; 108190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reset dirty anchor 108290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_activeAnchorName} = undef; 108390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 108490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 108590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # end() 108690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 108790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::extend() --------------------------------------------- 108990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Extend ToCs. 109090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTocs: Reference to array of ToC objects 109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aString: String to parse. 109290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 109390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub extend { 109490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 109590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTocs, $aString) = @_; 109690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Initialize TocGenerator batch 109790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_initializeExtenderBatch($aTocs); 109890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Extend ToCs 109990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_extend($aString); 110090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Deinitialize TocGenerator batch 110190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_deinitializeExtenderBatch(); 110290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # extend() 110390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 110490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 110590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::extendFromFile() ------------------------------------- 110690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Extend ToCs. 110790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - @aTocs: Reference to array of ToC objects 110890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - @aFiles: Reference to array of files to parse. 110990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 111090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub extendFromFile { 111190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 111290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTocs, $aFiles) = @_; 111390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Initialize TocGenerator batch 111490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_initializeExtenderBatch($aTocs); 111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Extend ToCs 111690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_extendFromFile($aFiles); 111790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Deinitialize TocGenerator batch 111890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_deinitializeExtenderBatch(); 111990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # extendFromFile() 112090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 112190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 112290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::generate() ------------------------------------------- 112390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Generate ToC. 112490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aToc: Reference to (array of) ToC object(s) 112590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aString: Reference to string to parse 112690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aOptions: optional options 112790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 112890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub generate { 112990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 113090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aToc, $aString, $aOptions) = @_; 113190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Initialize TocGenerator batch 113290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_initializeGeneratorBatch($aToc, $aOptions); 113390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Do generate ToC 113490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_generate($aString); 113590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Deinitialize TocGenerator batch 113690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_deinitializeGeneratorBatch(); 113790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # generate() 113890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 113990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 114090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::generateFromFile() ----------------------------------- 114190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Generate ToC. 114290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aToc: Reference to (array of) ToC object(s) 114390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aFile: (reference to array of) file to parse. 114490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aOptions: optional options 114590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 114690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub generateFromFile { 114790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 114890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aToc, $aFile, $aOptions) = @_; 114990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Initialize TocGenerator batch 115090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_initializeGeneratorBatch($aToc, $aOptions); 115190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Do generate ToC 115290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_generateFromFile($aFile); 115390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Deinitialize TocGenerator batch 115490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_deinitializeGeneratorBatch(); 115590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # generateFromFile() 115690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 115790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 115890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::number() --------------------------------------------- 115990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Heading number processing method. Leave it up to the descendant 116090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# to do something useful with it. 116190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aNumber 116290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToc: Reference to ToC to which anchorname belongs. 116390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 116490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub number { 116590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 116690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aNumber, $aToc) = @_; 116790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # number() 116890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 116990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 117090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::parse() ---------------------------------------------- 117190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse scalar. 117290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aString: string to parse 117390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 117490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub parse { 117590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 117690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aString) = @_; 117790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Call ancestor 117890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->SUPER::parse($aString); 117990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # parse() 118090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 118190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 118290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::parse_file() ----------------------------------------- 118390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse file. 118490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 118590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub parse_file { 118690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 118790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aFile) = @_; 118890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Call ancestor 118990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->SUPER::parse_file($aFile); 119090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # parse_file() 119190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 119290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 119390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::setOptions() ----------------------------------------- 119490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Set options. 119590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - aOptions: Reference to hash containing options. 119690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 119790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub setOptions { 119890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 119990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aOptions) = @_; 120090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Options are defined? 120190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($aOptions)) { 120290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, options are defined; add to options 120390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber %{$self->{options}} = (%{$self->{options}}, %$aOptions); 120490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 120590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # setOptions() 120690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 120790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 120890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::start() ---------------------------------------------- 120990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time an opening tag is encountered. 121090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTag: tag name (in lower case). 121190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aAttr: reference to hash containing all tag attributes (in lower 121290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# case). 121390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aAttrSeq: reference to array containing all tag attributes (in 121490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# lower case) in the original order 121590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aOrigText: the original HTML text 121690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 121790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub start { 121890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 121990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_; 122090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{isTocToken} = 0; 122190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Start tag is of type 'anchor name'? 122290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($aTag eq "a" && defined($aAttr->{name})) { 122390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, start tag is of type 'anchor name'; 122490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Is another anchor already active? 122590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($self->{_activeAnchorName})) { 122690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, another anchor is already active; 122790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Is the first anchor inserted by 'TocGenerator'? 122890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{_doOutputAnchorNameEnd}) { 122990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, the first anchor is inserted by 'TocGenerator'; 123090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Show warning 123190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_showWarning( 123290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber WARNING_NESTED_ANCHOR_PS_WITHIN_PS, 123390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber [$aOrigText, $self->{_activeAnchorName}] 123490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 123590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 123690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 123790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Set active anchor name 123890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_setActiveAnchorName($aAttr->{name}); 123990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 124090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must a ToC be generated? 124190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{_doGenerateToc}) { 124290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, a ToC must be generated 124390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process start tag as ToC token 124490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{isTocToken} = $self->_processTokenAsTocStartingToken( 124590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber TT_TOKENTYPE_START, $aTag, $aAttr, \$aOrigText 124690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 124790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process end tag as ToC-ending-token 124890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTokenAsTocEndingToken( 124990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber TT_TOKENTYPE_START, $aTag 125090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 125190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 125290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # start() 125390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 125490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 125590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::text() ----------------------------------------------- 125690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time plain text is encountered. 125790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - @_: array containing data. 125890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 125990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub text { 126090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 126190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aText) = @_; 126290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 126390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($text, $toc, $i, $token, $tokens); 126490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Must a ToC be generated? 126590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($self->{_doGenerateToc}) { 126690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, a ToC must be generated 126790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Are there dirty start tags? 126890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 126990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through token types 127090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $tokens (@{$self->{_tokensTocEnd}}) { 127190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop though tokens 127290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber foreach $token (@$tokens) { 127390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add text to toc 127490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 127590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Alias 127690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $toc = $token->[TT_TOC]; 127790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Remove possible newlines from text 127890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($text = $aText) =~ s/\s*\n\s*/ /g; 127990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add text to toc 128090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processTocText($text, $toc); 128190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 128290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 128390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 128490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # text() 128590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 128690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 128790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 128890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 128990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#=== HTML::_TokenTocParser ==================================================== 129090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse 'toc tokens'. 'Toc tokens' mark HTML code which is to be 129190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# inserted into the ToC. 129290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note: Used internally. 129390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 129490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::_TokenTocParser; 129590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 129690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 129790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberBEGIN { 129890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber use vars qw(@ISA); 129990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 130090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @ISA = qw(HTML::Parser); 130190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 130290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 130390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 130490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {} 130590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 130690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 130790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocParser::new() --------------------------------------------- 130890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor 130990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 131090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new { 131190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 131290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($aType) = @_; 131390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Create instance 131490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my $self = $aType->SUPER::new; 131590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 131690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return instance 131790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $self; 131890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # new() 131990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 132090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 132190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocParser::_parseAttributes() -------------------------------- 132290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse attributes. 132390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aAttr: Reference to hash containing all tag attributes (in lower 132490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# case). 132590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aIncludeAttributes: Reference to hash to which 'include 132690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# attributes' must be added. 132790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aExcludeAttributes: Reference to hash to which 'exclude 132890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# attributes' must be added. 132990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTocAttributes: Reference to hash to which 'ToC attributes' 133090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# must be added. 133190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 133290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _parseAttributes { 133390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 133490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ( 133590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self, $aAttr, $aIncludeAttributes, $aExcludeAttributes, 133690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aTocAttributes 133790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) = @_; 133890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 133990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($key, $value); 134090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($attributeToExcludeToken, $attributeToTocToken); 134190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get token which marks attributes which must be excluded 134290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $attributeToExcludeToken = $self->{_toc}{options}{'attributeToExcludeToken'}; 134390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $attributeToTocToken = $self->{_toc}{options}{'attributeToTocToken'}; 134490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Loop through attributes 134590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber while (($key, $value) = each %$aAttr) { 134690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Attribute value equals 'ToC token'? 134790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($value =~ m/$attributeToTocToken/) { 134890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, attribute value equals 'ToC token'; 134990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add attribute to 'ToC attributes' 135090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push @$aTocAttributes, $key; 135190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 135290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 135390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, attribute isn't 'ToC' token; 135490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Attribute value starts with 'exclude token'? 135590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($value =~ m/^$attributeToExcludeToken(.*)/) { 135690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, attribute value starts with 'exclude token'; 135790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add attribute to 'exclude attributes' 135890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $$aExcludeAttributes{$key} = "$1"; 135990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 136090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 136190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, attribute key doesn't start with '-'; 136290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add attribute to 'include attributes' 136390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $$aIncludeAttributes{$key} = $value; 136490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 136590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 136690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 136790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _parseAttributes() 136890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 136990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 137090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 137190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 137290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#=== HTML::_TokenTocBeginParser =============================================== 137390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse 'toc tokens'. 'Toc tokens' mark HTML code which is to be 137490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# inserted into the ToC. 137590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note: Used internally. 137690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 137790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::_TokenTocBeginParser; 137890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 137990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 138090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberBEGIN { 138190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber use vars qw(@ISA); 138290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 138390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @ISA = qw(HTML::_TokenTocParser); 138490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 138590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 138690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {} 138790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 138890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 138990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::new() ---------------------------------------- 139090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor 139190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 139290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new { 139390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 139490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($aType, $aTokenArray) = @_; 139590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Create instance 139690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my $self = $aType->SUPER::new; 139790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reference token array 139890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{tokens} = $aTokenArray; 139990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reference to last added token 140090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_lastAddedToken} = undef; 140190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_lastAddedTokenType} = undef; 140290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return instance 140390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $self; 140490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # new() 140590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 140690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 140790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::_processAttributes() ------------------------- 140890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process attributes. 140990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aAttributes: Attributes to parse. 141090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 141190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processAttributes { 141290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 141390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aAttributes) = @_; 141490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 141590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my (%includeAttributes, %excludeAttributes, @tocAttributes); 141690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 141790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Parse attributes 141890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_parseAttributes( 141990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aAttributes, \%includeAttributes, \%excludeAttributes, \@tocAttributes 142090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 142190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Include attributes are specified? 142290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (keys(%includeAttributes) > 0) { 142390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, include attributes are specified; 142490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store include attributes 142590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_lastAddedToken}}[ 142690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_INCLUDE_ATTRIBUTES_BEGIN 142790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ] = \%includeAttributes; 142890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 142990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Exclude attributes are specified? 143090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (keys(%excludeAttributes) > 0) { 143190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, exclude attributes are specified; 143290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store exclude attributes 143390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_lastAddedToken}}[ 143490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_EXCLUDE_ATTRIBUTES_BEGIN 143590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ] = \%excludeAttributes; 143690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 143790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Toc attributes are specified? 143890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (@tocAttributes > 0) { 143990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, toc attributes are specified; 144090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store toc attributes 144190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_lastAddedToken}}[ 144290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_ATTRIBUTES_TOC 144390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ] = \@tocAttributes; 144490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 144590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processAttributes() 144690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 144790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 144890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::_processToken() ------------------------------ 144990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process token. 145090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTokenType: Type of token to process. 145190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTag: Tag of token. 145290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 145390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processToken { 145490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 145590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTokenType, $aTag) = @_; 145690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 145790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($tokenArray, $index); 145890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Push element on array of update tokens 145990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $index = push(@{$self->{tokens}[$aTokenType]}, []) - 1; 146090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Alias token array to add element to 146190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tokenArray = $self->{tokens}[$aTokenType]; 146290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate last updated token array element 146390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_lastAddedTokenType} = $aTokenType; 146490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_lastAddedToken} = \$$tokenArray[$index]; 146590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add fields 146690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $$tokenArray[$index][HTML::TocGenerator::TT_TAG_BEGIN] = $aTag; 146790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $$tokenArray[$index][HTML::TocGenerator::TT_GROUP] = $self->{_group}; 146890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $$tokenArray[$index][HTML::TocGenerator::TT_TOC] = $self->{_toc}; 146990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processToken() 147090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 147190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 147290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::comment() ------------------------------------ 147390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process comment. 147490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aComment: comment text with '<!--' and '-->' tags stripped off. 147590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 147690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub comment { 147790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 147890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aComment) = @_; 147990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 148090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_COMMENT, $aComment); 148190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # comment() 148290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 148390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 148490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::declaration() -------------------------------- 148590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a markup declaration is 148690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# encountered by HTML::Parser. 148790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aDeclaration: Markup declaration. 148890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 148990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub declaration { 149090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 149190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aDeclaration) = @_; 149290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 149390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken( 149490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_TOKENTYPE_DECLARATION, $aDeclaration 149590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 149690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # declaration() 149790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 149890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 149990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::end() ---------------------------------------- 150090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a closing tag is encountered 150190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# by HTML::Parser. 150290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTag: tag name (in lower case). 150390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 150490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub end { 150590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 150690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTag, $aOrigText) = @_; 150790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 150890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_END, $aTag); 150990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # end() 151090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 151190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 151290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::parse() -------------------------------------- 151390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse begin token. 151490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aToken: 'toc token' to parse 151590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 151690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub parse { 151790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 151890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aString) = @_; 151990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Call ancestor 152090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->SUPER::parse($aString); 152190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # parse() 152290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 152390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 152490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser->setGroup() ----------------------------------- 152590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Set current 'tokenToToc' group. 152690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 152790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub setGroup { 152890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 152990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aGroup) = @_; 153090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Set current 'tokenToToc' group 153190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_group} = $aGroup; 153290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # setGroup() 153390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 153490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 153590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser->setToc() ------------------------------------- 153690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Set current ToC. 153790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 153890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub setToc { 153990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 154090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aToc) = @_; 154190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Set current ToC 154290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_toc} = $aToc; 154390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # setToc() 154490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 154590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 154690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::start() -------------------------------------- 154790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time an opening tag is encountered. 154890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTag: tag name (in lower case). 154990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aAttr: reference to hash containing all tag attributes (in lower 155090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# case). 155190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aAttrSeq: reference to array containing all attribute keys (in 155290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# lower case) in the original order 155390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aOrigText: the original HTML text 155490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 155590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub start { 155690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 155790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_; 155890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 155990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_START, $aTag); 156090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process attributes 156190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processAttributes($aAttr); 156290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # start() 156390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 156490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 156590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocBeginParser::text() --------------------------------------- 156690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time plain text is encountered. 156790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - @_: array containing data. 156890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 156990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub text { 157090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 157190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aText) = @_; 157290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Was token already created and is last added token of type 'text'? 157390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( 157490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber defined($self->{_lastAddedToken}) && 157590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_lastAddedTokenType} == HTML::TocGenerator::TT_TOKENTYPE_TEXT 157690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) { 157790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, token is already created; 157890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add tag to existing token 157990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_lastAddedToken}}[HTML::TocGenerator::TT_TAG_BEGIN] .= $aText; 158090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 158190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 158290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, token isn't created; 158390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 158490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_TEXT, $aText); 158590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 158690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # text() 158790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 158890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 158990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 159090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 159190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#=== HTML::_TokenTocEndParser ================================================= 159290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse 'toc tokens'. 'Toc tokens' mark HTML code which is to be 159390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# inserted into the ToC. 159490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note: Used internally. 159590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 159690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::_TokenTocEndParser; 159790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 159890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 159990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberBEGIN { 160090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber use vars qw(@ISA); 160190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 160290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @ISA = qw(HTML::_TokenTocParser); 160390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 160490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 160590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 160690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {} 160790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 160890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 160990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::new() ------------------------------------------ 161090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor 161190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aType: Class type. 161290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 161390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new { 161490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 161590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($aType) = @_; 161690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Create instance 161790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my $self = $aType->SUPER::new; 161890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Reference to last added token 161990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_lastAddedToken} = undef; 162090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Return instance 162190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $self; 162290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # new() 162390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 162490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 162590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::_processAttributes() --------------------------- 162690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process attributes. 162790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aAttributes: Attributes to parse. 162890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 162990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processAttributes { 163090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 163190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aAttributes) = @_; 163290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Local variables 163390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my (%includeAttributes, %excludeAttributes); 163490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 163590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Parse attributes 163690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_parseAttributes( 163790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $aAttributes, \%includeAttributes, \%excludeAttributes 163890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 163990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Include attributes are specified? 164090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (keys(%includeAttributes) > 0) { 164190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, include attributes are specified; 164290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store include attributes 164390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_Token}}[ 164490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_INCLUDE_ATTRIBUTES_END 164590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ] = \%includeAttributes; 164690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 164790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Exclude attributes are specified? 164890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (keys(%excludeAttributes) > 0) { 164990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, exclude attributes are specified; 165090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store exclude attributes 165190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_Token}}[ 165290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_EXCLUDE_ATTRIBUTES_END 165390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ] = \%excludeAttributes; 165490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 165590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processAttributes() 165690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 165790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 165890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::_processToken() -------------------------------- 165990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process token. 166090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTokenType: Type of token to process. 166190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTag: Tag of token. 166290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 166390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processToken { 166490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 166590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTokenType, $aTag) = @_; 166690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Update token 166790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_token}}[HTML::TocGenerator::TT_TAG_TYPE_END] = $aTokenType; 166890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_token}}[HTML::TocGenerator::TT_TAG_END] = $aTag; 166990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Indicate token type which has been processed 167090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_lastAddedTokenType} = $aTokenType; 167190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # _processToken() 167290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 167390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 167490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::comment() -------------------------------------- 167590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process comment. 167690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aComment: comment text with '<!--' and '-->' tags stripped off. 167790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 167890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub comment { 167990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 168090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aComment) = @_; 168190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 168290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_COMMENT, $aComment); 168390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # comment() 168490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 168590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 168690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocDeclarationParser::declaration() -------------------------- 168790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a markup declaration is 168890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# encountered by HTML::Parser. 168990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aDeclaration: Markup declaration. 169090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 169190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub declaration { 169290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 169390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aDeclaration) = @_; 169490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 169590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken( 169690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_TOKENTYPE_DECLARATION, $aDeclaration 169790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 169890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # declaration() 169990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 170090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 170190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::end() ------------------------------------------ 170290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a closing tag is encountered 170390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# by HTML::Parser. 170490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTag: tag name (in lower case). 170590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 170690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub end { 170790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 170890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTag, $aOrigText) = @_; 170990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 171090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_END, $aTag); 171190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # end() 171290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 171390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 171490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::parse() ---------------------------------------- 171590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse token. 171690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aString: 'toc token' to parse 171790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aToken: Reference to token 171890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aTokenTypeBegin: Type of begin token 171990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 172090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub parse { 172190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 172290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aString, $aToken, $aTokenTypeBegin) = @_; 172390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Token argument specified? 172490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($aToken)) { 172590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, token argument is specified; 172690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Store token reference 172790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->{_token} = $aToken; 172890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 172990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # End tag defined? 173090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (! defined($aString)) { 173190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, end tag isn't defined; 173290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Last added tokentype was of type 'start'? 173390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ( 173490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (defined($aTokenTypeBegin)) && 173590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($aTokenTypeBegin == HTML::TocGenerator::TT_TOKENTYPE_START) 173690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ) { 173790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, last added tokentype was of type 'start'; 173890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Assume end tag 173990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken( 174090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber HTML::TocGenerator::TT_TAG_END, 174190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_token}}[HTML::TocGenerator::TT_TAG_BEGIN] 174290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ); 174390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 174490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 174590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 174690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Call ancestor 174790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->SUPER::parse($aString); 174890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 174990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # parse() 175090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 175190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 175290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::start() ---------------------------------------- 175390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time an opening tag is encountered. 175490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - $aTag: tag name (in lower case). 175590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aAttr: reference to hash containing all tag attributes (in lower 175690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# case). 175790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aAttrSeq: reference to array containing all attribute keys (in 175890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# lower case) in the original order 175990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# - $aOrigText: the original HTML text 176090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 176190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub start { 176290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 176390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_; 176490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 176590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_START, $aTag); 176690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process attributes 176790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processAttributes($aAttr); 176890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # start() 176990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 177090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 177190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTocEndParser::text() ----------------------------------------- 177290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time plain text is encountered. 177390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args: - @_: array containing data. 177490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 177590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub text { 177690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Get arguments 177790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber my ($self, $aText) = @_; 177890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 177990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Is token already created? 178090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (defined($self->{_lastAddedTokenType})) { 178190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Yes, token is already created; 178290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Add tag to existing token 178390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber @${$self->{_token}}[HTML::TocGenerator::TT_TAG_END] .= $aText; 178490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 178590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else { 178690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # No, token isn't created; 178790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber # Process token 178890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_TEXT, $aText); 178990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 179090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} # text() 179190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 179290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 179390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber1; 1794