Tento uživatelský účet slouží pro hromadné robotické editace na projektu. Bota spravuje uživatel Milda (jeho diskusní stránka).

Používá (mírně upravenou) sadu skriptů pywikipediabot doplněnou o skriptování v prostředí operačního systému Linux (bash, sed, Perl).

Níže jsou a budou publikovány některé postupy, které jsem využil při strojových editacích české verze Wikisource. Smyslem zveřejnění je jednak pro mě samotného mít možnost dohledat, co jsem jak dělal (jaký skript s jakými parametry jsem volal apod.), kódy ale mohou sloužit i jako inspirace jiným uživatelům. Upozorňuji však, že jsem z Linuxu zvyklý pracovat často stylem „udělej si sám“, takže možná dělám složitě něco, co jde jednoduše nebo pro co existuje specializovaný skript v pywikipediabot frameworku, pouze já jsem o něm nevěděl. ;-)

Obecně k regexpům

editovat
  • Aby neměly zvláštní funkci, escapují se znaky: ^$?+*.[](){}|.
  • Zahrnutí konců řádků do hledání bez ohledu na použitý operační systém: \r?\n?.
  • Aby tečce (libovolný znak) vyhovovalo víc řádků, je nutné použít parametr -dotall.

Zakládání kategorií

editovat
#!/bin/sh
i=2009
while [ $i -le 2052 ]; do
    sed -e "s/YYYY/$i/" tmp/hiddencat.wiki > tmp/hiddencat.wiki.$i
    python pagefromfile.py -start:___boundary___ -end:___boundary___ -file:tmp/hiddencat.wiki.$i -summary:hiddencat -minor -force -notitle
    i=$((i+1))
done

kde iniciální soubor tmp/hiddencat.wiki obsahuje:

___boundary___
'''Kategorie:Odkazy na díla volná od roku YYYY'''
__HIDDENCAT__
[[Kategorie:Stránky s odkazy na dosud chráněná díla]]
___boundary___

Přesuny stránek

editovat

V názvu některých stránek byla chyba způsobená OCR softwarem (záměna ě za ĕ).

cat tmp/zvonyazvonky.txt | { 
  while read NAZEV; do
    echo "$NAZEV" | grep 'ĕ' && \
    NOVYNAZEV=`echo "$NAZEV" | tr 'ĕ' 'ě'` && \
    python movepages.py -from:"$NAZEV" -to:"$NOVYNAZEV" -summary:'oprava ĕ/ě v názvu'
  done
}

Oprava znaků v textu stránek

editovat

Stránky obsahovaly, jako chybu způsobenou OCR softwarem, znaky ĕ namísto ě).

cat tmp/zvonyazvonky.txt | {
  while read NAZEV; do
    python replace.py -page:"$NAZEV" 'ĕ' 'ě' -summary:'oprava ĕ/ě' -always
  done
}

Varianta s vkládáním nových řádků (parametr -multiline), okolo značek <poem> skript vkládal nové řádky se značkou <section>:

python replace.py -multiline '<poem>' '<section begin="poem" />\n<poem>' '</poem>' '</poem>\n<section end="poem" />' -page:"$NAZEV" -summary:'vyznačení sekce pro transkluzi'

Náhrada s využitím regulárních výrazů

editovat

Použito na Wikipedii [1]. Syntaxe regulárních výrazů je z velké části podobná Perlu, ale předchozí výskyty se odkazují pomocí \1. V předpisu regulárního výrazu je nutné escapovat i svislítko na začátku výrazu. Skript defaultně vyžaduje potvrzování uložení každé stránky uživatelem, plně automatický režim se zapne volbou -always.

replace.py -regex '\[\[Soubor:Commons-logo[^]]*commons:Category:([^]]*)\]\]' '{{Commonscat v tabulce|\1}}' -page:"$NAZEV" -summary:'náhrada vložení odkazu na Commons šablonou'

Znaky pro začátek a konec řádku (^, $) fungují jen s volbou -multiline, ale $ mi nefunguje dobře, bere z CR+LF konce řádku jen LF, zatímco CR považuje za běžný znak. To se dá obojít pomocí \r?$:

replace.py -multiline -regex ' -\r?$' ' –' -page:"Sekáči/IX." -summary:'náhrada spojovníků na konci řádku pomlčkami'

