# -*-perl-*-
######################################################################
# File: mediawiki.pm
#
# Override values for various customizable procedures are set in this file
# in such a way as to create text suitable for pasting into a MediaWiki.
#
# Load the file with command-line option: --init-file mediawiki.pm
#
# This file is in the public domain. Thus it may easily be used as an
# example for further customizations.
#
# Originally written by Derek Price in 2005.
# Modified in 2008 and 2009.
#
# $Id: mediawiki.pm,v 1.1 2011-04-09 00:10:45 pertusus Exp $
use strict;
#html_default_load();
t2h_default_load_format('html');
# remark: in my tests, there was no support for mathtt in texvc
# https://bugzilla.wikimedia.org/show_bug.cgi?id=21475
default_load_tex_math();
# inline css style
set_default('INLINE_CSS_STYLE', 1);
set_default('USE_SECTIONS', 1);
set_default('USE_NODES', undef);
# numbers are added automatically based on mediawiki markup
set_default('NUMBER_SECTIONS', 0);
# if this is set footnotes are on a separated page. Otherwise they are at
# the end of each file (if the document is split).
# At the end is better for the mediawiki output which is more per page
# oriented.
set_default('footnotestyle', 'end');
# extension
set_default('EXTENSION', undef);
# extension for nodes files when NODE_FILES is true
set_default('NODE_FILE_EXTENSION', '');
# no title page at the beginning
set_default('USE_TITLEPAGE_FOR_TITLE', 0);
# if set and SPLIT is set, then split index pages at the next letter
# after they have more than that many entries
set_default('SPLIT_INDEX', undef);
# Use preformatted menus.
set_default('SIMPLE_MENU', 1);
# no NODE_FILES. In fact the whole ref to external manual is broken.
# This may be revisited later.
set_default('NODE_FILES', 0);
$DEFAULT_RULE = "\n----\n";
my %mediawiki_table_commands;
# FIXME b, i could be ''' ''
# FIXME ''' and '' are stopped by end of lines!
my %style_map_mediawiki = (
'emph', {'inline_begin' => "''"},
'email', {'function' => \&mediawiki_default_email},
'math', {'function' => \&mediawiki_default_math},
'url', {'function' => \&mediawiki_default_uref},
'uref', {'function' => \&mediawiki_default_uref},
'strong', {'inline_begin' => "'''"}
);
foreach my $style_command (keys(%style_map_mediawiki))
{
if ($style_map_mediawiki{$style_command}->{'inline_begin'})
{
foreach my $key ('inline_attribute', 'attribute')
{
delete $style_map_pre{$style_command}->{$key};
delete $style_map{$style_command}->{$key};
}
$style_map_pre{$style_command}->{'inline_end'} = $style_map_mediawiki{$style_command}->{'inline_begin'};
$style_map{$style_command}->{'inline_end'} = $style_map_mediawiki{$style_command}->{'inline_begin'};
}
foreach my $key (keys(%{$style_map_mediawiki{$style_command}}))
{
$style_map_pre{$style_command}->{$key} = $style_map_mediawiki{$style_command}->{$key};
$style_map{$style_command}->{$key} = $style_map_mediawiki{$style_command}->{$key};
}
}
# no samp/kbd in allowed html elements in the default case.
foreach my $style_command (keys(%style_map))
{
if ($style_map{$style_command}->{'inline_attribute'})
{
$style_map{$style_command}->{'inline_attribute'} =~ s/^(samp|kbd)/code/;
}
}
foreach my $style_command (keys(%style_map_pre))
{
if ($style_map_pre{$style_command}->{'inline_attribute'})
{
$style_map_pre{$style_command}->{'inline_attribute'} =~ s/^(samp|kbd)/code/;
}
}
$style_map{'indicateurl'} = {'begin' => '<>'};
$style_map_pre{'indicateurl'} = {'begin' => '<>'};
sub mediawiki_default_email($$)
{
my $command = shift;
my $args = shift;
my $mail = shift @$args;
my $text = shift @$args;
$text = '' if (!defined($text));
$mail = main::normalise_space($mail);
$text = main::normalise_space($text);
return $text if ($mail eq '');
$text = ' ' . $text if ($text ne '');
return "[mailto:$mail$text]";
}
sub mediawiki_default_uref($$)
{
shift;
my $args = shift;
my $url = shift @$args;
my $text = shift @$args;
my $replacement = shift @$args;
$url = main::normalise_space($url);
$replacement = '' if (!defined($replacement));
$replacement = main::normalise_space($replacement);
$text = '' if (!defined($text));
$text = main::normalise_space($text);
$text = $replacement if ($replacement ne '');
return $text if ($url eq '');
return &$anchor('', $url, $text);
}
sub mediawiki_default_math($$)
{
shift;
my $args = shift;
my $text = shift @$args;
return "";
}
foreach my $format ('enumerate', 'table', 'vtable', 'ftable')
{
$format_map{$format} = '';
}
my %processed_formats = ();
# there are no pre used in mediawiki, to have links working in
# complex formats, therefore the styles are copied in div that
# are used instead. This doesn't really improve the situation,
# though, since the div outside of a
is not taken into account.
foreach my $complex_format (keys(%complex_format_map))
{
my $class = $complex_format_map{$complex_format}->{'class'};
$class = $complex_format if (!defined($class));
# Avoid doing things twice if the class is associated with more than one
# complex format
next if($processed_formats{$class});
if (defined($css_map{"pre.$class"}))
{
if (defined($css_map{"div.$class"}))
{
$css_map{"div.$class"} .= "; ";
}
else
{
$css_map{"div.$class"} = '';
}
$css_map{"div.$class"} .= $css_map{"pre.$class"};
}
$processed_formats{$class} = 1;
}
foreach my $format ('example', 'display', 'lisp', 'format')
{
$complex_format_map{$format}->{'begin'} = html_default_attribute_class('div', $format).">\n";
$complex_format_map{"small$format"}->{'begin'} = html_default_attribute_class('div', "small$format").">\n";
$complex_format_map{$format}->{'end'} = ''."\n";
$complex_format_map{"small$format"}->{'end'} = ''."\n";
}
foreach my $format ('menu', 'detailmenu', 'menu_comment')
{
my $class = $complex_format_map{$format}->{'class'};
$class = $format if (!defined($class));
$complex_format_map{$format}->{'begin'} = html_default_attribute_class('div', $class).">\n";
$complex_format_map{$format}->{'end'} = ''."\n";
}
$texi_formats_map{'direntry'} = 0;
# no acronym nor abbr allowed in wikitext.
$acronym_like = \&t2h_default_acronym_like;
push @command_handler_setup, \&mediawiki_default_initialize_variables;
my %mediawiki_doc_nr_to_file; # File name cache based on file index.
my %mediawiki_target_to_name;
my %mediawiki_special_file_name;
sub mediawiki_default_initialize_variables()
{
%mediawiki_doc_nr_to_file = (); # File name cache based on file index.
%mediawiki_target_to_name = ();
%mediawiki_special_file_name = ();
}
my @html_files_from_tex;
my $mediawiki_out_dir;
my $tex_extension;
push @command_handler_init, \&mediawiki_default_init_html_to_wiki;
sub mediawiki_default_init_html_to_wiki
{
# This must be done here, because the latex2html handler is added
# after command line scanning, so after the mediawiki.pm parsing
push @command_handler_process, \&mediawiki_default_html_to_wiki;
$command_handler{'math'}->{'init'} = undef;
$command_handler{'math'}->{'expand'} = undef;
$command_handler{'math'} = undef;
$mediawiki_out_dir = "$Texi2HTML::THISDOC{'destination_directory'}";
$mediawiki_out_dir = './' if (!defined($mediawiki_out_dir) or $mediawiki_out_dir =~ /^\s*$/);
@html_files_from_tex = ();
$tex_extension = undef;
if ($Texi2HTML::THISDOC{'extensions'}->{'tex4ht'})
{
push @html_files_from_tex, "$Texi2HTML::THISDOC{'file_base_name'}_tex4ht_tex.html";
$tex_extension = 'tex4ht';
}
elsif (get_conf('L2H'))
{
push @html_files_from_tex, "$Texi2HTML::THISDOC{'file_base_name'}_l2h.html";
$tex_extension = 'l2h';
# avoid use of the cache
set_default('L2H_SKIP', 0);
}
}
# could be in texi2html.pm...
sub mediawiki_default_readd_end_of_lines($$$$;$)
{
my $from_file = shift;
my $to_file = shift;
my $tex_extension = shift;
my $basename = shift;
my $before_wiki = shift;
# html2wiki removes end of lines, they are readded here
unless (open (ORIG, $from_file))
{
print STDERR "open $from_file error: $!\n";
return 0;
}
unless (open (FINAL, ">$to_file"))
{
print STDERR "open $to_file error: $!\n";
return 0;
}
my $line;
while ($line = )
{
if ($before_wiki)
{
$line =~ s/() *$/$1\n\nintersticiae<\/p>\n/;
$line = Texi2HTML::LaTeX2HTML::change_image_file_names($line) if ($tex_extension eq 'l2h');
}
else
{
$line =~ s/^()(.+)/$1\n$5/;
$line =~ s/(.+)() *$/$1\n$2/;
}
print FINAL "$line";
}
close ORIG;
close FINAL;
return 1;
}
sub mediawiki_default_html_to_wiki
{
foreach my $file (@html_files_from_tex)
{
if (-f $mediawiki_out_dir.$file)
{
my $html_file = $mediawiki_out_dir.$file;
my $tmp_file = $mediawiki_out_dir.$file.".tmp";
my $tmp_file2 = $mediawiki_out_dir.$file.".tmp2";
my $tmp_file3 = $mediawiki_out_dir.$file.".tmp3";
my $basename = $file;
$basename =~ s/\.html$//;
if (!rename ($html_file, $tmp_file))
{
print STDERR "rename $html_file $tmp_file error: $!\n";
return;
}
#system ("cp $tmp_file $tmp_file.save");
# Add a paragraph between the end and begin comments to force
# html2wiki to leave them appart.
return unless (mediawiki_default_readd_end_of_lines($tmp_file, $tmp_file3, $tex_extension, $basename, 1));
if (!rename ($tmp_file3, $tmp_file))
{
print STDERR "rename $tmp_file3 $tmp_file error: $!\n";
return;
}
#system ("cp $tmp_file $tmp_file3.save");
my $cmd = "html2wiki --dialect MediaWiki --strip-tags '' $tmp_file > $tmp_file2";
print STDERR "Launching(". Cwd::cwd() ."): $cmd\n" if (get_conf('VERBOSE'));
if (system ($cmd))
{
main::document_warn ("mediawiki_tex command failed: $cmd");
return;
}
# this ensures that there is one end of line before the
# html comment, and after, even though html2wiki removed them
return unless (mediawiki_default_readd_end_of_lines($tmp_file2, $html_file, $tex_extension, $basename));
#system ("cp $html_file $html_file.save");
}
else
{ # FIXME error message?
}
}
}
$heading_text = \&mediawiki_heading_text;
sub mediawiki_heading_text($$$)
{
my $command = shift;
my $text = shift;
my $level = shift;
return '' if ($text !~ /\S/);
$level = 1 if ($level == 0);
return (("=" x $level) . "= $text =" . ("=" x $level) . "\n");
}
###################################################################
# Layout of standard header and footer
#
$print_page_head = \&mediawiki_default_print_page_head;
$print_page_foot = \&mediawiki_default_print_page_foot;
sub mediawiki_default_print_page_head($)
{
my $fh = shift;
print $fh "$AFTER_BODY_OPEN\n" if $AFTER_BODY_OPEN;
}
sub mediawiki_default_print_page_foot($)
{
my $fh = shift;
my $program_string = &$program_string();
print $fh $program_string, "\n";
print $fh $PRE_BODY_CLOSE, "\n" if $PRE_BODY_CLOSE;
}
# This function produces an anchor
#
# arguments:
# $name : anchor name
# $href : anchor href
# $text : text displayed
# extra_attribs : added to anchor attributes list
$anchor = \&mediawiki_anchor;
sub mediawiki_anchor($;$$$)
{
my $name = shift;
my $href = shift;
my $text = shift;
my $attributes = shift; # ignored
$href = '' if !defined $href or $href !~ /\S/;
$text = '' if !defined $text or $text !~ /\S/;
return $text if $name eq '' and $href eq '';
$name = "
" if $name ne '';
if (defined($href) and $href ne '')
{
my $wiki_href;
my ($file, $target);
if ($href =~ /^([^#]*)\#(.+)$/)
{
$file = $1;
$target = $2;
if (defined($mediawiki_target_to_name{$target}))
{
if ($file eq '')
{
$target = $mediawiki_target_to_name{$target}->[0]->[1]->{'simple_format'}
if ($mediawiki_target_to_name{$target}->[0]->[1]->{'simple_format'} ne '');
$wiki_href = '#' . $target;
}
else
{
foreach my $element (@{$mediawiki_target_to_name{$target}})
{
if ($file eq $element->[0])
{
$target = $element->[1]->{'simple_format'} if ($element->[1]->{'simple_format'} ne '');
$wiki_href = $file . '#' . $target;
}
}
}
}
# Element pages, or misc relative links.
# mediawiki 1.15.1 doesn't like anchor only urls, they work as wiki_ref.
if (!defined($wiki_href) and ($mediawiki_special_file_name{$file} or $file eq ''))
{
$wiki_href = $href;
}
}
# Element page, no target
elsif ($mediawiki_special_file_name{$href})
{
$file = $href;
$wiki_href = $href;
}
if (defined($wiki_href))
{
$text = "|$text" if $text;
# FIXME trouble with http://meta.wikimedia.org/wiki/Help:Namespace#Generic_namespace_names
# and with http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_(technical_restrictions)#Forbidden_characters
$href = "[[$wiki_href$text]]";
}
else
{
$text = " $text" if $text;
$href = "[$href$text]";
}
}
else
{
$href = $text;
}
#print STDERR "!!!$name!$href!$text!$attributes!\n";
return "$name$href";
}
# it is not possible (at least not easy) to protect only 2 consecutive
# {, although it would be better.
foreach my $brace ('{', '}')
{
$simple_map{$brace} = "$simple_map{$brace} ";
$simple_map_pre{$brace} = "$simple_map_pre{$brace} ";
}
# remark: this nullifies the change of default_load_tex_math for normal_text.
# We assume that in @math the TeX characters have already been
# rightly protected and so don't protect once more. This is important
# for <, not to lead to <.
# remark: texvc doesn't accept " \&
$normal_text = \&mediawiki_default_normal_text;
sub mediawiki_default_normal_text($$$$$$$;$)
{
my @initial_args = @_;
my $text = shift;
my $in_raw_text = shift; # remove_texi
my $in_preformatted = shift;
my $in_code = shift;
my $in_math = shift;
my $in_simple = shift;
my $style_stack = shift;
my $state = shift;
if ($in_math)
{
$text = uc($text) if (in_cmd($style_stack, 'sc'));
return $text;
}
$text = &html_default_normal_text (@initial_args);
my $colon = '';
foreach my $command (@$style_stack)
{
if ($mediawiki_table_commands{$command} or $def_map{$command})
{
$colon = '|( :)' ;
last;
}
#print STDERR "$command\n";
}
# '' is changed to &ldsquo; so it doesn't needs to be protected in
# normal text...
if (!$in_raw_text and !$in_simple)
{
$text =~ s/(([\[\]]|[']{2,}|(\{\{)|(\}\})$colon)+)/$1<\/nowiki>/g;
}
return $text;
}
#$heading = \&mediawiki_default_heading;
sub mediawiki_default_heading($$$$$;$$)
{
my $element = shift;
my $command = shift;
my $texi_line = shift;
my $line = shift;
my $in_preformatted = shift;
my $one_section = shift;
my $element_heading = shift;
my $result = t2h_default_heading($element, $command, $texi_line, $line,
$in_preformatted, $one_section, $element_heading);
if ($result ne '')
{
if ($element->{'no_texi'} =~ /[\#<>\[\]|{}]/)
{
main::msg_warn("# < > [ ] | { } not allowed in title `$element->{'texi'}'",$element->{'line_nr'});
}
}
return $result;
}
# This function formats a footnote reference and the footnote text associated
# with a given footnote.
# The footnote reference is the text appearing in the main document pointing
# to the footnote text.
#
# arguments:
# absolute number of the footnote (in the document)
# relative number of the footnote (in the page)
# identifier for the footnote
# identifier for the footnote reference in the main document
# main document file
# footnote text file
# array with the footnote text lines
# the state. See menu entry.
#
# returns:
# reference on an array containing the footnote text lines which should
# have been updated
# the text for the reference pointing on the footnote text
# FIXME the ... stuff is only available with the Cite extension.
$foot_line_and_ref = \&mediawiki_default_foot_line_and_ref;
$foot_section = \&mediawiki_default_foot_section;
sub mediawiki_default_foot_line_and_ref($$$$$$$)
{
my $number_in_doc = shift;
my $number_in_page = shift;
my $footnote_id = shift;
my $place_id = shift;
my $document_file = shift;
my $footnote_file = shift;
my $lines = shift;
my $state = shift;
my $result = '';
foreach my $line (@$lines)
{
$result .= $line;
}
# The result shouldn't be empty, such that the call to print_Footnotes
# and foot_section are not skipped
return ([' '], $result . '');
}
# formats a group of footnotes.
#
# argument:
# array reference on the footnotes texts lines
#
# returns an array reference on the group of footnotes lines
# FIXME maybe do a header?
sub mediawiki_default_foot_section($)
{
my $lines = shift;
#unshift @$lines, "$DEFAULT_RULE\n" if $DEFAULT_RULE;
#unshift @$lines, "==== " . gdt('Footnotes') . " ====\n";
@$lines = (" \n\n");
return $lines;
}
# FIXME maybe also a header here?
$print_Footnotes = \&mediawiki_default_print_Footnotes;
sub mediawiki_default_print_Footnotes
{
my $fh = shift;
my $new_file = shift;
my $misc_page = shift;
my $buttons = \@MISC_BUTTONS;
&$print_misc_header($fh, $buttons, $new_file, $misc_page) if ($new_file);
print $fh " \n\n";
&$print_misc_footer($fh, $buttons, $new_file) if ($new_file);
}
$button_formatting = \&mediawiki_button_formatting;
sub mediawiki_button_formatting
{
my $button = shift;
my $vertical = shift;
my ($active, $passive) = HTML_DEFAULT_button_formatting($button, $vertical);
if (defined($active) and !ref($button))
{
$active =~ s/^\[/\|/;
$active =~ s/\]$/\|/;
}
return ($active, $passive);
}
$element_file_name = \&mediawiki_element_file_name;
sub mediawiki_element_file_name
{
my $element = shift;
my $type = shift;
my $docu_name = shift;
my $file;
#print STDERR "!$element!$type!$docu_name!\n";
if (!$element)
{
if ($type =~ /^toc$/)
{
$file = $docu_name . ": Table of Contents";
}
elsif ($type =~ /^stoc$/)
{
$file = $docu_name . ": Short Table of Contents";
}
elsif ($type =~ /^foot$/)
{
$file = $docu_name . ": Footnotes";
}
elsif ($type =~ /^about$/)
{
$file = $docu_name . ": About this Manual";
}
elsif ($type =~ /^doc$/)
{
$file = $docu_name;
}
}
else
{
my $name = main::substitute_line($element->{'texi'}, 'file name', {'remove_texi' => 1}, $element->{'line_nr'});
if (exists $mediawiki_doc_nr_to_file{$element->{'doc_nr'}})
{
$file = $mediawiki_doc_nr_to_file{$element->{'doc_nr'}};
$mediawiki_doc_nr_to_file{$element->{'doc_nr'}} = $file;
}
else
{
$name =~ s,/,%47,g;
$name =~ s,\\,%92,g;
$file = "$docu_name" . (($type eq 'top') ? "" : ": " . $name);
$mediawiki_doc_nr_to_file{$element->{'doc_nr'}} = $file;
}
push @{$mediawiki_target_to_name{$element->{'target'}}}, [ $file, $element ];
if ($name =~ /[\#<>\[\]|{}]/)
{
main::msg_warn("# < > [ ] | { } not allowed in title `$element->{'texi'}'",$element->{'line_nr'});
}
}
$mediawiki_special_file_name{$file} = 1;
return $file;
}
$node_file_name = \&mediawiki_default_node_file_name;
sub mediawiki_default_node_file_name($$)
{
my $node = shift;
my $type = shift;
my $filename = T2H_DEFAULT_node_file_name($node, $type);
my $command = 'node';
$command = $node->{'tag'};
my $name = main::substitute_line($node->{'texi'}, 'node name', {'remove_texi' => 1}, $node->{'line_nr'});
if ($name =~ /[\#<>\[\]|{}]/)
{
main::msg_warn("# < > [ ] | { } not allowed in references, in \@$command `$node->{'texi'}'",$node->{'line_nr'});
}
return $filename;
}
# a preformatted region
# arguments:
# $text of the preformatted region
# $pre_style css style
# $class identifier for the preformatted region (example, menu-comment)
# The following is usefull if the preformatted is in an itemize.
# $leading_command is the leading formatting command (like @minus)
# $leading_command_formatted is the leading formatting command formatted
# $preformatted_number is a reference on the number of preformatteds appearing
# in the format. The value should be increased if a preformatted is done
$preformatted = \&mediawiki_default_preformatted;
sub mediawiki_default_preformatted($$$$$$$$$$)
{
my $text = shift;
my $pre_style = shift;
my $class = shift;
my $leading_command = shift;
my $leading_command_formatted = shift;
my $preformatted_number = shift;
my $format = shift;
my $item_nr = shift;
my $enumerate_style = shift;
my $number = shift;
my $command_stack_at_end = shift;
my $command_stack_at_begin = shift;
return '' if ($text eq '');
$leading_command_formatted = '' if (!defined($leading_command_formatted) or
exists($special_list_commands{$format}->{$leading_command}));
if (defined($preformatted_number) and defined($$preformatted_number))
{
$$preformatted_number++;
}
my $top_stack = '';
$top_stack = $command_stack_at_begin->[-1] if (scalar (@$command_stack_at_begin));
if ($top_stack eq 'multitable')
{
$text =~ s/^\s*//;
$text =~ s/\s*$//;
}
$text =~ s/^/ /mg;
# return html_default_attribute_class('div', $class).">\n$text\n";
return "$text";
#return "$text
";
}
sub mediawiki_default_remove_eol($)
{
my $text = shift;
chomp($text);
my $res = '';
foreach my $line (split /\n/, $text)
{
$res .= $line . " ";
}
$res =~ s/ $//;
$res .= "\n";
return $res;
}
my %mediawiki_default_indent_symbol = (
'itemize' => '*',
'enumerate' => '#'
);
foreach my $table ('table', 'ftable', 'vtable')
{
$mediawiki_default_indent_symbol{$table} = ':';
$mediawiki_table_commands{$table} = 1;
}
foreach my $definition_command (keys(%def_map))
{
$mediawiki_default_indent_symbol{$definition_command} = ':';
}
sub mediawiki_default_indent_string($;$)
{
my $commands = shift;
my $remove_last = shift;
$commands = $Texi2HTML::THISDOC{'command_stack'} if (!defined($commands));
my $indent_string = '';
foreach my $format (@$commands)
{
$indent_string .= $mediawiki_default_indent_symbol{$format}
if defined($mediawiki_default_indent_symbol{$format});
}
$indent_string =~ s/.$// if ($remove_last);
return $indent_string;
}
$paragraph = \&mediawiki_default_paragraph;
sub mediawiki_default_paragraph($$$$$$$$$$$$)
{
my $text = shift;
my $align = shift;
my $indent = shift;
my $paragraph_command = shift;
my $paragraph_command_formatted = shift;
my $paragraph_number = shift;
my $format = shift;
my $item_nr = shift;
my $enumerate_style = shift;
my $number = shift;
my $command_stack_at_end = shift;
my $command_stack_at_begin = shift;
#print STDERR "format: $format\n" if (defined($format));
#print STDERR "paragraph @$command_stack_at_end; @$command_stack_at_begin\n";
# $paragraph_command_formatted = '' if (!defined($paragraph_command_formatted) or
# exists($special_list_commands{$format}->{$paragraph_command}));
return '' if ($text =~ /^\s*$/);
if (defined($paragraph_number) and defined($$paragraph_number))
{
$$paragraph_number++;
}
# remove leading spaces, they trigger a preformatted environment in wikitext
$text =~ s/^\s*//mg;
my $top_stack = '';
$top_stack = $command_stack_at_begin->[-1] if (scalar (@$command_stack_at_begin));
if ($top_stack eq 'multitable')
{
$html_default_multitable_stack[-1]->[1]++;
return mediawiki_default_remove_eol($text);
}
if ($align)
{
$text = "".$text.'
';
}
my $indent_string = mediawiki_default_indent_string($command_stack_at_begin);
if ($indent_string)
{
$text = $indent_string . ' ' .mediawiki_default_remove_eol($text);
}
return $text;
}
$list_item = \&mediawiki_default_list_item;
sub mediawiki_default_list_item
{
my $text = shift;
return $text;
}
$def_item = \&mediawiki_default_def_item;
sub mediawiki_default_def_item($$$)
{
my $text = shift;
my $only_inter_item_commands = shift;
my $command = shift;
if ($text =~ /\S/)
{
if (! get_conf('DEF_TABLE'))
{
return $text;# unless $only_inter_item_commands;
#return $text; # invalid without dd in ul
}
else
{
return '' . $text . ' ';
}
}
return '';
}
$table_item = \&mediawiki_default_table_item;
sub mediawiki_default_table_item($$$$$$$)
{
my $text = shift;
my $index_label = shift;
my $format = shift;
my $command = shift;
# my $formatted_command = shift;
my $style_stack = shift;
# my $text_formatted = shift;
# my $text_formatted_leading_spaces = shift;
# my $text_formatted_trailing_spaces = shift;
my $item_cmd = shift;
my $formatted_index_entry = shift;
# if (defined($text_formatted) and !exists $special_list_commands{$format}->{$command})
# {
# $text = $text_formatted_leading_spaces . $text_formatted .$text_formatted_trailing_spaces;
# }
# $formatted_command = '' if (!defined($formatted_command) or
# exists($special_list_commands{$format}->{$command}));
if (html_teletyped_in_stack($style_stack))
{
# $text .= '';
# $formatted_command = '' . $formatted_command;
$text = '' . $text . '';
}
$text .= "\n" . $index_label if (defined($index_label));
# return '' . $formatted_command . $text . ' ' . "\n";
return mediawiki_default_indent_string(undef,1) .";$text\n";
}
$table_line = \&mediawiki_default_table_line;
sub mediawiki_default_table_line($$$)
{
my $text = shift;
my $only_inter_item_commands = shift;
my $before_items = shift;
$only_inter_item_commands = '' if (!defined($only_inter_item_commands));
if ($text =~ /\S/)
{
#return ";$text\n";# unless ($only_inter_item_commands);
return $text;
#return $text; # invalid without dd in ul
}
return '';
}
$def_line = \&mediawiki_default_def_line;
sub mediawiki_default_def_line($$$$$$$$$$$$$$$$)
{
my $category_prepared = shift;
my $name = shift;
my $type = shift;
my $arguments = shift;
my $index_label = shift;
my $arguments_array = shift;
my $arguments_type_array = shift;
my $unformatted_arguments_array = shift;
my $command = shift;
my $class_name = shift;
my $category = shift;
my $class = shift;
my $style = shift;
my $original_command = shift;
$index_label = '' if (!defined($index_label));
chomp($index_label);
$category_prepared = '' if (!defined($category_prepared) or ($category_prepared =~ /^\s*$/));
$name = '' if (!defined($name) or ($name =~ /^\s*$/));
$type = '' if (!defined($type) or $type =~ /^\s*$/);
if (!defined($arguments) or $arguments =~ /^\s*$/)
{
$arguments = '';
}
else
{
chomp ($arguments);
$arguments = '' . $arguments . '';
}
my $type_name = '';
$type_name = " $type" if ($type ne '');
$type_name .= ' ' . $name . '' if ($name ne '');
$type_name .= $arguments;
if (! get_conf('DEF_TABLE'))
{
return mediawiki_default_indent_string(undef,1) .';'. $index_label. $category_prepared . ': ' . $type_name . "\n";
}
else
{
return "" . $type_name .
" " . $category_prepared . $index_label . " \n";
}
}
$def = \&mediawiki_default_def;
sub mediawiki_default_def($$)
{
my $text = shift;
my $command = shift;
if ($text =~ /\S/)
{
if (! get_conf('DEF_TABLE'))
{
return $text;
}
else
{
return "\n" . $text . "
\n";
}
}
return '';
}
$table_list = \&mediawiki_default_table_list;
sub mediawiki_default_table_list($$$$$$$$$)
{
my $format_command = shift;
my $text = shift;
my $command = shift;
my $formatted_command = shift;
# enumerate
my $item_nr = shift;
my $enumerate_style = shift;
# itemize
my $prepended = shift;
my $prepended_formatted = shift;
# multitable
my $columnfractions = shift;
my $prototype_row = shift;
my $prototype_lengths = shift;
my $column_number = shift;
if ($format_command eq 'multitable')
{
pop @html_default_multitable_stack;
return &$format('multitable', 'table', $text);
}
return $text;
}
# format an index summary. This is a list of letters linking to the letter
# entries.
#
# arguments:
# array reference containing the formatted alphabetical letters
# array reference containing the formatted non lphabetical letters
$index_summary = \&mediawiki_index_summary;
sub mediawiki_index_summary($$)
{
my $alpha = shift;
my $nonalpha = shift;
my $join = '';
my $nonalpha_text = '';
my $alpha_text = '';
return "" if !@$nonalpha and !@$alpha;
$nonalpha_text = join ("", map {"$_ "} @$nonalpha) . "\n"
if @$nonalpha;
$alpha_text = join ("", @$alpha) . "\n \n"
if @$alpha;
return ''
. "" . gdt('Jump to') .": \n"
. join ("", map {"$_ \n"} @$nonalpha, @$alpha)
. "
\n";
}
$line_command = \&mediawiki_line_command;
sub mediawiki_line_command($$$$)
{
my $command = shift;
my $arg_text = shift;
my $arg_texi = shift;
my $state = shift;
return '' if ($arg_text eq '' or ($command eq 'author' and (!$state->{'region'} or $state->{'region'} ne 'titlepage')));
if ($command eq 'title')
{
$arg_text = '== ' .$arg_text. " ==\n";
}
elsif ($command eq 'subtitle')
{
$arg_text = '=== ' .$arg_text. " ===\n";
}
elsif ($command eq 'author')
{
$arg_text = ' ' .$arg_text. "
\n";
}
return $arg_text;
}
$image = \&mediawiki_default_image;
sub mediawiki_default_image($$$$$$$$$$$$$$$$$)
{
my $file = shift;
my $base = shift;
my $preformatted = shift;
my $file_name = shift;
my $alt = shift;
my $width = shift;
my $height = shift;
my $raw_alt = shift;
my $extension = shift;
my $working_dir = shift;
my $file_path = shift;
my $in_paragraph = shift;
my $file_locations = shift;
my $base_simple_format = shift;
my $extension_simple_format = shift;
my $file_name_simple_format = shift;
my $line_nr = shift;
if (!defined($file_path) or $file_path eq '')
{
if (defined($extension) and $extension ne '')
{
$file = "$base.$extension";
}
else
{
$file = "$base.jpg";
}
main::line_warn (sprintf(__("\@image file `%s' not found, using `%s'"), $base, $file), $line_nr);
}
elsif (! get_conf('COMPLETE_IMAGE_PATHS'))
{
$file = $file_name;
}
my $alt_text = '';
$alt_text = "|alt=$alt" if (defined($alt) and $alt ne '');
# it is possible that $file_name is more correct as it allows the user
# to chose the relative path.
$file = &$protect_text($file);
return "[[Image:$file$alt_text]]";
}
# FIXME ';
}
elsif ($style eq 'html' and $expanded)
{
chomp ($text);
return $text;
}
elsif ($style eq 'tex' and $expanded)
{
chomp ($text);
return "\n";
}
elsif ($expanded)
{
main::line_warn (sprintf(__("Raw format %s is not converted"), $style), $line_nr);
return &$protect_text($text);
}
else
{
return '';
}
}
## a simple menu entry ref in case we aren't in a standard menu context
#$simple_menu_link = \&mediawiki_simple_menu_link;
# a menu link. We are always in preformatted because of SIMPLE_MENU.
# currently not used.
#$menu_link = \&mediawiki_simple_menu_link;
sub mediawiki_simple_menu_link($$$$$$$)
{
my $entry = shift;
# my $preformatted = shift; # We assume this is true.
my $state = shift;
my $href = shift;
my $node = shift;
my $title = shift;
my $ending = shift;
my $has_title = shift;
my $command_stack = shift;
my $preformatted = shift;
$title = '' unless ($has_title);
$ending = '' unless defined $ending;
$entry = "";
$entry .= "$MENU_SYMBOL";
if ($href)
{
$entry .= &$anchor ('', $href, $node);
}
else
{
$title .= ":" if ($title ne '');
$entry .= "$title$node";
}
$entry .= $ending;
$entry .= "