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 &nbsp"';
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