Differences
This shows you the differences between two versions of the page.
— |
media2doku.pl [2008/07/09 11:08] (current) zeman vytvořeno |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== media2doku.pl ====== | ||
+ | <code perl># | ||
+ | # Převede zdroják Media Wiki (např. wiki StatMT CLIP UMIACS) do Doku Wiki (např. wiki ÚFAL MFF UK). | ||
+ | # (c) 2008 Dan Zeman < | ||
+ | # Licence: GNU GPL | ||
+ | |||
+ | use utf8; | ||
+ | use open ": | ||
+ | binmode(STDIN, | ||
+ | binmode(STDOUT, | ||
+ | binmode(STDERR, | ||
+ | |||
+ | # Načíst zdroják Media Wiki. | ||
+ | while(<> | ||
+ | { | ||
+ | $wiki .= $_; | ||
+ | } | ||
+ | # Převést konstrukce Media Wiki do pseudo-HTML. | ||
+ | $wiki =~ s/&/& | ||
+ | $wiki =~ s/</& | ||
+ | $wiki =~ s/>/& | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/''' | ||
+ | $wiki =~ s/'' | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | $wiki =~ s/ | ||
+ | # Tabulky mají složitější syntax, takže si nevystačíme pouze s regulárními výrazy. | ||
+ | while($wiki =~ s/ | ||
+ | { | ||
+ | my $tabulka = $1; | ||
+ | push(@tabulky, | ||
+ | $wiki =~ s/< | ||
+ | } | ||
+ | # Převést pseudo-HTML na konstrukce Doku Wiki. | ||
+ | $wiki =~ s/<a href=' | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/(<span .*?> | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | $wiki =~ s/< | ||
+ | # Tabulky mají složitější syntax, takže si nevystačíme pouze s regulárními výrazy. | ||
+ | while($wiki =~ s/< | ||
+ | { | ||
+ | my $index = $1; | ||
+ | my $tabulka = zakodovat_tabulku($tabulky[$index]); | ||
+ | $wiki =~ s/< | ||
+ | } | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/& | ||
+ | # Dokuwiki neumí většinu entit HTML, proto dekódovat i ty < a >, které už byly v kódu MediaWiki. | ||
+ | $wiki =~ s/& | ||
+ | $wiki =~ s/& | ||
+ | # Vypsat převedený zdroják na standardní výstup. | ||
+ | print($wiki); | ||
+ | |||
+ | |||
+ | |||
+ | # | ||
+ | # Rozebere tabulku v syntaxi Media Wiki a uloží ji jako pole buněk. | ||
+ | # | ||
+ | sub dekodovat_tabulku | ||
+ | { | ||
+ | my $tabulka = shift; | ||
+ | # Rozsekat kód tabulky na řádky. | ||
+ | my @radky_kodu = split(/ | ||
+ | # Projít řádky kódu, přečíst parametry celé tabulky a rozdělit kód podle řádků tabulky (což není totéž jako řádky kódu). | ||
+ | my $atributy_tabulky; | ||
+ | my @radky_tabulky; | ||
+ | foreach my $radek (@radky_kodu) | ||
+ | { | ||
+ | if($radek =~ m/ | ||
+ | { | ||
+ | $atributy_tabulky = $1; | ||
+ | } | ||
+ | elsif($radek =~ m/ | ||
+ | { | ||
+ | # Umazat úvodní svislítko. | ||
+ | $radek = $1; | ||
+ | $radek =~ s/^\s+//; | ||
+ | $radek =~ s/\s+$//; | ||
+ | my @bunky = split(/ | ||
+ | # Projít buňky a oddělit atributy od obsahu. | ||
+ | foreach my $bunka (@bunky) | ||
+ | { | ||
+ | my %bunka; | ||
+ | if($bunka =~ m/ | ||
+ | { | ||
+ | my $atributy = $1; | ||
+ | $bunka{obsah} = $2; | ||
+ | my @atributy = split(/ | ||
+ | foreach my $atribut (@atributy) | ||
+ | { | ||
+ | # $atribut nemůže obsahovat mezery, protože na mezerách jsme odsekávali atributy od sebe. | ||
+ | # Nemusíme se proto starat o mezery v následujícím regulárním výrazu. | ||
+ | if($atribut =~ m/ | ||
+ | { | ||
+ | $bunka{$1} = $2; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $bunka{$atribut}++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $bunka{obsah} = $bunka; | ||
+ | } | ||
+ | # V původním poli buněk nahradit řetězec odkazem na hash. | ||
+ | $bunka = \%bunka; | ||
+ | } | ||
+ | push(@radky_tabulky, | ||
+ | } | ||
+ | } | ||
+ | # Vytvořit hash z atributů a matice buněk a vrátit odkaz na něj. | ||
+ | my %tabulka = | ||
+ | ( | ||
+ | ' | ||
+ | ' | ||
+ | ); | ||
+ | return \%tabulka; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | # | ||
+ | # Vypíše tabulku v syntaxi Doku Wiki. | ||
+ | # | ||
+ | sub zakodovat_tabulku | ||
+ | { | ||
+ | my $tabulka = shift; # odkaz na hash s atributy a maticí buněk | ||
+ | my $kod; | ||
+ | # Dokuwiki neumí rowspany. Projít tabulku a vložit místo nich prázdné buňky. | ||
+ | for(my $i = 0; $i< | ||
+ | { | ||
+ | for(my $j = 0; $j< | ||
+ | { | ||
+ | if(exists($tabulka-> | ||
+ | { | ||
+ | # Na každý následující řádek v rowspanu přidat do příslušného místa prázdnou buňku. | ||
+ | for(my $k = $i+1; $k< | ||
+ | { | ||
+ | # Pokud má aktuální buňka také colspan, nezapomenout ho okopírovat i do vkládané prázdné buňky. | ||
+ | my %bunka = (' | ||
+ | if(exists($tabulka-> | ||
+ | { | ||
+ | $bunka{colspan} = $tabulka-> | ||
+ | } | ||
+ | splice(@{$tabulka-> | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | # Dokuwiki špatně snáší, když všechny řádky tabulky nemají stejný počet buněk. | ||
+ | # Zjistit počet buněk v nejdelším řádku tabulky. | ||
+ | my $max_delka_radku = 0; | ||
+ | foreach my $radek (@{$tabulka-> | ||
+ | { | ||
+ | my $delka_radku = 0; | ||
+ | foreach my $bunka (@{$radek}) | ||
+ | { | ||
+ | if(exists($bunka-> | ||
+ | { | ||
+ | $delka_radku += $bunka-> | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $delka_radku++; | ||
+ | } | ||
+ | } | ||
+ | $max_delka_radku = $delka_radku if($delka_radku> | ||
+ | } | ||
+ | # Doplnit řádky prázdnými buňkami na maximální počet. | ||
+ | foreach my $radek (@{$tabulka-> | ||
+ | { | ||
+ | my $delka_radku = 0; | ||
+ | foreach my $bunka (@{$radek}) | ||
+ | { | ||
+ | if(exists($bunka-> | ||
+ | { | ||
+ | $delka_radku += $bunka-> | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $delka_radku++; | ||
+ | } | ||
+ | } | ||
+ | # Vlastní doplňování začíná tady. | ||
+ | for(my $i = $delka_radku+1; | ||
+ | { | ||
+ | push(@{$radek}, | ||
+ | } | ||
+ | } | ||
+ | # Zakódovat tabulku v syntaxi Doku Wiki. | ||
+ | foreach my $radek (@{$tabulka-> | ||
+ | { | ||
+ | $kod .= join('', | ||
+ | { | ||
+ | my $vysledek = $_-> | ||
+ | $vysledek =~ s/^\s+//s; | ||
+ | $vysledek =~ s/\s+$//s; | ||
+ | if($_-> | ||
+ | { | ||
+ | $vysledek = " | ||
+ | } | ||
+ | elsif($_-> | ||
+ | { | ||
+ | $vysledek = " $vysledek | ||
+ | } | ||
+ | elsif($_-> | ||
+ | { | ||
+ | $vysledek = " | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $vysledek = " $vysledek "; | ||
+ | } | ||
+ | $vysledek = ' | ||
+ | for(my $i = 2; $i< | ||
+ | { | ||
+ | $vysledek .= ' | ||
+ | } | ||
+ | $vysledek; | ||
+ | } | ||
+ | (@{$radek}))." | ||
+ | } | ||
+ | return $kod; | ||
+ | } | ||
+ | </ |