[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[no subject]
From: |
Patrice Dumas |
Date: |
Wed, 2 Oct 2024 06:20:11 -0400 (EDT) |
branch: master
commit bec3cc4fe3e1a880ba9666614855da77836f6dc9
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Wed Jul 31 11:01:38 2024 +0200
* tp/Texinfo/XS/convert/get_html_perl_info.c
(html_converter_initialize_sv): move up code which should have
defaults in C and customization from Perl. No change.
---
ChangeLog | 6 +
tp/Texinfo/XS/convert/get_html_perl_info.c | 1162 ++++++++++++++--------------
2 files changed, 587 insertions(+), 581 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d823bfd817..ee00899460 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2024-07-31 Patrice Dumas <pertusus@free.fr>
+
+ * tp/Texinfo/XS/convert/get_html_perl_info.c
+ (html_converter_initialize_sv): move up code which should have
+ defaults in C and customization from Perl. No change.
+
2024-07-31 Patrice Dumas <pertusus@free.fr>
* tp/Texinfo/XS/convert/convert_html.c (html_format_setup): preset
diff --git a/tp/Texinfo/XS/convert/get_html_perl_info.c
b/tp/Texinfo/XS/convert/get_html_perl_info.c
index a365f74568..9fc3809fc9 100644
--- a/tp/Texinfo/XS/convert/get_html_perl_info.c
+++ b/tp/Texinfo/XS/convert/get_html_perl_info.c
@@ -315,508 +315,312 @@ html_converter_initialize_sv (SV *converter_sv,
}
}
-#define FETCH(key) key##_sv = hv_fetch (converter_hv, #key, strlen (#key), 0);
- FETCH(htmlxref)
-
- if (htmlxref_sv)
+ if (customized_upper_case_commands && SvOK (customized_upper_case_commands))
{
I32 hv_number;
I32 i;
- HV *htmlxref_hv = (HV *) SvRV (*htmlxref_sv);
+ int cmd_index = 0;
- hv_number = hv_iterinit (htmlxref_hv);
+ HV *upper_case_commands_hv = (HV *)SvRV (customized_upper_case_commands);
- converter->htmlxref.number = hv_number;
+ hv_number = hv_iterinit (upper_case_commands_hv);
- if (hv_number > 0)
- {
- converter->htmlxref.list = new_htmlxref_manual_list (hv_number);
+ converter->html_customized_upper_case_commands
+ = (COMMAND_INTEGER_INFORMATION *) malloc ((hv_number + 1)
+ * sizeof (COMMAND_INTEGER_INFORMATION));
+ memset (converter->html_customized_upper_case_commands, 0,
+ (hv_number + 1) * sizeof (COMMAND_INTEGER_INFORMATION));
- for (i = 0; i < hv_number; i++)
+ for (i = 0; i < hv_number; i++)
+ {
+ I32 retlen;
+ char *cmdname;
+ SV *upper_case_sv = hv_iternextsv (upper_case_commands_hv,
+ &cmdname, &retlen);
+ if (SvOK (upper_case_sv))
{
- int j;
- HTMLXREF_MANUAL *htmlxref_manual = &converter->htmlxref.list[i];
- HE *next = hv_iternext (htmlxref_hv);
- SV *selector_sv = hv_iterkeysv (next);
- const char *selector = (char *) SvPVutf8_nolen (selector_sv);
- SV *split_type_sv = HeVAL(next);
- HV *split_type_hv = (HV *) SvRV (split_type_sv);
-
- htmlxref_manual->manual = non_perl_strdup (selector);
-
- for (j = 0; j < htmlxref_split_type_chapter +1; j++)
+ int upper_case_value = SvIV (upper_case_sv);
+ enum command_id cmd = lookup_builtin_command (cmdname);
+ if (!cmd)
+ fprintf (stderr, "ERROR: %s: no upper-case command\n",
cmdname);
+ else
{
- const char *split_type_name = htmlxref_split_type_names[j];
- SV **urlprefix_sv = hv_fetch (split_type_hv, split_type_name,
- strlen (split_type_name), 0);
- if (urlprefix_sv && SvOK (*urlprefix_sv))
- {
- const char *urlprefix = SvPVutf8_nolen (*urlprefix_sv);
- htmlxref_manual->urlprefix[j]
- = non_perl_strdup (urlprefix);
- }
+ COMMAND_INTEGER_INFORMATION *customized_upper
+ =
&converter->html_customized_upper_case_commands[cmd_index];
+ customized_upper->cmd = cmd;
+ customized_upper->integer = upper_case_value;
+ cmd_index++;
}
}
}
}
- FETCH(formatting_function);
-
- /* no need to check if it exists */
- formatting_function_hv = (HV *)SvRV (*formatting_function_sv);
+#define FETCH(key) key##_sv = hv_fetch (converter_hv, #key, strlen (#key), 0);
+ FETCH(code_types)
- for (i = 0; i < FR_format_translate_message+1; i++)
+ if (code_types_sv)
{
- const char *ref_name = html_formatting_reference_names[i];
- FORMATTING_REFERENCE *formatting_reference
- = &converter->formatting_references[i];
- SV **default_formatting_reference_sv
- = hv_fetch (default_formatting_references_hv, ref_name,
- strlen (ref_name), 0);
- SV **formatting_reference_sv
- = hv_fetch (formatting_function_hv, ref_name, strlen (ref_name), 0);
- /* no check for existence, all should exist */
- if (SvOK (*default_formatting_reference_sv))
+ I32 hv_number;
+ I32 i;
+
+ HV *code_types_hv = (HV *)SvRV (*code_types_sv);
+
+ hv_number = hv_iterinit (code_types_hv);
+
+ for (i = 0; i < hv_number; i++)
{
- formatting_reference->sv_default = *default_formatting_reference_sv;
- formatting_reference->status = FRS_status_default_set;
- }
- if (formatting_reference_sv)
+ int j;
+ enum element_type type = ET_NONE;
+ I32 retlen;
+ char *type_name;
+ SV *code_sv = hv_iternextsv (code_types_hv,
+ &type_name, &retlen);
+ if (SvOK (code_sv))
+ {
+ int code_value = SvIV (code_sv);
+ /* this is not very efficient, but should be done only once
+ in the default case. If this is needed more, a qsort/bfind
+ could be used, but the overhead could probably only be
+ justified if finding the type index happens more often */
+ for (j = 1; j < TXI_TREE_TYPES_NUMBER; j++)
+ {
+ if (!strcmp (type_data[j].name, type_name))
+ {
+ type = j;
+ break;
+ }
+ }
+ if (type == ET_NONE)
+ {
+ fprintf (stderr, "ERROR: %s: code type not found\n",
+ type_name);
+ }
+ else
+ converter->code_types[type] = code_value;
+ }
+ }
+ }
+
+ FETCH(pre_class_types)
+
+ if (pre_class_types_sv)
+ {
+ I32 hv_number;
+ I32 i;
+
+ HV *pre_class_types_hv = (HV *)SvRV (*pre_class_types_sv);
+
+ hv_number = hv_iterinit (pre_class_types_hv);
+
+ for (i = 0; i < hv_number; i++)
{
- if SvOK (*formatting_reference_sv)
+ I32 retlen;
+ char *type_name;
+ SV *pre_class_sv = hv_iternextsv (pre_class_types_hv,
+ &type_name, &retlen);
+ if (SvOK (pre_class_sv))
{
- formatting_reference->sv_reference = *formatting_reference_sv;
- if (formatting_reference->status != FRS_status_default_set
- || SvRV (*formatting_reference_sv)
- != SvRV (*default_formatting_reference_sv))
- formatting_reference->status = FRS_status_customization_set;
+ const char *pre_class = SvPV_nolen (pre_class_sv);
+ enum element_type type = find_element_type (type_name);
+
+ if (type == ET_NONE)
+ {
+ fprintf (stderr, "ERROR: %s: pre class type not found\n",
+ type_name);
+ }
+ else
+ converter->pre_class_types[type] = non_perl_strdup (pre_class);
}
}
- else
- fprintf (stderr, "BUG: formatting reference %s not found\n",
- ref_name);
}
- /* copy the normal formatting references and replace the css strings
- specific references */
- memcpy (&converter->css_string_formatting_references,
- &converter->formatting_references,
- (FR_format_translate_message+1) * sizeof (FORMATTING_REFERENCE));
+ FETCH(accent_entities)
- for (i = 0; i < FR_format_translate_message+1; i++)
+ if (accent_entities_sv)
{
- const char *ref_name = html_formatting_reference_names[i];
- SV **default_formatting_reference_sv
- = hv_fetch (default_css_string_formatting_references_hv, ref_name,
- strlen (ref_name), 0);
+ I32 hv_number;
+ I32 i;
- /* no customization, current is the default */
- if (default_formatting_reference_sv
- && SvOK (*default_formatting_reference_sv))
+ HV *accent_entities_hv
+ = (HV *)SvRV (*accent_entities_sv);
+
+ hv_number = hv_iterinit (accent_entities_hv);
+
+ for (i = 0; i < hv_number; i++)
{
- FORMATTING_REFERENCE *formatting_reference
- = &converter->css_string_formatting_references[i];
- formatting_reference->sv_default = *default_formatting_reference_sv;
- formatting_reference->sv_reference =
*default_formatting_reference_sv;
- formatting_reference->status = FRS_status_default_set;
+ char *cmdname;
+ I32 retlen;
+ SV *spec_sv = hv_iternextsv (accent_entities_hv,
+ &cmdname, &retlen);
+ if (SvOK (spec_sv))
+ {
+ enum command_id cmd = lookup_builtin_command (cmdname);
+ if (!cmd)
+ fprintf (stderr, "ERROR: %s: no accent command\n", cmdname);
+ else
+ {
+ ACCENT_ENTITY_INFO *accent_info
+ = &converter->accent_entities[cmd];
+ AV *spec_av = (AV *)SvRV (spec_sv);
+ SV **entity_sv = av_fetch (spec_av, 0, 0);
+ SV **characters_sv = av_fetch (spec_av, 1, 0);
+
+ if (entity_sv)
+ {
+ char *entity = (char *) SvPVutf8_nolen (*entity_sv);
+ accent_info->entity = non_perl_strdup (entity);
+ }
+
+ if (characters_sv && SvOK (*characters_sv))
+ {
+ char *characters
+ = (char *) SvPVutf8_nolen (*characters_sv);
+ if (strlen (characters))
+ accent_info->characters = non_perl_strdup (characters);
+ }
+ }
+ }
}
}
- FETCH(commands_open)
- commands_open_hv = (HV *)SvRV (*commands_open_sv);
- default_commands_open_hv = (HV *)SvRV (default_commands_open);
- FETCH(commands_conversion)
- commands_conversion_hv = (HV *)SvRV (*commands_conversion_sv);
- default_commands_conversion_hv = (HV *)SvRV (default_commands_conversion);
+ FETCH(style_commands_formatting)
- for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
+ if (style_commands_formatting_sv)
{
- const char *ref_name;
- if (i == 0)
- ref_name = "";
- else
- ref_name = builtin_command_data[i].cmdname;
- FORMATTING_REFERENCE *open_formatting_reference
- = &converter->commands_open[i];
- FORMATTING_REFERENCE *conversion_formatting_reference
- = &converter->commands_conversion[i];
-
- register_formatting_reference_with_default ("command_open",
- open_formatting_reference, ref_name, default_commands_open_hv,
- commands_open_hv);
- register_formatting_reference_with_default ("command_conversion",
- conversion_formatting_reference, ref_name,
- default_commands_conversion_hv,
- commands_conversion_hv);
+ I32 hv_number;
+ I32 i;
- /* NOTE use the loop to collect the number of accent commands too */
- if (builtin_command_data[i].flags & CF_accent)
- nr_accent_cmd++;
- }
+ HV *style_commands_formatting_hv
+ = (HV *)SvRV (*style_commands_formatting_sv);
- initialize_cmd_list (&converter->accent_cmd, nr_accent_cmd, 0);
+ hv_number = hv_iterinit (style_commands_formatting_hv);
+ initialize_cmd_list (&converter->style_formatted_cmd, hv_number, 0);
- default_css_string_commands_conversion_hv
- = (HV *)SvRV (default_css_string_commands_conversion);
- /* copy the normal formatting references and replace the css strings
- specific references */
- memcpy (&converter->css_string_commands_conversion,
- &converter->commands_conversion,
- (BUILTIN_CMD_NUMBER) * sizeof (FORMATTING_REFERENCE));
-
- for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
- {
- const char *ref_name;
- if (i == 0)
- ref_name = "";
- else
- ref_name = builtin_command_data[i].cmdname;
-
- FORMATTING_REFERENCE *conversion_formatting_reference
- = &converter->css_string_commands_conversion[i];
-
- register_formatting_reference_default ("css_command_conversion",
- conversion_formatting_reference, ref_name,
- default_css_string_commands_conversion_hv);
-
- /* NOTE we use the loop to collect the accent commands too */
- if (builtin_command_data[i].flags & CF_accent)
- {
- converter->accent_cmd.list[converter->accent_cmd.number] = i;
- converter->accent_cmd.number++;
- }
- }
-
-
- FETCH(types_open)
- types_open_hv = (HV *)SvRV (*types_open_sv);
- default_types_open_hv = (HV *)SvRV (default_types_open);
-
- FETCH(types_conversion)
- types_conversion_hv = (HV *)SvRV (*types_conversion_sv);
- default_types_conversion_hv = (HV *)SvRV (default_types_conversion);
-
- for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
- {
- const char *ref_name;
- if (i == 0)
- ref_name = "";
- else
- ref_name = type_data[i].name;
- FORMATTING_REFERENCE *open_formatting_reference
- = &converter->types_open[i];
- FORMATTING_REFERENCE *conversion_formatting_reference
- = &converter->types_conversion[i];
-
- register_formatting_reference_with_default ("type_open",
- open_formatting_reference, ref_name, default_types_open_hv,
- types_open_hv);
- register_formatting_reference_with_default ("type_conversion",
- conversion_formatting_reference, ref_name,
- default_types_conversion_hv,
- types_conversion_hv);
- }
-
- default_css_string_types_conversion_hv
- = (HV *)SvRV (default_css_string_types_conversion);
- /* copy the normal formatting references and replace the css strings
- specific references */
- memcpy (&converter->css_string_types_conversion,
- &converter->types_conversion,
- (TXI_TREE_TYPES_NUMBER) * sizeof (FORMATTING_REFERENCE));
-
- for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
- {
- char *ref_name;
- if (i == 0)
- ref_name = "";
- else
- ref_name = type_data[i].name;
- FORMATTING_REFERENCE *conversion_formatting_reference
- = &converter->css_string_types_conversion[i];
-
- register_formatting_reference_default ("css_type_conversion",
- conversion_formatting_reference, ref_name,
- default_css_string_types_conversion_hv);
- }
-
-
- FETCH(output_units_conversion)
- output_units_conversion_hv = (HV *)SvRV (*output_units_conversion_sv);
- default_output_units_conversion_hv
- = (HV *)SvRV (default_output_units_conversion);
-
- for (i = 0; i < OU_special_unit+1; i++)
- {
- const char *ref_name = output_unit_type_names[i];
- FORMATTING_REFERENCE *conversion_formatting_reference
- = &converter->output_units_conversion[i];
+ for (i = 0; i < hv_number; i++)
+ {
+ char *cmdname;
+ I32 retlen;
+ SV *context_sv = hv_iternextsv (style_commands_formatting_hv,
+ &cmdname, &retlen);
+ if (SvOK (context_sv))
+ {
+ HV *context_hv = (HV *)SvRV (context_sv);
+ enum command_id cmd = lookup_builtin_command (cmdname);
+ if (!cmd)
+ fprintf (stderr, "ERROR: %s: no style command\n", cmdname);
+ else
+ {
+ I32 context_nr;
+ I32 j;
- register_formatting_reference_with_default ("output_unit_conversion",
- conversion_formatting_reference, ref_name,
- default_output_units_conversion_hv,
- output_units_conversion_hv);
- }
+ converter->style_formatted_cmd.list[
+ converter->style_formatted_cmd.number] = cmd;
+ converter->style_formatted_cmd.number++;
- if (special_unit_varieties->number > 0)
- {
- HV *special_unit_body_hv = 0;
- HV *default_special_unit_body_hv;
+ context_nr = hv_iterinit (context_hv);
+ for (j = 0; j < context_nr; j++)
+ {
+ char *context_name;
+ I32 retlen;
+ int k;
+ int context_idx = -1;
+ SV *format_spec_sv = hv_iternextsv (context_hv,
+ &context_name, &retlen);
+ for (k = 0; k < STYLE_COMMAND_CONTEXT_NR; k++)
+ {
+ if (!strcmp (context_name,
+ html_conversion_context_type_names[k]))
+ {
+ context_idx = k;
+ break;
+ }
+ }
+ if (context_idx < 0)
+ {
+ fprintf (stderr,
+ "ERROR: %s: %s: unknown style context\n",
+ cmdname, context_name);
+ break;
+ }
+ if (SvOK (format_spec_sv))
+ {
+ I32 spec_number;
+ I32 s;
+ HTML_STYLE_COMMAND_CONVERSION *format_spec;
- converter->special_unit_body
- = new_special_unit_formatting_references
- (special_unit_varieties->number);
+ HV *format_spec_hv = (HV *)SvRV (format_spec_sv);
- FETCH(special_unit_body)
- if (special_unit_body_sv)
- special_unit_body_hv = (HV *)SvRV (*special_unit_body_sv);
- default_special_unit_body_hv = (HV *)SvRV (default_special_unit_body);
+ format_spec
+ = &converter
+ ->html_style_command_conversion[cmd][context_idx];
- for (i = 0; i < special_unit_varieties->number; i++)
- {
- char *variety_name = special_unit_varieties->list[i];
- FORMATTING_REFERENCE *special_unit_body_formatting_reference
- = &converter->special_unit_body[i];
- register_formatting_reference_with_default ("special_unit_body",
- special_unit_body_formatting_reference, variety_name,
- default_special_unit_body_hv,
- special_unit_body_hv);
+ spec_number = hv_iterinit (format_spec_hv);
+ for (s = 0; s < spec_number; s++)
+ {
+ char *key;
+ I32 retlen;
+ SV *spec_sv = hv_iternextsv (format_spec_hv,
+ &key, &retlen);
+ if (!strcmp (key, "element"))
+ {
+ const char *tmp_spec
+ = (char *) SvPVutf8_nolen (spec_sv);
+ format_spec->element
+ = non_perl_strdup (tmp_spec);
+ }
+ else if (!strcmp (key, "quote"))
+ format_spec->quote = SvIV (spec_sv);
+ }
+ /*
+ fprintf (stderr, "HHH %d %d %s %d %d %s %d %s\n", i,
cmd, cmdname, j, context_idx, context_name, format_spec->quote,
format_spec->element);
+ */
+ }
+ }
+ }
+ }
}
}
- FETCH(file_id_setting)
-
- if (file_id_setting_sv)
- {
- HV *file_id_setting_hv = (HV *)SvRV(*file_id_setting_sv);
- #define html_file_id_setting_name(name) \
- {\
- SV **name##_sv = hv_fetch (file_id_setting_hv, #name, \
- strlen (#name), 0);\
- if (name##_sv)\
- {\
- converter->file_id_setting_refs[FIS_##name]\
- = (const void *) (* name##_sv);\
- converter->file_id_setting_ref_number++; \
- }\
- }
- HTML_FILE_ID_SETTING_NAMES_LIST
- #undef html_file_id_setting_name
- }
-
- FETCH(code_types)
-
- if (code_types_sv)
+ FETCH(customized_no_arg_commands_formatting)
+ if (customized_no_arg_commands_formatting_sv)
{
I32 hv_number;
I32 i;
+ HV *customized_no_arg_commands_formatting_hv
+ = (HV *) SvRV (*customized_no_arg_commands_formatting_sv);
- HV *code_types_hv = (HV *)SvRV (*code_types_sv);
-
- hv_number = hv_iterinit (code_types_hv);
+ hv_number = hv_iterinit (customized_no_arg_commands_formatting_hv);
for (i = 0; i < hv_number; i++)
{
- int j;
- enum element_type type = ET_NONE;
+ char *cmdname;
I32 retlen;
- char *type_name;
- SV *code_sv = hv_iternextsv (code_types_hv,
- &type_name, &retlen);
- if (SvOK (code_sv))
+ SV *context_sv
+ = hv_iternextsv (customized_no_arg_commands_formatting_hv,
+ &cmdname, &retlen);
+ if (SvOK (context_sv))
{
- int code_value = SvIV (code_sv);
- /* this is not very efficient, but should be done only once
- in the default case. If this is needed more, a qsort/bfind
- could be used, but the overhead could probably only be
- justified if finding the type index happens more often */
- for (j = 1; j < TXI_TREE_TYPES_NUMBER; j++)
+ HV *context_hv = (HV *)SvRV (context_sv);
+ enum command_id cmd = lookup_builtin_command (cmdname);
+
+ if (!cmd)
+ fprintf (stderr, "ERROR: %s: no no arg command\n", cmdname);
+ else
{
- if (!strcmp (type_data[j].name, type_name))
- {
- type = j;
- break;
- }
- }
- if (type == ET_NONE)
- {
- fprintf (stderr, "ERROR: %s: code type not found\n",
- type_name);
- }
- else
- converter->code_types[type] = code_value;
- }
- }
- }
-
- FETCH(pre_class_types)
-
- if (pre_class_types_sv)
- {
- I32 hv_number;
- I32 i;
-
- HV *pre_class_types_hv = (HV *)SvRV (*pre_class_types_sv);
-
- hv_number = hv_iterinit (pre_class_types_hv);
-
- for (i = 0; i < hv_number; i++)
- {
- I32 retlen;
- char *type_name;
- SV *pre_class_sv = hv_iternextsv (pre_class_types_hv,
- &type_name, &retlen);
- if (SvOK (pre_class_sv))
- {
- const char *pre_class = SvPV_nolen (pre_class_sv);
- enum element_type type = find_element_type (type_name);
-
- if (type == ET_NONE)
- {
- fprintf (stderr, "ERROR: %s: pre class type not found\n",
- type_name);
- }
- else
- converter->pre_class_types[type] = non_perl_strdup (pre_class);
- }
- }
- }
-
- if (customized_upper_case_commands && SvOK (customized_upper_case_commands))
- {
- I32 hv_number;
- I32 i;
- int cmd_index = 0;
-
- HV *upper_case_commands_hv = (HV *)SvRV (customized_upper_case_commands);
-
- hv_number = hv_iterinit (upper_case_commands_hv);
-
- converter->html_customized_upper_case_commands
- = (COMMAND_INTEGER_INFORMATION *) malloc ((hv_number + 1)
- * sizeof (COMMAND_INTEGER_INFORMATION));
- memset (converter->html_customized_upper_case_commands, 0,
- (hv_number + 1) * sizeof (COMMAND_INTEGER_INFORMATION));
-
- for (i = 0; i < hv_number; i++)
- {
- I32 retlen;
- char *cmdname;
- SV *upper_case_sv = hv_iternextsv (upper_case_commands_hv,
- &cmdname, &retlen);
- if (SvOK (upper_case_sv))
- {
- int upper_case_value = SvIV (upper_case_sv);
- enum command_id cmd = lookup_builtin_command (cmdname);
- if (!cmd)
- fprintf (stderr, "ERROR: %s: no upper-case command\n",
cmdname);
- else
- {
- COMMAND_INTEGER_INFORMATION *customized_upper
- =
&converter->html_customized_upper_case_commands[cmd_index];
- customized_upper->cmd = cmd;
- customized_upper->integer = upper_case_value;
- cmd_index++;
- }
- }
- }
- }
-
- FETCH(accent_entities)
-
- if (accent_entities_sv)
- {
- I32 hv_number;
- I32 i;
-
- HV *accent_entities_hv
- = (HV *)SvRV (*accent_entities_sv);
-
- hv_number = hv_iterinit (accent_entities_hv);
-
- for (i = 0; i < hv_number; i++)
- {
- char *cmdname;
- I32 retlen;
- SV *spec_sv = hv_iternextsv (accent_entities_hv,
- &cmdname, &retlen);
- if (SvOK (spec_sv))
- {
- enum command_id cmd = lookup_builtin_command (cmdname);
- if (!cmd)
- fprintf (stderr, "ERROR: %s: no accent command\n", cmdname);
- else
- {
- ACCENT_ENTITY_INFO *accent_info
- = &converter->accent_entities[cmd];
- AV *spec_av = (AV *)SvRV (spec_sv);
- SV **entity_sv = av_fetch (spec_av, 0, 0);
- SV **characters_sv = av_fetch (spec_av, 1, 0);
-
- if (entity_sv)
- {
- char *entity = (char *) SvPVutf8_nolen (*entity_sv);
- accent_info->entity = non_perl_strdup (entity);
- }
-
- if (characters_sv && SvOK (*characters_sv))
- {
- char *characters
- = (char *) SvPVutf8_nolen (*characters_sv);
- if (strlen (characters))
- accent_info->characters = non_perl_strdup (characters);
- }
- }
- }
- }
- }
-
-
- FETCH(style_commands_formatting)
-
- if (style_commands_formatting_sv)
- {
- I32 hv_number;
- I32 i;
-
- HV *style_commands_formatting_hv
- = (HV *)SvRV (*style_commands_formatting_sv);
-
- hv_number = hv_iterinit (style_commands_formatting_hv);
- initialize_cmd_list (&converter->style_formatted_cmd, hv_number, 0);
-
- for (i = 0; i < hv_number; i++)
- {
- char *cmdname;
- I32 retlen;
- SV *context_sv = hv_iternextsv (style_commands_formatting_hv,
- &cmdname, &retlen);
- if (SvOK (context_sv))
- {
- HV *context_hv = (HV *)SvRV (context_sv);
- enum command_id cmd = lookup_builtin_command (cmdname);
- if (!cmd)
- fprintf (stderr, "ERROR: %s: no style command\n", cmdname);
- else
- {
- I32 context_nr;
- I32 j;
-
- converter->style_formatted_cmd.list[
- converter->style_formatted_cmd.number] = cmd;
- converter->style_formatted_cmd.number++;
-
- context_nr = hv_iterinit (context_hv);
- for (j = 0; j < context_nr; j++)
+ I32 context_nr;
+ I32 j;
+
+ context_nr = hv_iterinit (context_hv);
+ for (j = 0; j < context_nr; j++)
{
char *context_name;
I32 retlen;
- int k;
+ enum conversion_context k;
int context_idx = -1;
SV *format_spec_sv = hv_iternextsv (context_hv,
&context_name, &retlen);
- for (k = 0; k < STYLE_COMMAND_CONTEXT_NR; k++)
+ for (k = 0; k < NO_ARG_COMMAND_CONTEXT_NR; k++)
{
if (!strcmp (context_name,
html_conversion_context_type_names[k]))
@@ -828,7 +632,7 @@ html_converter_initialize_sv (SV *converter_sv,
if (context_idx < 0)
{
fprintf (stderr,
- "ERROR: %s: %s: unknown style context\n",
+ "ERROR: %s: %s: unknown no arg context\n",
cmdname, context_name);
break;
}
@@ -836,13 +640,16 @@ html_converter_initialize_sv (SV *converter_sv,
{
I32 spec_number;
I32 s;
- HTML_STYLE_COMMAND_CONVERSION *format_spec;
+ HTML_NO_ARG_COMMAND_CONVERSION *format_spec;
HV *format_spec_hv = (HV *)SvRV (format_spec_sv);
- format_spec
- = &converter
- ->html_style_command_conversion[cmd][context_idx];
+ format_spec = (HTML_NO_ARG_COMMAND_CONVERSION *)
+ malloc (sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
+ memset (format_spec, 0,
+ sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
+ converter->customized_no_arg_commands_formatting
+ [cmd][context_idx] = format_spec;
spec_number = hv_iterinit (format_spec_hv);
for (s = 0; s < spec_number; s++)
@@ -858,12 +665,30 @@ html_converter_initialize_sv (SV *converter_sv,
format_spec->element
= non_perl_strdup (tmp_spec);
}
- else if (!strcmp (key, "quote"))
- format_spec->quote = SvIV (spec_sv);
+ else if (!strcmp (key, "unset"))
+ format_spec->unset = SvIV (spec_sv);
+ else if (!strcmp (key, "text"))
+ {
+ const char *tmp_spec
+ = (char *) SvPVutf8_nolen (spec_sv);
+ format_spec->text
+ = non_perl_strdup (tmp_spec);
+ }
+ else if (!strcmp (key, "translated_converted"))
+ {
+ const char *tmp_spec
+ = (char *) SvPVutf8_nolen (spec_sv);
+ format_spec->translated_converted
+ = non_perl_strdup (tmp_spec);
+ }
+ else if (!strcmp (key, "translated_to_convert"))
+ {
+ const char *tmp_spec
+ = (char *) SvPVutf8_nolen (spec_sv);
+ format_spec->translated_to_convert
+ = non_perl_strdup (tmp_spec);
+ }
}
- /*
- fprintf (stderr, "HHH %d %d %s %d %d %s %d %s\n", i,
cmd, cmdname, j, context_idx, context_name, format_spec->quote,
format_spec->element);
- */
}
}
}
@@ -871,138 +696,24 @@ html_converter_initialize_sv (SV *converter_sv,
}
}
- FETCH(customized_no_arg_commands_formatting)
- if (customized_no_arg_commands_formatting_sv)
- {
- I32 hv_number;
- I32 i;
- HV *customized_no_arg_commands_formatting_hv
- = (HV *) SvRV (*customized_no_arg_commands_formatting_sv);
+ /* The corresponding direction without FirstInFile are used instead
+ of FirstInFile*, so the directions_strings are not set */
+ nr_string_directions = NON_SPECIAL_DIRECTIONS_NR - FIRSTINFILE_NR
+ + special_unit_varieties->number;
- hv_number = hv_iterinit (customized_no_arg_commands_formatting_hv);
+ if (customized_direction_strings && SvOK (customized_direction_strings))
+ {
+ HV *customized_direction_strings_hv
+ = (HV *) SvRV (customized_direction_strings);
- for (i = 0; i < hv_number; i++)
+ for (DS_type = 0; DS_type < TDS_TYPE_MAX_NR; DS_type++)
{
- char *cmdname;
- I32 retlen;
- SV *context_sv
- = hv_iternextsv (customized_no_arg_commands_formatting_hv,
- &cmdname, &retlen);
- if (SvOK (context_sv))
- {
- HV *context_hv = (HV *)SvRV (context_sv);
- enum command_id cmd = lookup_builtin_command (cmdname);
-
- if (!cmd)
- fprintf (stderr, "ERROR: %s: no no arg command\n", cmdname);
- else
- {
- I32 context_nr;
- I32 j;
-
- context_nr = hv_iterinit (context_hv);
- for (j = 0; j < context_nr; j++)
- {
- char *context_name;
- I32 retlen;
- enum conversion_context k;
- int context_idx = -1;
- SV *format_spec_sv = hv_iternextsv (context_hv,
- &context_name, &retlen);
- for (k = 0; k < NO_ARG_COMMAND_CONTEXT_NR; k++)
- {
- if (!strcmp (context_name,
- html_conversion_context_type_names[k]))
- {
- context_idx = k;
- break;
- }
- }
- if (context_idx < 0)
- {
- fprintf (stderr,
- "ERROR: %s: %s: unknown no arg context\n",
- cmdname, context_name);
- break;
- }
- if (SvOK (format_spec_sv))
- {
- I32 spec_number;
- I32 s;
- HTML_NO_ARG_COMMAND_CONVERSION *format_spec;
-
- HV *format_spec_hv = (HV *)SvRV (format_spec_sv);
-
- format_spec = (HTML_NO_ARG_COMMAND_CONVERSION *)
- malloc (sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
- memset (format_spec, 0,
- sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
- converter->customized_no_arg_commands_formatting
- [cmd][context_idx] = format_spec;
-
- spec_number = hv_iterinit (format_spec_hv);
- for (s = 0; s < spec_number; s++)
- {
- char *key;
- I32 retlen;
- SV *spec_sv = hv_iternextsv (format_spec_hv,
- &key, &retlen);
- if (!strcmp (key, "element"))
- {
- const char *tmp_spec
- = (char *) SvPVutf8_nolen (spec_sv);
- format_spec->element
- = non_perl_strdup (tmp_spec);
- }
- else if (!strcmp (key, "unset"))
- format_spec->unset = SvIV (spec_sv);
- else if (!strcmp (key, "text"))
- {
- const char *tmp_spec
- = (char *) SvPVutf8_nolen (spec_sv);
- format_spec->text
- = non_perl_strdup (tmp_spec);
- }
- else if (!strcmp (key, "translated_converted"))
- {
- const char *tmp_spec
- = (char *) SvPVutf8_nolen (spec_sv);
- format_spec->translated_converted
- = non_perl_strdup (tmp_spec);
- }
- else if (!strcmp (key, "translated_to_convert"))
- {
- const char *tmp_spec
- = (char *) SvPVutf8_nolen (spec_sv);
- format_spec->translated_to_convert
- = non_perl_strdup (tmp_spec);
- }
- }
- }
- }
- }
- }
- }
- }
-
- /* The corresponding direction without FirstInFile are used instead
- of FirstInFile*, so the directions_strings are not set */
- nr_string_directions = NON_SPECIAL_DIRECTIONS_NR - FIRSTINFILE_NR
- + special_unit_varieties->number;
-
- if (customized_direction_strings && SvOK (customized_direction_strings))
- {
- HV *customized_direction_strings_hv
- = (HV *) SvRV (customized_direction_strings);
-
- for (DS_type = 0; DS_type < TDS_TYPE_MAX_NR; DS_type++)
- {
- int i;
- const char *type_name;
- HV *direction_hv = 0;
- SV **direction_sv;
- size_t customized_type = DS_type;
- int translated = 0;
+ int i;
+ const char *type_name;
+ HV *direction_hv = 0;
+ SV **direction_sv;
+ size_t customized_type = DS_type;
+ int translated = 0;
type_name = direction_string_type_names[DS_type];
@@ -1145,6 +856,295 @@ html_converter_initialize_sv (SV *converter_sv,
}
}
+ FETCH(htmlxref)
+
+ if (htmlxref_sv)
+ {
+ I32 hv_number;
+ I32 i;
+ HV *htmlxref_hv = (HV *) SvRV (*htmlxref_sv);
+
+ hv_number = hv_iterinit (htmlxref_hv);
+
+ converter->htmlxref.number = hv_number;
+
+ if (hv_number > 0)
+ {
+ converter->htmlxref.list = new_htmlxref_manual_list (hv_number);
+
+ for (i = 0; i < hv_number; i++)
+ {
+ int j;
+ HTMLXREF_MANUAL *htmlxref_manual = &converter->htmlxref.list[i];
+ HE *next = hv_iternext (htmlxref_hv);
+ SV *selector_sv = hv_iterkeysv (next);
+ const char *selector = (char *) SvPVutf8_nolen (selector_sv);
+ SV *split_type_sv = HeVAL(next);
+ HV *split_type_hv = (HV *) SvRV (split_type_sv);
+
+ htmlxref_manual->manual = non_perl_strdup (selector);
+
+ for (j = 0; j < htmlxref_split_type_chapter +1; j++)
+ {
+ const char *split_type_name = htmlxref_split_type_names[j];
+ SV **urlprefix_sv = hv_fetch (split_type_hv, split_type_name,
+ strlen (split_type_name), 0);
+ if (urlprefix_sv && SvOK (*urlprefix_sv))
+ {
+ const char *urlprefix = SvPVutf8_nolen (*urlprefix_sv);
+ htmlxref_manual->urlprefix[j]
+ = non_perl_strdup (urlprefix);
+ }
+ }
+ }
+ }
+ }
+
+ FETCH(formatting_function);
+
+ /* no need to check if it exists */
+ formatting_function_hv = (HV *)SvRV (*formatting_function_sv);
+
+ for (i = 0; i < FR_format_translate_message+1; i++)
+ {
+ const char *ref_name = html_formatting_reference_names[i];
+ FORMATTING_REFERENCE *formatting_reference
+ = &converter->formatting_references[i];
+ SV **default_formatting_reference_sv
+ = hv_fetch (default_formatting_references_hv, ref_name,
+ strlen (ref_name), 0);
+ SV **formatting_reference_sv
+ = hv_fetch (formatting_function_hv, ref_name, strlen (ref_name), 0);
+ /* no check for existence, all should exist */
+ if (SvOK (*default_formatting_reference_sv))
+ {
+ formatting_reference->sv_default = *default_formatting_reference_sv;
+ formatting_reference->status = FRS_status_default_set;
+ }
+ if (formatting_reference_sv)
+ {
+ if SvOK (*formatting_reference_sv)
+ {
+ formatting_reference->sv_reference = *formatting_reference_sv;
+ if (formatting_reference->status != FRS_status_default_set
+ || SvRV (*formatting_reference_sv)
+ != SvRV (*default_formatting_reference_sv))
+ formatting_reference->status = FRS_status_customization_set;
+ }
+ }
+ else
+ fprintf (stderr, "BUG: formatting reference %s not found\n",
+ ref_name);
+ }
+
+ /* copy the normal formatting references and replace the css strings
+ specific references */
+ memcpy (&converter->css_string_formatting_references,
+ &converter->formatting_references,
+ (FR_format_translate_message+1) * sizeof (FORMATTING_REFERENCE));
+
+ for (i = 0; i < FR_format_translate_message+1; i++)
+ {
+ const char *ref_name = html_formatting_reference_names[i];
+ SV **default_formatting_reference_sv
+ = hv_fetch (default_css_string_formatting_references_hv, ref_name,
+ strlen (ref_name), 0);
+
+ /* no customization, current is the default */
+ if (default_formatting_reference_sv
+ && SvOK (*default_formatting_reference_sv))
+ {
+ FORMATTING_REFERENCE *formatting_reference
+ = &converter->css_string_formatting_references[i];
+ formatting_reference->sv_default = *default_formatting_reference_sv;
+ formatting_reference->sv_reference =
*default_formatting_reference_sv;
+ formatting_reference->status = FRS_status_default_set;
+ }
+ }
+
+ FETCH(commands_open)
+ commands_open_hv = (HV *)SvRV (*commands_open_sv);
+ default_commands_open_hv = (HV *)SvRV (default_commands_open);
+
+ FETCH(commands_conversion)
+ commands_conversion_hv = (HV *)SvRV (*commands_conversion_sv);
+ default_commands_conversion_hv = (HV *)SvRV (default_commands_conversion);
+
+ for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
+ {
+ const char *ref_name;
+ if (i == 0)
+ ref_name = "";
+ else
+ ref_name = builtin_command_data[i].cmdname;
+ FORMATTING_REFERENCE *open_formatting_reference
+ = &converter->commands_open[i];
+ FORMATTING_REFERENCE *conversion_formatting_reference
+ = &converter->commands_conversion[i];
+
+ register_formatting_reference_with_default ("command_open",
+ open_formatting_reference, ref_name, default_commands_open_hv,
+ commands_open_hv);
+ register_formatting_reference_with_default ("command_conversion",
+ conversion_formatting_reference, ref_name,
+ default_commands_conversion_hv,
+ commands_conversion_hv);
+
+ /* NOTE use the loop to collect the number of accent commands too */
+ if (builtin_command_data[i].flags & CF_accent)
+ nr_accent_cmd++;
+ }
+
+ initialize_cmd_list (&converter->accent_cmd, nr_accent_cmd, 0);
+
+ default_css_string_commands_conversion_hv
+ = (HV *)SvRV (default_css_string_commands_conversion);
+ /* copy the normal formatting references and replace the css strings
+ specific references */
+ memcpy (&converter->css_string_commands_conversion,
+ &converter->commands_conversion,
+ (BUILTIN_CMD_NUMBER) * sizeof (FORMATTING_REFERENCE));
+
+ for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
+ {
+ const char *ref_name;
+ if (i == 0)
+ ref_name = "";
+ else
+ ref_name = builtin_command_data[i].cmdname;
+
+ FORMATTING_REFERENCE *conversion_formatting_reference
+ = &converter->css_string_commands_conversion[i];
+
+ register_formatting_reference_default ("css_command_conversion",
+ conversion_formatting_reference, ref_name,
+ default_css_string_commands_conversion_hv);
+
+ /* NOTE we use the loop to collect the accent commands too */
+ if (builtin_command_data[i].flags & CF_accent)
+ {
+ converter->accent_cmd.list[converter->accent_cmd.number] = i;
+ converter->accent_cmd.number++;
+ }
+ }
+
+
+ FETCH(types_open)
+ types_open_hv = (HV *)SvRV (*types_open_sv);
+ default_types_open_hv = (HV *)SvRV (default_types_open);
+
+ FETCH(types_conversion)
+ types_conversion_hv = (HV *)SvRV (*types_conversion_sv);
+ default_types_conversion_hv = (HV *)SvRV (default_types_conversion);
+
+ for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
+ {
+ const char *ref_name;
+ if (i == 0)
+ ref_name = "";
+ else
+ ref_name = type_data[i].name;
+ FORMATTING_REFERENCE *open_formatting_reference
+ = &converter->types_open[i];
+ FORMATTING_REFERENCE *conversion_formatting_reference
+ = &converter->types_conversion[i];
+
+ register_formatting_reference_with_default ("type_open",
+ open_formatting_reference, ref_name, default_types_open_hv,
+ types_open_hv);
+ register_formatting_reference_with_default ("type_conversion",
+ conversion_formatting_reference, ref_name,
+ default_types_conversion_hv,
+ types_conversion_hv);
+ }
+
+ default_css_string_types_conversion_hv
+ = (HV *)SvRV (default_css_string_types_conversion);
+ /* copy the normal formatting references and replace the css strings
+ specific references */
+ memcpy (&converter->css_string_types_conversion,
+ &converter->types_conversion,
+ (TXI_TREE_TYPES_NUMBER) * sizeof (FORMATTING_REFERENCE));
+
+ for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
+ {
+ char *ref_name;
+ if (i == 0)
+ ref_name = "";
+ else
+ ref_name = type_data[i].name;
+ FORMATTING_REFERENCE *conversion_formatting_reference
+ = &converter->css_string_types_conversion[i];
+
+ register_formatting_reference_default ("css_type_conversion",
+ conversion_formatting_reference, ref_name,
+ default_css_string_types_conversion_hv);
+ }
+
+
+ FETCH(output_units_conversion)
+ output_units_conversion_hv = (HV *)SvRV (*output_units_conversion_sv);
+ default_output_units_conversion_hv
+ = (HV *)SvRV (default_output_units_conversion);
+
+ for (i = 0; i < OU_special_unit+1; i++)
+ {
+ const char *ref_name = output_unit_type_names[i];
+ FORMATTING_REFERENCE *conversion_formatting_reference
+ = &converter->output_units_conversion[i];
+
+ register_formatting_reference_with_default ("output_unit_conversion",
+ conversion_formatting_reference, ref_name,
+ default_output_units_conversion_hv,
+ output_units_conversion_hv);
+ }
+
+ if (special_unit_varieties->number > 0)
+ {
+ HV *special_unit_body_hv = 0;
+ HV *default_special_unit_body_hv;
+
+ converter->special_unit_body
+ = new_special_unit_formatting_references
+ (special_unit_varieties->number);
+
+ FETCH(special_unit_body)
+ if (special_unit_body_sv)
+ special_unit_body_hv = (HV *)SvRV (*special_unit_body_sv);
+ default_special_unit_body_hv = (HV *)SvRV (default_special_unit_body);
+
+ for (i = 0; i < special_unit_varieties->number; i++)
+ {
+ char *variety_name = special_unit_varieties->list[i];
+ FORMATTING_REFERENCE *special_unit_body_formatting_reference
+ = &converter->special_unit_body[i];
+ register_formatting_reference_with_default ("special_unit_body",
+ special_unit_body_formatting_reference, variety_name,
+ default_special_unit_body_hv,
+ special_unit_body_hv);
+ }
+ }
+
+ FETCH(file_id_setting)
+
+ if (file_id_setting_sv)
+ {
+ HV *file_id_setting_hv = (HV *)SvRV(*file_id_setting_sv);
+ #define html_file_id_setting_name(name) \
+ {\
+ SV **name##_sv = hv_fetch (file_id_setting_hv, #name, \
+ strlen (#name), 0);\
+ if (name##_sv)\
+ {\
+ converter->file_id_setting_refs[FIS_##name]\
+ = (const void *) (* name##_sv);\
+ converter->file_id_setting_ref_number++; \
+ }\
+ }
+ HTML_FILE_ID_SETTING_NAMES_LIST
+ #undef html_file_id_setting_name
+ }
+
FETCH(stage_handlers)
if (stage_handlers_sv)
- Prev by Date:
master updated (e25e05a758 -> bec3cc4fe3)
- Next by Date:
branch master updated: * tp/Texinfo/Convert/HTML.pm (converter_initialize), tp/Texinfo/XS/convert/ConvertXS.xs (html_converter_initialize_sv), tp/Texinfo/XS/convert/convert_html.c (default_code_types) (default_pre_class_types, html_converter_initialize) (html_free_converter), tp/Texinfo/XS/convert/get_html_perl_info.c (html_converter_initialize_sv), tp/Texinfo/XS/main/converter_types.h (TYPE_INTEGER_INFORMATION, PRE_CLASS_TYPE_INFO, CONVERTER): set default_code_types and default_pre_class_types. Add html_custom [...]
- Previous by thread:
[no subject]
- Next by thread:
branch master updated: * tp/Texinfo/Convert/HTML.pm (converter_initialize), tp/Texinfo/XS/convert/ConvertXS.xs (html_converter_initialize_sv), tp/Texinfo/XS/convert/convert_html.c (default_code_types) (default_pre_class_types, html_converter_initialize) (html_free_converter), tp/Texinfo/XS/convert/get_html_perl_info.c (html_converter_initialize_sv), tp/Texinfo/XS/main/converter_types.h (TYPE_INTEGER_INFORMATION, PRE_CLASS_TYPE_INFO, CONVERTER): set default_code_types and default_pre_class_types. Add html_custom [...]
- Index(es):