Обсуждение:Язык Haskell: О пользе и вреде лени: различия между версиями

Убрал старые, уже неактуальные обсуждения
м
(Убрал старые, уже неактуальные обсуждения)
Статья в процессе выкладывания, пока помещен только кусочек, остальное в процессе конвертирования из формата TeX. Если вы знаете какие-нибудь существующие конверторы из TeX в wiki или HTML, пожалуйста, сообщите здесь :-)
: Предлагаю Perl скрипт, приведенный ниже. Буду его со временем дорабатывать. Этот скрипт, безусовно, иногда будет работать неправильно, так как не содержит в себе корректный парсер теха. Он основан на нескольких простых правилах -- перловских заменах.
Он позволяет автоматизировать значительную часть работы, но не 100%. [[Участник:Greck|Greck]] 12:15, 15 августа 2006 (UTC)
 
:* Установить Perl с сайта http://www.activestate.com (если вы под Windows)
:* Скопируйте текст приведенный на странице в файл <tt>tex2wiki.pl</tt> (копируйте из окна редактирования, так как некоторые моменты парсер wiki-разметки меняет).
:* В командной строчке набрать
> perl tex2wiki.pl < input.tex > output.wiki
 
 
#!/usr/bin/perl
########################################
#
# Transforms file in LaTeX (http://www.tug.org/) notation
# to file in Wikimedia notation (http://wikimedia.org)
#
#########################################
use strict;
local $/='\n';
my $t;
my %formules = ();
my $formula_count = 0;
my $task_count = 0;
$t = join ( "", <STDIN>);
# warn "Initial text: $t\n";
print do_the_job( $t );
#########################################
sub usage {
print <<END_USAGE
Transworms file in TeX (http://www.tug.org/) notation
to file in Wikimedia notation (http://wikimedia.org)
Usage:
./tex2wiki.pl < input_file > output_file
END_USAGE
}
sub do_the_job {
my $T = shift;
my $nobraces = '[^{}]*';
my $br1 = "$nobraces(\{$nobraces\})?$nobraces";
my $br2 = "$br1(\{$br1\})?$br1";
my $br3 = "$br2(\{$br2\})?$br2";
my $br4 = "$br3(\{$br3\})?$br3";
#$T =~ /(..)$/; warn "End chars1 = $1\n";
$T =~ s/---/—/g;
$T =~ s/--/–/g;
$T =~ s/``/«/g;
$T =~ s/''/»/g;
$T =~ s/~/\&nbsp;/g;
$T =~ s/(\\sloppy|\\noindent|\\\w+penalty=?\d+|\\end\{document\}|\\begin\{document\})//g;
$T =~ s/\$\s*\to\s*\$/\&rarr;/;
$T =~ s/\$(\d+)\$/$1/;
$T =~ s/\$\$([+-\d\.,]+|[a-zA-Z]{1,10})\$\$/\n:<i>$1<\/i>/g;
$T =~ s/\$([+-\d\.,]+|[a-zA-Z]{1,10})\$/<i>$1<\/i>/g;
$T =~ s/\$\$([^\$]+)\$\$/"\n:" . &do_formula($1) . "\n"/ge;
$T =~ s/\\begin\{equation\}([^\$]+)\\end\{equation\}/"\n:" . &do_formula($1) . "\n"/ge;
$T =~ s/\$([^\$]+)\$/&do_formula($1)/ge;
$T =~ s/</&lt;/g;
$T =~ s/>/&gt;/g;
$T =~ s/\&lt;i\&gt;/<i>/g;
$T =~ s/\&lt;\/i\&gt;/<\/i>/g;
$T =~ s/\&lt;b\&gt;/<b>/g;
$T =~ s/\&lt;\/b\&gt;/<\/b>/g;
$T =~ s/\&lt;math\&gt;/<math>/g;
$T =~ s/\&lt;\/math\&gt;/<\/math>/g;
$T =~ s/\\\%/\%/g;
$T =~ s/([^\\])?\\\{/${1}xxxOBRACE/g;
$T =~ s/([^\\])?\\\}/${1}xxxCBRACE/g;
$T =~ s/(\{\\bf\s*|\\textbf\{)($br4)\}/'''$2'''/g;
$T =~ s/(\{\\(it|em|sc)\s*|\\textit\{)($br4)\}/''$3''/g;
$T =~ s/(\{\\tt\*|\\texttt\{)($br4)\}/<tt>$2<\/tt>/g;
$T =~ s/\\section{\s*($br4)\s*\}\s*\n?/==$1==\n/g;
$T =~ s/\\subsection{\s*($br4)\s*\}\s*\n?/===$1===\n/g;
$T =~ s/\\subsubsection{\s*($br4)\s*\}\s*\n?/<b>$1<\/b>\n/g;
$T =~ s/\\ldots/\&hellip;/g; # BUG: should be done only out of formules
$T =~ s/\\\\s*\n;/<br\/>/g;
$T =~ s/\\begin\{center\}/\n\n<div align=\"center\">/g;
$T =~ s/\\end\{center\}/<\/div>\n\n/g;
$T =~ s/\\begin\{task\}((.|\n)+?)\\end\{task\}/&do_task($1)/ge;
$T =~ s/\\begin\{itemize\}((.|\n)+?)\\end\{itemize\}/&do_ilist($1)/ge;
$T =~ s/\\begin\{enumerate\}((.|\n)+?)\\end\{enumerate\}/&do_olist($1)/ge;
$T =~ s/xxxOBRACE/\{/g;
$T =~ s/xxxCBRACE/\}/g;
$T =~ s/\\label\{([^\}]*)\}/<b>($1)<\/b>/g;
$T =~ s/\\r[e]f\{([^\}]*)\}/<b>($1)<\/b>/g;
$T =~ s/\n\s*\n\s*\n+/\n\n/g;
$T =~ s/\\footnote\{($br4)\}/&do_note($1)/ge;
$T .= &flush_notes();
foreach my $k (keys %formules) {
$T =~ s/$k/$formules{$k}/;
}
return $T;
}
my @notes = ();
my $note_count = 0;
sub do_formula {
my $f = shift;
my $label;
$formula_count++;
my $formula_name = "__FORMULA${formula_count}__";
if($f =~ s/\\label\{([^\}]*)\}//) {
$label = $1;
$formules{$formula_name} = "<math>$f</math> <b>($label)</b>";
} else {
$formules{$formula_name} = "<math>$f</math>";
}
warn "$formula_name = $f\n";
return $formula_name;
}
sub do_note {
$_ = shift;
$note_count++;
$_ =~ s/\n/ /g;
my $id = "note$note_count";
push @notes, "# {{note|$id}} $_";
return "{{ref|$id}}";
}
sub do_ilist {
$_ = shift;
$_ =~ s/\n/ /g;
$_ =~ s/\s*\\item\s*/\n* /g;
return $_;
}
sub do_olist {
$_ = shift;
$_ =~ s/\n/ /g;
$_ =~ s/\s*\\item\s*/\n\# /g;
return $_;
}
sub do_task {
$_ = shift;
$task_count++;
return "\n\n<div class=\"task\"><b>Çàäà÷à $task_count.</b>\n\n $_\n\n<b>Êîíåö çàäà÷è.</b></div>\n\n";
}
sub flush_notes {
my $res = join("\n", @notes);
@notes = ();
return $res;
}
 
== Hello from en! ==
 
481

правка