190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#==== HTML::TocUpdator ========================================================
290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Update 'HTML::Toc' table of contents.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     - 'TUT' is an abbreviation of 'Toc Update Token'.
490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::TocUpdator;
790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse strict;
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse HTML::TocInsertor;
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::TocInsertor);
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TUT_TOKENTYPE_START    => 0;
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TUT_TOKENTYPE_END      => 1;
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TUT_TOKENTYPE_TEXT     => 2;
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TUT_TOKENTYPE_COMMENT  => 3;
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant MODE_DO_NOTHING   => 0;	# 0b00
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant MODE_DO_INSERT    => 1;	# 0b01
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant MODE_DO_UPDATE    => 3;	# 0b11
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {}
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::new() --------------------------------------------------
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor.
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new {
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($aType) = @_;
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $self = $aType->SUPER::new;
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Bias to not update ToC
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{htu__Mode} = MODE_DO_NOTHING;
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Bias to not delete tokens
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_doDeleteTokens} = 0;
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reset batch variables
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	#$self->_resetBatchVariables;
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{options} = {};
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# TODO: Initialize output
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	return $self;
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # new()
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_deinitializeUpdatorBatch() --------------------------
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Deinitialize updator batch.
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTocs: Reference to array of tocs.
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _deinitializeUpdatorBatch {
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTocs) = @_;
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate end of ToC updating
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{htu__Mode} = MODE_DO_NOTHING;
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Deinitialize insertor batch
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_deinitializeInsertorBatch();
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _deinitializeUpdatorBatch()
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TokenUpdator::_doesHashEqualHash() ---------------------------------
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Determines whether hash1 equals hash2.
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aHash1
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aHash2
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# returns:  True (1) if hash1 equals hash2, 0 if not.  For example, with the
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           following hashes:
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#              %hash1 = {                     %hash2 = {
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                 'class' => 'header',          'class' => 'header',
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                 'id'    => 'intro1'           'id'    => 'intro2'
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#              }                             }
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           the routine will return 0, cause the hash fields 'id' differ.
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Class function.
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _doesHashEqualHash {
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($aHash1, $aHash2) = @_;
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($key1, $value1, $key2, $value2, $result);
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Bias to success
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$result = 1;
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Loop through hash1 while values available
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	HASH1: while (($key1, $value1) = each %$aHash1) {
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, values are available;
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Value1 differs from value2?
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if ($value1 ne $aHash2->{$key1}) {
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, hashes differ;
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Indicate condition fails
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$result = 0;
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Reset 'each' iterator which we're going to break
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			keys %$aHash2;
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Break loop
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			last HASH1;
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Return value
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	return $result;
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _doesHashEqualHash()
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TokenUpdator::_doesTagExistInArray() -------------------------------
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Check whether tag & attributes matches any of the tags & attributes
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           in the specified array.  The array must consist of elements with
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           format:
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#              [$tag, \%attributes]
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag to search for
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttributes: tag attributes to search for
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aArray: Array to search in.
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# returns:  1 if tag does exist in array, 0 if not.
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Class function.
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _doesTagExistInArray {
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($aTag, $aAttributes, $aArray) = @_;
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($tag, $result);
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Bias to non-existing tag
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$result = 0;
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Loop through existing tags
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	TAG: foreach $tag (@{$aArray}) {
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (defined(@{$tag}[0])) {
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Does tag equals any existing tag?
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			if ($aTag eq @{$tag}[0]) {
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Yes, tag equals existing tag;
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Do hashes equal?
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				if (HTML::TocUpdator::_doesHashEqualHash(
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					$aAttributes, @{$tag}[1]
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				)) {
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Yes, hashes are the same;
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber						# Indicate tag exists in array
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					$result = 1;
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber						# Break loop
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					last TAG;
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				}
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			}
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Return value
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	return $result;
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _doesTagExistInArray()
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_initializeUpdatorBatch() ----------------------------
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Initialize insertor batch.
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aMode: Mode.  Can be either MODE_DO_INSERT or MODE_DO_UPDATE
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aTocs: Reference to array of tocs.
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional options
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Updating actually means: deleting the old ToC and inserting a new
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           ToC.  That's why we're calling 'insertor' methods here.
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _initializeUpdatorBatch {
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aMode, $aTocs, $aOptions) = @_;
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Initialize insertor batch
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_initializeInsertorBatch($aTocs, $aOptions);
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Parse ToC update templates
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_parseTocUpdateTokens();
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate start of ToC updating
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{htu__Mode} = $aMode;
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _initializeUpdatorBatch()
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_parseTocUpdateTokens() --------------------------------
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse ToC insertion point specifier.
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _parseTocUpdateTokens {
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($toc, $tokenType, $tokenPreposition, $token);
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($tocInsertionPoint, $tocInsertionPointTokenAttributes);
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Create parser for update begin tokens
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $tokenUpdateBeginParser = HTML::_TokenUpdateParser->new(
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_tokensUpdateBegin}
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	);
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Create parser for update end tokens
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $tokenUpdateEndParser = HTML::_TokenUpdateParser->new(
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_tokensUpdateEnd}
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	);
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Loop through ToCs
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	foreach $toc (@{$self->{_tocs}}) {
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Parse update tokens
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateBeginParser->parse(
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$toc->{_tokenUpdateBeginOfAnchorNameBegin}
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		);
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateBeginParser->parse($toc->{_tokenUpdateBeginOfAnchorNameEnd});
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateBeginParser->parse($toc->{_tokenUpdateBeginNumber});
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateBeginParser->parse($toc->{_tokenUpdateBeginToc});
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndOfAnchorNameBegin});
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndOfAnchorNameEnd});
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndNumber});
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndToc});
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _parseTocUpdateTokens()
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_resetBatchVariables() ---------------------------------
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Reset batch variables
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _resetBatchVariables {
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::_resetBatchVariables();
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Arrays containing start, end, comment & text tokens which indicate
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# the begin of ToC tokens.  The tokens are stored in keys of hashes to
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# avoid storing duplicates as an array would.
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_tokensUpdateBegin} = [
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		[],	# ['<start tag>', <attributes>]
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		{},	# {'<end tag>' => ''}
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		{},	# {'<text>'    => ''}
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		{}		# {'<comment>' => ''}
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	];
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Arrays containing start, end, comment & text tokens which indicate
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# the end of ToC tokens.  The tokens are stored in keys of hashes to
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# avoid storing duplicates as an array would.
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_tokensUpdateEnd} = [
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		[],	# ['<start tag>', <attributes>]
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		{},	# {'<end tag>' => ''}
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		{},	# {'<text>'    => ''}
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		{}		# {'<comment>' => ''}
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	];
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _resetBatchVariables()
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_setActiveAnchorName() ---------------------------------
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Set active anchor name.
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - aAnchorName: Name of anchor name to set active.
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _setActiveAnchorName {
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aAnchorName) = @_;
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Are tokens being deleted?
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (! $self->{_doDeleteTokens}) {
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, tokens aren't being deleted;
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Call ancestor to set anchor name
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->SUPER::_setActiveAnchorName($aAnchorName);
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _setActiveAnchorName()
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_update() ----------------------------------------------
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Update ToC in string.
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aMode: Mode.  Can be either MODE_DO_UPDATE or MODE_DO_INSERT.
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: (reference to array of) ToC object to update
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aString: string to update ToC of
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional updator options
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Used internally.
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _update {
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aMode, $aToc, $aString, $aOptions) = @_;
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Initialize TocUpdator batch
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_initializeUpdatorBatch($aMode, $aToc, $aOptions);
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Start updating ToC by starting ToC insertion
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_insert($aString);
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Deinitialize TocUpdator batch
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_deinitializeUpdatorBatch();
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # update()
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_updateFile() ------------------------------------------
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Update ToCs in file.
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aMode: Mode.  Can be either MODE_DO_UPDATE or MODE_DO_INSERT.
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: (reference to array of) ToC object to update
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aFile: (reference to array of) file to parse for updating.
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional updator options
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Used internally.
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _updateFile {
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aMode, $aToc, $aFile, $aOptions) = @_;
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Initialize TocUpdator batch
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_initializeUpdatorBatch($aMode, $aToc, $aOptions);
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Start updating ToC by starting ToC insertion
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_insertIntoFile($aFile);
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Deinitialize TocUpdator batch
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_deinitializeUpdatorBatch();
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _updateFile()
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_writeOrBufferOutput() ---------------------------------
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Write processed HTML to output device(s).
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - aOutput: scalar to write
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _writeOrBufferOutput {
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aOutput) = @_;
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Delete output?
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (! $self->{_doDeleteTokens}) {
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, don't delete output;
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Call ancestor
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->SUPER::_writeOrBufferOutput($aOutput);
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _writeOrBufferOutput()
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::anchorNameBegin() --------------------------------------
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process 'anchor name begin' generated by HTML::Toc.
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aAnchorName: Anchor name begin tag to output.
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: Reference to ToC to which anchorname belongs.
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorNameBegin {
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aAnchorNameBegin, $aToc) = @_;
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::anchorNameBegin($aAnchorNameBegin);
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be inserted or updated?
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{htu__Mode} != MODE_DO_NOTHING) {
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be inserted or updated;
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Surround anchor name with update tags
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_outputPrefix} =
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$aToc->{_tokenUpdateBeginOfAnchorNameBegin} .
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_outputPrefix} .
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$aToc->{_tokenUpdateEndOfAnchorNameBegin};
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}	# anchorNameBegin()
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::anchorNameEnd() ----------------------------------------
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process 'anchor name end' generated by HTML::Toc.
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aAnchorNameEnd: Anchor name end tag to output.
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: Reference to ToC to which anchorname belongs.
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorNameEnd {
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aAnchorNameEnd, $aToc) = @_;
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::anchorNameEnd($aAnchorNameEnd);
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be inserted or updated?
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{htu__Mode} != MODE_DO_NOTHING) {
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be inserted or updated;
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Surround anchor name with update tags
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_outputSuffix} =
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$aToc->{_tokenUpdateBeginOfAnchorNameEnd} .
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_outputSuffix} .
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$aToc->{_tokenUpdateEndOfAnchorNameEnd};
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}	# anchorNameEnd()
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::comment() ----------------------------------------------
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process comment.
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aComment: comment text with '<!--' and '-->' tags stripped off.
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub comment {
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aComment) = @_;
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be updated?
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{htu__Mode} == MODE_DO_UPDATE) {
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be updated;
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Updator is currently deleting tokens?
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if ($self->{_doDeleteTokens}) {
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, tokens must be deleted;
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Call ancestor
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->SUPER::comment($aComment);
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Look for update end token
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Does comment matches update end token?
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			if (defined(
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->{_tokensUpdateEnd}[TUT_TOKENTYPE_COMMENT]{$aComment}
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			)) {
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Yes, comment matches update end token;
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Indicate to stop deleting tokens
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->{_doDeleteTokens} = 0;
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			}
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		else {
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, tokens mustn't be deleted;
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Look for update begin token
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Does comment matches update begin token?
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			if (defined(
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->{_tokensUpdateBegin}[TUT_TOKENTYPE_COMMENT]{$aComment}
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			)) {
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Yes, comment matches update begin token;
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Indicate to start deleting tokens
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->{_doDeleteTokens} = 1;
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			}
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Call ancestor
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->SUPER::comment($aComment);
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	else {
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, ToC mustn't be updated;
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Call ancestor
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->SUPER::comment($aComment);
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # comment()
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::end() --------------------------------------------------
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a closing tag is encountered.
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOrigText: tag name including brackets.
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub end {
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aOrigText) = @_;
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::end($aTag, $aOrigText);
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be updated?
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{htu__Mode} == MODE_DO_UPDATE) {
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be updated;
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Updator is currently deleting tokens?
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if ($self->{_doDeleteTokens}) {
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, tokens must be deleted;
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Does end tag matches update end token?
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			if (defined(
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->{_tokensUpdateEnd}[TUT_TOKENTYPE_END]{$aTag}
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			)) {
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Yes, end tag matches update end token;
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Indicate to stop deleting tokens
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->{_doDeleteTokens} = 0;
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			}
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # end()
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::insert() -----------------------------------------------
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Insert ToC in string.
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object to update
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aString: string to insert ToC in.
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional updator options
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub insert {
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc, $aString, $aOptions) = @_;
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Do start insert
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_update(MODE_DO_INSERT, $aToc, $aString, $aOptions);
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # insert()
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::insertIntoFile() --------------------------------------
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Insert ToC in file.
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object to update
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aFile: File to insert ToC in.
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional updator options
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub insertIntoFile {
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc, $aFile, $aOptions) = @_;
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Do start insert
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_updateFile(MODE_DO_INSERT, $aToc, $aFile, $aOptions);
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # insertIntoFile()
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::number() -----------------------------------------------
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process heading number generated by HTML::Toc.
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aNumber
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: Reference to ToC to which anchorname belongs.
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub number {
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aNumber, $aToc) = @_;
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::number($aNumber);
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be inserted or updated?
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{htu__Mode} != MODE_DO_NOTHING) {
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be inserted or updated;
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Surround number with update tags
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_outputSuffix} =
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$aToc->{_tokenUpdateBeginNumber} .
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_outputSuffix} .
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$aToc->{_tokenUpdateEndNumber};
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}	# number()
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::start() ------------------------------------------------
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time an opening tag is encountered.
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttr: reference to hash containing all tag attributes (in lower
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                case).
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttrSeq: reference to array containing all tag attributes (in
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                lower case) in the original order
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOrigText: the original HTML text
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub start {
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_;
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be updated?
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{htu__Mode} == MODE_DO_UPDATE) {
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be updated;
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Does start tag matches token update begin tag?
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (HTML::TocUpdator::_doesTagExistInArray(
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$aTag, $aAttr, $self->{_tokensUpdateBegin}[TUT_TOKENTYPE_START]
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		)) {
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, start tag matches token update tag;
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Indicate to delete tokens
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_doDeleteTokens} = 1;
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Let ancestor process the start tag
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::start($aTag, $aAttr, $aAttrSeq, $aOrigText);
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # start()
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::toc() --------------------------------------------------
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Toc processing method.  Add toc reference to scenario.
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aScenario: Scenario to add ToC reference to.
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: Reference to ToC to insert.
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     The ToC hasn't been build yet; only a reference to the ToC to be
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           build is inserted.
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub toc {
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aScenario, $aToc) = @_;
52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Surround toc with update tokens
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add update begin token
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	push(@$aScenario, \$aToc->{_tokenUpdateBeginToc});
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::toc($aScenario, $aToc);
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add update end token
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	push(@$aScenario, \$aToc->{_tokenUpdateEndToc});
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # toc()
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::_processTocText() --------------------------------------
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Toc text processing function.
54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aText: Text to add to ToC.
54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: ToC to add text to.
54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTocText {
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aText, $aToc) = @_;
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Delete output?
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (! $self->{_doDeleteTokens}) {
54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, don't delete output;
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Call ancestor
55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->SUPER::_processTocText($aText, $aToc);
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _processTocText()
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::update() -----------------------------------------------
55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Update ToC in string.
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object to update
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aString: string to update ToC of
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional updator options
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub update {
56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc, $aString, $aOptions) = @_;
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Do start update
56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_update(MODE_DO_UPDATE, $aToc, $aString, $aOptions);
56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # update()
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocUpdator::updateFile() -------------------------------------------
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Update ToC of file.
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object to update
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aFile: (reference to array of) file to parse for updating.
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional updator options
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub updateFile {
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc, $aFile, $aOptions) = @_;
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Do start update
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_updateFile(MODE_DO_UPDATE, $aToc, $aFile, $aOptions);
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # update()
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#=== HTML::_TokenUpdateParser =================================================
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse 'update tokens'.  'Update tokens' mark HTML code which is
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           inserted by 'HTML::TocInsertor'.
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Used internally.
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::_TokenUpdateParser;
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberBEGIN {
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	use vars qw(@ISA);
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	@ISA = qw(HTML::Parser);
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {}
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenUpdateParser::new() ------------------------------------------
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new {
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($aType, $aTokenArray) = @_;
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Create instance
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $self = $aType->SUPER::new;
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reference token array
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{tokens} = $aTokenArray;
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Return instance
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	return $self;
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # new()
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenUpdateParser::comment() --------------------------------------
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process comment.
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aComment: comment text with '<!--' and '-->' tags stripped off.
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub comment {
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aComment) = @_;
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add token to array of update tokens
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_COMMENT]{$aComment} = '';
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # comment()
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenUpdateParser::end() ------------------------------------------
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a closing tag is encountered
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           by HTML::Parser.
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub end {
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aOrigText) = @_;
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add token to array of update tokens
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_END]{$aTag} = '';
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # end()
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenUpdateParser::parse() ----------------------------------------
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse token.
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToken: 'update token' to parse
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub parse {
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aString) = @_;
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::parse($aString);
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # parse()
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenUpdateParser::start() ----------------------------------------
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time an opening tag is encountered.
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttr: reference to hash containing all tag attributes (in lower
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                case).
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttrSeq: reference to array containing all tag attributes (in
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                lower case) in the original order
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOrigText: the original HTML text
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub start {
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_;
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Does token exist in array?
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (! HTML::TocUpdator::_doesTagExistInArray(
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$aTag, $aAttr, $self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_START]
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	)) {
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, token doesn't exist in array;
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Add token to array of update tokens
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		push(
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			@{$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_START]},
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			[$aTag, $aAttr]
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		);
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # start()
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenUpdateParser::text() -----------------------------------------
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time plain text is encountered.
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - @_: array containing data.
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub text {
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aText) = @_;
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add token to array of update tokens
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_TEXT]{$aText} = '';
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # text()
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber1;
694