Označení redakčních poznámek

editovat

Na stránkách, kde nebyly redakční poznámky v patřičné skupině, byla provedena náhrada <ref> za <ref group="red"> společně se změnou šablony {{References}} za {{Redakční poznámky}}, současně byla značka <br> nahrazena za XML validní <br />, v obou případech s odmazáním nadbytečných mezer tam, kde nejsou žádoucí.

replace.py -regex '{{[Rr]eferences(\|[^}]*)?}}' '{{Redakční poznámky\1}}' -regex ' *<ref> *' '<ref group="red">' -regex ' *</ref>' '</ref>' -regex ' *<br */?> *' '<br />' -page:"$TITLE" -summary:'úprava redakčních poznámek'

Bohužel mi nefungovaly parametry pro pagegenerators.py -links ani -transcludes, skript hlásil chybu, že vyžaduje sudý počet parametrů pro náhrady. Stránky jsem musel skriptu předhazovat jednotlivě.

Odstranění celých řádků vyhovujících vzorku nebo regulárnímu výrazu

editovat
replace.py -multiline -regex '== *Redakční poznámky *==\r\n' '' -regex '{{[Rr]eferences(\|[^}]*)?}}\r\n' '' -page:"$TITLE" -summary:'redakční poznámky nejsou'

Linkování stránek, které dosud neobsahovaly interwiki

editovat

Přidáním parametru -askhints skriptu interwiki.py, odkazy na jinojazyčné verze stránek se zapisují včetně jazykového kódu, i když jsou na domovském projektu. Zadávání hintů se ukončí odentrováním prázdného řádku:

$ interwiki.py -confirm -askhints
Which page to check: es:Alejandro Dumas (padre)
Getting 1 pages from wikisource:es...
NOTE: does not have any interwiki links
Give a hint (? to see pagetext): en:Author:Alexandre Dumas (1802-1870)
Give a hint (? to see pagetext):
Getting 1 pages from wikisource:en...

Přidávání řádků

editovat

Na Wikislovníku jsem potřeboval doplnit typ přídavného jména (měkké, tvrdé) tam, kde není uveden, tj. kde po sobě následující nadpisy === přídavné jméno === a ==== skloňování ==== oddělené žádným nebo jedním prázdným řádkem (tj. jedním nebo dvěma konci řádků). Aby nahrazování fungovalo jak má, bylo nutné hledat konce řádků jako \r\n (tj. CR+LF), ale nahrazovat je jen \n (tj. jen LF).

replace.py -multiline -regex "=== *přídavné jméno *===\r\n\r?\n?==== *skloňování *====" "=== přídavné jméno ===\n* ''měkké''\n\n==== skloňování ====" -cat:"Česká adjektiva" -summary:"/* přídavné jméno */ +typ"

Přesouvání části stránky na jiné místo na stránce

editovat

Provedeno na Wikizprávách, kde bylo potřeba odstranit {{Kategorie den|YYYY-MM-DD}} v závěru stránky a současně vložit {{Denní přehled}} na úplný začátek. Využívá triku, že se vše před vyhledaným vzorkem přesune za něj.

replace.py -dotall -regex '^(.*)\{\{[Kk]ategorie den[^\}]*\}\}\s*(.*)$' '{{Denní přehled}}\n\n\1\2' -summary:'náhrada šablon pro kategorizaci a navigaci v denních přehledech' -transcludes:'Kategorie den' -ns:0

Náhrady bez replace.py

editovat

Se starší verzí Pythonu jsem nucen používat i starší verzi frameworku pywikipedia a přestalo mi fungovat replace.py. Nouzové řešení pomocí mírně upraveného pagefromfile.py (aby při -force nevkládal upozornění na přepsaný text stránky):

project=wikiquote
summary="sjednocení názvu sekce souvisejících"
page="$1"
boundary="___boundary___"

wget "http://cs.$project.org/w/index.php?title=$page&action=raw" -O /tmp/stranka.txt
sed -e 's/^===*\s*Související[^=]*===*$/== Související ==/' \
    /tmp/stranka.txt > /tmp/stranka2.txt # provedení náhrady
# eventuelně zde jiné zpracování textu stránky

