Rozšíření:Replace Text
ReplaceText Stav rozšíření: stabilní |
|
---|---|
Implementace | Speciální stránka |
Popis | Poskytuje formulář, který umožňuje správcům nahrazovat řetězce na celé wiki, a to jak pro obsah stránky, tak pro názvy stránek |
Autoři | Yaron Koren <yaron57gmail.com> a Niklas Laxström |
Nejnovější verze | 1.8 |
Zásady kompatibility | Vydání snímků současně s MediaWiki. Hlavní vývojová větev není zpětně kompatibilní. |
MediaWiki | 1.31+ |
Licence | GNU General Public License 2.0 nebo novější |
Stáhnout | |
|
|
|
|
Veřejné wiki používající rozšíření | 1,812 (Ranked 200th) |
Přeložte rozšíření Replace Text, používá-li lokalizaci z translatewiki.net | |
Problémy | Otevřené úkoly · Nahlásit chybu |
Replace Text (nahradit text) je rozšíření MediaWiki, které poskytuje speciální stránku, stejně jako skript příkazového řádku, umožňující administrátorům provádět globální hledání a nahrazování řetězce na straně serveru v textu i názvech obsahových stránek wiki.
Operace nahrazení textu je odložená operace a je zařazena do fronty úloh.
Můžete spustit runJobs.php
ze složky maintenance
a okamžitě provést změnu a zpracovat frontu úloh.
Instalace
- Stáhněte soubor/y a vložte je do adresáře pojmenovaného
ReplaceText
ve vaší složceextensions/
.
Vývojáři a přispěvatelé kódu by si místo toho měli nainstalovat rozšíření from Git pomocí:cd extensions/
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/ReplaceText - Na konec vašeho souboru LocalSettings.php přidejte následující kód:
wfLoadExtension( 'ReplaceText' );
- Ve výchozím nastavení mají k funkci Replace Text (nahradit text) přístup pouze členové uživatelské skupiny "
sysop
". Množinu povolených uživatelů můžete přidat nebo upravit úpravou pole$wgGroupPermissions
vLocalSettings.php
. Chcete-li například přidat oprávnění pro uživatele "bureaucrat
" nebo "bot
", přidejte následující:$wgGroupPermissions['bureaucrat']['replacetext'] = true;
- Dokončeno – Přejděte na stránku Special:Version vaší wiki a zkontrolujte, zda bylo rozšíření úspěšně nainstalováno.
Použití
Replace text definuje speciální stránku na "Special:ReplaceText" (nebo její ekvivalent v jiném jazyce), která zpracovává globální vyhledávání a nahrazování. Také definuje skript replaceAll.php, který dělá totéž z příkazového řádku. Tato dokumentace nejprve pokryje speciální stránku a poté skript příkazového řádku.
Na stránce Special:ReplaceText se nejdříve zobrazí formulář pro administrátora, aby vyplnil podrobnosti o hledání a nahrazení: Administrátor zadá hledaný řetězec a jeho nahrazení, sadu jmenných prostorů, ve kterých se má hledat, a také volbu, zda má být textem na stránce nahrazen obsah, názvy stránek nebo obojí. Volitelně může správce také přidat dva další filtry: Název kategorie, do které musí patřit všechny stránky, a předponu, kterou musí všechny názvy stránek začínat. Když je tento formulář odeslán, zobrazí se seznam buď všech stránek, které obsahují daný hledaný řetězec, nebo všech stránek, jejichž názvy obsahují hledaný řetězec, nebo obojí. Vedle názvu každé stránky je zaškrtávací políčko pro každou stránku, takže lze zrušit výběr stránek, které uživatel nahradit nechce. Uživatel pak může kliknout na "Replace" a provést skutečnou změnu. Jakmile je nahrazení textu provedeno, nelze jej přímo vrátit zpět. I když vždy můžete spustit "reverzní" nahrazení, nahrazující nový řetězec původním řetězcem. Z tohoto důvodu, pokud je náhradní řetězec prázdný nebo se jedná o řetězec, který již na wiki existuje, se zobrazí uživateli varovná zpráva.
Pokud je hledaný řetězec na stránce obsažen vícekrát, bude nahrazen každý takový výskyt. Nahrazení každé stránky se zobrazí jako (malá) úprava wiki, přičemž správce, který provedl nahrazení textu, je uživatel, který provedl úpravu, a shrnutí úprav, které se zobrazí jako "Text replace: 'search string' to 'replacement string'" (nahrazení textu: 'hledaný řetězec' na 'náhradní řetězec').
Název stránky nelze přesunout do názvu, který již na wiki existuje, nebo do titulku, který má více řádků. Stránky, které nelze přesunout, budou jednoduše uvedeny na stránce "select" (vybrat) jako nepřemístitelné, bez zaškrtávacího políčka vedle nich.
Vyhledávání rozlišuje malá a velká písmena. Viz níže, jak nastavit, aby se nerozlišovala malá a velká písmena.
Důležité poznámky
- ReplaceText ve výchozím nastavení zpracovává pouze 250 stránek najednou. Chcete-li to změnit, můžete v LocalSettings.php nastavit
$wgReplaceTextResultsLimit
na vyšší hodnotu. Můžete však být omezenimax_input_vars
PHP. Pokud rozšíření hlásí takové varování, možná ho budete muset změnit. - Všechny náhrady jsou umístěny do fronty úloh. Pokud tedy musíte zpracovat velké množství stránek, budete muset spustit Replace Text a poté spustit "
runJobs.php
" (potenciálně vícekrát).
Použití regulárních výrazů
Pokud používáte databázi MySQL nebo PostgreSQL, uvidíte ve formuláři Special:ReplaceText zaškrtávací políčko "Use regular expressions" (použít regulární výrazy). Toto zaškrtávací políčko se nezobrazuje u databází SQLite, protože SQLite postrádá nativní operátor "REGEXP".
Pokud kliknete na toto zaškrtávací políčko, můžete v rámci vyhledávacích a nahrazovacích řetězců použít regular expressions neboli regulární výrazy. Sada povolených regulárních výrazů je v podstatě malá podmnožina sady regulárních výrazů PHP a MySQL/PostgreSQL. Speciální znaky, které lze použít ve vyhledávacím řetězci, jsou "( ) . * + ? [ ] |" a v rámci náhradního řetězce lze použít hodnoty jako $1, $2 atd. (Chcete-li je použít jako běžné znaky, stačí je nejprve opustit přidáním "\" – což byste také museli udělat se znakem "/".) Tato část nebude poskytovat návod na používání regulárních výrazů (článek na Wikipedii je dobrým místem, kde začít, stejně jako tato stránka na MySQL regexps), ale zde je základní příklad uvedený v inline vysvětlení:
- Vyhledávací řetězec -
a(.*)c
- Náhradní řetězec -
ac$1
To bude hledat stránky obsahující písmeno 'a', písmeno 'c' a jakýkoli text mezi nimi (označený ".*"). Tento prostřední text by pak umístil za 'a' a 'c' - "$1" v náhradním řetězci odkazuje na první prvek vyhledávacího řetězce obsaženého v závorkách (v tomto případě je pouze jeden).
Pro každou stránku, pro kterou je nahrazení skutečně voláno, by nahrazení nastalo pro každý výskyt hledaného řetězce, nejen pro jeden – stejně jako se to děje u běžného vyhledávání s neregulárními výrazy.
Složitější regulární výrazy
- Vyhledávací řetězec -
hello([0-9]*)\.([0-9]*)
- Náhradní řetězec -
$1,$2
To by nahradilo "hello222.555" slovy "222,555" a "hello2.55" with "2,55"
Nejprve se shoduje slovo "hello". V závorkách následuje výraz pro hledání libovolných číslic "0-9". Následující hvězdička najde více shod předchozího prvku. Závorky a hvězdička jsou uzavřeny v závorkách, shodujeme se s úplným výrazem a převedeme jej na $1. "\." znamená, že se jedná o skutečnou tečku, nikoli o speciální znak. Druhý výraz v závorkách je porovnán a vložen do $2.
Náhrady následované čísly
Následující nebude fungovat:
- Vyhledávací řetězec -
123(.*)456
- Náhradní řetězec -
$1123456
That's because the search will think the number of the replacement is 1123456, not 1. Místo toho byste měli mít následující:
- Náhradní řetězec -
{$1}123456
Obecně platí, že očíslované hodnoty můžete vždy uzavřít do složených závorek.
Vyhledávání bez rozlišení malých a velkých písmen
Chcete-li, aby se ve vyhledávání nerozlišovala malá a velká písmena, použijte regulární výraz a modifikátor bez ohledu na velikost písmen (?i)
:
- Vyhledávací řetězec -
(?i)iphone
- Náhradní řetězec -
iPhone
Výše uvedené sjednotí obal všech zmínek o iPhone/iphone/IPHONE na iPhone.
Zapouzdření časových razítek
Pokud máte text, který obsahuje časová razítka (např. z přepisu videa) ve tvaru hh:mm:ss
, kde hh
a mm
nejsou odsazeny nulou a hh:
nemusí být ani přítomny – jako například:
0:03 Blah blah blah 11:21 Blah blah blah 2:31:54 Blah blah blah
a chtěli byste zapouzdřit časová razítka, řekněme, značky span. Můžete udělat něco jako:
- Původní text:
((([01]?\d|2[0-3]):)?[0-5]?\d:[0-5]\d)
- Náhradní text:
<span class="timespan">$0</span>
Výsledkem by bylo:
<span class="timespan">0:03</span> Blah blah blah <span class="timespan">11:21</span> Blah blah blah <span class="timespan">2:31:54</span> Blah blah blah
(zvláštní poděkování: https://matrix.to/#/@alex.mashin:matrix.org)
Skript příkazového řádku: replaceAll.php
Nahradit text nabízí skript replaceAll.php v adresáři extensions/ReplaceText/maintenance
, který lze spustit z příkazového řádku a který provádí všechny stejné náhrady jako stránka Special:ReplaceText.
První dva argumenty pro tento skript by měly být hledaný text a nahrazující text. Tento můžete skript nazvat jednoduše takto:
php replaceAll.php "Leningrad" "St. Petersburg"
Pokud v náhradním řetězci použijete očíslované hodnoty jako $1, musíte je buď uvozovat dvojitými uvozovkami jako "ac\$1"
nebo použít jednoduché uvozovky.
Jinak shell na jejich místo umístí mezery, protože si myslí, že jde o proměnné.
Další možné argumenty/příznaky pro tento skript jsou:
Popis | Výchozí | |
---|---|---|
--dry-run |
najde pouze hledané texty, aniž byste museli provádět jakékoli skutečné nahrazování | |
--regex |
měly by se používat regulární výrazy | false
|
--user |
uživatel, kterému má přiřadit náhrady | uživatel s ID 1 |
--yes |
přeskočit všechny výzvy s předpokládaným "ano" | |
--summary |
nastaví vlastní souhrn úprav pro nahrazující úpravy | |
--rename |
přejmenuje názvy stránek namísto nahrazení obsahu | |
--bot-edit |
označte všechny náhrady jako úpravy robotem | |
--ns |
nastaví čárkami oddělený seznam jmenných prostorů, které se mají hledat | |
--nsall |
hledat ve všech jmenných prostorech; přepíše jakoukoli hodnotu nastavenou pro "--ns" | |
--replacements |
název souboru obsahujícího seznam náhrad, které mají být provedeny, oddělené tabulátory | |
--debug |
zobrazit prováděné náhrady | |
--category |
hledat pouze stránky v této kategorii | |
--prefix |
hledat pouze stránky, jejichž názvy začínají tímto řetězcem |
Kromě toho existují dva příznaky, které striktně vypisují užitečné informace, které nesouvisejí s konkrétní náhradou textu:
Popis | Výchozí | |
---|---|---|
--show-file-format |
zobrazit popis formátu souboru pro použití s --replacements
| |
--listns |
zobrazit seznam všech jmenných prostorů na této wiki |
(Všechny tyto možnosti můžete zobrazit také voláním "php replaceAll.php --help".)
Přiřazení náhrad uživateli
Ve výchozím nastavení jsou všechna nahrazení připsána v historii stránek uživateli, který je inicioval. Místo toho však můžete nechat náhrady připsat předem nastavenému uživateli – například účtu robota – přidáním řádku jako je tento do LocalSettings.php pod zahrnutím Replace Text:
$wgReplaceTextUser = "MyReplaceTextBot";
Zadané uživatelské jméno již musí mít účet na wiki. Bude přidáno do pole MediaWiki s uživatelskými jmény, ve kterých nemusí být zaregistrováno nebo přihlášeno.
Autoři
Replace Text byl většinou napsán Yaronem Korenem, dosažitelný na yaron57 gmail.com. Důležitými příspěvateli byli také Niklas Laxström, Ankit Garg (který přispěl velkou částí kódu regulárního výrazu), Mark Hershberger (který napsal skript příkazového řádku), Brent Laabs, Cindy Cicalese, Nikhil Kumar, Umherirrender, James Forrester, Fomafix, Marijn Khandel van Wezel a další
Historie verzí
Replace Text je aktuálně ve verzi 1.8. Zobrazit celou historii verzí .
Snímky obrazovky
Níže jsou obrázky pracovního postupu Replace Text. Nejprve je na Discourse DB zadána počáteční stránka, na které jsou zadány "George F. Will" a "George Will" pro cílový řetězec a nahrazující řetězec, a také nahrazující text v názvech stránek:
Poznámka: Zaškrtávací políčka "Vše" a "Žádné" se zobrazí pouze při použití vzhledu Vector nebo vzhledů na něm založených.
A takto vypadá stránka poté, co uživatel klikne na "Pokračovat":
Stisknutím tlačítka "Nahradit" nahradíte tuto hodnotu na všech uvedených stránkách a stránku na konci přesunete na novou hodnotu.
Známé problémy
- Samotné výměnné akce jsou strukturovány jako "úkoly" MediaWiki, aby se zajistilo, že systém nebude přetížen, pokud jich chce uživatel dělat více najednou. To znamená, že velká sada výměn nebude provedena okamžitě a jejich dokončení může trvat minuty, hodiny nebo i déle. Normálně se úlohy aktivují pokaždé, když je stránka zobrazena na wiki. Pro urychlení (nebo zpomalení) procesu můžete změnit počet spuštěných úloh při prohlížení stránky. Výchozí je 1. Požadavek Replace Text se tedy může zastavit brzy po svém spuštění, pokud na wiki není dostatek front-endové aktivity, aby překonala ostatní zdroje nových dávkových úloh. Informace o tom, jak změnit výchozí nastavení, naleznete na stránce $wgJobRunRate . Chcete-li přinutit wiki, aby okamžitě spouštěla všechny úlohy, přejděte do shellu a spusťte skript runJobs.php . Obecně neexistuje způsob, jak to udělat z frontendu wiki.
- Chcete-li, aby se úlohy spouštěly na zřídka používané wiki, například pracovní wiki pro malý hobby projektový tým, můžete například vynutit obnovení speciální stránky "Všechny stránky". To lze provést například pomocí následujícího shell skriptu na Unixu:
#!/bin/bash # $0 is the script name, $1 id the first ARG, $2 is second... ITERATIONS=$1 WAIT=$2 n=1 while [ $n -le $ITERATIONS ] do echo "Iteration $n/$ITERATIONS" # Získání speciální stránky, která musí být regenerována, vynutí spuštění úloh wiki zařazených do fronty, # výsledné stahování se zahodí wget -nv --output-document=/dev/null http://yourwiki.tld/index.php/Special:AllPages echo " wget OK" sleep $WAIT echo " wait OK" n=$(( n+1 )) done
- Pokud máte stále problém se spuštěním úloh Replace Text, můžete problém vyřešit přidáním následujícího do LocalSettings.php:
$wgRunJobsAsync = false;
- Aby se při přesunech stránek nevytvářela přesměrování (tj. pokud není zaškrtnuté políčko "Uložit staré názvy jako přesměrování na nové názvy"), budete muset příslušnému uživateli udělit oprávnění 'potlačit přesměrování'. Za předpokladu, že jste udělili oprávnění
replacetext
uživatelské skupinětrusted-editor
, budete muset do LocalSettings.php přidat následující:
$wgGroupPermissions['trusted-editor']['suppressredirect'] = true;
- Pokud jsou vaše revize komprimované (tj. pokud je v LocalSettings.php povoleno $wgCompressRevisions nebo byl skript compressOld.php proveden s volbou
-t gzip
), pak ReplaceText nebude fungovat, protože využívá dotazy SQL, které nemohou hledat komprimovaný text. (viz rozšíření MassEditRegex jako alternativu v tomto případě.) - Pokud máte velký počet náhrad, některé z nich nemusí být hotové, nebo se může zobrazit chybová zpráva "Musíte vybrat alespoň jeden jmenný prostor". V obou případech je to kvůli omezení počtu formulářových vstupů, které PHP akceptuje. To lze opravit několika způsoby:
- Pokud máte na svém serveru nainstalované rozšíření PHP Suhosin, může to být zdrojem problému. Můžete zvýšit hodnotu proměnných
suhosin.post.max_vars
asuhosin.request.max_vars
. Nebo jednoduše zkuste dočasně deaktivovat Suhosin, zatímco budete provádět výměny. - Nastavení PHP
max_input_vars
(dostupné od PHP 5.3.9) také ovlivňuje počet nahrazení, které můžete kdykoli provést - můžete zkusit nastavit velmi velké číslo, například 3000.
- Pokud máte na svém serveru nainstalované rozšíření PHP Suhosin, může to být zdrojem problému. Můžete zvýšit hodnotu proměnných
Překlad
Překlad Replace Text se provádí prostřednictvím translatewiki.net. překlad pro toto rozšíření je na translatewiki. Chcete-li přidat jazykové hodnoty nebo změnit stávající, měli byste si vytvořit účet na translatewiki.net a poté požádat administrátory o povolení k překladu určitého jazyka nebo jazyků na této stránce (toto je velmi jednoduchý proces). Jakmile budete mít oprávnění pro daný jazyk, můžete se přihlásit a přidávat nebo upravovat jakékoli zprávy, které chcete v tomto jazyce.
Související odkazy
- Extension:MassEditRegex - Podobné rozšíření využívající regulární výrazy k úpravě více stránek najednou
Toto rozšíření je zahrnuto v následujících wiki farmách/hostitelích a/nebo balíčcích: Toto není autoritativní seznam. Některé wiki farmy/hostitelé a/nebo balíčky mohou toto rozšíření obsahovat, i když zde nejsou uvedeny. Pro potvrzení se vždy obraťte na své wiki farmy/hostitele nebo balíček. |