# API documentation code examples implemented, to check syntax # and also expected effects. Only for code that is not already elsewhere, # nor is too complex to set up. Some of those customization results # are silly, just for the sake of checking. use strict; # To check if there is no erroneous autovivification #no autovivification qw(fetch delete exists store strict); my $default_footnotestyle = texinfo_get_conf('footnotestyle'); my $main_program_footnotestyle; if (not defined($default_footnotestyle)) { $main_program_footnotestyle = 'is undef'; } elsif ($default_footnotestyle eq 'separate') { $main_program_footnotestyle = 'is separate'; } else { $main_program_footnotestyle = 'not separate '.$default_footnotestyle; } my %translations = ( 'fr' => { 'error-->' => {'' => 'erreur-->',}, # ... }, 'de' => { 'error-->' => {'' => 'Fehler-->',}, # ... } # ... ); texinfo_register_no_arg_command_formatting('-', undef, '­'); texinfo_register_no_arg_command_formatting('error', undef, undef, undef, 'error-->'); texinfo_register_no_arg_command_formatting('equiv', undef, undef, undef, undef, 'is the @strong{same} as'); $translations{'fr'}->{'is the @strong{same} as'}->{''} = 'est la @strong{m@^eme} que'; texinfo_register_style_command_formatting('sansserif', 'code', 0, 'normal'); texinfo_register_style_command_formatting('sansserif', 'code', 0, 'preformatted'); texinfo_register_style_command_formatting('sansserif', undef, 1, 'string'); texinfo_register_accent_command_formatting('dotless', 'nodot', 'ij'); my $shown_styles; my $footnotestyle; sub my_function_set_some_css { my $converter = shift; my @all_included_rules = $converter->css_get_info('rules'); my $all_default_selector_styles = $converter->css_get_info('styles'); my $titlefont_style = $all_default_selector_styles->{'h1.titlefont'}; $titlefont_style = 'undefined' if (!defined($titlefont_style)); $shown_styles = $titlefont_style.' '. $all_default_selector_styles->{'h1.shorttitlepage'}; $converter->css_add_info('styles', 'h1.titlefont', 'text-align:center'); my $footnotestyle_before_setting = $converter->get_conf('footnotestyle'); $footnotestyle_before_setting = 'UNDEF' if (not defined($footnotestyle_before_setting)); $converter->set_conf('footnotestyle', 'separate'); $footnotestyle = $main_program_footnotestyle .'|'.$footnotestyle_before_setting .'|'.$converter->get_conf('footnotestyle'); # there should be nothing in @all_included_rules for two reasons, # first because it requires 'CSS_FILES' to be set to parseable # CSS files, and CSS files parsing is done after the setup handler # is called. #print STDERR "all_included_rules: ".join('|', @all_included_rules)."\n"; return 0; } texinfo_register_handler('setup', \&my_function_set_some_css); sub my_email_formatting_function { my $converter = shift; my $cmdname = shift; my $command = shift; my $args = shift; my $mail_arg = shift @$args; my $text_arg = shift @$args; my $mail = ''; my $mail_string; if (defined($mail_arg)) { $mail = $mail_arg->{'url'}; $mail_string = $mail_arg->{'monospacestring'}; } my $text = ''; if (defined($text_arg)) { $text = $text_arg->{'normal'}; } if ($converter->in_string()) { return "$mail_string ($text) $shown_styles, $footnotestyle"; } else { return $converter->html_attribute_class('a', [$cmdname]) ." href=\"mailto:$mail_string\">$text [$shown_styles, $footnotestyle]"; } } texinfo_register_command_formatting('email', \&my_email_formatting_function); sub my_convert_paragraph_type($$$$) { my $converter = shift; my $type = shift; my $element = shift; my $content = shift; return $content if ($converter->in_string()); my @contents = @{$element->{'contents'}}; push @contents, {'text' => ' HTML text ', 'type' => '_converted'}; my $result = $converter->convert_tree({'type' => '_code', 'contents' => \@contents }); return "

".$result."

"; } texinfo_register_type_formatting('paragraph', \&my_convert_paragraph_type); sub my_node_file_name($$$) { my ($converter, $element, $filename) = @_; # .... my $node_file_name = 'prepended_to_filenames-'.$filename; return $node_file_name; } texinfo_register_file_id_setting_function('node_file_name', \&my_node_file_name); sub my_label_target_name($$$$) { my ($converter, $normalized, $node_contents, $default_target) = @_; if (defined($normalized)) { my $element = $converter->label_command($normalized); return 'prepended_to_labels-'.$element->{'extra'}->{'normalized'}; } return $default_target; } texinfo_register_file_id_setting_function('label_target_name', \&my_label_target_name); sub my_format_translate_string($$$;$$$) { my ($self, $string, $lang, $replaced_substrings, $translation_context, $type) = @_; $translation_context = '' if (!defined($translation_context)); if (exists($translations{$lang}) and exists($translations{$lang}->{$string}) and exists($translations{$lang}->{$string}->{$translation_context})) { my $translation = $translations{$lang}->{$string}->{$translation_context}; return $self->replace_convert_substrings($translation, $replaced_substrings, $type); } return undef; } texinfo_register_formatting_function('format_translate_string', \&my_format_translate_string); 1;