[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[no subject]
From: |
Patrice Dumas |
Date: |
Wed, 2 Oct 2024 02:13:43 -0400 (EDT) |
branch: master
commit 18fd6f317069ebc806ea44479717411d6b1a5634
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Tue Jul 30 14:43:08 2024 +0200
* tp/Texinfo/XS/convert/convert_html.c (direction_string)
(from_element_direction): return 0 if the direction is negative, which
should mean a Perl direction not found in C.
* tp/Texinfo/XS/main/get_perl_info.c (html_get_direction_index):
return -2 if there are directions in the converter and the direction
is not found (instead of -1).
* tp/Texinfo/XS/main/get_perl_info.c
(html_get_button_specification_list): add more checks of empty arrays,
undef values.
* tp/Makefile.am (test_files), tp/Makefile.tres,
tp/t/init_files_tests.t ($special_unit_direction_customization_text)
(special_unit_direction_customization),
tp/t/init/special_unit_direction_customization.pm: add test of special
unit direction customization.
---
ChangeLog | 20 ++
tp/Makefile.am | 1 +
tp/Makefile.tres | 2 +
tp/Texinfo/XS/convert/convert_html.c | 11 +-
tp/Texinfo/XS/convert/get_converter_perl_info.c | 87 -------
tp/Texinfo/XS/main/get_perl_info.c | 51 +++-
tp/t/init/special_unit_direction_customization.pm | 4 +
tp/t/init_files_tests.t | 15 ++
.../special_unit_direction_customization.pl | 290 +++++++++++++++++++++
.../res_html/chapter.html | 40 +++
.../res_html/index.html | 57 ++++
11 files changed, 486 insertions(+), 92 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 78c353aac3..df97d5aaf2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2024-07-30 Patrice Dumas <pertusus@free.fr>
+
+ * tp/Texinfo/XS/convert/convert_html.c (direction_string)
+ (from_element_direction): return 0 if the direction is negative, which
+ should mean a Perl direction not found in C.
+
+ * tp/Texinfo/XS/main/get_perl_info.c (html_get_direction_index):
+ return -2 if there are directions in the converter and the direction
+ is not found (instead of -1).
+
+ * tp/Texinfo/XS/main/get_perl_info.c
+ (html_get_button_specification_list): add more checks of empty arrays,
+ undef values.
+
+ * tp/Makefile.am (test_files), tp/Makefile.tres,
+ tp/t/init_files_tests.t ($special_unit_direction_customization_text)
+ (special_unit_direction_customization),
+ tp/t/init/special_unit_direction_customization.pm: add test of special
+ unit direction customization.
+
2024-07-30 Patrice Dumas <pertusus@free.fr>
* tp/Texinfo/XS/convert/convert_html.c
diff --git a/tp/Makefile.am b/tp/Makefile.am
index 4fe28ecead..5600c998e7 100644
--- a/tp/Makefile.am
+++ b/tp/Makefile.am
@@ -204,6 +204,7 @@ test_files = \
t/init/redirection_file_collision_with_user_def.init \
t/init/set_unit_file_name_filepath.pm \
t/init/special_element_customization.pm \
+ t/init/special_unit_direction_customization.pm \
t/init/t2h_buttons.pm \
t/init/t2h_singular.init \
t/init/test_css_info_functions.pm \
diff --git a/tp/Makefile.tres b/tp/Makefile.tres
index efc19ed084..be400a7969 100644
--- a/tp/Makefile.tres
+++ b/tp/Makefile.tres
@@ -1123,6 +1123,8 @@ test_files_generated_list =
$(test_tap_files_generated_list) \
t/results/init_files_tests/redefined_need.pl \
t/results/init_files_tests/sc_formatting_with_css.pl \
t/results/init_files_tests/sc_formatting_with_css/res_html \
+ t/results/init_files_tests/special_unit_direction_customization.pl \
+ t/results/init_files_tests/special_unit_direction_customization/res_html \
t/results/init_files_tests/test_format_single_footnote_in_inline_content.pl \
t/results/init_files_tests/test_format_single_footnote_in_inline_content/res_html
\
t/results/init_files_tests/translation_in_parser_in_translation.pl \
diff --git a/tp/Texinfo/XS/convert/convert_html.c
b/tp/Texinfo/XS/convert/convert_html.c
index 8c81c24c76..0b89056583 100644
--- a/tp/Texinfo/XS/convert/convert_html.c
+++ b/tp/Texinfo/XS/convert/convert_html.c
@@ -3039,6 +3039,11 @@ direction_string (CONVERTER *self, int direction,
enum direction_string_context context)
{
int direction_unit_direction_idx = direction;
+
+ /* Perl direction not found in C */
+ if (direction < 0)
+ return 0;
+
if (direction >= FIRSTINFILE_MIN_IDX && direction <= FIRSTINFILE_MAX_IDX)
{
direction += FIRSTINFILE_OFFSET;
@@ -4413,6 +4418,10 @@ from_element_direction (CONVERTER *self, int direction,
const OUTPUT_UNIT *target_unit = 0;
const ELEMENT *command = 0;
+ /* this means that the direction given in Perl was not found in C */
+ if (direction < 0)
+ return 0;
+
if (!source_unit)
source_unit = self->current_output_unit;
@@ -4422,7 +4431,7 @@ from_element_direction (CONVERTER *self, int direction,
filename_from = self->current_filename.filename;
/* To debug:
- fprintf (stderr, "%s %s\n", html_command_text_type_name[type],
+ fprintf (stderr, "FED: %s %s\n", html_command_text_type_name[type],
self->direction_unit_direction_name[direction]);
*/
diff --git a/tp/Texinfo/XS/convert/get_converter_perl_info.c
b/tp/Texinfo/XS/convert/get_converter_perl_info.c
index 13ef9a5377..8c935b0bde 100644
--- a/tp/Texinfo/XS/convert/get_converter_perl_info.c
+++ b/tp/Texinfo/XS/convert/get_converter_perl_info.c
@@ -169,92 +169,6 @@ get_expanded_formats (HV *hv, EXPANDED_FORMAT
**expanded_formats)
}
}
-/* Texinfo::Convert::Converter generic initialization for all the converters */
-/* Called early, in particuliar before any format specific code has been
- called */
-int
-converter_initialize (SV *converter_sv)
-{
- HV *hv_in;
- SV **configured_sv;
- SV **output_format_sv;
- size_t converter_descriptor = 0;
- CONVERTER *converter;
-
- dTHX;
-
- converter_descriptor = new_converter ();
- converter = retrieve_converter (converter_descriptor);
-
- hv_in = (HV *)SvRV (converter_sv);
-
-#define FETCH(key) key##_sv = hv_fetch (hv_in, #key, strlen (#key), 0);
- FETCH(output_format)
-
- if (output_format_sv && SvOK (*output_format_sv))
- {
- converter->output_format
- = non_perl_strdup (SvPVutf8_nolen (*output_format_sv));
- }
-
- /*
- fprintf (stderr, "XS|CONVERTER Init: %zu; %s\n", converter_descriptor,
- converter->output_format);
- */
-
- converter->conf = new_options ();
- /* force is not set, but at this point, the configured field should not
- be set, so it would not have an effect anyway */
- copy_converter_conf_sv (hv_in, converter, &converter->conf, "conf", 0);
-
- converter->init_conf = new_options ();
- copy_converter_conf_sv (hv_in, converter, &converter->init_conf,
- "converter_init_conf", 1);
-
- FETCH(configured);
-
- if (configured_sv && SvOK (*configured_sv))
- {
- get_sv_configured_options (*configured_sv, converter->conf);
- }
-
-#undef FETCH
- set_translated_commands (converter, hv_in);
-
- converter->expanded_formats = new_expanded_formats ();
- set_expanded_formats_from_options (converter->expanded_formats,
- converter->conf);
-
- converter->hv = hv_in;
-
- /* store converter_descriptor in perl converter */
- hv_store (hv_in, "converter_descriptor",
- strlen ("converter_descriptor"),
- newSViv (converter_descriptor), 0);
-
- return converter_descriptor;
-}
-
-/* currently unused */
-/* reset output_init_conf. Can be called after it has been modified */
-void
-reset_output_init_conf (SV *sv_in)
-{
- CONVERTER *converter;
-
- dTHX;
-
- converter = get_sv_converter (sv_in, "reset_output_init_conf");
-
- if (converter)
- {
- HV *hv_in = (HV *)SvRV (sv_in);
-
- copy_converter_conf_sv (hv_in, converter, &converter->init_conf,
- "output_init_conf", 1);
- }
-}
-
/* output format specific */
/* map hash reference of Convert::Text options to TEXT_OPTIONS */
@@ -345,4 +259,3 @@ copy_sv_options_for_convert_text (SV *sv_in)
return text_options;
}
#undef FETCH
-
diff --git a/tp/Texinfo/XS/main/get_perl_info.c
b/tp/Texinfo/XS/main/get_perl_info.c
index 63618f2608..6ebe8cb374 100644
--- a/tp/Texinfo/XS/main/get_perl_info.c
+++ b/tp/Texinfo/XS/main/get_perl_info.c
@@ -736,6 +736,9 @@ force_sv_conf (CONVERTER *converter, const char *conf, SV
*value)
get_sv_option (converter->conf, conf, value, 1, converter);
}
+/* output format specific */
+
+/* return -2 if there are info and not found. */
static int
html_get_direction_index (const CONVERTER *converter, const char *direction)
{
@@ -747,6 +750,7 @@ html_get_direction_index (const CONVERTER *converter, const
char *direction)
if (!strcmp (direction, converter->direction_unit_direction_name[i]))
return i;
}
+ return -2;
}
return -1;
}
@@ -792,6 +796,10 @@ html_get_button_specification_list (const CONVERTER
*converter,
result->BIT_user_function_number = 0;
result->number = (size_t) buttons_nr;
+
+ if (result->number == 0)
+ return 0;
+
result->list = (BUTTON_SPECIFICATION *)
malloc (result->number * sizeof (BUTTON_SPECIFICATION));
memset (result->list, 0, result->number * sizeof (BUTTON_SPECIFICATION));
@@ -801,6 +809,11 @@ html_get_button_specification_list (const CONVERTER
*converter,
SV **button_sv = av_fetch (buttons_av, i, 0);
BUTTON_SPECIFICATION *button = &result->list[i];
+ if (!button_sv || !SvOK (*button_sv))
+ {
+ fprintf (stderr, "ERROR: missing button %zu\n", i);
+ }
+
button->sv = *button_sv;
SvREFCNT_inc (button->sv);
@@ -811,12 +824,13 @@ html_get_button_specification_list (const CONVERTER
*converter,
button->type = BST_function;
button->b.sv_reference = *button_sv;
}
- else if (SvTYPE (SvRV(*button_sv)) == SVt_PVAV)
+ else if (SvTYPE (SvRV(*button_sv)) == SVt_PVAV) /* ARRAY */
{
AV *button_spec_info_av = (AV *) SvRV(*button_sv);
SV **direction_sv = av_fetch (button_spec_info_av, 0, 0);
SV **button_spec_info_type
= av_fetch (button_spec_info_av, 1, 0);
+ const char *direction_name;
BUTTON_SPECIFICATION_INFO *button_spec
= (BUTTON_SPECIFICATION_INFO *)
@@ -826,9 +840,32 @@ html_get_button_specification_list (const CONVERTER
*converter,
button->type = BST_direction_info;
button->b.button_info = button_spec;
+ if (!direction_sv || !SvOK (*direction_sv))
+ {
+ fprintf (stderr,
+ "ERROR: missing direction in button %zu array\n",
+ i);
+ continue;
+ }
+ if (!button_spec_info_type || !SvOK (*button_spec_info_type))
+ {
+ fprintf (stderr,
+ "ERROR: missing specification in button %zu
array\n",
+ i);
+ continue;
+ }
+
+ direction_name = SvPVutf8_nolen (*direction_sv);
button_spec->direction
- = html_get_direction_index (converter,
- SvPVutf8_nolen (*direction_sv));
+ = html_get_direction_index (converter, direction_name);
+ /* to debug
+ if (button_spec->direction == -2)
+ {
+ fprintf (stderr,
+ "REMARK: unknown button %zu array direction: %s\n",
+ i, direction_name);
+ }
+ */
if (SvROK (*button_spec_info_type))
{
@@ -904,9 +941,15 @@ html_get_button_specification_list (const CONVERTER
*converter,
}
else
{
+ const char *direction_name = SvPVutf8_nolen (*button_sv);
button->type = BST_direction;
button->b.direction = html_get_direction_index (converter,
- SvPVutf8_nolen (*button_sv));
+ direction_name);
+ /* To debug
+ if (button->b.direction == -2)
+ fprintf (stderr, "REMARK: unknown button %zu string direction:
%s\n",
+ i, direction_name);
+ */
}
}
diff --git a/tp/t/init/special_unit_direction_customization.pm
b/tp/t/init/special_unit_direction_customization.pm
new file mode 100644
index 0000000000..7bf78a6da9
--- /dev/null
+++ b/tp/t/init/special_unit_direction_customization.pm
@@ -0,0 +1,4 @@
+
+use strict;
+
+texinfo_register_special_unit_info('direction', 'contents', 'Table');
diff --git a/tp/t/init_files_tests.t b/tp/t/init_files_tests.t
index cf6a88d62f..c0ee55011a 100644
--- a/tp/t/init_files_tests.t
+++ b/tp/t/init_files_tests.t
@@ -109,6 +109,15 @@ my $documentation_examples_text = '
';
+my $special_unit_direction_customization_text = '@contents
+
+@node Top
+@top top
+
+@node chapter
+@chapter chap
+';
+
my @file_tests = (
['customize_translations',
'
@@ -254,6 +263,12 @@ In quotation
@chapter Chap
', {'init_files' => ['access_document_name_in_handler.pm']},
],
+# a series of tests with special unit direction customization showing the
+# effect of adding customization information needed by the change.
+['special_unit_direction_customization',
+$special_unit_direction_customization_text,
+{'init_files' => ['special_unit_direction_customization.pm']},
+],
);
foreach my $test (@test_cases) {
diff --git
a/tp/t/results/init_files_tests/special_unit_direction_customization.pl
b/tp/t/results/init_files_tests/special_unit_direction_customization.pl
new file mode 100644
index 0000000000..e09c729ad6
--- /dev/null
+++ b/tp/t/results/init_files_tests/special_unit_direction_customization.pl
@@ -0,0 +1,290 @@
+use vars qw(%result_texis %result_texts %result_trees %result_errors
+ %result_indices %result_sectioning %result_nodes %result_menus
+ %result_floats %result_converted %result_converted_errors
+ %result_elements %result_directions_text %result_indices_sort_strings);
+
+use utf8;
+
+$result_trees{'special_unit_direction_customization'} = {
+ 'contents' => [
+ {
+ 'contents' => [
+ {
+ 'contents' => [
+ {
+ 'args' => [
+ {
+ 'text' => '
+',
+ 'type' => 'rawline_arg'
+ }
+ ],
+ 'cmdname' => 'contents',
+ 'extra' => {},
+ 'source_info' => {
+ 'line_nr' => 1
+ }
+ },
+ {
+ 'text' => '
+',
+ 'type' => 'empty_line'
+ }
+ ],
+ 'type' => 'preamble_before_content'
+ }
+ ],
+ 'type' => 'before_node_section'
+ },
+ {
+ 'args' => [
+ {
+ 'contents' => [
+ {
+ 'text' => 'Top'
+ }
+ ],
+ 'info' => {
+ 'spaces_after_argument' => {
+ 'text' => '
+'
+ }
+ },
+ 'type' => 'line_arg'
+ }
+ ],
+ 'cmdname' => 'node',
+ 'extra' => {
+ 'is_target' => 1,
+ 'normalized' => 'Top'
+ },
+ 'info' => {
+ 'spaces_before_argument' => {
+ 'text' => ' '
+ }
+ },
+ 'source_info' => {
+ 'line_nr' => 3
+ }
+ },
+ {
+ 'args' => [
+ {
+ 'contents' => [
+ {
+ 'text' => 'top'
+ }
+ ],
+ 'info' => {
+ 'spaces_after_argument' => {
+ 'text' => '
+'
+ }
+ },
+ 'type' => 'line_arg'
+ }
+ ],
+ 'cmdname' => 'top',
+ 'contents' => [
+ {
+ 'text' => '
+',
+ 'type' => 'empty_line'
+ }
+ ],
+ 'extra' => {},
+ 'info' => {
+ 'spaces_before_argument' => {
+ 'text' => ' '
+ }
+ },
+ 'source_info' => {
+ 'line_nr' => 4
+ }
+ },
+ {
+ 'args' => [
+ {
+ 'contents' => [
+ {
+ 'text' => 'chapter'
+ }
+ ],
+ 'info' => {
+ 'spaces_after_argument' => {
+ 'text' => '
+'
+ }
+ },
+ 'type' => 'line_arg'
+ }
+ ],
+ 'cmdname' => 'node',
+ 'extra' => {
+ 'is_target' => 1,
+ 'normalized' => 'chapter'
+ },
+ 'info' => {
+ 'spaces_before_argument' => {
+ 'text' => ' '
+ }
+ },
+ 'source_info' => {
+ 'line_nr' => 6
+ }
+ },
+ {
+ 'args' => [
+ {
+ 'contents' => [
+ {
+ 'text' => 'chap'
+ }
+ ],
+ 'info' => {
+ 'spaces_after_argument' => {
+ 'text' => '
+'
+ }
+ },
+ 'type' => 'line_arg'
+ }
+ ],
+ 'cmdname' => 'chapter',
+ 'extra' => {
+ 'section_number' => '1'
+ },
+ 'info' => {
+ 'spaces_before_argument' => {
+ 'text' => ' '
+ }
+ },
+ 'source_info' => {
+ 'line_nr' => 7
+ }
+ }
+ ],
+ 'type' => 'document_root'
+};
+
+$result_texis{'special_unit_direction_customization'} = '@contents
+
+@node Top
+@top top
+
+@node chapter
+@chapter chap
+';
+
+
+$result_texts{'special_unit_direction_customization'} = '
+top
+***
+
+1 chap
+******
+';
+
+$result_sectioning{'special_unit_direction_customization'} = {
+ 'extra' => {
+ 'section_childs' => [
+ {
+ 'cmdname' => 'top',
+ 'extra' => {
+ 'associated_node' => {
+ 'cmdname' => 'node',
+ 'extra' => {
+ 'normalized' => 'Top'
+ }
+ },
+ 'section_childs' => [
+ {
+ 'cmdname' => 'chapter',
+ 'extra' => {
+ 'associated_node' => {
+ 'cmdname' => 'node',
+ 'extra' => {
+ 'normalized' => 'chapter'
+ }
+ },
+ 'section_directions' => {
+ 'up' => {}
+ },
+ 'section_level' => 1,
+ 'section_number' => '1',
+ 'toplevel_directions' => {
+ 'prev' => {},
+ 'up' => {}
+ }
+ }
+ }
+ ],
+ 'section_level' => 0,
+ 'sectioning_root' => {},
+ 'toplevel_directions' => {}
+ }
+ }
+ ],
+ 'section_level' => -1
+ }
+};
+$result_sectioning{'special_unit_direction_customization'}{'extra'}{'section_childs'}[0]{'extra'}{'section_childs'}[0]{'extra'}{'section_directions'}{'up'}
=
$result_sectioning{'special_unit_direction_customization'}{'extra'}{'section_childs'}[0];
+$result_sectioning{'special_unit_direction_customization'}{'extra'}{'section_childs'}[0]{'extra'}{'section_childs'}[0]{'extra'}{'toplevel_directions'}{'prev'}
=
$result_sectioning{'special_unit_direction_customization'}{'extra'}{'section_childs'}[0];
+$result_sectioning{'special_unit_direction_customization'}{'extra'}{'section_childs'}[0]{'extra'}{'section_childs'}[0]{'extra'}{'toplevel_directions'}{'up'}
=
$result_sectioning{'special_unit_direction_customization'}{'extra'}{'section_childs'}[0];
+$result_sectioning{'special_unit_direction_customization'}{'extra'}{'section_childs'}[0]{'extra'}{'sectioning_root'}
= $result_sectioning{'special_unit_direction_customization'};
+
+$result_nodes{'special_unit_direction_customization'} = [
+ {
+ 'cmdname' => 'node',
+ 'extra' => {
+ 'associated_section' => {
+ 'cmdname' => 'top',
+ 'extra' => {}
+ },
+ 'node_directions' => {
+ 'next' => {
+ 'cmdname' => 'node',
+ 'extra' => {
+ 'associated_section' => {
+ 'cmdname' => 'chapter',
+ 'extra' => {
+ 'section_number' => '1'
+ }
+ },
+ 'node_directions' => {
+ 'prev' => {},
+ 'up' => {}
+ },
+ 'normalized' => 'chapter'
+ }
+ }
+ },
+ 'normalized' => 'Top'
+ }
+ },
+ {}
+];
+$result_nodes{'special_unit_direction_customization'}[0]{'extra'}{'node_directions'}{'next'}{'extra'}{'node_directions'}{'prev'}
= $result_nodes{'special_unit_direction_customization'}[0];
+$result_nodes{'special_unit_direction_customization'}[0]{'extra'}{'node_directions'}{'next'}{'extra'}{'node_directions'}{'up'}
= $result_nodes{'special_unit_direction_customization'}[0];
+$result_nodes{'special_unit_direction_customization'}[1] =
$result_nodes{'special_unit_direction_customization'}[0]{'extra'}{'node_directions'}{'next'};
+
+$result_menus{'special_unit_direction_customization'} = [
+ {
+ 'extra' => {
+ 'normalized' => 'Top'
+ }
+ },
+ {
+ 'extra' => {
+ 'normalized' => 'chapter'
+ }
+ }
+];
+
+$result_errors{'special_unit_direction_customization'} = [];
+
+
+$result_floats{'special_unit_direction_customization'} = {};
+
+
+1;
diff --git
a/tp/t/results/init_files_tests/special_unit_direction_customization/res_html/chapter.html
b/tp/t/results/init_files_tests/special_unit_direction_customization/res_html/chapter.html
new file mode 100644
index 0000000000..dbd842248d
--- /dev/null
+++
b/tp/t/results/init_files_tests/special_unit_direction_customization/res_html/chapter.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by texinfo, http://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>chapter (top)</title>
+
+<meta name="description" content="chapter (top)">
+<meta name="keywords" content="chapter (top)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="index.html" rel="start" title="Top">
+<link href="index.html" rel="up" title="Top">
+<link href="index.html" rel="prev" title="Top">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span:hover a.copiable-link {visibility: visible}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+<div class="chapter-level-extent" id="chapter">
+<div class="nav-panel">
+<p>
+Previous: <a href="index.html" accesskey="p" rel="prev">top</a>, Up: <a
href="index.html" accesskey="u" rel="up">top</a> </p>
+</div>
+<hr>
+<h2 class="chapter" id="chap"><span>1 chap<a class="copiable-link"
href="#chap"> ¶</a></span></h2>
+</div>
+
+
+
+</body>
+</html>
diff --git
a/tp/t/results/init_files_tests/special_unit_direction_customization/res_html/index.html
b/tp/t/results/init_files_tests/special_unit_direction_customization/res_html/index.html
new file mode 100644
index 0000000000..bb84e0b7a0
--- /dev/null
+++
b/tp/t/results/init_files_tests/special_unit_direction_customization/res_html/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<!-- Created by texinfo, http://www.gnu.org/software/texinfo/ -->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>Top (top)</title>
+
+<meta name="description" content="Top (top)">
+<meta name="keywords" content="Top (top)">
+<meta name="resource-type" content="document">
+<meta name="distribution" content="global">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+
+<link href="#Top" rel="start" title="Top">
+<link href="chapter.html" rel="next" title="chapter">
+<style type="text/css">
+<!--
+a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
+span:hover a.copiable-link {visibility: visible}
+ul.toc-numbered-mark {list-style: none}
+-->
+</style>
+
+
+</head>
+
+<body lang="en">
+
+<div class="top-level-extent" id="Top">
+<div class="nav-panel">
+<p>
+Next: <a href="chapter.html" accesskey="n" rel="next">chap</a> </p>
+</div>
+<hr>
+<h1 class="top" id="top"><span>top<a class="copiable-link" href="#top">
¶</a></span></h1>
+
+<div class="region-contents" id="SEC_Contents">
+<h2 class="contents-heading">Table of Contents</h2>
+
+<div class="contents">
+
+<ul class="toc-numbered-mark">
+ <li><a id="toc-chap" href="chapter.html">1 chap</a></li>
+</ul>
+</div>
+</div>
+</div>
+<hr>
+<div class="nav-panel">
+<p>
+Next: <a href="chapter.html" accesskey="n" rel="next">chap</a> </p>
+</div>
+
+
+
+</body>
+</html>