echo "$boundary" > /tmp/page.txt
echo "'''$page'''" >> /tmp/page.txt
cat /tmp/stranka2.txt >> /tmp/page.txt
echo >> /tmp/page.txt
echo "$boundary" >> /tmp/page.txt

diff /tmp/stranka.txt /tmp/stranka2.txt # zobrazení diffu mezi původní a upravenou stránkou
echo -n "Upload [[$page]]? [y/n] "
read answer
[ ".$answer" == ".y" ] && python pagefromfile.py -start:"$boundary" -end:"$boundary" \
                                 -file:/tmp/page.txt -summary:"$summary" \
                                 -minor -force -notitle -putthrottle:2

Původně jsem zamýšlel volat jako

cat seznam_stranek | while read page; do ./replace-using-pagefromfile.py "$page"; done

ale nefungovalo správně kvůli tomu, že read answer se četlo ze stejného vstupu jako seznam stránek, tudíž jsem si musel ze seznamu stránek prvně vygenerovat skript, který volal tento pro jednotlivé stránky.

Vkládání grantové šablony na diskusní stránky

editovat

Pozor, není zohledněna existence diskusní stránky; pokud existuje, přepíše se novým obsahem!

summary="{{Grant Přenosný skener}}"
page="$1"
boundary="___boundary___"

[ ".$page" == "." ] && exit 1

echo "$boundary" > /tmp/page.txt
echo "'''Diskuse:$page'''" >> /tmp/page.txt

if [ ".$2" == "." ]
  then
    echo "{{Grant Přenosný skener}}" >> /tmp/page.txt
  else
    echo "{{Grant Přenosný skener|stránek=$2}}" >> /tmp/page.txt
fi
echo "$boundary" >> /tmp/page.txt

cat /tmp/page.txt # kontrolní výpis
echo -n "Upload [[$page]]? [y/n] "
read answer
[ ".$answer" == ".y" ] && python pagefromfile.py -start:"$boundary" -end:"$boundary" \
                                 -file:/tmp/page.txt -summary:"$summary" \
                                 -minor -force -notitle -putthrottle:2

Skript se volá:

insert-grant-prenosny-skener.sh "Název stránky" N

kde N je číslo udávající počet stránek knižní předlohy, které byly při převádění textu zpracovány. Název stránky se předpokládá v hlavním jmenném prostoru (tj. skript založí stránku Diskuse:Název stránky; pokud je název stránky víceslovný nebo obsahuje znaky, které mají v shellu zvláštní význam, je nutné předat tento parametr v uvozovkách, apostrofech nebo escapovaný.

Zakládání autorských kategorií

editovat
project=wikisource
summary="založení"
page="$1"
namespace="Kategorie:"
boundary="___boundary___"

jmeno=${page% *} # vše od začátku po poslední mezeru
prijmeni=${page##* } # vše od poslední mezery do konce
if [ ${prijmeni:0:2} == Ch ]
  then pismeno=${prijmeni:0:2} # zohledněno příjmení začínající Ch
  else pismeno=${prijmeni:0:1}
fi

echo "$boundary" > /tmp/page.txt
echo "'''$namespace$page'''" >> /tmp/page.txt
echo "{{Hlavní článek|Autor:$page}}" >> /tmp/page.txt
echo "[[Kategorie:Autor-$pismeno|$prijmeni, $jmeno]]" >> /tmp/page.txt
echo >> /tmp/page.txt
echo "$boundary" >> /tmp/page.txt
echo >> /tmp/page.txt
cat /tmp/page.txt # kontrolní výpis
echo -n "Upload [[$page]]? [y/n] "
read answer
[ ".$answer" == ".y" ] && python pagefromfile.py -start:"$boundary" -end:"$boundary" \
                                 -file:/tmp/page.txt -summary:"$summary" \
                                 -minor -force -notitle -putthrottle:2

Skript se volá:

skript.sh "Jméno Příjmení"

Vstup může obsahovat i více křestních jmen; dělení vstupu na „jméno“ a „příjmení“ probíhá na poslední mezeře. Zařazení do písmenné kategorie tedy nefunguje správně, pokud je „příjmením“ jiná část vstupu než podřetězec od poslední mezery do konce.

Začíná-li příjmení digrafem „Ch“, je kategorie zařazena do nadřazené Kategorie:Autor-Ch.