[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[no subject]
From: |
Patrice Dumas |
Date: |
Fri, 16 Feb 2024 17:52:04 -0500 (EST) |
branch: master
commit c37c96b9006e60d1c1fb827b64a0c31e15a8ae95
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Fri Feb 16 16:14:39 2024 +0100
* tp/Texinfo/XS/convert/ConvertXS.xs (html_current_filename): handle
non-ASCII filenames.
* tp/Texinfo/Convert/HTML.pm (command_text, _file_header_information),
tp/Texinfo/XS/convert/convert_html.c (html_command_text)
(file_header_information): make sure that there is a non empty context
string in the convert_tree_new_formatting_context call even if there
is no command name.
* tp/Texinfo/XS/main/utils.h: rename HMSF_converter_state as
HMSF_ignore_notice. Update users.
* tp/Texinfo/XS/convert/convert_html.c
(convert_tree_new_formatting_context): use xasprintf and char * for
context_string_str instead of TEXT.
* tp/Texinfo/Convert/HTML.pm: reindent
convert_tree_new_formatting_context calls to view more easily how many
arguments there are and their values.
---
ChangeLog | 22 ++++
tp/TODO | 3 +
tp/Texinfo/Convert/HTML.pm | 161 +++++++++++++++---------
tp/Texinfo/XS/convert/ConvertXS.xs | 4 +-
tp/Texinfo/XS/convert/build_html_perl_state.c | 2 +-
tp/Texinfo/XS/convert/convert_html.c | 55 +++++---
tp/Texinfo/XS/main/utils.h | 2 +-
tp/t/results/converters_tests/commands_in_sc.pl | 2 +-
8 files changed, 175 insertions(+), 76 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 6758192794..99def22440 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2024-02-16 Patrice Dumas <pertusus@free.fr>
+
+ * tp/Texinfo/XS/convert/ConvertXS.xs (html_current_filename): handle
+ non-ASCII filenames.
+
+ * tp/Texinfo/Convert/HTML.pm (command_text, _file_header_information),
+ tp/Texinfo/XS/convert/convert_html.c (html_command_text)
+ (file_header_information): make sure that there is a non empty context
+ string in the convert_tree_new_formatting_context call even if there
+ is no command name.
+
+ * tp/Texinfo/XS/main/utils.h: rename HMSF_converter_state as
+ HMSF_ignore_notice. Update users.
+
+ * tp/Texinfo/XS/convert/convert_html.c
+ (convert_tree_new_formatting_context): use xasprintf and char * for
+ context_string_str instead of TEXT.
+
+ * tp/Texinfo/Convert/HTML.pm: reindent
+ convert_tree_new_formatting_context calls to view more easily how many
+ arguments there are and their values.
+
2024-02-16 Patrice Dumas <pertusus@free.fr>
* tp/Texinfo/Convert/HTML.pm (%XS_conversion_overrides): add missed
diff --git a/tp/TODO b/tp/TODO
index 979b08e954..f2e73aeebb 100644
--- a/tp/TODO
+++ b/tp/TODO
@@ -14,6 +14,9 @@ Before next release
Bugs
====
+Check html_convert_css_string probable misuse of multiple_formatted
+argument.
+
HTML API
========
diff --git a/tp/Texinfo/Convert/HTML.pm b/tp/Texinfo/Convert/HTML.pm
index f10f2daf12..dd8df26e32 100644
--- a/tp/Texinfo/Convert/HTML.pm
+++ b/tp/Texinfo/Convert/HTML.pm
@@ -648,10 +648,11 @@ sub html_convert_css_string($$;$)
= $default_css_string_formatting_references{$formatting_reference};
}
- my $result = $self->convert_tree_new_formatting_context(
- {'type' => '_string',
- 'contents' => [$element]},
- 'css_string', $explanation);
+ my $result
+ = $self->convert_tree_new_formatting_context({'type' => '_string',
+ 'contents' => [$element]},
+ 'css_string',
+ $explanation);
foreach my $cmdname (keys (%default_css_string_commands_conversion)) {
$self->{'commands_conversion'}->{$cmdname} = $saved_commands->{$cmdname};
}
@@ -1450,9 +1451,24 @@ sub command_text($$;$)
$tree = {'type' => '_string',
'contents' => [$tree]};
}
- my $result = $self->convert_tree_new_formatting_context(
+ my $context_str = "command_text $type ";
+ if (defined($command->{'cmdname'})) {
+ # this never happens, as the external node label tree
+ # element is never directly an @-command. It can be an @-command
+ # argument, in a menu, or a reconstituted tree.
+ $context_str .= '@'.$command->{'cmdname'};
+ } elsif ($command->{'type'}) {
+ $context_str .= $command->{'type'};
+ }
+ # NOTE the multiple pass argument is not unicized, however the
+ # external node manual label should in general be converted only
+ # once, and even if it is converted more than once, it is unlikely
+ # to contain @-commands which should better be converted only once.
+ my $result
+ = $self->convert_tree_new_formatting_context($tree,
+ $context_str,
# FIXME check if $document_global_context argument would be needed?
- $tree, $command->{'cmdname'}, 'command_text-manual_content');
+ 'command_text-manual_content');
return $result;
}
@@ -1603,9 +1619,9 @@ sub from_element_direction($$$;$$$)
my $global_target_unit = $self->global_direction_unit($direction);
if ($global_target_unit) {
$target_unit = $global_target_unit;
- # output TOP_NODE_UP related infos even if element is not
- # defined which should mostly correspond to cases when there is no
- # output file, for example in the tests.
+ # output TOP_NODE_UP related info even if $source_unit is not defined,
+ # which should mostly correspond to cases when there is no
+ # output file, for example in tests.
} elsif ((not defined($source_unit)
or ($source_unit
and $self->unit_is_top_output_unit($source_unit)))
@@ -1804,7 +1820,8 @@ sub direction_string($$$;$)
# set above if not already existing.
my $result_string
= $self->convert_tree_new_formatting_context($converted_tree,
- $context_str, undef, $context_str);
+ $context_str,
+ undef, $context_str);
$self->{'directions_strings'}->{$string_type}->{$direction} = {}
if (not $self->{'directions_strings'}->{$string_type}->{$direction});
$self->{'directions_strings'}->{$string_type}->{$direction}->{$context}
@@ -2342,6 +2359,7 @@ sub get_info($$)
# This function should be used in formatting functions when some
# Texinfo tree need to be converted.
+# FIXME make $context_string a non-optional argument?
sub convert_tree_new_formatting_context($$;$$$$)
{
my $self = shift;
@@ -5469,6 +5487,8 @@ sub _convert_listoffloats_command($$$$)
my $caption_text;
my @caption_classes;
if ($caption_element) {
+ # FIXME 'listoffloats' multiple pass/formatting argument is not
+ # unicized.
$caption_text = $self->convert_tree_new_formatting_context(
$caption_element->{'args'}->[0], $cmdname, 'listoffloats');
push @caption_classes, "${caption_cmdname}-in-${cmdname}";
@@ -5538,8 +5558,9 @@ sub _convert_float_command($$$$$)
if (in_string($self)) {
my $prepended_text;
if ($prepended) {
- $prepended_text = $self->convert_tree_new_formatting_context(
- $prepended, 'float prepended');
+ $prepended_text
+ = $self->convert_tree_new_formatting_context($prepended,
+ 'float prepended');
} else {
$prepended_text = '';
}
@@ -5582,7 +5603,7 @@ sub _convert_float_command($$$$$)
$self->register_pending_formatted_inline_content($caption_command_name,
$prepended_text);
$caption_text = $self->convert_tree_new_formatting_context(
- $caption_element->{'args'}->[0], 'float caption');
+ $caption_element->{'args'}->[0], 'float caption');
my $cancelled_prepended
=
$self->cancel_pending_formatted_inline_content($caption_command_name);
# unset if prepended text is in caption, i.e. is not cancelled
@@ -5594,7 +5615,7 @@ sub _convert_float_command($$$$$)
}
} elsif (defined($caption_element)) {
$caption_text = $self->convert_tree_new_formatting_context(
- $caption_element->{'args'}->[0], 'float caption');
+ $caption_element->{'args'}->[0], 'float caption');
}
if (defined($caption_text) and $caption_text ne '') {
@@ -6333,9 +6354,10 @@ sub _convert_printindex_command($$$$)
and $main_entry_element->{'extra'}->{'element_node'}
->{'extra'}->{'normalized'} eq 'Top');
- # to avoid double error messages, call
convert_tree_new_formatting_context
- # below with a multiple_pass argument if an entry was already formatted
once,
- # for example if there are multiple printindex.
+ # to avoid double error messages, call
+ # convert_tree_new_formatting_context below with a multiple_pass
+ # argument if an entry was already formatted once, for example if
+ # there are multiple printindex.
my $formatted_index_entry_nr
= $self->get_shared_conversion_state('printindex',
'formatted_index_entries',
@@ -6416,7 +6438,8 @@ sub _convert_printindex_command($$$$)
# call with multiple_pass argument
$entry
= $self->convert_tree_new_formatting_context($entry_trees[$level],
- $convert_info, "index-formatted-$formatted_index_entry_nr")
+ $convert_info,
+ "index-formatted-$formatted_index_entry_nr");
} else {
$entry = $self->convert_tree($entry_trees[$level],
$convert_info);
@@ -7486,11 +7509,11 @@ sub _convert_menu_entry_type($$$)
$multiple_formatted
= 'preformatted-node-description-'.$formatted_nodedescription_nr;
}
- $description .= $self->convert_tree_new_formatting_context(
- $description_element,
- 'menu_arg node description preformatted',
- $multiple_formatted, undef,
- 'menu');
+ $description
+ .= $self->convert_tree_new_formatting_context($description_element,
+ 'menu_arg node description preformatted',
+ $multiple_formatted, undef,
+ 'menu');
} elsif ($menu_description) {
$description .= $self->convert_tree($menu_description,
'menu_arg description preformatted');
@@ -7545,9 +7568,10 @@ sub _convert_menu_entry_type($$$)
$multiple_formatted
= 'node-description-'.$formatted_nodedescription_nr;
}
- $description = $self->convert_tree_new_formatting_context(
- $description_element, 'menu_arg node description',
- $multiple_formatted, undef, 'menu');
+ $description
+ = $self->convert_tree_new_formatting_context($description_element,
+ 'menu_arg node description',
+ $multiple_formatted, undef, 'menu');
} elsif ($menu_description) {
$description = $self->convert_tree($menu_description,
'menu_arg description');
@@ -8027,12 +8051,15 @@ sub _default_format_titlepage($)
} else {
my $simpletitle_tree = $self->get_info('simpletitle_tree');
if ($simpletitle_tree) {
- my $simpletitle_command_name =
$self->get_info('simpletitle_command_name');
- my $title_text = $self->convert_tree_new_formatting_context(
- $simpletitle_tree, "$simpletitle_command_name simpletitle");
- $titlepage_text =
&{$self->formatting_function('format_heading_text')}($self,
- $simpletitle_command_name,
- [$simpletitle_command_name], $title_text, 0);
+ my $simpletitle_command_name
+ = $self->get_info('simpletitle_command_name');
+ my $title_text
+ = $self->convert_tree_new_formatting_context($simpletitle_tree,
+ "$simpletitle_command_name simpletitle");
+ $titlepage_text
+ = &{$self->formatting_function('format_heading_text')}($self,
+ $simpletitle_command_name,
+ [$simpletitle_command_name], $title_text, 0);
}
}
my $result = '';
@@ -8053,12 +8080,15 @@ sub _default_format_title_titlepage($)
my $result = '';
my $simpletitle_tree = $self->get_info('simpletitle_tree');
if ($simpletitle_tree) {
- my $simpletitle_command_name =
$self->get_info('simpletitle_command_name');
- my $title_text = $self->convert_tree_new_formatting_context(
- $simpletitle_tree, "$simpletitle_command_name simpletitle");
- $result .= &{$self->formatting_function('format_heading_text')}($self,
- $simpletitle_command_name,
- [$simpletitle_command_name], $title_text, 0);
+ my $simpletitle_command_name
+ = $self->get_info('simpletitle_command_name');
+ my $title_text
+ = $self->convert_tree_new_formatting_context($simpletitle_tree,
+ "$simpletitle_command_name simpletitle");
+ $result
+ .= &{$self->formatting_function('format_heading_text')}($self,
+ $simpletitle_command_name,
+ [$simpletitle_command_name], $title_text, 0);
}
$result .= $self->_contents_shortcontents_in_title();
return $result;
@@ -8367,7 +8397,7 @@ sub
_reset_unset_no_arg_commands_formatting_context($$$$;$)
$translation_result
= $self->convert_tree_new_formatting_context({'type' => '_string',
'contents' => [$translated_tree]},
- $context_str);
+ $context_str);
} elsif ($reset_context eq 'css_string') {
$translation_result = $self->html_convert_css_string($translated_tree);
}
@@ -10968,11 +10998,23 @@ sub _file_header_information($$;$)
}
# TRANSLATORS: sectioning element title for the page header
my $title_tree = $self->cdt('{element_text} ({title})',
- { 'title' => $self->get_info('title_tree'),
- 'element_text' => $element_tree });
- $title = $self->convert_tree_new_formatting_context(
- {'type' => '_string', 'contents' => [$title_tree]},
- $command->{'cmdname'}, 'element_title');
+ {'title' => $self->get_info('title_tree'),
+ 'element_text' => $element_tree });
+
+ my $context_str = 'file_header_title-element-';
+ if ($command->{'cmdname'}) {
+ $context_str .= '@'.$command->{'cmdname'};
+ } elsif ($command->{'type'}) {
+ $context_str .= $command->{'type'};
+ }
+ # NOTE 'element_title' is not unique although this could be called
+ # for each file. We are in string context, though, so it is
+ # probably not important.
+ $title
+ = $self->convert_tree_new_formatting_context({'type' => '_string',
+ 'contents' => [$title_tree]},
+ $context_str,
+ 'element_title');
}
}
$title = $self->get_info('title_string') if (!defined($title));
@@ -10993,8 +11035,9 @@ sub _file_header_information($$;$)
my $date = '';
if ($self->get_conf('DATE_IN_HEADER')) {
- my $today = $self->convert_tree_new_formatting_context(
- {'cmdname' => 'today'}, 'DATE_IN_HEADER');
+ my $today
+ = $self->convert_tree_new_formatting_context({'cmdname' => 'today'},
+ 'DATE_IN_HEADER');
$date =
$self->close_html_lone_element(
"<meta name=\"date\" content=\"$today\"")."\n";
@@ -12274,9 +12317,10 @@ sub _prepare_converted_output_info($)
my $html_title_string;
if ($fulltitle_tree) {
$self->{'title_tree'} = $fulltitle_tree;
- $html_title_string = $self->convert_tree_new_formatting_context(
- {'type' => '_string', 'contents' => [$self->{'title_tree'}]},
- 'title_string');
+ $html_title_string
+ = $self->convert_tree_new_formatting_context({'type' => '_string',
+ 'contents' => [$self->{'title_tree'}]},
+ 'title_string');
if ($html_title_string !~ /\S/) {
$html_title_string = undef;
}
@@ -12284,9 +12328,10 @@ sub _prepare_converted_output_info($)
if (!defined($html_title_string)) {
my $default_title = $self->cdt('Untitled Document');
$self->{'title_tree'} = $default_title;
- $self->{'title_string'} = $self->convert_tree_new_formatting_context(
- {'type' => '_string', 'contents' => [$self->{'title_tree'}]},
- 'title_string');
+ $self->{'title_string'}
+ = $self->convert_tree_new_formatting_context({'type' => '_string',
+ 'contents' => [$self->{'title_tree'}]},
+ 'title_string');
my $input_file_name;
if ($self->{'document'}) {
@@ -12329,11 +12374,10 @@ sub _prepare_converted_output_info($)
= $self->get_conf('documentdescription');
} elsif ($global_commands and $global_commands->{'documentdescription'}) {
$self->{'documentdescription_string'}
- = $self->convert_tree_new_formatting_context(
- {'type' => '_string',
- 'contents' =>
- $global_commands->{'documentdescription'}->{'contents'}},
- 'documentdescription');
+ = $self->convert_tree_new_formatting_context({'type' => '_string',
+ 'contents' =>
+ $global_commands->{'documentdescription'}->{'contents'}},
+ 'documentdescription');
chomp($self->{'documentdescription_string'});
}
}
@@ -13332,6 +13376,9 @@ sub _convert($$;$)
_convert_command_update_context($self, $command_name);
+ # TODO remove some time in the future of 2024, it is not used
+ # in texi2any and have never been documented. It may be used in 3rd
+ # party codes, though.
if ($element->{'cmdname'} eq 'node') {
$self->{'current_node'} = $element;
}
diff --git a/tp/Texinfo/XS/convert/ConvertXS.xs
b/tp/Texinfo/XS/convert/ConvertXS.xs
index 4a779ddc58..8d3f191b00 100644
--- a/tp/Texinfo/XS/convert/ConvertXS.xs
+++ b/tp/Texinfo/XS/convert/ConvertXS.xs
@@ -820,13 +820,13 @@ html_in_align (SV *converter_in)
OUTPUT:
RETVAL
-const char *
+SV *
html_current_filename (SV *converter_in)
PREINIT:
CONVERTER *self;
CODE:
self = get_sv_converter (converter_in, "html_current_filename");
- RETVAL = self->current_filename.filename;
+ RETVAL = newSVpv_utf8 (self->current_filename.filename, 0);
OUTPUT:
RETVAL
diff --git a/tp/Texinfo/XS/convert/build_html_perl_state.c
b/tp/Texinfo/XS/convert/build_html_perl_state.c
index 0fcb1b7bfa..a94b237ed5 100644
--- a/tp/Texinfo/XS/convert/build_html_perl_state.c
+++ b/tp/Texinfo/XS/convert/build_html_perl_state.c
@@ -374,7 +374,7 @@ build_html_formatting_state (CONVERTER *converter, unsigned
long flags)
#define FETCH(key) key##_sv = hv_fetch (hv, #key, strlen (#key), 0);
#define STORE(key, value) hv_store (hv, key, strlen (key), value, 0)
- if (flags & HMSF_converter_state)
+ if (flags & HMSF_ignore_notice)
{
STORE("ignore_notice",
newSViv (converter->ignore_notice));
diff --git a/tp/Texinfo/XS/convert/convert_html.c
b/tp/Texinfo/XS/convert/convert_html.c
index 27ada18700..428b9807f9 100644
--- a/tp/Texinfo/XS/convert/convert_html.c
+++ b/tp/Texinfo/XS/convert/convert_html.c
@@ -2787,45 +2787,43 @@ convert_tree_new_formatting_context (CONVERTER *self,
const ELEMENT *tree,
char *result;
char *multiple_pass_str = "";
char *explanation;
- TEXT context_string_str;
- text_init (&context_string_str);
- text_append (&context_string_str, "");
+ char *context_string_str = "";
if (context_string)
{
html_new_document_context (self, context_string,
document_global_context, block_cmd);
- text_printf (&context_string_str, "C(%s)", context_string);
+ xasprintf (&context_string_str, "C(%s)", context_string);
}
if (multiple_pass)
{
self->ignore_notice++;
push_string_stack_string (&self->multiple_pass, multiple_pass);
- self->modified_state |= HMSF_multiple_pass | HMSF_converter_state;
+ self->modified_state |= HMSF_multiple_pass | HMSF_ignore_notice;
multiple_pass_str = "|M";
}
if (self->conf->DEBUG.integer > 0)
- fprintf (stderr, "XS|new_fmt_ctx %s%s\n", context_string_str.text,
- multiple_pass_str);
+ fprintf (stderr, "XS|new_fmt_ctx %s%s\n", context_string_str,
+ multiple_pass_str);
- xasprintf (&explanation, "new_fmt_ctx %s", context_string_str.text);
+ xasprintf (&explanation, "new_fmt_ctx %s", context_string_str);
result = html_convert_tree (self, tree, explanation);
free (explanation);
- free (context_string_str.text);
if (context_string)
{
html_pop_document_context (self);
+ free (context_string_str);
}
if (multiple_pass)
{
self->ignore_notice--;
pop_string_stack (&self->multiple_pass);
- self->modified_state |= HMSF_multiple_pass | HMSF_converter_state;
+ self->modified_state |= HMSF_multiple_pass | HMSF_ignore_notice;
}
return result;
@@ -3975,13 +3973,13 @@ html_internal_command_text (CONVERTER *self, const
ELEMENT *command,
self->ignore_notice++;
push_element_reference_stack_element (&self->referred_command_stack,
command, command->hv);
- self->modified_state |= HMSF_converter_state;
+ self->modified_state |= HMSF_ignore_notice;
target_info->command_text[type]
= html_convert_tree (self, tree_root, explanation);
free (explanation);
pop_element_reference_stack (&self->referred_command_stack);
self->ignore_notice--;
- self->modified_state |= HMSF_converter_state;
+ self->modified_state |= HMSF_ignore_notice;
html_pop_document_context (self);
@@ -4018,6 +4016,7 @@ html_command_text (CONVERTER *self, const ELEMENT
*command,
"manual_content");
if (manual_content)
{
+ char *context_str;
ELEMENT *tree_root;
TREE_ADDED_ELEMENTS *command_tree
= html_external_command_tree (self, command, manual_content);
@@ -4030,10 +4029,27 @@ html_command_text (CONVERTER *self, const ELEMENT
*command,
else
tree_root = command_tree->tree;
+ if (command->cmd)
+ /* this never happens, as the external node label tree
+ element is never directly an @-command. It can be an @-command
+ argument, in a menu, or a reconstituted tree. */
+ xasprintf (&context_str, "command_text %s @%s",
+ html_command_text_type_name[type],
+ element_command_name(command));
+ else if (command->type)
+ xasprintf (&context_str, "command_text %s %s",
+ html_command_text_type_name[type],
+ element_type_names[command->type]);
+ else
+ xasprintf (&context_str, "command_text %s ",
+ html_command_text_type_name[type]);
+
result = convert_tree_new_formatting_context (self, tree_root,
- element_command_name(command),
+ context_str,
"command_text-manual_content", 0, 0);
+ free (context_str);
+
if (type == HTT_string)
{
remove_element_from_list (&self->tree_to_build, tree_root);
@@ -6872,6 +6888,7 @@ file_header_information (CONVERTER *self, const ELEMENT
*command,
if (command_string && strlen (command_string)
&& strcmp (command_string, self->title_string))
{
+ char *context_str;
NAMED_STRING_ELEMENT_LIST *substrings
= new_named_string_element_list ();
ELEMENT *title_tree_copy = copy_tree (self->title_tree);
@@ -6913,11 +6930,21 @@ file_header_information (CONVERTER *self, const ELEMENT
*command,
add_to_element_list (&self->tree_to_build, title_tree);
+ if (command->cmd)
+ xasprintf (&context_str, "file_header_title-element-@%s",
+ element_command_name (command));
+ else if (command->type)
+ xasprintf (&context_str, "file_header_title-element-%s",
+ element_type_names[command->type]);
+ else
+ context_str = strdup ("file_header_title-element-");
+
begin_info->title
= convert_string_tree_new_formatting_context (self,
- title_tree, element_command_name (command),
+ title_tree, context_str,
"element_title");
+ free (context_str);
remove_element_from_list (&self->tree_to_build, title_tree);
destroy_element_and_children (title_tree);
}
diff --git a/tp/Texinfo/XS/main/utils.h b/tp/Texinfo/XS/main/utils.h
index f722cfbfeb..adf6dbfe19 100644
--- a/tp/Texinfo/XS/main/utils.h
+++ b/tp/Texinfo/XS/main/utils.h
@@ -113,7 +113,7 @@ enum command_location {
/*
#define HMSF_ 0x0800
*/
-#define HMSF_converter_state 0x1000
+#define HMSF_ignore_notice 0x1000
#define HMSF_multiple_pass 0x2000
#define HMSF_translations 0x4000
/*
diff --git a/tp/t/results/converters_tests/commands_in_sc.pl
b/tp/t/results/converters_tests/commands_in_sc.pl
index 134b9002f2..f8c8f1a624 100644
--- a/tp/t/results/converters_tests/commands_in_sc.pl
+++ b/tp/t/results/converters_tests/commands_in_sc.pl
@@ -853,7 +853,7 @@ $result_converted{'html_text'}->{'commands_in_sc'} = '<div
class="top-level-exte
</div>
<h2 class="chapter" id="chap-1"><span>1 chap<a class="copiable-link"
href="#chap-1"> ¶</a></span></h2>
-<p><small class="sc">A Ñ Å TeX <img class="image"
src="myimage.jpg" alt="myimage"> <a class="ref" href="#chap">chap</a> SEE <a
data-manual="F" href="f.html#node">(F)NODE</a>
+<p><small class="sc">A Ñ Å TeX <img class="image"
src="myimage.jpg" alt="myimage"> <a class="ref" href="#chap">chap</a> SEE <a
data-manual="F" href="f.html#node">(f)node</a>
<a data-manual="argf" href="argf.html#ext">NAME</a> <code
class="verb">INVERB</code> <a class="anchor" id="inanchor"></a>ÿ <em
class="math">ma+th</em> <a class="footnote" id="DOCF1"
href="#FOOT1"><sup>1</sup></a> <a class="url" href="la">la</a> <a class="url"
href="a">B</a> LB
C <a class="email" href="mailto:a@c">E</a> <abbr class="abbr"
title="d">AB</abbr> (D)</small></p></div>
</div>