190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- TocInsertor.pm -----------------------------------------------------------
290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Insert Table of Contents HTML::Toc, generated by
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           HTML::TocGenerator.
490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     - The term 'propagate' is used as a shortcut for the process of
590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#             both generating and inserting a ToC at the same time.
690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - 'TIP' is an abbreviation of 'Toc Insertion Point'.
790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::TocInsertor;
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse strict;
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse FileHandle;
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse HTML::TocGenerator;
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberBEGIN {
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	use vars qw(@ISA $VERSION);
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$VERSION = '0.91';
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	@ISA = qw(HTML::TocGenerator);
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	# TocInsertionPoint (TIP) constants
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_PREPOSITION_REPLACE => 'replace';
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_PREPOSITION_BEFORE  => 'before';
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_PREPOSITION_AFTER   => 'after';
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_TOKEN_ID           => 0;
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_PREPOSITION        => 1;
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_INCLUDE_ATTRIBUTES => 2;
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_EXCLUDE_ATTRIBUTES => 3;
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant TIP_TOC                => 4;
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant MODE_DO_NOTHING   => 0;	# 0b00
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant MODE_DO_INSERT    => 1;	# 0b01
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberuse constant MODE_DO_PROPAGATE => 3;	# 0b11
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {}
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::new() -------------------------------------------------
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor.
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new {
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($aType) = @_;
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $self = $aType->SUPER::new;
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# TRUE if insertion point token must be output, FALSE if not
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_doOutputInsertionPointToken} = 1;
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reset batch variables
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_resetBatchVariables;
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Bias to not insert ToC
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{hti__Mode} = MODE_DO_NOTHING;
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# TODO: Initialize output
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	return $self;
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # new()
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_deinitializeOutput() ---------------------------------
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Deinitialize output.
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _deinitializeOutput {
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Filehandle is defined?
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (defined($self->{_outputFileHandle})) {
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, filehandle is defined;
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Restore selected filehandle
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		select($self->{_oldFileHandle});
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Undefine filehandle, closing it automatically
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		undef $self->{_outputFileHandle};
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _deinitializeOutput()
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_initializeOutput() -----------------------------------
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Initialize output.
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _initializeOutput {
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Bias to write to outputfile
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $doOutputToFile = 1;
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Is output specified?
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (defined($self->{options}{'output'})) {
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, output is specified;
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Indicate to not output to outputfile
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$doOutputToFile = 0;
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Alias output reference
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_output} = $self->{options}{'output'};
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Clear output
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		${$self->{_output}} = "";
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Is output file specified?
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (defined($self->{options}{'outputFile'})) {
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, output file is specified;
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Indicate to output to outputfile
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$doOutputToFile = 1;
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Open file
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_outputFileHandle} =
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			new FileHandle ">" . $self->{options}{'outputFile'};
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Backup currently selected filehandle
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_oldFileHandle} = select;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Set new default filehandle
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		select($self->{_outputFileHandle});
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Alias output-to-file indicator
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_doOutputToFile} = $doOutputToFile;
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _initializeOutput()
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_deinitializeInsertorBatch() --------------------------
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Deinitialize insertor batch.
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _deinitializeInsertorBatch {
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate ToC insertion has finished
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_isTocInsertionPointPassed} = 0;
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Write buffered output
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_writeBufferedOutput();
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Propagate?
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{hti__Mode} == MODE_DO_PROPAGATE) {
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, propagate;
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Deinitialize generator batch
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_deinitializeGeneratorBatch();
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	else {
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, insert only;
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Do general batch deinitialization
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_deinitializeBatch();
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Deinitialize output
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_deinitializeOutput();
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate end of batch
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{hti__Mode} = MODE_DO_NOTHING;
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reset batch variables
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_resetBatchVariables();
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _deinitializeInsertorBatch()
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_initializeInsertorBatch() ----------------------------
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Initialize insertor batch.
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTocs: Reference to array of tocs.
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional options
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _initializeInsertorBatch {
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTocs, $aOptions) = @_;
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add invocation options
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->setOptions($aOptions);
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Option 'doGenerateToc' specified?
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (!defined($self->{options}{'doGenerateToc'})) {
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, options 'doGenerateToc' not specified;
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Default to 'doGenerateToc'
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{options}{'doGenerateToc'} = 1;
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Propagate?
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{options}{'doGenerateToc'}) {
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, propagate;
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Indicate mode
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{hti__Mode} = MODE_DO_PROPAGATE;
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Initialize generator batch
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# NOTE: This method takes care of calling '_initializeBatch()'
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_initializeGeneratorBatch($aTocs);
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	else {
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, insert;
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Indicate mode
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{hti__Mode} = MODE_DO_INSERT;
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Do general batch initialization
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_initializeBatch($aTocs);
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Initialize output
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_initializeOutput();
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Parse ToC insertion points
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_parseTocInsertionPoints();
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _initializeInsertorBatch()
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_insert() ---------------------------------------------
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Insert ToC in string.
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aString: Reference to string to parse.
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Used internally.
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _insert {
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aString) = @_;
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Propagate?
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{options}{'doGenerateToc'}) {
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, propagate;
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Generate & insert ToC
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_generate($aString);
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	else {
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, just insert ToC
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Insert by parsing file
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->parse($aString);
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Flush remaining buffered text
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->eof();
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _insert()
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_insertIntoFile() -------------------------------------
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Do insert generated ToCs in file.
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object(s) to insert.
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aFile: (reference to array of) file(s) to parse for insertion
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                points.
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional insertor options
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Used internally.
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _insertIntoFile {
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aFile) = @_;
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables;
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($file, @files);
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Dereference array reference or make array of file specification
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	@files = (ref($aFile) =~ m/ARRAY/) ? @$aFile : ($aFile);
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Loop through files
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	foreach $file (@files) {
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Propagate?
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if ($self->{options}{'doGenerateToc'}) {
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, propagate;
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Generate and insert ToC
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->_generateFromFile($file);
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		else {
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, just insert ToC
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Insert by parsing file
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->parse_file($file);
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _insertIntoFile()
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_parseTocInsertionPoints() ----------------------------
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse ToC insertion point specifier.
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _parseTocInsertionPoints {
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($tipPreposition, $tipToken, $toc, $tokenTipParser);
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Create parser for TIP tokens
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$tokenTipParser = HTML::_TokenTipParser->new(
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_tokensTip}
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	);
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Loop through ToCs
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	foreach $toc (@{$self->{_tocs}}) {
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Split TIP in preposition and token
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		($tipPreposition, $tipToken) = split(
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			'\s+', $toc->{options}{'insertionPoint'}, 2
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		);
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Known preposition?
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			($tipPreposition ne TIP_PREPOSITION_REPLACE) &&
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			($tipPreposition ne TIP_PREPOSITION_BEFORE) &&
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			($tipPreposition ne TIP_PREPOSITION_AFTER)
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		) {
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, unknown preposition;
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Use default preposition
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$tipPreposition = TIP_PREPOSITION_AFTER;
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Use entire 'insertionPoint' as token
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$tipToken = $toc->{options}{'insertionPoint'};
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Indicate current ToC to parser
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenTipParser->setToc($toc);
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Indicate current preposition to parser
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenTipParser->setPreposition($tipPreposition);
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Parse ToC Insertion Point
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenTipParser->parse($tipToken);
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Flush remaining buffered text
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tokenTipParser->eof();
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _parseTocInsertionPoints()
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_processTokenAsInsertionPoint() -----------------------
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Check for token being a ToC insertion point (Tip) token and
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           process it accordingly.
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTokenType: type of token: start, end, comment or text.
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aTokenId: token id of currently parsed token
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aTokenAttributes: attributes of currently parsed token
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOrigText: complete token
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# returns:  1 if successful -- token is processed as insertion point, 0
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           if not.
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTokenAsInsertionPoint {
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTokenType, $aTokenId, $aTokenAttributes, $aOrigText) = @_;
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($i, $result, $tipToken, $tipTokenId, $tipTokens);
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Bias to token not functioning as a ToC insertion point (Tip) token
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$result = 0;
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Alias ToC insertion point (Tip) array of right type
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$tipTokens = $self->{_tokensTip}[$aTokenType];
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Loop through tipTokens
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$i = 0;
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	while ($i < scalar @{$tipTokens}) {
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Aliases
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tipToken			         = $tipTokens->[$i];
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$tipTokenId			         = $tipToken->[TIP_TOKEN_ID];
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Id & attributes match?
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			($aTokenId =~ m/$tipTokenId/) && (
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				HTML::TocGenerator::_doesHashContainHash(
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					$aTokenAttributes, $tipToken->[TIP_INCLUDE_ATTRIBUTES], 0
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				) &&
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				HTML::TocGenerator::_doesHashContainHash(
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					$aTokenAttributes, $tipToken->[TIP_EXCLUDE_ATTRIBUTES], 1
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				)
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			)
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		) {
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, id and attributes match;
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Process ToC insertion point
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->_processTocInsertionPoint($tipToken);
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Indicate token functions as ToC insertion point
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$result = 1;
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Remove Tip token, automatically advancing to next token
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			splice(@$tipTokens, $i, 1);
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		else {
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, tag doesn't match ToC insertion point
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Advance to next start token
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$i++;
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Token functions as ToC insertion point?
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($result) {
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, token functions as ToC insertion point;
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Process insertion point(s)
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_processTocInsertionPoints($aOrigText);
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Return value
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	return $result;
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _processTokenAsInsertionPoint()
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::toc() -------------------------------------------------
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Toc processing method.  Add toc reference to scenario.
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aScenario: Scenario to add ToC reference to.
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: Reference to ToC to insert.
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     The ToC hasn't been build yet; only a reference to the ToC to be
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           build is inserted.
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub toc {
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aScenario, $aToc) = @_;
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add toc to scenario
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	push(@$aScenario, $aToc);
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # toc()
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_processTocInsertionPoint() ----------------------------
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process ToC insertion point.
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTipToken: Reference to token array item which matches the ToC
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                insertion point.
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTocInsertionPoint {
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTipToken) = @_;
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($tipToc, $tipPreposition);
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Aliases
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$tipToc         = $aTipToken->[TIP_TOC];
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$tipPreposition = $aTipToken->[TIP_PREPOSITION];
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	SWITCH: {
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Replace token with ToC?
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if ($tipPreposition eq TIP_PREPOSITION_REPLACE) {
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, replace token;
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Indicate ToC insertion point has been passed
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_isTocInsertionPointPassed} = 1;
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Add ToC reference to scenario reference by calling 'toc' method
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->toc($self->{_scenarioAfterToken}, $tipToc);
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			#push(@{$self->{_scenarioAfterToken}}, $tipTokenToc);
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Indicate token itself must not be output
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_doOutputInsertionPointToken} = 0;
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			last SWITCH;
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Output ToC before token?
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if ($tipPreposition eq TIP_PREPOSITION_BEFORE) {
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, output ToC before token;
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Indicate ToC insertion point has been passed
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_isTocInsertionPointPassed} = 1;
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Add ToC reference to scenario reference by calling 'toc' method
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->toc($self->{_scenarioBeforeToken}, $tipToc);
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			#push(@{$self->{_scenarioBeforeToken}}, $tipTokenToc);
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			last SWITCH;
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Output ToC after token?
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if ($tipPreposition eq TIP_PREPOSITION_AFTER) {
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Yes, output ToC after token;
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Indicate ToC insertion point has been passed
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->{_isTocInsertionPointPassed} = 1;
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Add ToC reference to scenario reference by calling 'toc' method
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->toc($self->{_scenarioAfterToken}, $tipToc);
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			#push(@{$self->{_scenarioAfterToken}}, $tipTokenToc);
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			last SWITCH;
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _processTocInsertionPoint()
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_processTocInsertionPoints() --------------------------
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process ToC insertion points
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTokenText: Text of token which acts as insertion point for one
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                or multiple ToCs.
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processTocInsertionPoints {
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTokenText) = @_;
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($outputPrefix, $outputSuffix);
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Extend scenario
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	push(@{$self->{_scenario}}, @{$self->{_scenarioBeforeToken}});
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($outputPrefix = $self->{_outputPrefix}) {
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		push(@{$self->{_scenario}}, \$outputPrefix);
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_outputPrefix} = "";
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must insertion point token be output?
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{_doOutputInsertionPointToken}) {
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, output insertion point token;
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		push(@{$self->{_scenario}}, \$aTokenText);
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($outputSuffix = $self->{_outputSuffix}) {
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		push(@{$self->{_scenario}}, \$outputSuffix);
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_outputSuffix} = "";
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	push(@{$self->{_scenario}}, @{$self->{_scenarioAfterToken}});
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add new act to scenario for output to come
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $output = "";
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	push(@{$self->{_scenario}}, \$output);
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Write output, processing possible '_outputSuffix'
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	#$self->_writeOrBufferOutput("");
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reset helper scenario's
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_scenarioBeforeToken} = [];
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_scenarioAfterToken}  = [];
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reset bias value to output insertion point token
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_doOutputInsertionPointToken} = 1;
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _processTocInsertionPoints()
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::Toc::_resetBatchVariables() ----------------------------------------
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Reset batch variables.
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _resetBatchVariables {
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Call ancestor
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::_resetBatchVariables();
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Array containing references to scalars.  This array depicts the order
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# in which output must be performed after the first ToC Insertion Point
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# has been passed.
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_scenario}            = [];
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Helper scenario
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_scenarioBeforeToken} = [];
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Helper scenario
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_scenarioAfterToken}  = [];
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Arrays containing start, end, comment, text & declaration tokens which
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# must trigger the ToC insertion.  Each array element may contain a
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# reference to an array containing the following elements:
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_tokensTip} = [
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		[],	# TT_TOKENTYPE_START
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		[],	# TT_TOKENTYPE_END
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		[],	# TT_TOKENTYPE_COMMENT
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		[],	# TT_TOKENTYPE_TEXT
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		[]		# TT_TOKENTYPE_DECLARATION
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	];
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# 1 if ToC insertion point has been passed, 0 if not
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_isTocInsertionPointPassed} = 0;
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Tokens after ToC
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{outputBuffer} = "";
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Trailing text after parsed token
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_outputSuffix} = "";
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Preceding text before parsed token
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_outputPrefix} = "";
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _resetBatchVariables()
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_writeBufferedOutput() --------------------------------
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Write buffered output to output device(s).
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _writeBufferedOutput {
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self) = @_;
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($scene);
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be parsed?
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{options}{'parseToc'}) {
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be parsed;
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Parse ToC
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		#$self->parse($self->{toc});
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Output tokens after ToC
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		#$self->_writeOrBufferOutput($self->{outputBuffer});
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	else {
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, ToC needn't be parsed;
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Output scenario
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		foreach $scene (@{$self->{_scenario}}) {
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Is scene a reference to a scalar?
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			if (ref($scene) eq "SCALAR") {
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Yes, scene is a reference to a scalar;
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Output scene
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->_writeOutput($$scene);
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			}
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			else {
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# No, scene must be reference to HTML::Toc;
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Output toc
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->_writeOutput($scene->format());
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			}
52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _writeBufferedOutput()
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_writeOrBufferOutput() --------------------------------
53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Write processed HTML to output device(s).
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - aOutput: scalar to write
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     If '_isTocInsertionPointPassed' text is buffered before being
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           output because the ToC has to be generated before it can be output.
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           Only after the entire data has been parsed, the ToC and the
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           following text will be output.
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _writeOrBufferOutput {
54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aOutput) = @_;
54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add possible output prefix and suffix
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$aOutput = $self->{_outputPrefix} . $aOutput . $self->{_outputSuffix};
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Clear output prefix and suffix
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_outputPrefix} = "";
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_outputSuffix} = "";
54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Has ToC insertion point been passed?
55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{_isTocInsertionPointPassed}) {
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC insertion point has been passed;
55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Buffer output; add output to last '_scenario' item
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		my $index = scalar(@{$self->{_scenario}}) - 1;
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		${$self->{_scenario}[$index]} .= $aOutput;
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	else {
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, ToC insertion point hasn't been passed;
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Write output
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_writeOutput($aOutput);
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _writeOrBufferOutput()
56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::_writeOutput() ----------------------------------------
56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Write processed HTML to output device(s).
56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - aOutput: scalar to write
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _writeOutput {
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aOutput) = @_;
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Write output to scalar;
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	${$self->{_output}} .= $aOutput if (defined($self->{_output}));
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Write output to output file
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	print $aOutput if ($self->{_doOutputToFile})
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _writeOutput()
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocGenerator::anchorId() -------------------------------------------
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Anchor id processing method.
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aAnchorId
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorId {
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aAnchorId) = @_;
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate id must be added to start tag
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_doAddAnchorIdToStartTag} = 1;
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_anchorId} = $aAnchorId;
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # anchorId()
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::anchorNameBegin() -------------------------------------
59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process anchor name begin, generated by HTML::TocGenerator.
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aAnchorNameBegin: Anchor name begin tag to output.
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: Reference to ToC to which anchorname belongs.
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorNameBegin {
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aAnchorNameBegin, $aToc) = @_;
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Is another anchorName active?
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (defined($self->{_activeAnchorName})) {
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, another anchorName is active;
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Show warning
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		print "Warn\n";
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_showWarning(
60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocGenerator::WARNING_NESTED_ANCHOR_PS_WITHIN_PS,
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			[$aAnchorNameBegin, $self->{_activeAnchorName}]
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		);
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Store anchor name as output prefix
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_outputPrefix} = $aAnchorNameBegin;
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate active anchor name
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_activeAnchorName} = $aAnchorNameBegin;
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate anchor name end must be output
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_doOutputAnchorNameEnd} = 1;
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}	# anchorNameBegin()
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::anchorNameEnd() ---------------------------------------
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process anchor name end, generated by HTML::TocGenerator.
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aAnchorNameEnd: Anchor name end tag to output.
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aToc: Reference to ToC to which anchorname belongs.
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub anchorNameEnd {
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aAnchorNameEnd) = @_;
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Store anchor name as output prefix
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_outputSuffix} .= $aAnchorNameEnd;
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate deactive anchor name
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_activeAnchorName} = undef;
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}	# anchorNameEnd()
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::comment() ---------------------------------------------
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process comment.
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aComment: comment text with '<!--' and '-->' tags stripped off.
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub comment {
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aComment) = @_;
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($tocInsertionPointToken, $doOutput, $origText);
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Allow ancestor to process the comment tag
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::comment($aComment);
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Assemble original comment
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$origText = "<!--$aComment-->";
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToCs be inserted?
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{hti__Mode} & MODE_DO_INSERT) {
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToCs must be inserted;
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Processing comment as ToC insertion point is successful?
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (! $self->_processTokenAsInsertionPoint(
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocGenerator::TT_TOKENTYPE_COMMENT, $aComment, undef, $origText
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		)) {
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, comment isn't a ToC insertion point;
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Output comment normally
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->_writeOrBufferOutput($origText);
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # comment()
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::declaration() -----------------------------------------
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a declaration is encountered
66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           by HTML::Parser.
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub declaration {
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aDeclaration) = @_;
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Allow ancestor to process the declaration tag
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::declaration($aDeclaration);
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToCs be inserted?
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{hti__Mode} & MODE_DO_INSERT) {
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToCs must be inserted;
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Processing declaration as ToC insertion point is successful?
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (! $self->_processTokenAsInsertionPoint(
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocGenerator::TT_TOKENTYPE_DECLARATION, $aDeclaration, undef,
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			"<!$aDeclaration>"
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		)) {
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, declaration isn't a ToC insertion point;
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Output declaration normally
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->_writeOrBufferOutput("<!$aDeclaration>");
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # declaration()
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::end() -------------------------------------------------
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a closing tag is encountered
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           by HTML::Parser.
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub end {
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aOrigText) = @_;
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Allow ancestor to process the end tag
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::end($aTag, $aOrigText);
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToCs be inserted?
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{hti__Mode} & MODE_DO_INSERT) {
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToCs must be inserted;
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Processing end tag as ToC insertion point is successful?
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (! $self->_processTokenAsInsertionPoint(
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocGenerator::TT_TOKENTYPE_END, $aTag, undef, $aOrigText
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		)) {
70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, end tag isn't a ToC insertion point;
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Output end tag normally
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->_writeOrBufferOutput($aOrigText);
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # end()
71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::insert() ----------------------------------------------
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Insert ToC in string.
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object to insert
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aString: string to insert ToC in
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: hash reference with optional insertor options
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub insert {
71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc, $aString, $aOptions) = @_;
72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Initialize TocInsertor batch
72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_initializeInsertorBatch($aToc, $aOptions);
72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Do insert Toc
72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_insert($aString);
72590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Deinitialize TocInsertor batch
72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_deinitializeInsertorBatch();
72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # insert()
72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::insertIntoFile() --------------------------------------
73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Insert ToCs in file.
73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object(s) to insert.
73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aFile: (reference to array of) file(s) to parse for insertion
73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                points.
73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional insertor options
73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub insertIntoFile {
73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc, $aFile, $aOptions) = @_;
74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Initialize TocInsertor batch
74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_initializeInsertorBatch($aToc, $aOptions);
74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Do insert ToCs into file
74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_insertIntoFile($aFile);
74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Deinitialize TocInsertor batch
74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_deinitializeInsertorBatch();
74690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # insertIntoFile()
74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::number() ----------------------------------------------
75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process heading number generated by HTML::Toc.
75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aNumber
75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub number {
75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aNumber) = @_;
75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Store heading number as output suffix
75790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_outputSuffix} .= $aNumber;
75890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}	# number()
75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::propagateFile() ---------------------------------------
76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Propagate ToC; generate & insert ToC, using file as input.
76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aToc: (reference to array of) ToC object to insert
76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aFile: (reference to array of) file to parse for insertion
76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                points.
76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOptions: optional insertor options
76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub propagateFile {
76990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc, $aFile, $aOptions) = @_;
77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables;
77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($file, @files);
77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Initialize TocInsertor batch
77490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_initializeInsertorBatch($aToc, $aOptions);
77590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Dereference array reference or make array of file specification
77690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	@files = (ref($aFile) =~ m/ARRAY/) ? @$aFile : ($aFile);
77790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Loop through files
77890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	foreach $file (@files) {
77990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Generate and insert ToC
78090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_generateFromFile($file);
78190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
78290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Deinitialize TocInsertor batch
78390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_deinitializeInsertorBatch();
78490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # propagateFile()
78590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::start() -----------------------------------------------
78890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time an opening tag is encountered.
78990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
79090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttr: reference to hash containing all tag attributes (in lower
79190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                case).
79290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttrSeq: reference to array containing all tag attributes (in
79390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                lower case) in the original order
79490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOrigText: the original HTML text
79590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
79690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub start {
79790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
79890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_;
79990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
80090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($doOutput, $i, $tocToken, $tag, $anchorId);
80190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Let ancestor process the start tag
80290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::start($aTag, $aAttr, $aAttrSeq, $aOrigText);
80390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be inserted?
80490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{hti__Mode} & MODE_DO_INSERT) {
80590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be inserted;
80690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Processing start tag as ToC insertion point is successful?
80790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (! $self->_processTokenAsInsertionPoint(
80890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocGenerator::TT_TOKENTYPE_START, $aTag, $aAttr, $aOrigText
80990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		)) {
81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, start tag isn't a ToC insertion point;
81190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Add anchor id?
81290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			if ($self->{_doAddAnchorIdToStartTag}) {
81390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Yes, anchor id must be added;
81490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Reset indicator;
81590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$self->{_doAddAnchorIdToStartTag} = 0;
81690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Alias anchor id
81790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				$anchorId = $self->{_anchorId};
81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Attribute 'id' already exists?
81990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				if (defined($aAttr->{id})) {
82090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# Yes, attribute 'id' already exists;
82190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber						# Show warning
82290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					print STDERR "WARNING: Overwriting existing id attribute '" .
82390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber						$aAttr->{id} . "' of tag $aOrigText\n";
82490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
82590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber						# Add anchor id to start tag
82690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					$aOrigText =~ s/(id)=\S*([\s>])/$1=$anchorId$2/i;
82790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				}
82890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				else {
82990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					# No, attribute 'id' doesn't exist;
83090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber						# Add anchor id to start tag
83190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber					$aOrigText =~ s/>/ id=$anchorId>/;
83290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				}
83390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			}
83490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Output start tag normally
83590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->_writeOrBufferOutput($aOrigText);
83690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
83790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
83890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # start()
83990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
84090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
84190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::TocInsertor::text() ------------------------------------------------
84290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time plain text is encountered.
84390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - @_: array containing data.
84490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
84590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub text {
84690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
84790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aText) = @_;
84890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Let ancestor process the text
84990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->SUPER::text($aText);
85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Must ToC be inserted?
85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if ($self->{hti__Mode} & MODE_DO_INSERT) {
85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, ToC must be inserted;
85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Processing text as ToC insertion point is successful?
85490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		if (! $self->_processTokenAsInsertionPoint(
85590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocGenerator::TT_TOKENTYPE_TEXT, $aText, undef, $aText
85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		)) {
85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# No, text isn't a ToC insertion point;
85890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber				# Output text normally
85990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			$self->_writeOrBufferOutput($aText);
86090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		}
86190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
86290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # text()
86390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
86490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
86590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
86690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
86790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#=== HTML::_TokenTipParser ====================================================
86890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Parse 'TIP tokens'.  'TIP tokens' mark HTML code which is to be
86990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           used as the ToC Insertion Point.
87090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# note:     Used internally.
87190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberpackage HTML::_TokenTipParser;
87390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberBEGIN {
87690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	use vars qw(@ISA);
87790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	@ISA = qw(HTML::_TokenTocParser);
87990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
88090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
88190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
88290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberEND {}
88390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
88490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
88590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::new() ---------------------------------------------
88690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Constructor
88790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
88890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub new {
88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
89090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($aType, $aTokenArray) = @_;
89190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Create instance
89290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my $self = $aType->SUPER::new;
89390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reference token array
89490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{tokens} = $aTokenArray;
89590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Reference to last added token
89690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_lastAddedToken}     = undef;
89790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_lastAddedTokenType} = undef;
89890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Return instance
89990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	return $self;
90090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # new()
90190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
90390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::_processAttributes() ------------------------------
90490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process attributes.
90590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aAttributes: Attributes to parse.
90690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
90790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processAttributes {
90890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
90990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aAttributes) = @_;
91090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
91190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my (%includeAttributes, %excludeAttributes);
91290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
91390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Parse attributes
91490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_parseAttributes(
91590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$aAttributes, \%includeAttributes, \%excludeAttributes
91690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	);
91790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Include attributes are specified?
91890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (keys(%includeAttributes) > 0) {
91990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, include attributes are specified;
92090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Store include attributes
92190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		@${$self->{_lastAddedToken}}[
92290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocInsertor::TIP_INCLUDE_ATTRIBUTES
92390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		] = \%includeAttributes;
92490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
92590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Exclude attributes are specified?
92690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (keys(%excludeAttributes) > 0) {
92790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, exclude attributes are specified;
92890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Store exclude attributes
92990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		@${$self->{_lastAddedToken}}[
93090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			HTML::TocInsertor::TIP_EXCLUDE_ATTRIBUTES
93190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		] = \%excludeAttributes;
93290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
93390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _processAttributes()
93490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
93590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::_processToken() -----------------------------------
93790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process token.
93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTokenType: Type of token to process.
93990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aTag: Tag of token.
94090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
94190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub _processToken {
94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTokenType, $aTag) = @_;
94490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Local variables
94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($tokenArray, $index);
94690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Push element on array of update tokens
94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$index = push(@{$self->{tokens}[$aTokenType]}, []) - 1;
94890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Alias token array to add element to
94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$tokenArray = $self->{tokens}[$aTokenType];
95090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Indicate last updated token array element
95190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_lastAddedTokenType} = $aTokenType;
95290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_lastAddedToken}     = \$$tokenArray[$index];
95390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Add fields
95490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$$tokenArray[$index][HTML::TocInsertor::TIP_TOC]         = $self->{_toc};
95590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$$tokenArray[$index][HTML::TocInsertor::TIP_TOKEN_ID] 	= $aTag;
95690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$$tokenArray[$index][HTML::TocInsertor::TIP_PREPOSITION] =
95790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_preposition};
95890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # _processToken()
95990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
96090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
96190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::comment() -----------------------------------------
96290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Process comment.
96390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aComment: comment text with '<!--' and '-->' tags stripped off.
96490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
96590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub comment {
96690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
96790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aComment) = @_;
96890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Process token
96990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_COMMENT, $aComment);
97090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # comment()
97190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
97290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
97390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::declaration() --------------------------------
97490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a markup declaration is
97590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           encountered by HTML::Parser.
97690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aDeclaration: Markup declaration.
97790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub declaration {
97990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
98090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aDeclaration) = @_;
98190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Process token
98290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_processToken(
98390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		HTML::TocGenerator::TT_TOKENTYPE_DECLARATION, $aDeclaration
98490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	);
98590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # declaration()
98690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
98790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
98890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::end() ----------------------------------------
98990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time a closing tag is encountered
99090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           by HTML::Parser.
99190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
99290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
99390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub end {
99490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
99590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aOrigText) = @_;
99690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Process token
99790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_END, $aTag);
99890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # end()
99990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
100090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
100190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser->setPreposition() ----------------------------------
100290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Set current preposition.
100390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
100490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub setPreposition {
100590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
100690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aPreposition) = @_;
100790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Set current ToC
100890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_preposition} = $aPreposition;
100990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # setPreposition()
101090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
101190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
101290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser->setToc() ------------------------------------------
101390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: Set current ToC.
101490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
101590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub setToc {
101690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
101790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aToc) = @_;
101890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Set current ToC
101990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->{_toc} = $aToc;
102090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # setToc()
102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
102290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
102390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::start() --------------------------------------
102490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time an opening tag is encountered.
102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - $aTag: tag name (in lower case).
102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttr: reference to hash containing all tag attributes (in lower
102790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                case).
102890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aAttrSeq: reference to array containing all attribute keys (in
102990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#                lower case) in the original order
103090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#           - $aOrigText: the original HTML text
103190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub start {
103390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
103490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_;
103590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Process token
103690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_START, $aTag);
103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Process attributes
103890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	$self->_processAttributes($aAttr);
103990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # start()
104090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
104190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
104290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#--- HTML::_TokenTipParser::text() ---------------------------------------
104390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# function: This function is called every time plain text is encountered.
104490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# args:     - @_: array containing data.
104590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
104690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub text {
104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Get arguments
104890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	my ($self, $aText) = @_;
104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Was token already created and is last added token of type 'text'?
105090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	if (
105190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		defined($self->{_lastAddedToken}) &&
105290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->{_lastAddedTokenType} == HTML::TocGenerator::TT_TOKENTYPE_TEXT
105390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	) {
105490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# Yes, token is already created;
105590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Add tag to existing token
105690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		@${$self->{_lastAddedToken}}[HTML::TocGenerator::TT_TAG_BEGIN] .= $aText;
105790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
105890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	else {
105990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		# No, token isn't created;
106090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber			# Process token
106190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber		$self->_processToken(HTML::TocGenerator::TT_TOKENTYPE_TEXT, $aText);
106290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber	}
106390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}  # text()
106490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
106590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
106690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber1;
1067