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; | ||
| + | } | ||
| + | </ | ||
