Cswikisource-bot
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
editovatV 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
editovatStrá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ů
editovatPouž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
editovatNa 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
editovatreplace.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
editovatPř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ů
editovatNa 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
editovatProvedeno 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
editovatSe 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
editovatPozor, 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í
editovatproject=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.