<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://thirdworldcup.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Diman+Russkov</id>
	<title>ЧТМ - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://thirdworldcup.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Diman+Russkov"/>
	<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Diman_Russkov"/>
	<updated>2026-05-25T22:35:35Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A7%D0%A2%D0%9C:%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD&amp;diff=68411</id>
		<title>ЧТМ:Отладка/Перенос на основной домен</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A7%D0%A2%D0%9C:%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD&amp;diff=68411"/>
		<updated>2026-05-25T00:16:23Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;markdown&amp;gt;&lt;br /&gt;
Перенос сайта MediaWiki на новую версию и другую базу данных — это большая работа, и то, что вы успешно провели ее на тестовом домене, значительно упрощает задачу. &lt;br /&gt;
&lt;br /&gt;
Описанный вами план (переместить файлы, заменить старый сайт архивной копией и обновить параметр `$wgServer` в `LocalSettings.php`) действительно составляет основу процесса. Однако, чтобы перенос прошел безболезненно и без неожиданных сбоев, необходимо учесть еще несколько важных деталей.&lt;br /&gt;
&lt;br /&gt;
Ниже приведен чек-лист критических моментов и пошаговый план переноса.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### Что нужно проверить помимо `$wgServer`&lt;br /&gt;
&lt;br /&gt;
#### 1. Разделение баз данных (Тест vs Продакшн)&lt;br /&gt;
Если ваша тестовая база данных и продакшн-база будут находиться на одном сервере MySQL под одним именем, то переносить базу не нужно. Но **крайне рекомендуется** держать их отдельно (например, `wiki_test` и `wiki_prod`). &lt;br /&gt;
Если базы разные, вам потребуется:&lt;br /&gt;
*   Экспортировать дамп базы данных с тестового сайта и импортировать его в чисто созданную продакшн-базу.&lt;br /&gt;
*   Обновить в `LocalSettings.php` параметры подключения к БД: `$wgDBname`, `$wgDBuser`, `$wgDBpassword` и `$wgDBserver`.&lt;br /&gt;
&lt;br /&gt;
#### 2. Физические пути на сервере&lt;br /&gt;
Если на хостинге путь к основной папке сайта отличается от пути к тестовой (например, `/var/www/test-wiki/` и `/var/www/main-wiki/`), проверьте, чтобы в `LocalSettings.php` не было жестко прописанных старых путей. Обратите внимание на:&lt;br /&gt;
*   `$wgScriptPath` (если меняется вложенность папок, например, с `/test` на корневную директорию `/`).&lt;br /&gt;
*   `$wgUploadDirectory` и `$wgUploadPath` (если они заданы абсолютно, а не через относительный `$IP/images`).&lt;br /&gt;
*   `$wgCacheDirectory` или `$wgTmpDirectory`.&lt;br /&gt;
&lt;br /&gt;
#### 3. Права на папки (Permissions)&lt;br /&gt;
При перемещении файлов часто сбиваются права доступа. Веб-серверу (обычно пользователю `www-data`, `nginx` или `apache`) обязательно нужны права на запись в папку картинок:&lt;br /&gt;
*   Убедитесь, что для папки `images/` (и всех вложенных) установлены корректные права (обычно `755` или `775` и правильный владелец). В противном случае пользователи не смогут загружать новые медиафайлы.&lt;br /&gt;
&lt;br /&gt;
#### 4. Конфигурация веб-сервера (Nginx / Apache) и ЧПУ (Short URLs)&lt;br /&gt;
Если вы используете «красивые ссылки» (Short URLs, например, `/wiki/Заглавная_страница` вместо `/index.php?title=...`), убедитесь, что конфигурационный файл веб-сервера (например, `.htaccess` для Apache или конфигурация `nginx.conf`) для основного домена указывает на новую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
#### 5. Кэширование&lt;br /&gt;
MediaWiki активно кэширует данные. Чтобы избежать ситуации, когда старый дизайн или старые пути «зависли» в кэше:&lt;br /&gt;
*   Если у вас настроено объектное кэширование (Memcached, Redis, APCu) через параметр `$wgMainCacheType`, желательно очистить этот кэш.&lt;br /&gt;
*   Рекомендуется сбросить системный кэш локализации. Для этого запустите скрипт из консоли:&lt;br /&gt;
    ```bash&lt;br /&gt;
    php maintenance/rebuildLocalisationCache.php --force&lt;br /&gt;
    ```&lt;br /&gt;
*   Сбросьте кэш PHP OPcache (проще всего сделать это перезапуском веб-сервера или службы PHP-FPM).&lt;br /&gt;
&lt;br /&gt;
#### 6. Сессии и файлы Cookie&lt;br /&gt;
Чтобы у пользователей не возникло конфликтов сессий (поскольку домен изменился, а куки могли остаться старыми), рекомендуется временно изменить префикс кук в `LocalSettings.php`:&lt;br /&gt;
*   Найдите или добавьте параметр `$wgCookiePrefix` и задайте ему новое уникальное значение (например, измените `my_wiki_` на `my_wiki_v145_`). Это заставит всех пользователей просто заново авторизоваться на сайте, избежав ошибок сессии.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### Рекомендуемый пошаговый план переноса&lt;br /&gt;
&lt;br /&gt;
1.  **Подготовка:**&lt;br /&gt;
    *   Сделайте резервную копию файлов и базы данных старого сайта (1.34 на SQLite), а также тестового сайта (1.45 на MySQL).&lt;br /&gt;
    *   Включите на старом сайте режим «только чтение», добавив в его `LocalSettings.php` строку `$wgReadOnly = &#039;Переезд на новую версию...&#039;;` (если на нем еще кто-то успевает писать в этот момент).&lt;br /&gt;
2.  **Работа с БД (если базы разные):**&lt;br /&gt;
    *   Экспортируйте базу тестового сайта: `mysqldump -u имя -p имя_тест_бд &amp;gt; wiki_dump.sql`&lt;br /&gt;
    *   Импортируйте её в продакшн-базу: `mysql -u имя -p имя_прод_бд &amp;lt; wiki_dump.sql`&lt;br /&gt;
3.  **Перемещение файлов:**&lt;br /&gt;
    *   Переместите файлы старого сайта (1.34) в архивную папку (например, `old_wiki_backup`).&lt;br /&gt;
    *   Скопируйте файлы тестового сайта (1.45) в основную директорию вашего домена.&lt;br /&gt;
4.  **Корректировка `LocalSettings.php`:**&lt;br /&gt;
    *   Откройте файл в основной директории.&lt;br /&gt;
    *   Обновите `$wgServer` на адрес вашего основного домена (обязательно проверьте протокол `http://` или `https://`).&lt;br /&gt;
    *   При необходимости обновите параметры подключения к БД (`$wgDBname`, `$wgDBuser`, `$wgDBpassword`).&lt;br /&gt;
    *   Измените `$wgCookiePrefix` для сброса старых сессий.&lt;br /&gt;
5.  **Финальные штрихи на сервере:**&lt;br /&gt;
    *   Проверьте права доступа на папку `images/`.&lt;br /&gt;
    *   Обновите конфигурацию веб-сервера (Nginx/Apache), если пути к папкам на сервере изменились.&lt;br /&gt;
    *   Запустите из папки нового сайта консольный скрипт обновления (хуже не будет, он проверит целостность структуры БД):&lt;br /&gt;
        ```bash&lt;br /&gt;
        php maintenance/update.php&lt;br /&gt;
        ```&lt;br /&gt;
    *   Перезапустите PHP-FPM / Apache для очистки OPcache.&lt;br /&gt;
&lt;br /&gt;
После выполнения этих шагов зайдите на основной домен, проверьте авторизацию, отображение картинок, корректность работы поиска и ЧПУ.&lt;br /&gt;
&amp;lt;/markdown&amp;gt;&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A7%D0%A2%D0%9C:%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD&amp;diff=68410</id>
		<title>ЧТМ:Отладка/Перенос на основной домен</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A7%D0%A2%D0%9C:%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD&amp;diff=68410"/>
		<updated>2026-05-25T00:16:09Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Новая страница: «&amp;lt;markdown&amp;gt;  &amp;lt;/markdown&amp;gt;»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;markdown&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/markdown&amp;gt;&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A7%D0%A2%D0%9C:%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0&amp;diff=68409</id>
		<title>ЧТМ:Отладка</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A7%D0%A2%D0%9C:%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0&amp;diff=68409"/>
		<updated>2026-05-25T00:15:57Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Терминал ==&lt;br /&gt;
Обновление БД через браузер: &amp;lt;code&amp;gt;http://test.thirdworldcup.ru/mw-config/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Обновление БД через терминал&lt;br /&gt;
* сначала &amp;lt;code&amp;gt;cd ~/test.thirdworldcup.ru/public_html&amp;lt;/code&amp;gt;&lt;br /&gt;
* потом &amp;lt;code&amp;gt;php8.5 maintenance/run.php update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Скрипт обновления статистики участников:&lt;br /&gt;
* &amp;lt;code&amp;gt;php8.5 maintenance/run.php initSiteStats --update --active&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Очистка БД от текста безвозвратно удалённых страниц:&lt;br /&gt;
* &amp;lt;code&amp;gt;php8.5 maintenance/run.php purgeOldText --purge&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подстраницы ==&lt;br /&gt;
* [[/Технические права]]&lt;br /&gt;
* [[/Конфиг]]&lt;br /&gt;
* [[/AbuseFilter]]&lt;br /&gt;
* [[/Группы участников]]&lt;br /&gt;
* [[/Перенос на основной домен]]&lt;br /&gt;
&lt;br /&gt;
== Служебные ==&lt;br /&gt;
* [[Служебная:Права групп участников]]&lt;br /&gt;
* [[Служебная:Статистика]]&lt;br /&gt;
* [[Служебная:BatchTools]]&lt;br /&gt;
&lt;br /&gt;
== Разработка расширений ==&lt;br /&gt;
* [[Документ:BatchTools]]&lt;br /&gt;
* [[Документ:PersonalWhitelist]]&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_6&amp;diff=68397</id>
		<title>Тестовая страница 6</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_6&amp;diff=68397"/>
		<updated>2026-05-24T23:00:48Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Новая страница: «папаап»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;папаап&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_4&amp;diff=68396</id>
		<title>Тестовая страница 4</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_4&amp;diff=68396"/>
		<updated>2026-05-24T23:00:40Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Новая страница: «павпавпавп»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;павпавпавп&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-QuickEdit.js&amp;diff=68384</id>
		<title>MediaWiki:Gadget-QuickEdit.js</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-QuickEdit.js&amp;diff=68384"/>
		<updated>2026-05-24T20:56:58Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/** Quick Edit **/&lt;br /&gt;
&lt;br /&gt;
// Edit sections of a page without leaving the article&lt;br /&gt;
// [[en:w:User:BrandonXLF/QuickEdit]]&lt;br /&gt;
// By [[en:w:User:BrandonXLF]]&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
	var mobile = mw.config.get(&#039;skin&#039;) === &#039;minerva&#039;,&lt;br /&gt;
		apiSingleton,&lt;br /&gt;
		titleRegexp = new RegExp(&lt;br /&gt;
			mw.config.get(&#039;wgArticlePath&#039;).replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;).replace(/\\\$1/, &#039;([^?]+)&#039;) +&lt;br /&gt;
			&#039;|[?&amp;amp;]title=([^&amp;amp;#]*)&#039;&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	function api(func, params) {&lt;br /&gt;
		if (!apiSingleton) apiSingleton = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
		$.extend(params, {&lt;br /&gt;
			errorformat: &#039;html&#039;,&lt;br /&gt;
			errorlang: mw.config.get(&#039;wgUserLanguage&#039;),&lt;br /&gt;
			errorsuselocal: true&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		return apiSingleton[func](params).fail(function(_, data) {&lt;br /&gt;
			mw.notify(apiSingleton.getErrorMessage(data), {&lt;br /&gt;
				type: &#039;error&#039;,&lt;br /&gt;
				tag: &#039;quickedit&#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPageInfo(title, sectionID) {&lt;br /&gt;
		return api(&#039;get&#039;, {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			curtimestamp: 1,&lt;br /&gt;
			prop: &#039;revisions&#039;,&lt;br /&gt;
			indexpageids: 1,&lt;br /&gt;
			titles: title,&lt;br /&gt;
			rvprop: [&#039;timestamp&#039;, &#039;content&#039;],&lt;br /&gt;
			rvslots: &#039;main&#039;,&lt;br /&gt;
			rvsection: sectionID&lt;br /&gt;
		}).then(function(res) {&lt;br /&gt;
			var rev = res.query.pages[res.query.pageids[0]].revisions[0];&lt;br /&gt;
&lt;br /&gt;
			return {&lt;br /&gt;
				start: res.curtimestamp,&lt;br /&gt;
				base: rev.timestamp,&lt;br /&gt;
				full: rev.slots.main[&#039;*&#039;]&lt;br /&gt;
			};&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPreviewCallback(editor) {&lt;br /&gt;
		editor.children(&#039;.preview&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
		new OO.ui.ProgressBarWidget().$element.css({&lt;br /&gt;
			maxWidth: &#039;100%&#039;,&lt;br /&gt;
			borderRadius: &#039;0&#039;,&lt;br /&gt;
			boxShadow: &#039;none&#039;,&lt;br /&gt;
			margin: &#039;8px 0&#039;&lt;br /&gt;
		}).addClass(&#039;preview&#039;).appendTo(editor);&lt;br /&gt;
&lt;br /&gt;
		return function(html) {&lt;br /&gt;
			editor.children(&#039;.preview&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
			$(&#039;&amp;lt;div&amp;gt;&#039;).html(html).css({&lt;br /&gt;
				margin: &#039;8px 0&#039;,&lt;br /&gt;
				border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
				padding: &#039;8px&#039;,&lt;br /&gt;
				overflowX: &#039;hidden&#039;&lt;br /&gt;
			}).addClass(&#039;preview&#039;).appendTo(editor);&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showCompare(editor, title, from, to) {&lt;br /&gt;
		mw.loader.load(&#039;mediawiki.diff.styles&#039;);&lt;br /&gt;
&lt;br /&gt;
		api(&#039;post&#039;, {&lt;br /&gt;
			action: &#039;compare&#039;,&lt;br /&gt;
			fromslots: &#039;main&#039;,&lt;br /&gt;
			&#039;fromtext-main&#039;: from,&lt;br /&gt;
			fromtitle: title,&lt;br /&gt;
			frompst: &#039;true&#039;,&lt;br /&gt;
			toslots: &#039;main&#039;,&lt;br /&gt;
			&#039;totext-main&#039;: to,&lt;br /&gt;
			totitle: title,&lt;br /&gt;
			topst: &#039;true&#039;&lt;br /&gt;
		}).then(function(r) {&lt;br /&gt;
			return r.compare[&#039;*&#039;] ? $(&#039;&amp;lt;table&amp;gt;&#039;).addClass(&#039;diff&#039;).append(&lt;br /&gt;
				$(&#039;&amp;lt;colgroup&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-marker&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-content&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-marker&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-content&#039;)&lt;br /&gt;
				)&lt;br /&gt;
			).append(r.compare[&#039;*&#039;]) : &#039;Нет различий.&#039;;&lt;br /&gt;
		}).then(getPreviewCallback(editor));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Parts taken from EditPage::extractSectionTitle and Parser::stripSectionName&lt;br /&gt;
	function getSectionSummary(text) {&lt;br /&gt;
		var match = text.match(/^(=+)(.+)\1\s*(\n|$)/);&lt;br /&gt;
&lt;br /&gt;
		return !match ? &#039;&#039; : &#039;/* &#039; + match[2].trim()&lt;br /&gt;
			// Strip internal link markup&lt;br /&gt;
			.replace(/\[\[:?([^[|]+)\|([^[]+)\]\]/g, &#039;$2&#039;)&lt;br /&gt;
			.replace(/\[\[:?([^[]+)\|?\]\]/g, &#039;$1&#039;)&lt;br /&gt;
			// Strip external link markup&lt;br /&gt;
			.replace(new RegExp(&#039;\\[(?:&#039; + mw.config.get(&#039;wgUrlProtocols&#039;) + &#039;)([^ ]+?) ([^\\[]+)\\]&#039;, &#039;ig&#039;), &#039;$2&#039;)&lt;br /&gt;
			// Remove wikitext quotes&lt;br /&gt;
			.replace(/(&#039;&#039;|&#039;&#039;&#039;|&#039;&#039;&#039;&#039;&#039;)(?!&#039;)/g, &#039;&#039;)&lt;br /&gt;
			// Strip HTML tags&lt;br /&gt;
			.replace(/&amp;lt;[^&amp;gt;]+?&amp;gt;/g, &#039;&#039;) + &#039; */ &#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showEditor(el) {&lt;br /&gt;
		var progress = new OO.ui.ProgressBarWidget(),&lt;br /&gt;
			// https://www.mediawiki.org/wiki/Heading_HTML_changes&lt;br /&gt;
			// Cannot use .closest() because DiscussionTools nests an h2 within a .mw-heading&lt;br /&gt;
			heading = el.parents(&#039;:header, .mw-heading&#039;).last(),&lt;br /&gt;
			matcher = heading.nextUntil.bind(heading),&lt;br /&gt;
			inserter = heading.after.bind(heading),&lt;br /&gt;
			targetEl = el.siblings(&#039;.quickedit-target&#039;).last(),&lt;br /&gt;
			titleMatch = targetEl.attr(&#039;href&#039;).match(titleRegexp),&lt;br /&gt;
			title = decodeURIComponent(titleMatch[1] || titleMatch[2]),&lt;br /&gt;
			sectionID = /[?&amp;amp;]v?e?section=T?-?(\d*)/.exec(targetEl.attr(&#039;href&#039;))[1];&lt;br /&gt;
&lt;br /&gt;
		if (!heading.closest(&#039;.mw-parser-output&#039;).length) {&lt;br /&gt;
			var articleContent = $(&#039;#mw-content-text .mw-parser-output&#039;);&lt;br /&gt;
&lt;br /&gt;
			matcher = function(selector) {&lt;br /&gt;
				var child = articleContent.children(selector).first();&lt;br /&gt;
&lt;br /&gt;
				if (child.length) return child.prevAll();&lt;br /&gt;
				return articleContent.children();&lt;br /&gt;
			};&lt;br /&gt;
			inserter = articleContent.prepend.bind(articleContent);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		inserter(progress.$element.css({&lt;br /&gt;
			maxWidth: &#039;100%&#039;,&lt;br /&gt;
			borderRadius: &#039;0&#039;,&lt;br /&gt;
			boxShadow: &#039;none&#039;&lt;br /&gt;
		}));&lt;br /&gt;
&lt;br /&gt;
		el.addClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
		$(&#039;.quickedit-hide&#039;).removeClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
		$(&#039;.quickedit-heading&#039;).removeClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
		$(&#039;#quickedit-editor&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
		getPageInfo(title, sectionID).then(function(r) {&lt;br /&gt;
			var start = r.start,&lt;br /&gt;
				base = r.base,&lt;br /&gt;
				full = r.full,&lt;br /&gt;
				saving = false,&lt;br /&gt;
				expanded = false,&lt;br /&gt;
				remainderStart = full.match(/\n=+.+=+(?:\n|$)/),&lt;br /&gt;
				part =  remainderStart ? full.substring(0, remainderStart.index) : full,&lt;br /&gt;
				remainder = remainderStart ? full.substring(remainderStart.index) : &#039;&#039;,&lt;br /&gt;
				level = 0,&lt;br /&gt;
				editor;&lt;br /&gt;
&lt;br /&gt;
			full.replace(/^(=+).+?(=+)(?:\n|$)/, function(m, a, b) {&lt;br /&gt;
				level = Math.min(a.length, b.length);&lt;br /&gt;
				return m;&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			var levelMatch = &#039;h1&#039;;&lt;br /&gt;
			for (var i = 2; i &amp;lt;= level; i++)&lt;br /&gt;
				levelMatch += &#039;,h&#039; + i + &#039;:has(*), .mw-heading&#039; + i;&lt;br /&gt;
&lt;br /&gt;
			var partSection = matcher(&#039;:header:has(*), .mw-heading&#039;),&lt;br /&gt;
				fullSection = matcher(levelMatch),&lt;br /&gt;
				textarea = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: part&lt;br /&gt;
				}),&lt;br /&gt;
				summary = new OO.ui.TextInputWidget({&lt;br /&gt;
					value: getSectionSummary(part)&lt;br /&gt;
				}),&lt;br /&gt;
				minor = new OO.ui.CheckboxInputWidget(),&lt;br /&gt;
				save = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Сохранить&#039;,&lt;br /&gt;
					title: &#039;Сохранить изменения&#039;,&lt;br /&gt;
					flags: [&#039;primary&#039;, &#039;progressive&#039;],&lt;br /&gt;
					accessKey: &#039;s&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				preview = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Предпросмотр&#039;,&lt;br /&gt;
					title: &#039;Предварительный просмотр вики-текста&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				compare = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Сравнить&#039;,&lt;br /&gt;
					title: &#039;Показать различия между текущей версией и вашей&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				cancel = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					useInputTag: true,&lt;br /&gt;
					label: &#039;Отмена&#039;,&lt;br /&gt;
					title: &#039;Закрыть форму редактирования и отменить изменения&#039;,&lt;br /&gt;
					flags: [&#039;secondary&#039;, &#039;destructive&#039;]&lt;br /&gt;
				}),&lt;br /&gt;
				more = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;+&#039;,&lt;br /&gt;
					title: &#039;Редактировать весь раздел (включая подразделы)&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				buttons = new OO.ui.HorizontalLayout({&lt;br /&gt;
					items: [save, preview, compare, cancel]&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			if (part != full) {&lt;br /&gt;
				buttons.addItems([more], 3);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			partSection.addClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
			heading.addClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
			el.removeClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
			progress.$element.remove();&lt;br /&gt;
			textarea.$input.css({&lt;br /&gt;
				borderRadius: &#039;0&#039;&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			summary.on(&#039;enter&#039;, function() {&lt;br /&gt;
				save.emit(&#039;click&#039;);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			save.on(&#039;click&#039;, function() {&lt;br /&gt;
				if (saving) return;&lt;br /&gt;
&lt;br /&gt;
				var fullText = textarea.getValue() + (expanded ? &#039;&#039; : remainder);&lt;br /&gt;
				saving = true;&lt;br /&gt;
				save.setLabel(&#039;Сохранение...&#039;);&lt;br /&gt;
				compare.setDisabled(true);&lt;br /&gt;
				preview.setDisabled(true);&lt;br /&gt;
				cancel.setDisabled(true);&lt;br /&gt;
				more.setDisabled(true);&lt;br /&gt;
&lt;br /&gt;
				api(&#039;postWithEditToken&#039;, {&lt;br /&gt;
					action: &#039;edit&#039;,&lt;br /&gt;
					title: title,&lt;br /&gt;
					section: sectionID,&lt;br /&gt;
					summary: summary.getValue(),&lt;br /&gt;
					text: fullText,&lt;br /&gt;
					minor: minor.isSelected() ? true : undefined,&lt;br /&gt;
					notminor: minor.isSelected() ? undefined : true,&lt;br /&gt;
					starttimestamp: start,&lt;br /&gt;
					basetimestamp: base&lt;br /&gt;
				}).then(function() {&lt;br /&gt;
					api(&#039;get&#039;, {&lt;br /&gt;
						action: &#039;parse&#039;,&lt;br /&gt;
						page: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
						prop: [&#039;text&#039;, &#039;categorieshtml&#039;]&lt;br /&gt;
					}).then(function(r) {&lt;br /&gt;
						var contentText = $(&#039;#mw-content-text&#039;),&lt;br /&gt;
							catLinks = $(&#039;#catlinks&#039;);&lt;br /&gt;
&lt;br /&gt;
						contentText.find(&#039;.mw-parser-output&#039;).replaceWith(r.parse.text[&#039;*&#039;]);&lt;br /&gt;
						mw.hook(&#039;wikipage.content&#039;).fire(contentText);&lt;br /&gt;
&lt;br /&gt;
						catLinks.replaceWith(r.parse.categorieshtml[&#039;*&#039;]);&lt;br /&gt;
						mw.hook(&#039;wikipage.categories&#039;).fire(catLinks);&lt;br /&gt;
&lt;br /&gt;
						saving = false;&lt;br /&gt;
					});&lt;br /&gt;
				}, function(code) {&lt;br /&gt;
					if (code == &#039;editconflict&#039;) {&lt;br /&gt;
						showEditConflict(editor, title, sectionID, fullText).then(function(r) {&lt;br /&gt;
							start = r.start;&lt;br /&gt;
							base = r.base;&lt;br /&gt;
							textarea = r.textarea;&lt;br /&gt;
							expanded = true;&lt;br /&gt;
						});&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					compare.setDisabled(false);&lt;br /&gt;
					preview.setDisabled(false);&lt;br /&gt;
					cancel.setDisabled(false);&lt;br /&gt;
					more.setDisabled(expanded);&lt;br /&gt;
					saving = false;&lt;br /&gt;
					save.setLabel(&#039;Сохранить&#039;);&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			preview.on(&#039;click&#039;, function() {&lt;br /&gt;
				api(&#039;post&#039;, {&lt;br /&gt;
					action: &#039;parse&#039;,&lt;br /&gt;
					title: title,&lt;br /&gt;
					prop: &#039;text&#039;,&lt;br /&gt;
					pst: &#039;true&#039;,&lt;br /&gt;
					disablelimitreport: &#039;true&#039;,&lt;br /&gt;
					disableeditsection: &#039;true&#039;,&lt;br /&gt;
					sectionpreview: &#039;true&#039;,&lt;br /&gt;
					disabletoc: &#039;true&#039;,&lt;br /&gt;
					text: textarea.getValue()&lt;br /&gt;
				}).then(function(r) {&lt;br /&gt;
					return r.parse.text[&#039;*&#039;] + &#039;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
				}).then(getPreviewCallback(editor));&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			compare.on(&#039;click&#039;, function() {&lt;br /&gt;
				showCompare(editor, title, part + (expanded ? remainder : &#039;&#039;), textarea.getValue());&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			cancel.on(&#039;click&#039;, function() {&lt;br /&gt;
				editor.remove();&lt;br /&gt;
				heading.removeClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
				fullSection.removeClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			more.on(&#039;click&#039;, function() {&lt;br /&gt;
				expanded = true;&lt;br /&gt;
				textarea.setValue(textarea.getValue() + remainder);&lt;br /&gt;
				fullSection.addClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
				more.setDisabled(true);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			editor = $(&#039;&amp;lt;div id=&amp;quot;quickedit-editor&amp;quot;&amp;gt;&#039;).css({&lt;br /&gt;
				overflowX: &#039;hidden&#039;&lt;br /&gt;
			}).append(&lt;br /&gt;
				$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
					backgroundColor: &#039;#eaecf0&#039;,&lt;br /&gt;
					borderBottom: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
					marginBottom: &#039;8px&#039;&lt;br /&gt;
				}).append(&lt;br /&gt;
					textarea.$element.css({&lt;br /&gt;
						width: &#039;100%&#039;,&lt;br /&gt;
						maxWidth: &#039;100%&#039;,&lt;br /&gt;
						fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
					}).addClass(&#039;quickedit-textarea&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
							padding: &#039;8px 4px 8px 8px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						}).html(&#039;Описание&amp;amp;nbsp;правки:&#039;),&lt;br /&gt;
						summary.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							padding: &#039;8px 0px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						}),&lt;br /&gt;
						new OO.ui.FieldLayout(minor, {&lt;br /&gt;
							label: new OO.ui.HtmlSnippet(&#039;Малая&amp;amp;nbsp;правка?&#039;),&lt;br /&gt;
							align: &#039;inline&#039;&lt;br /&gt;
						}).$element.css({&lt;br /&gt;
							padding: &#039;8px 8px 8px 4px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						})&lt;br /&gt;
					),&lt;br /&gt;
					buttons.$element.css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;,&lt;br /&gt;
						padding: &#039;0 8px 8px 8px&#039;&lt;br /&gt;
					}),&lt;br /&gt;
					title !== mw.config.get(&#039;wgPageName&#039;) ? $(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;,&lt;br /&gt;
						padding: &#039;0px 8px 8px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						&#039;Редактирование страницы: &#039;,&lt;br /&gt;
						$(&#039;&amp;lt;a&amp;gt;&#039;).attr(&#039;href&#039;, mw.config.get(&#039;wgArticlePath&#039;).replace(&#039;$1&#039;, title)).css({&lt;br /&gt;
							fontWeight: &#039;bold&#039;&lt;br /&gt;
						}).text(title.replace(/_/g, &#039; &#039;))&lt;br /&gt;
					) : undefined&lt;br /&gt;
				)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			inserter(editor);&lt;br /&gt;
		}, function() {&lt;br /&gt;
			el.removeClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
			progress.$element.remove();&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showEditConflict(editor, title, sectionID, text) {&lt;br /&gt;
		return getPageInfo(title, sectionID).then(function(r) {&lt;br /&gt;
			var textarea = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: r.full&lt;br /&gt;
				}),&lt;br /&gt;
				textarea2 = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: text,&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function syncSize() {&lt;br /&gt;
				textarea.styleHeight = -1;&lt;br /&gt;
				textarea.adjustSize(true);&lt;br /&gt;
&lt;br /&gt;
				textarea2.styleHeight = -1;&lt;br /&gt;
				textarea2.adjustSize(true);&lt;br /&gt;
&lt;br /&gt;
				var height = Math.max(textarea.$input.height(), textarea2.$input.height());&lt;br /&gt;
				textarea.$input.height(height);&lt;br /&gt;
				textarea2.$input.height(height);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			textarea.$input.css({&lt;br /&gt;
				borderRadius: &#039;0&#039;&lt;br /&gt;
			});&lt;br /&gt;
			editor.find(&#039;&amp;gt; :first-child &amp;gt; :first-child&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
			$(&#039;&amp;lt;table&amp;gt;&#039;).css({&lt;br /&gt;
				width: &#039;100%&#039;,&lt;br /&gt;
				border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
				borderBottom: &#039;none&#039;,&lt;br /&gt;
				borderSpacing: &#039;0&#039;,&lt;br /&gt;
				margin: &#039;0 !important&#039;&lt;br /&gt;
			}).append(&lt;br /&gt;
				$(&#039;&amp;lt;tr&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;th&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						paddingTop: &#039;4px&#039;&lt;br /&gt;
					}).text(&#039;Их версия (которая будет сохранена)&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;th&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						paddingTop: &#039;4px&#039;&lt;br /&gt;
					}).text(&#039;Ваша версия&#039;)&lt;br /&gt;
				),&lt;br /&gt;
				$(&#039;&amp;lt;tr&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;td&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						padding: &#039;4px 4px 0 8px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						textarea.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
						})&lt;br /&gt;
					),&lt;br /&gt;
					$(&#039;&amp;lt;td&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						padding: &#039;4px 8px 0 4px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						textarea2.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
						})&lt;br /&gt;
					)&lt;br /&gt;
				)&lt;br /&gt;
			).prependTo(editor.find(&#039;&amp;gt; :first-child&#039;));&lt;br /&gt;
&lt;br /&gt;
			textarea.on(&#039;change&#039;, syncSize);&lt;br /&gt;
			textarea2.on(&#039;change&#039;, syncSize);&lt;br /&gt;
			syncSize();&lt;br /&gt;
			showCompare(editor, title, text, r.full);&lt;br /&gt;
&lt;br /&gt;
			r.textarea = textarea;&lt;br /&gt;
			return r;&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function clickHandler(e) {&lt;br /&gt;
		var el = $(e.target);&lt;br /&gt;
&lt;br /&gt;
		if (!el.hasClass(&#039;quickedit-editlink&#039;) || el.hasClass(&#039;quickedit-loading&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
		e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
		showEditor(el);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function addLinksToChildren(element) {&lt;br /&gt;
		element.find(&#039;#quickedit-editor, .quickedit-section&#039;).remove();&lt;br /&gt;
		element.find(&#039;.mw-editsection&#039;).each(function() {&lt;br /&gt;
			$(&#039;[href*=&amp;quot;section=&amp;quot;]&#039;, this).last().after(&lt;br /&gt;
				mobile ? &#039;&#039; : &#039;&amp;lt;span class=&amp;quot;quickedit-section&amp;quot;&amp;gt; | &amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
				$(&#039;&amp;lt;a&amp;gt;&#039;)&lt;br /&gt;
					.html(mobile ? &#039;&amp;amp;nbsp;Q&#039; : &#039;быстрое редактирование&#039;)&lt;br /&gt;
					.addClass(&#039;quickedit-section quickedit-editlink&#039;)&lt;br /&gt;
					.attr(&#039;href&#039;, &#039;#&#039;)&lt;br /&gt;
			).addClass(&#039;quickedit-target&#039;);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$.when(mw.loader.using(&#039;oojs-ui-core&#039;), $.ready).done(function() {&lt;br /&gt;
		var body = $(document.body);&lt;br /&gt;
&lt;br /&gt;
		body.on(&#039;click&#039;, clickHandler);&lt;br /&gt;
		addLinksToChildren(body);&lt;br /&gt;
		mw.hook(&#039;wikipage.content&#039;).add(addLinksToChildren);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	mw.loader.addStyleTag(&lt;br /&gt;
		&#039;.skin-minerva .mw-editsection { white-space: nowrap; }&#039; +&lt;br /&gt;
		&#039;.skin-minerva .content .collapsible-heading .quickedit-section { visibility: hidden; }&#039; +&lt;br /&gt;
		&#039;.skin-minerva .content .collapsible-heading.open-block .quickedit-section { visibility: visible; }&#039; +&lt;br /&gt;
		&#039;.quickedit-hide { display: none !important; }&#039; +&lt;br /&gt;
		&#039;.quickedit-loading, .quickedit-heading { color: #777; }&#039;&lt;br /&gt;
	);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-QuickEdit.js&amp;diff=68382</id>
		<title>MediaWiki:Gadget-QuickEdit.js</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-QuickEdit.js&amp;diff=68382"/>
		<updated>2026-05-24T20:55:36Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: локализация&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/** Quick Edit **/&lt;br /&gt;
&lt;br /&gt;
// Edit sections of a page without leaving the article&lt;br /&gt;
// [[en:w:User:BrandonXLF/QuickEdit]]&lt;br /&gt;
// By [[en:w:User:BrandonXLF]]&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
	var mobile = mw.config.get(&#039;skin&#039;) === &#039;minerva&#039;,&lt;br /&gt;
		apiSingleton,&lt;br /&gt;
		titleRegexp = new RegExp(&lt;br /&gt;
			mw.config.get(&#039;wgArticlePath&#039;).replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;).replace(/\\\$1/, &#039;([^?]+)&#039;) +&lt;br /&gt;
			&#039;|[?&amp;amp;]title=([^&amp;amp;#]*)&#039;&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	function api(func, params) {&lt;br /&gt;
		if (!apiSingleton) apiSingleton = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
		$.extend(params, {&lt;br /&gt;
			errorformat: &#039;html&#039;,&lt;br /&gt;
			errorlang: mw.config.get(&#039;wgUserLanguage&#039;),&lt;br /&gt;
			errorsuselocal: true&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		return apiSingleton[func](params).fail(function(_, data) {&lt;br /&gt;
			mw.notify(apiSingleton.getErrorMessage(data), {&lt;br /&gt;
				type: &#039;error&#039;,&lt;br /&gt;
				tag: &#039;quickedit&#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPageInfo(title, sectionID) {&lt;br /&gt;
		return api(&#039;get&#039;, {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			curtimestamp: 1,&lt;br /&gt;
			prop: &#039;revisions&#039;,&lt;br /&gt;
			indexpageids: 1,&lt;br /&gt;
			titles: title,&lt;br /&gt;
			rvprop: [&#039;timestamp&#039;, &#039;content&#039;],&lt;br /&gt;
			rvslots: &#039;main&#039;,&lt;br /&gt;
			rvsection: sectionID&lt;br /&gt;
		}).then(function(res) {&lt;br /&gt;
			var rev = res.query.pages[res.query.pageids[0]].revisions[0];&lt;br /&gt;
&lt;br /&gt;
			return {&lt;br /&gt;
				start: res.curtimestamp,&lt;br /&gt;
				base: rev.timestamp,&lt;br /&gt;
				full: rev.slots.main[&#039;*&#039;]&lt;br /&gt;
			};&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPreviewCallback(editor) {&lt;br /&gt;
		editor.children(&#039;.preview&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
		new OO.ui.ProgressBarWidget().$element.css({&lt;br /&gt;
			maxWidth: &#039;100%&#039;,&lt;br /&gt;
			borderRadius: &#039;0&#039;,&lt;br /&gt;
			boxShadow: &#039;none&#039;,&lt;br /&gt;
			margin: &#039;8px 0&#039;&lt;br /&gt;
		}).addClass(&#039;preview&#039;).appendTo(editor);&lt;br /&gt;
&lt;br /&gt;
		return function(html) {&lt;br /&gt;
			editor.children(&#039;.preview&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
			$(&#039;&amp;lt;div&amp;gt;&#039;).html(html).css({&lt;br /&gt;
				margin: &#039;8px 0&#039;,&lt;br /&gt;
				border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
				padding: &#039;8px&#039;,&lt;br /&gt;
				overflowX: &#039;hidden&#039;&lt;br /&gt;
			}).addClass(&#039;preview&#039;).appendTo(editor);&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showCompare(editor, title, from, to) {&lt;br /&gt;
		mw.loader.load(&#039;mediawiki.diff.styles&#039;);&lt;br /&gt;
&lt;br /&gt;
		api(&#039;post&#039;, {&lt;br /&gt;
			action: &#039;compare&#039;,&lt;br /&gt;
			fromslots: &#039;main&#039;,&lt;br /&gt;
			&#039;fromtext-main&#039;: from,&lt;br /&gt;
			fromtitle: title,&lt;br /&gt;
			frompst: &#039;true&#039;,&lt;br /&gt;
			toslots: &#039;main&#039;,&lt;br /&gt;
			&#039;totext-main&#039;: to,&lt;br /&gt;
			totitle: title,&lt;br /&gt;
			topst: &#039;true&#039;&lt;br /&gt;
		}).then(function(r) {&lt;br /&gt;
			return r.compare[&#039;*&#039;] ? $(&#039;&amp;lt;table&amp;gt;&#039;).addClass(&#039;diff&#039;).append(&lt;br /&gt;
				$(&#039;&amp;lt;colgroup&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-marker&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-content&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-marker&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-content&#039;)&lt;br /&gt;
				)&lt;br /&gt;
			).append(r.compare[&#039;*&#039;]) : &#039;Нет различий.&#039;;&lt;br /&gt;
		}).then(getPreviewCallback(editor));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Parts taken from EditPage::extractSectionTitle and Parser::stripSectionName&lt;br /&gt;
	function getSectionSummary(text) {&lt;br /&gt;
		var match = text.match(/^(=+)(.+)\1\s*(\n|$)/);&lt;br /&gt;
&lt;br /&gt;
		return !match ? &#039;&#039; : &#039;/* &#039; + match[2].trim()&lt;br /&gt;
			// Strip internal link markup&lt;br /&gt;
			.replace(/\[\[:?([^[|]+)\|([^[]+)\]\]/g, &#039;$2&#039;)&lt;br /&gt;
			.replace(/\[\[:?([^[]+)\|?\]\]/g, &#039;$1&#039;)&lt;br /&gt;
			// Strip external link markup&lt;br /&gt;
			.replace(new RegExp(&#039;\\[(?:&#039; + mw.config.get(&#039;wgUrlProtocols&#039;) + &#039;)([^ ]+?) ([^\\[]+)\\]&#039;, &#039;ig&#039;), &#039;$2&#039;)&lt;br /&gt;
			// Remove wikitext quotes&lt;br /&gt;
			.replace(/(&#039;&#039;|&#039;&#039;&#039;|&#039;&#039;&#039;&#039;&#039;)(?!&#039;)/g, &#039;&#039;)&lt;br /&gt;
			// Strip HTML tags&lt;br /&gt;
			.replace(/&amp;lt;[^&amp;gt;]+?&amp;gt;/g, &#039;&#039;) + &#039; */ &#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showEditor(el) {&lt;br /&gt;
		var progress = new OO.ui.ProgressBarWidget(),&lt;br /&gt;
			// https://www.mediawiki.org/wiki/Heading_HTML_changes&lt;br /&gt;
			// Cannot use .closest() because DiscussionTools nests an h2 within a .mw-heading&lt;br /&gt;
			heading = el.parents(&#039;:header, .mw-heading&#039;).last(),&lt;br /&gt;
			matcher = heading.nextUntil.bind(heading),&lt;br /&gt;
			inserter = heading.after.bind(heading),&lt;br /&gt;
			targetEl = el.siblings(&#039;.quickedit-target&#039;).last(),&lt;br /&gt;
			titleMatch = targetEl.attr(&#039;href&#039;).match(titleRegexp),&lt;br /&gt;
			title = decodeURIComponent(titleMatch[1] || titleMatch[2]),&lt;br /&gt;
			sectionID = /[?&amp;amp;]v?e?section=T?-?(\d*)/.exec(targetEl.attr(&#039;href&#039;))[1];&lt;br /&gt;
&lt;br /&gt;
		if (!heading.closest(&#039;.mw-parser-output&#039;).length) {&lt;br /&gt;
			var articleContent = $(&#039;#mw-content-text .mw-parser-output&#039;);&lt;br /&gt;
&lt;br /&gt;
			matcher = function(selector) {&lt;br /&gt;
				var child = articleContent.children(selector).first();&lt;br /&gt;
&lt;br /&gt;
				if (child.length) return child.prevAll();&lt;br /&gt;
				return articleContent.children();&lt;br /&gt;
			};&lt;br /&gt;
			inserter = articleContent.prepend.bind(articleContent);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		inserter(progress.$element.css({&lt;br /&gt;
			maxWidth: &#039;100%&#039;,&lt;br /&gt;
			borderRadius: &#039;0&#039;,&lt;br /&gt;
			boxShadow: &#039;none&#039;&lt;br /&gt;
		}));&lt;br /&gt;
&lt;br /&gt;
		el.addClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
		$(&#039;.quickedit-hide&#039;).removeClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
		$(&#039;.quickedit-heading&#039;).removeClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
		$(&#039;#quickedit-editor&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
		getPageInfo(title, sectionID).then(function(r) {&lt;br /&gt;
			var start = r.start,&lt;br /&gt;
				base = r.base,&lt;br /&gt;
				full = r.full,&lt;br /&gt;
				saving = false,&lt;br /&gt;
				expanded = false,&lt;br /&gt;
				remainderStart = full.match(/\n=+.+=+(?:\n|$)/),&lt;br /&gt;
				part =  remainderStart ? full.substring(0, remainderStart.index) : full,&lt;br /&gt;
				remainder = remainderStart ? full.substring(remainderStart.index) : &#039;&#039;,&lt;br /&gt;
				level = 0,&lt;br /&gt;
				editor;&lt;br /&gt;
&lt;br /&gt;
			full.replace(/^(=+).+?(=+)(?:\n|$)/, function(m, a, b) {&lt;br /&gt;
				level = Math.min(a.length, b.length);&lt;br /&gt;
				return m;&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			var levelMatch = &#039;h1&#039;;&lt;br /&gt;
			for (var i = 2; i &amp;lt;= level; i++)&lt;br /&gt;
				levelMatch += &#039;,h&#039; + i + &#039;:has(*), .mw-heading&#039; + i;&lt;br /&gt;
&lt;br /&gt;
			var partSection = matcher(&#039;:header:has(*), .mw-heading&#039;),&lt;br /&gt;
				fullSection = matcher(levelMatch),&lt;br /&gt;
				textarea = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: part&lt;br /&gt;
				}),&lt;br /&gt;
				summary = new OO.ui.TextInputWidget({&lt;br /&gt;
					value: getSectionSummary(part)&lt;br /&gt;
				}),&lt;br /&gt;
				minor = new OO.ui.CheckboxInputWidget(),&lt;br /&gt;
				save = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Сохранить&#039;,&lt;br /&gt;
					title: &#039;Сохранить изменения&#039;,&lt;br /&gt;
					flags: [&#039;primary&#039;, &#039;progressive&#039;],&lt;br /&gt;
					accessKey: &#039;s&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				preview = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Предпросмотр&#039;,&lt;br /&gt;
					title: &#039;Предварительный просмотр вики-текста&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				compare = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Сравнить&#039;,&lt;br /&gt;
					title: &#039;Показать различия между текущей версией и вашей&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				cancel = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					useInputTag: true,&lt;br /&gt;
					label: &#039;Отмена&#039;,&lt;br /&gt;
					title: &#039;Закрыть форму редактирования и отменить изменения&#039;,&lt;br /&gt;
					flags: [&#039;secondary&#039;, &#039;destructive&#039;]&lt;br /&gt;
				}),&lt;br /&gt;
				more = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;+&#039;,&lt;br /&gt;
					title: &#039;Редактировать весь раздел (включая подразделы)&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				buttons = new OO.ui.HorizontalLayout({&lt;br /&gt;
					items: [save, preview, compare, cancel]&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			if (part != full) {&lt;br /&gt;
				buttons.addItems([more], 3);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			partSection.addClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
			heading.addClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
			el.removeClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
			progress.$element.remove();&lt;br /&gt;
			textarea.$input.css({&lt;br /&gt;
				borderRadius: &#039;0&#039;&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			summary.on(&#039;enter&#039;, function() {&lt;br /&gt;
				save.emit(&#039;click&#039;);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			save.on(&#039;click&#039;, function() {&lt;br /&gt;
				if (saving) return;&lt;br /&gt;
&lt;br /&gt;
				var fullText = textarea.getValue() + (expanded ? &#039;&#039; : remainder);&lt;br /&gt;
				saving = true;&lt;br /&gt;
				save.setLabel(&#039;Сохранение...&#039;);&lt;br /&gt;
				compare.setDisabled(true);&lt;br /&gt;
				preview.setDisabled(true);&lt;br /&gt;
				cancel.setDisabled(true);&lt;br /&gt;
				more.setDisabled(true);&lt;br /&gt;
&lt;br /&gt;
				api(&#039;postWithEditToken&#039;, {&lt;br /&gt;
					action: &#039;edit&#039;,&lt;br /&gt;
					title: title,&lt;br /&gt;
					section: sectionID,&lt;br /&gt;
					summary: summary.getValue(),&lt;br /&gt;
					text: fullText,&lt;br /&gt;
					minor: minor.isSelected() ? true : undefined,&lt;br /&gt;
					notminor: minor.isSelected() ? undefined : true,&lt;br /&gt;
					starttimestamp: start,&lt;br /&gt;
					basetimestamp: base&lt;br /&gt;
				}).then(function() {&lt;br /&gt;
					api(&#039;get&#039;, {&lt;br /&gt;
						action: &#039;parse&#039;,&lt;br /&gt;
						page: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
						prop: [&#039;text&#039;, &#039;categorieshtml&#039;]&lt;br /&gt;
					}).then(function(r) {&lt;br /&gt;
						var contentText = $(&#039;#mw-content-text&#039;),&lt;br /&gt;
							catLinks = $(&#039;#catlinks&#039;);&lt;br /&gt;
&lt;br /&gt;
						contentText.find(&#039;.mw-parser-output&#039;).replaceWith(r.parse.text[&#039;*&#039;]);&lt;br /&gt;
						mw.hook(&#039;wikipage.content&#039;).fire(contentText);&lt;br /&gt;
&lt;br /&gt;
						catLinks.replaceWith(r.parse.categorieshtml[&#039;*&#039;]);&lt;br /&gt;
						mw.hook(&#039;wikipage.categories&#039;).fire(catLinks);&lt;br /&gt;
&lt;br /&gt;
						saving = false;&lt;br /&gt;
					});&lt;br /&gt;
				}, function(code) {&lt;br /&gt;
					if (code == &#039;editconflict&#039;) {&lt;br /&gt;
						showEditConflict(editor, title, sectionID, fullText).then(function(r) {&lt;br /&gt;
							start = r.start;&lt;br /&gt;
							base = r.base;&lt;br /&gt;
							textarea = r.textarea;&lt;br /&gt;
							expanded = true;&lt;br /&gt;
						});&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					compare.setDisabled(false);&lt;br /&gt;
					preview.setDisabled(false);&lt;br /&gt;
					cancel.setDisabled(false);&lt;br /&gt;
					more.setDisabled(expanded);&lt;br /&gt;
					saving = false;&lt;br /&gt;
					save.setLabel(&#039;Сохранить&#039;);&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			preview.on(&#039;click&#039;, function() {&lt;br /&gt;
				api(&#039;post&#039;, {&lt;br /&gt;
					action: &#039;parse&#039;,&lt;br /&gt;
					title: title,&lt;br /&gt;
					prop: &#039;text&#039;,&lt;br /&gt;
					pst: &#039;true&#039;,&lt;br /&gt;
					disablelimitreport: &#039;true&#039;,&lt;br /&gt;
					disableeditsection: &#039;true&#039;,&lt;br /&gt;
					sectionpreview: &#039;true&#039;,&lt;br /&gt;
					disabletoc: &#039;true&#039;,&lt;br /&gt;
					text: textarea.getValue()&lt;br /&gt;
				}).then(function(r) {&lt;br /&gt;
					return r.parse.text[&#039;*&#039;] + &#039;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
				}).then(getPreviewCallback(editor));&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			compare.on(&#039;click&#039;, function() {&lt;br /&gt;
				showCompare(editor, title, part + (expanded ? remainder : &#039;&#039;), textarea.getValue());&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			cancel.on(&#039;click&#039;, function() {&lt;br /&gt;
				editor.remove();&lt;br /&gt;
				heading.removeClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
				fullSection.removeClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			more.on(&#039;click&#039;, function() {&lt;br /&gt;
				expanded = true;&lt;br /&gt;
				textarea.setValue(textarea.getValue() + remainder);&lt;br /&gt;
				fullSection.addClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
				more.setDisabled(true);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			editor = $(&#039;&amp;lt;div id=&amp;quot;quickedit-editor&amp;quot;&amp;gt;&#039;).css({&lt;br /&gt;
				overflowX: &#039;hidden&#039;&lt;br /&gt;
			}).append(&lt;br /&gt;
				$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
					backgroundColor: &#039;#eaecf0&#039;,&lt;br /&gt;
					borderBottom: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
					marginBottom: &#039;8px&#039;&lt;br /&gt;
				}).append(&lt;br /&gt;
					textarea.$element.css({&lt;br /&gt;
						width: &#039;100%&#039;,&lt;br /&gt;
						maxWidth: &#039;100%&#039;,&lt;br /&gt;
						fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
					}).addClass(&#039;quickedit-textarea&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
							padding: &#039;8px 4px 8px 8px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						}).html(&#039;Описание&amp;amp;nbsp;правки:&#039;),&lt;br /&gt;
						summary.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							padding: &#039;8px 0px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						}),&lt;br /&gt;
						new OO.ui.FieldLayout(minor, {&lt;br /&gt;
							label: new OO.ui.HtmlSnippet(&#039;Малая&amp;amp;nbsp;правка?&#039;),&lt;br /&gt;
							align: &#039;inline&#039;&lt;br /&gt;
						}).$element.css({&lt;br /&gt;
							padding: &#039;8px 8px 8px 4px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						})&lt;br /&gt;
					),&lt;br /&gt;
					buttons.$element.css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;,&lt;br /&gt;
						padding: &#039;0 8px 8px 8px&#039;&lt;br /&gt;
					}),&lt;br /&gt;
					title !== mw.config.get(&#039;wgPageName&#039;) ? $(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;,&lt;br /&gt;
						padding: &#039;0px 8px 8px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						&#039;Редактирование страницы: &#039;,&lt;br /&gt;
						$(&#039;&amp;lt;a&amp;gt;&#039;).attr(&#039;href&#039;, mw.config.get(&#039;wgArticlePath&#039;).replace(&#039;$1&#039;, title)).css({&lt;br /&gt;
							fontWeight: &#039;bold&#039;&lt;br /&gt;
						}).text(title.replace(/_/g, &#039; &#039;))&lt;br /&gt;
					) : undefined&lt;br /&gt;
				)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			inserter(editor);&lt;br /&gt;
		}, function() {&lt;br /&gt;
			el.removeClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
			progress.$element.remove();&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showEditConflict(editor, title, sectionID, text) {&lt;br /&gt;
		return getPageInfo(title, sectionID).then(function(r) {&lt;br /&gt;
			var textarea = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: r.full&lt;br /&gt;
				}),&lt;br /&gt;
				textarea2 = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: text,&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function syncSize() {&lt;br /&gt;
				textarea.styleHeight = -1;&lt;br /&gt;
				textarea.adjustSize(true);&lt;br /&gt;
&lt;br /&gt;
				textarea2.styleHeight = -1;&lt;br /&gt;
				textarea2.adjustSize(true);&lt;br /&gt;
&lt;br /&gt;
				var height = Math.max(textarea.$input.height(), textarea2.$input.height());&lt;br /&gt;
				textarea.$input.height(height);&lt;br /&gt;
				textarea2.$input.height(height);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			textarea.$input.css({&lt;br /&gt;
				borderRadius: &#039;0&#039;&lt;br /&gt;
			});&lt;br /&gt;
			editor.find(&#039;&amp;gt; :first-child &amp;gt; :first-child&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
			$(&#039;&amp;lt;table&amp;gt;&#039;).css({&lt;br /&gt;
				width: &#039;100%&#039;,&lt;br /&gt;
				border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
				borderBottom: &#039;none&#039;,&lt;br /&gt;
				borderSpacing: &#039;0&#039;,&lt;br /&gt;
				margin: &#039;0 !important&#039;&lt;br /&gt;
			}).append(&lt;br /&gt;
				$(&#039;&amp;lt;tr&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;th&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						paddingTop: &#039;4px&#039;&lt;br /&gt;
					}).text(&#039;Их версия (которая будет сохранена)&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;th&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						paddingTop: &#039;4px&#039;&lt;br /&gt;
					}).text(&#039;Ваша версия&#039;)&lt;br /&gt;
				),&lt;br /&gt;
				$(&#039;&amp;lt;tr&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;td&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						padding: &#039;4px 4px 0 8px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						textarea.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
						})&lt;br /&gt;
					),&lt;br /&gt;
					$(&#039;&amp;lt;td&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						padding: &#039;4px 8px 0 4px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						textarea2.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
						})&lt;br /&gt;
					)&lt;br /&gt;
				)&lt;br /&gt;
			).prependTo(editor.find(&#039;&amp;gt; :first-child&#039;));&lt;br /&gt;
&lt;br /&gt;
			textarea.on(&#039;change&#039;, syncSize);&lt;br /&gt;
			textarea2.on(&#039;change&#039;, syncSize);&lt;br /&gt;
			syncSize();&lt;br /&gt;
			showCompare(editor, title, text, r.full);&lt;br /&gt;
&lt;br /&gt;
			r.textarea = textarea;&lt;br /&gt;
			return r;&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function clickHandler(e) {&lt;br /&gt;
		var el = $(e.target);&lt;br /&gt;
&lt;br /&gt;
		if (!el.hasClass(&#039;quickedit-editlink&#039;) || el.hasClass(&#039;quickedit-loading&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
		e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
		showEditor(el);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function addLinksToChildren(element) {&lt;br /&gt;
		element.find(&#039;#quickedit-editor, .quickedit-section&#039;).remove();&lt;br /&gt;
		element.find(&#039;.mw-editsection&#039;).each(function() {&lt;br /&gt;
			$(&#039;[href*=&amp;quot;section=&amp;quot;]&#039;, this).last().after(&lt;br /&gt;
				mobile ? &#039;&#039; : &#039;&amp;lt;span class=&amp;quot;quickedit-section&amp;quot;&amp;gt; | &amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
				$(&#039;&amp;lt;a&amp;gt;&#039;)&lt;br /&gt;
					.html(mobile ? &#039;&amp;amp;nbsp;Q&#039; : &#039;быстрая правка&#039;)&lt;br /&gt;
					.addClass(&#039;quickedit-section quickedit-editlink&#039;)&lt;br /&gt;
					.attr(&#039;href&#039;, &#039;#&#039;)&lt;br /&gt;
			).addClass(&#039;quickedit-target&#039;);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$.when(mw.loader.using(&#039;oojs-ui-core&#039;), $.ready).done(function() {&lt;br /&gt;
		var body = $(document.body);&lt;br /&gt;
&lt;br /&gt;
		body.on(&#039;click&#039;, clickHandler);&lt;br /&gt;
		addLinksToChildren(body);&lt;br /&gt;
		mw.hook(&#039;wikipage.content&#039;).add(addLinksToChildren);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	mw.loader.addStyleTag(&lt;br /&gt;
		&#039;.skin-minerva .mw-editsection { white-space: nowrap; }&#039; +&lt;br /&gt;
		&#039;.skin-minerva .content .collapsible-heading .quickedit-section { visibility: hidden; }&#039; +&lt;br /&gt;
		&#039;.skin-minerva .content .collapsible-heading.open-block .quickedit-section { visibility: visible; }&#039; +&lt;br /&gt;
		&#039;.quickedit-hide { display: none !important; }&#039; +&lt;br /&gt;
		&#039;.quickedit-loading, .quickedit-heading { color: #777; }&#039;&lt;br /&gt;
	);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-QuickEdit.js&amp;diff=68381</id>
		<title>MediaWiki:Gadget-QuickEdit.js</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-QuickEdit.js&amp;diff=68381"/>
		<updated>2026-05-24T20:53:04Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/** Quick Edit **/&lt;br /&gt;
&lt;br /&gt;
// Edit sections of a page without leaving the article&lt;br /&gt;
// [[en:w:User:BrandonXLF/QuickEdit]]&lt;br /&gt;
// By [[en:w:User:BrandonXLF]]&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
	var mobile = mw.config.get(&#039;skin&#039;) === &#039;minerva&#039;,&lt;br /&gt;
		apiSingleton,&lt;br /&gt;
		titleRegexp = new RegExp(&lt;br /&gt;
			mw.config.get(&#039;wgArticlePath&#039;).replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;).replace(/\\\$1/, &#039;([^?]+)&#039;) +&lt;br /&gt;
			&#039;|[?&amp;amp;]title=([^&amp;amp;#]*)&#039;&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	function api(func, params) {&lt;br /&gt;
		if (!apiSingleton) apiSingleton = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
		$.extend(params, {&lt;br /&gt;
			errorformat: &#039;html&#039;,&lt;br /&gt;
			errorlang: mw.config.get(&#039;wgUserLanguage&#039;),&lt;br /&gt;
			errorsuselocal: true&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		return apiSingleton[func](params).fail(function(_, data) {&lt;br /&gt;
			mw.notify(apiSingleton.getErrorMessage(data), {&lt;br /&gt;
				type: &#039;error&#039;,&lt;br /&gt;
				tag: &#039;quickedit&#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPageInfo(title, sectionID) {&lt;br /&gt;
		return api(&#039;get&#039;, {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			curtimestamp: 1,&lt;br /&gt;
			prop: &#039;revisions&#039;,&lt;br /&gt;
			indexpageids: 1,&lt;br /&gt;
			titles: title,&lt;br /&gt;
			rvprop: [&#039;timestamp&#039;, &#039;content&#039;],&lt;br /&gt;
			rvslots: &#039;main&#039;,&lt;br /&gt;
			rvsection: sectionID&lt;br /&gt;
		}).then(function(res) {&lt;br /&gt;
			var rev = res.query.pages[res.query.pageids[0]].revisions[0];&lt;br /&gt;
&lt;br /&gt;
			return {&lt;br /&gt;
				start: res.curtimestamp,&lt;br /&gt;
				base: rev.timestamp,&lt;br /&gt;
				full: rev.slots.main[&#039;*&#039;]&lt;br /&gt;
			};&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getPreviewCallback(editor) {&lt;br /&gt;
		editor.children(&#039;.preview&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
		new OO.ui.ProgressBarWidget().$element.css({&lt;br /&gt;
			maxWidth: &#039;100%&#039;,&lt;br /&gt;
			borderRadius: &#039;0&#039;,&lt;br /&gt;
			boxShadow: &#039;none&#039;,&lt;br /&gt;
			margin: &#039;8px 0&#039;&lt;br /&gt;
		}).addClass(&#039;preview&#039;).appendTo(editor);&lt;br /&gt;
&lt;br /&gt;
		return function(html) {&lt;br /&gt;
			editor.children(&#039;.preview&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
			$(&#039;&amp;lt;div&amp;gt;&#039;).html(html).css({&lt;br /&gt;
				margin: &#039;8px 0&#039;,&lt;br /&gt;
				border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
				padding: &#039;8px&#039;,&lt;br /&gt;
				overflowX: &#039;hidden&#039;&lt;br /&gt;
			}).addClass(&#039;preview&#039;).appendTo(editor);&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showCompare(editor, title, from, to) {&lt;br /&gt;
		mw.loader.load(&#039;mediawiki.diff.styles&#039;);&lt;br /&gt;
&lt;br /&gt;
		api(&#039;post&#039;, {&lt;br /&gt;
			action: &#039;compare&#039;,&lt;br /&gt;
			fromslots: &#039;main&#039;,&lt;br /&gt;
			&#039;fromtext-main&#039;: from,&lt;br /&gt;
			fromtitle: title,&lt;br /&gt;
			frompst: &#039;true&#039;,&lt;br /&gt;
			toslots: &#039;main&#039;,&lt;br /&gt;
			&#039;totext-main&#039;: to,&lt;br /&gt;
			totitle: title,&lt;br /&gt;
			topst: &#039;true&#039;&lt;br /&gt;
		}).then(function(r) {&lt;br /&gt;
			return r.compare[&#039;*&#039;] ? $(&#039;&amp;lt;table&amp;gt;&#039;).addClass(&#039;diff&#039;).append(&lt;br /&gt;
				$(&#039;&amp;lt;colgroup&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-marker&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-content&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-marker&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;col&amp;gt;&#039;).addClass(&#039;diff-content&#039;)&lt;br /&gt;
				)&lt;br /&gt;
			).append(r.compare[&#039;*&#039;]) : &#039;No differences.&#039;;&lt;br /&gt;
		}).then(getPreviewCallback(editor));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Parts taken from EditPage::extractSectionTitle and Parser::stripSectionName&lt;br /&gt;
	function getSectionSummary(text) {&lt;br /&gt;
		var match = text.match(/^(=+)(.+)\1\s*(\n|$)/);&lt;br /&gt;
&lt;br /&gt;
		return !match ? &#039;&#039; : &#039;/* &#039; + match[2].trim()&lt;br /&gt;
			// Strip internal link markup&lt;br /&gt;
			.replace(/\[\[:?([^[|]+)\|([^[]+)\]\]/g, &#039;$2&#039;)&lt;br /&gt;
			.replace(/\[\[:?([^[]+)\|?\]\]/g, &#039;$1&#039;)&lt;br /&gt;
			// Strip external link markup&lt;br /&gt;
			.replace(new RegExp(&#039;\\[(?:&#039; + mw.config.get(&#039;wgUrlProtocols&#039;) + &#039;)([^ ]+?) ([^\\[]+)\\]&#039;, &#039;ig&#039;), &#039;$2&#039;)&lt;br /&gt;
			// Remove wikitext quotes&lt;br /&gt;
			.replace(/(&#039;&#039;|&#039;&#039;&#039;|&#039;&#039;&#039;&#039;&#039;)(?!&#039;)/g, &#039;&#039;)&lt;br /&gt;
			// Strip HTML tags&lt;br /&gt;
			.replace(/&amp;lt;[^&amp;gt;]+?&amp;gt;/g, &#039;&#039;) + &#039; */ &#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showEditor(el) {&lt;br /&gt;
		var progress = new OO.ui.ProgressBarWidget(),&lt;br /&gt;
			// https://www.mediawiki.org/wiki/Heading_HTML_changes&lt;br /&gt;
			// Cannot use .closest() because DiscussionTools nests an h2 within a .mw-heading&lt;br /&gt;
			heading = el.parents(&#039;:header, .mw-heading&#039;).last(),&lt;br /&gt;
			matcher = heading.nextUntil.bind(heading),&lt;br /&gt;
			inserter = heading.after.bind(heading),&lt;br /&gt;
			targetEl = el.siblings(&#039;.quickedit-target&#039;).last(),&lt;br /&gt;
			titleMatch = targetEl.attr(&#039;href&#039;).match(titleRegexp),&lt;br /&gt;
			title = decodeURIComponent(titleMatch[1] || titleMatch[2]),&lt;br /&gt;
			sectionID = /[?&amp;amp;]v?e?section=T?-?(\d*)/.exec(targetEl.attr(&#039;href&#039;))[1];&lt;br /&gt;
&lt;br /&gt;
		if (!heading.closest(&#039;.mw-parser-output&#039;).length) {&lt;br /&gt;
			var articleContent = $(&#039;#mw-content-text .mw-parser-output&#039;);&lt;br /&gt;
&lt;br /&gt;
			matcher = function(selector) {&lt;br /&gt;
				var child = articleContent.children(selector).first();&lt;br /&gt;
&lt;br /&gt;
				if (child.length) return child.prevAll();&lt;br /&gt;
				return articleContent.children();&lt;br /&gt;
			};&lt;br /&gt;
			inserter = articleContent.prepend.bind(articleContent);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		inserter(progress.$element.css({&lt;br /&gt;
			maxWidth: &#039;100%&#039;,&lt;br /&gt;
			borderRadius: &#039;0&#039;,&lt;br /&gt;
			boxShadow: &#039;none&#039;&lt;br /&gt;
		}));&lt;br /&gt;
&lt;br /&gt;
		el.addClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
		$(&#039;.quickedit-hide&#039;).removeClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
		$(&#039;.quickedit-heading&#039;).removeClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
		$(&#039;#quickedit-editor&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
		getPageInfo(title, sectionID).then(function(r) {&lt;br /&gt;
			var start = r.start,&lt;br /&gt;
				base = r.base,&lt;br /&gt;
				full = r.full,&lt;br /&gt;
				saving = false,&lt;br /&gt;
				expanded = false,&lt;br /&gt;
				remainderStart = full.match(/\n=+.+=+(?:\n|$)/),&lt;br /&gt;
				part =  remainderStart ? full.substring(0, remainderStart.index) : full,&lt;br /&gt;
				remainder = remainderStart ? full.substring(remainderStart.index) : &#039;&#039;,&lt;br /&gt;
				level = 0,&lt;br /&gt;
				editor;&lt;br /&gt;
&lt;br /&gt;
			full.replace(/^(=+).+?(=+)(?:\n|$)/, function(m, a, b) {&lt;br /&gt;
				level = Math.min(a.length, b.length);&lt;br /&gt;
				return m;&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			var levelMatch = &#039;h1&#039;;&lt;br /&gt;
			for (var i = 2; i &amp;lt;= level; i++)&lt;br /&gt;
				levelMatch += &#039;,h&#039; + i + &#039;:has(*), .mw-heading&#039; + i;&lt;br /&gt;
&lt;br /&gt;
			var partSection = matcher(&#039;:header:has(*), .mw-heading&#039;),&lt;br /&gt;
				fullSection = matcher(levelMatch),&lt;br /&gt;
				textarea = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: part&lt;br /&gt;
				}),&lt;br /&gt;
				summary = new OO.ui.TextInputWidget({&lt;br /&gt;
					value: getSectionSummary(part)&lt;br /&gt;
				}),&lt;br /&gt;
				minor = new OO.ui.CheckboxInputWidget(),&lt;br /&gt;
				save = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Save&#039;,&lt;br /&gt;
					title: &#039;Save your changes&#039;,&lt;br /&gt;
					flags: [&#039;primary&#039;, &#039;progressive&#039;],&lt;br /&gt;
					accessKey: &#039;s&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				preview = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Preview&#039;,&lt;br /&gt;
					title: &#039;Preview the new wikitext&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				compare = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;Compare&#039;,&lt;br /&gt;
					title: &#039;View the difference between the current revision and your revision&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				cancel = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					useInputTag: true,&lt;br /&gt;
					label: &#039;Cancel&#039;,&lt;br /&gt;
					title: &#039;Close the edit form and discard changes&#039;,&lt;br /&gt;
					flags: [&#039;secondary&#039;, &#039;destructive&#039;]&lt;br /&gt;
				}),&lt;br /&gt;
				more = new OO.ui.ButtonInputWidget({&lt;br /&gt;
					label: &#039;+&#039;,&lt;br /&gt;
					title: &#039;Edit the entire section (including subsections)&#039;&lt;br /&gt;
				}),&lt;br /&gt;
				buttons = new OO.ui.HorizontalLayout({&lt;br /&gt;
					items: [save, preview, compare, cancel]&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			if (part != full) {&lt;br /&gt;
				buttons.addItems([more], 3);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			partSection.addClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
			heading.addClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
			el.removeClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
			progress.$element.remove();&lt;br /&gt;
			textarea.$input.css({&lt;br /&gt;
				borderRadius: &#039;0&#039;&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			summary.on(&#039;enter&#039;, function() {&lt;br /&gt;
				save.emit(&#039;click&#039;);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			save.on(&#039;click&#039;, function() {&lt;br /&gt;
				if (saving) return;&lt;br /&gt;
&lt;br /&gt;
				var fullText = textarea.getValue() + (expanded ? &#039;&#039; : remainder);&lt;br /&gt;
				saving = true;&lt;br /&gt;
				save.setLabel(&#039;Saving...&#039;);&lt;br /&gt;
				compare.setDisabled(true);&lt;br /&gt;
				preview.setDisabled(true);&lt;br /&gt;
				cancel.setDisabled(true);&lt;br /&gt;
				more.setDisabled(true);&lt;br /&gt;
&lt;br /&gt;
				api(&#039;postWithEditToken&#039;, {&lt;br /&gt;
					action: &#039;edit&#039;,&lt;br /&gt;
					title: title,&lt;br /&gt;
					section: sectionID,&lt;br /&gt;
					summary: summary.getValue(),&lt;br /&gt;
					text: fullText,&lt;br /&gt;
					minor: minor.isSelected() ? true : undefined,&lt;br /&gt;
					notminor: minor.isSelected() ? undefined : true,&lt;br /&gt;
					starttimestamp: start,&lt;br /&gt;
					basetimestamp: base&lt;br /&gt;
				}).then(function() {&lt;br /&gt;
					api(&#039;get&#039;, {&lt;br /&gt;
						action: &#039;parse&#039;,&lt;br /&gt;
						page: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
						prop: [&#039;text&#039;, &#039;categorieshtml&#039;]&lt;br /&gt;
					}).then(function(r) {&lt;br /&gt;
						var contentText = $(&#039;#mw-content-text&#039;),&lt;br /&gt;
							catLinks = $(&#039;#catlinks&#039;);&lt;br /&gt;
&lt;br /&gt;
						contentText.find(&#039;.mw-parser-output&#039;).replaceWith(r.parse.text[&#039;*&#039;]);&lt;br /&gt;
						mw.hook(&#039;wikipage.content&#039;).fire(contentText);&lt;br /&gt;
&lt;br /&gt;
						catLinks.replaceWith(r.parse.categorieshtml[&#039;*&#039;]);&lt;br /&gt;
						mw.hook(&#039;wikipage.categories&#039;).fire(catLinks);&lt;br /&gt;
&lt;br /&gt;
						saving = false;&lt;br /&gt;
					});&lt;br /&gt;
				}, function(code) {&lt;br /&gt;
					if (code == &#039;editconflict&#039;) {&lt;br /&gt;
						showEditConflict(editor, title, sectionID, fullText).then(function(r) {&lt;br /&gt;
							start = r.start;&lt;br /&gt;
							base = r.base;&lt;br /&gt;
							textarea = r.textarea;&lt;br /&gt;
							expanded = true;&lt;br /&gt;
						});&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					compare.setDisabled(false);&lt;br /&gt;
					preview.setDisabled(false);&lt;br /&gt;
					cancel.setDisabled(false);&lt;br /&gt;
					more.setDisabled(expanded);&lt;br /&gt;
					saving = false;&lt;br /&gt;
					save.setLabel(&#039;Save&#039;);&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			preview.on(&#039;click&#039;, function() {&lt;br /&gt;
				api(&#039;post&#039;, {&lt;br /&gt;
					action: &#039;parse&#039;,&lt;br /&gt;
					title: title,&lt;br /&gt;
					prop: &#039;text&#039;,&lt;br /&gt;
					pst: &#039;true&#039;,&lt;br /&gt;
					disablelimitreport: &#039;true&#039;,&lt;br /&gt;
					disableeditsection: &#039;true&#039;,&lt;br /&gt;
					sectionpreview: &#039;true&#039;,&lt;br /&gt;
					disabletoc: &#039;true&#039;,&lt;br /&gt;
					text: textarea.getValue()&lt;br /&gt;
				}).then(function(r) {&lt;br /&gt;
					return r.parse.text[&#039;*&#039;] + &#039;&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
				}).then(getPreviewCallback(editor));&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			compare.on(&#039;click&#039;, function() {&lt;br /&gt;
				showCompare(editor, title, part + (expanded ? remainder : &#039;&#039;), textarea.getValue());&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			cancel.on(&#039;click&#039;, function() {&lt;br /&gt;
				editor.remove();&lt;br /&gt;
				heading.removeClass(&#039;quickedit-heading&#039;);&lt;br /&gt;
				fullSection.removeClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			more.on(&#039;click&#039;, function() {&lt;br /&gt;
				expanded = true;&lt;br /&gt;
				textarea.setValue(textarea.getValue() + remainder);&lt;br /&gt;
				fullSection.addClass(&#039;quickedit-hide&#039;);&lt;br /&gt;
				more.setDisabled(true);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			editor = $(&#039;&amp;lt;div id=&amp;quot;quickedit-editor&amp;quot;&amp;gt;&#039;).css({&lt;br /&gt;
				overflowX: &#039;hidden&#039;&lt;br /&gt;
			}).append(&lt;br /&gt;
				$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
					backgroundColor: &#039;#eaecf0&#039;,&lt;br /&gt;
					borderBottom: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
					marginBottom: &#039;8px&#039;&lt;br /&gt;
				}).append(&lt;br /&gt;
					textarea.$element.css({&lt;br /&gt;
						width: &#039;100%&#039;,&lt;br /&gt;
						maxWidth: &#039;100%&#039;,&lt;br /&gt;
						fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
					}).addClass(&#039;quickedit-textarea&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						$(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
							padding: &#039;8px 4px 8px 8px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						}).html(&#039;Edit&amp;amp;nbsp;summary:&#039;),&lt;br /&gt;
						summary.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							padding: &#039;8px 0px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						}),&lt;br /&gt;
						new OO.ui.FieldLayout(minor, {&lt;br /&gt;
							label: new OO.ui.HtmlSnippet(&#039;Minor&amp;amp;nbsp;edit?&#039;),&lt;br /&gt;
							align: &#039;inline&#039;&lt;br /&gt;
						}).$element.css({&lt;br /&gt;
							padding: &#039;8px 8px 8px 4px&#039;,&lt;br /&gt;
							display: &#039;table-cell&#039;,&lt;br /&gt;
							verticalAlign: &#039;middle&#039;&lt;br /&gt;
						})&lt;br /&gt;
					),&lt;br /&gt;
					buttons.$element.css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;,&lt;br /&gt;
						padding: &#039;0 8px 8px 8px&#039;&lt;br /&gt;
					}),&lt;br /&gt;
					title !== mw.config.get(&#039;wgPageName&#039;) ? $(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
						border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
						borderWidth: &#039;0 1px&#039;,&lt;br /&gt;
						padding: &#039;0px 8px 8px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						&#039;Editing page: &#039;,&lt;br /&gt;
						$(&#039;&amp;lt;a&amp;gt;&#039;).attr(&#039;href&#039;, mw.config.get(&#039;wgArticlePath&#039;).replace(&#039;$1&#039;, title)).css({&lt;br /&gt;
							fontWeight: &#039;bold&#039;&lt;br /&gt;
						}).text(title.replace(/_/g, &#039; &#039;))&lt;br /&gt;
					) : undefined&lt;br /&gt;
				)&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			inserter(editor);&lt;br /&gt;
		}, function() {&lt;br /&gt;
			el.removeClass(&#039;quickedit-loading&#039;);&lt;br /&gt;
			progress.$element.remove();&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showEditConflict(editor, title, sectionID, text) {&lt;br /&gt;
		return getPageInfo(title, sectionID).then(function(r) {&lt;br /&gt;
			var textarea = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: r.full&lt;br /&gt;
				}),&lt;br /&gt;
				textarea2 = new OO.ui.MultilineTextInputWidget({&lt;br /&gt;
					rows: 1,&lt;br /&gt;
					maxRows: 20,&lt;br /&gt;
					autosize: true,&lt;br /&gt;
					value: text,&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			function syncSize() {&lt;br /&gt;
				textarea.styleHeight = -1;&lt;br /&gt;
				textarea.adjustSize(true);&lt;br /&gt;
&lt;br /&gt;
				textarea2.styleHeight = -1;&lt;br /&gt;
				textarea2.adjustSize(true);&lt;br /&gt;
&lt;br /&gt;
				var height = Math.max(textarea.$input.height(), textarea2.$input.height());&lt;br /&gt;
				textarea.$input.height(height);&lt;br /&gt;
				textarea2.$input.height(height);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			textarea.$input.css({&lt;br /&gt;
				borderRadius: &#039;0&#039;&lt;br /&gt;
			});&lt;br /&gt;
			editor.find(&#039;&amp;gt; :first-child &amp;gt; :first-child&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
			$(&#039;&amp;lt;table&amp;gt;&#039;).css({&lt;br /&gt;
				width: &#039;100%&#039;,&lt;br /&gt;
				border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
				borderBottom: &#039;none&#039;,&lt;br /&gt;
				borderSpacing: &#039;0&#039;,&lt;br /&gt;
				margin: &#039;0 !important&#039;&lt;br /&gt;
			}).append(&lt;br /&gt;
				$(&#039;&amp;lt;tr&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;th&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						paddingTop: &#039;4px&#039;&lt;br /&gt;
					}).text(&#039;Their version (to be saved)&#039;),&lt;br /&gt;
					$(&#039;&amp;lt;th&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						paddingTop: &#039;4px&#039;&lt;br /&gt;
					}).text(&#039;Your version&#039;)&lt;br /&gt;
				),&lt;br /&gt;
				$(&#039;&amp;lt;tr&amp;gt;&#039;).append(&lt;br /&gt;
					$(&#039;&amp;lt;td&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						padding: &#039;4px 4px 0 8px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						textarea.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
						})&lt;br /&gt;
					),&lt;br /&gt;
					$(&#039;&amp;lt;td&amp;gt;&#039;).css({&lt;br /&gt;
						width: &#039;50%&#039;,&lt;br /&gt;
						padding: &#039;4px 8px 0 4px&#039;&lt;br /&gt;
					}).append(&lt;br /&gt;
						textarea2.$element.css({&lt;br /&gt;
							width: &#039;100%&#039;,&lt;br /&gt;
							maxWidth: &#039;100%&#039;,&lt;br /&gt;
							fontFamily: &#039;monospace, monospace&#039;&lt;br /&gt;
						})&lt;br /&gt;
					)&lt;br /&gt;
				)&lt;br /&gt;
			).prependTo(editor.find(&#039;&amp;gt; :first-child&#039;));&lt;br /&gt;
&lt;br /&gt;
			textarea.on(&#039;change&#039;, syncSize);&lt;br /&gt;
			textarea2.on(&#039;change&#039;, syncSize);&lt;br /&gt;
			syncSize();&lt;br /&gt;
			showCompare(editor, title, text, r.full);&lt;br /&gt;
&lt;br /&gt;
			r.textarea = textarea;&lt;br /&gt;
			return r;&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function clickHandler(e) {&lt;br /&gt;
		var el = $(e.target);&lt;br /&gt;
&lt;br /&gt;
		if (!el.hasClass(&#039;quickedit-editlink&#039;) || el.hasClass(&#039;quickedit-loading&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
		e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
		showEditor(el);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function addLinksToChildren(element) {&lt;br /&gt;
		element.find(&#039;#quickedit-editor, .quickedit-section&#039;).remove();&lt;br /&gt;
		element.find(&#039;.mw-editsection&#039;).each(function() {&lt;br /&gt;
			$(&#039;[href*=&amp;quot;section=&amp;quot;]&#039;, this).last().after(&lt;br /&gt;
				mobile ? &#039;&#039; : &#039;&amp;lt;span class=&amp;quot;quickedit-section&amp;quot;&amp;gt; | &amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
				$(&#039;&amp;lt;a&amp;gt;&#039;)&lt;br /&gt;
					.html(mobile ? &#039;&amp;amp;nbsp;Q&#039; : &#039;quick edit&#039;)&lt;br /&gt;
					.addClass(&#039;quickedit-section quickedit-editlink&#039;)&lt;br /&gt;
					.attr(&#039;href&#039;, &#039;#&#039;)&lt;br /&gt;
			).addClass(&#039;quickedit-target&#039;);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$.when(mw.loader.using(&#039;oojs-ui-core&#039;), $.ready).done(function() {&lt;br /&gt;
		var body = $(document.body);&lt;br /&gt;
&lt;br /&gt;
		body.on(&#039;click&#039;, clickHandler);&lt;br /&gt;
		addLinksToChildren(body);&lt;br /&gt;
		mw.hook(&#039;wikipage.content&#039;).add(addLinksToChildren);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	mw.loader.addStyleTag(&lt;br /&gt;
		&#039;.skin-minerva .mw-editsection { white-space: nowrap; }&#039; +&lt;br /&gt;
		&#039;.skin-minerva .content .collapsible-heading .quickedit-section { visibility: hidden; }&#039; +&lt;br /&gt;
		&#039;.skin-minerva .content .collapsible-heading.open-block .quickedit-section { visibility: visible; }&#039; +&lt;br /&gt;
		&#039;.quickedit-hide { display: none !important; }&#039; +&lt;br /&gt;
		&#039;.quickedit-loading, .quickedit-heading { color: #777; }&#039;&lt;br /&gt;
	);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68378</id>
		<title>Тестовая страница 8</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68378"/>
		<updated>2026-05-24T20:33:50Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Diman Russkov переименовал страницу Тестовая страница 6 в Тестовая страница 8 без оставления перенаправления&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ТЕСТ.&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_1&amp;diff=68374</id>
		<title>Заготовка:Тестовая страница 1</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_1&amp;diff=68374"/>
		<updated>2026-05-24T19:04:04Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Защитил страницу Заготовка:Тестовая страница 1 ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TeamStatCompiler|build_page|ДОМ}}&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_1/%D1%8B&amp;diff=68372</id>
		<title>Заготовка:Тестовая страница 1/ы</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_1/%D1%8B&amp;diff=68372"/>
		<updated>2026-05-24T18:41:15Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Новая страница: «паыпыап»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;паыпыап&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68368</id>
		<title>Тестовая страница 8</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68368"/>
		<updated>2026-05-24T18:30:48Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Изменил настройки защиты для «Тестовая страница 6» ([Редактирование=Разрешено только протекторам] (истекает 18:30, 31 мая 2026 (UTC)) [Переименование=Максимальная защита страницы] (бессрочно))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ТЕСТ.&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68367</id>
		<title>Тестовая страница 8</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68367"/>
		<updated>2026-05-24T18:29:41Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Изменил настройки защиты для «Тестовая страница 6» ([Редактирование=Разрешено только протекторам] (бессрочно) [Переименование=Максимальная защита страницы] (бессрочно))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ТЕСТ.&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-subpages.js&amp;diff=68364</id>
		<title>MediaWiki:Gadget-subpages.js</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=MediaWiki:Gadget-subpages.js&amp;diff=68364"/>
		<updated>2026-05-24T18:03:53Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Скрипт, добавляющий в меню &amp;quot;Ещё&amp;quot; и боковую панель ссылки на подстраницы&lt;br /&gt;
Автор - [[Участник:Lord]]&lt;br /&gt;
Дополнения - [[Участник:Больница для слабаков]]&lt;br /&gt;
             [[Участник:Септумулей]]&lt;br /&gt;
             [[Участник:Ла Ротьер]]&lt;br /&gt;
             [[Участник:Ламантепер]]&lt;br /&gt;
             [[Участник:Diman Russkov]]*/&lt;br /&gt;
&lt;br /&gt;
mw.loader.using( &#039;mediawiki.util&#039; ).then( function() {&lt;br /&gt;
	var ns = mw.config.get( &#039;wgNamespaceNumber&#039; );&lt;br /&gt;
	var pageName = mw.config.get( &#039;wgPageName&#039; );&lt;br /&gt;
	var title = mw.config.get( &#039;wgTitle&#039; );&lt;br /&gt;
	var wikiName = mw.config.get( &#039;wgSiteName&#039; ) || &#039;вики&#039;;&lt;br /&gt;
&lt;br /&gt;
	// 1. В основном пространстве имён (ID 0)&lt;br /&gt;
	if ( ns === 0 ) {&lt;br /&gt;
		// Ссылка на &amp;quot;Подстраницы&amp;quot; в пространстве имён &amp;quot;Подстраница&amp;quot; (ID 3004)&lt;br /&gt;
		// Название пространства имён (например, &amp;quot;Подстраница&amp;quot;) берётся динамически из конфигурации вики&lt;br /&gt;
		var subpageNs = mw.config.get( &#039;wgFormattedNamespaces&#039; )[3004] || &#039;Подстраница&#039;;&lt;br /&gt;
		&lt;br /&gt;
		mw.util.addPortletLink(&lt;br /&gt;
			&#039;p-cactions&#039;,&lt;br /&gt;
			mw.util.getUrl( &#039;Special:PrefixIndex/&#039; + subpageNs + &#039;:&#039; + pageName ),&lt;br /&gt;
			&#039;Подстраницы&#039;,&lt;br /&gt;
			null,&lt;br /&gt;
			&#039;Подстраницы&#039;&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// Добавляет в боковое меню ссылку &amp;quot;Создать подстраницу&amp;quot;&lt;br /&gt;
		mw.util.addPortletLink(&lt;br /&gt;
			&#039;p-tb&#039;,&lt;br /&gt;
			mw.util.getUrl( pageName, {&lt;br /&gt;
				action: &#039;edit&#039;,&lt;br /&gt;
				section: &#039;new&#039;,&lt;br /&gt;
				nosummary: &#039;yes&#039;,&lt;br /&gt;
				preview: &#039;yes&#039;,&lt;br /&gt;
				preload: &#039;Template:CreateSubpage&#039;&lt;br /&gt;
			} ),&lt;br /&gt;
			&#039;Создать подстраницу&#039;,&lt;br /&gt;
			null,&lt;br /&gt;
			&#039;Создать подстраницу для этой статьи &#039; + wikiName + &#039;!&#039;&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 2. В пространствах имён Участник (2), Проект/ЧТМ (4), Шаблон (10), Модуль (828), ЦК (3002) и Заготовка (3014)&lt;br /&gt;
	var allowedNamespaces = [ 2, 4, 10, 828, 3002, 3014 ];&lt;br /&gt;
	if ( allowedNamespaces.indexOf( ns ) !== -1 ) {&lt;br /&gt;
		// Добавляет ссылку &amp;quot;Создать подстраницу&amp;quot;&lt;br /&gt;
		mw.util.addPortletLink(&lt;br /&gt;
			&#039;p-tb&#039;,&lt;br /&gt;
			mw.util.getUrl( pageName, {&lt;br /&gt;
				action: &#039;edit&#039;,&lt;br /&gt;
				section: &#039;new&#039;,&lt;br /&gt;
				nosummary: &#039;yes&#039;,&lt;br /&gt;
				preview: &#039;yes&#039;,&lt;br /&gt;
				preload: &#039;Template:CreateSubpage/2&#039;&lt;br /&gt;
			} ),&lt;br /&gt;
			&#039;Создать подстраницу&#039;,&lt;br /&gt;
			null,&lt;br /&gt;
			&#039;Создать подстраницу!&#039;&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// Даёт ссылку на собственные подстраницы в этих же пространствах&lt;br /&gt;
		var rootPage = pageName.split( &#039;/&#039; )[0];&lt;br /&gt;
		mw.util.addPortletLink(&lt;br /&gt;
			&#039;p-cactions&#039;,&lt;br /&gt;
			mw.util.getUrl( &#039;Special:PrefixIndex/:&#039; + rootPage ),&lt;br /&gt;
			&#039;Подстраницы&#039;,&lt;br /&gt;
			null,&lt;br /&gt;
			&#039;Подстраницы&#039;&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 3. В пространстве &amp;quot;Подстраница&amp;quot; (ID 3004) возвращает на основную статью&lt;br /&gt;
	if ( ns === 3004 ) {&lt;br /&gt;
		var titleParts = title.split( &#039;/&#039; );&lt;br /&gt;
		var targetPage = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
		// Учитываем специфику названий со слэшем в долях &amp;quot;1/8 финала)&amp;quot; и &amp;quot;1/4 финала)&amp;quot;&lt;br /&gt;
		if ( titleParts[1] === &#039;8 финала)&#039; || titleParts[1] === &#039;4 финала)&#039; ) {&lt;br /&gt;
			targetPage = titleParts[0] + &#039;/&#039; + titleParts[1];&lt;br /&gt;
		} else {&lt;br /&gt;
			targetPage = titleParts[0];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		mw.util.addPortletLink(&lt;br /&gt;
			&#039;p-cactions&#039;,&lt;br /&gt;
			mw.util.getUrl( targetPage ),&lt;br /&gt;
			&#039;Основная страница&#039;,&lt;br /&gt;
			null,&lt;br /&gt;
			&#039;Вернуться на корневую страницу&#039;&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 4. Ссылка на архивацию страницы в WebArchive (для всех пространств имён)&lt;br /&gt;
	// Динамически собираем полную каноническую ссылку на текущую страницу&lt;br /&gt;
	var protocol = location.protocol;&lt;br /&gt;
	var server = mw.config.get( &#039;wgServer&#039; );&lt;br /&gt;
	if ( server.startsWith( &#039;//&#039; ) ) {&lt;br /&gt;
		server = protocol + server;&lt;br /&gt;
	}&lt;br /&gt;
	var canonicalUrl = server + mw.util.getUrl( pageName );&lt;br /&gt;
&lt;br /&gt;
	mw.util.addPortletLink(&lt;br /&gt;
		&#039;p-cactions&#039;,&lt;br /&gt;
		&#039;https://web.archive.org/save/&#039; + canonicalUrl,&lt;br /&gt;
		&#039;Архивировать&#039;,&lt;br /&gt;
		null,&lt;br /&gt;
		&#039;Создать архивную копию данной страницы на сайте WebArchive&#039;&lt;br /&gt;
	);&lt;br /&gt;
} );&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=MediaWiki:Sidebar-redirectcreator&amp;diff=68363</id>
		<title>MediaWiki:Sidebar-redirectcreator</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=MediaWiki:Sidebar-redirectcreator&amp;diff=68363"/>
		<updated>2026-05-24T17:49:23Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Полностью удалено содержимое страницы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_7&amp;diff=68361</id>
		<title>Заготовка:Тестовая страница 7</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_7&amp;diff=68361"/>
		<updated>2026-05-24T17:45:44Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Diman Russkov переименовал страницу Тестовая страница 7 в Заготовка:Тестовая страница 7 без оставления перенаправления&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ТЕСТ.&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_7&amp;diff=68360</id>
		<title>Заготовка:Тестовая страница 7</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_7&amp;diff=68360"/>
		<updated>2026-05-24T17:44:31Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Новая страница: «ТЕСТ.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ТЕСТ.&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Diman_Russkov&amp;diff=68358</id>
		<title>Обсуждение участника:Diman Russkov</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Diman_Russkov&amp;diff=68358"/>
		<updated>2026-05-24T17:37:29Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Откат правки Diman Russkov (обсуждение) к последней версии Шаблонист&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== I&#039;m ready ==&lt;br /&gt;
OK [[Участник:Johnny B Goode|Johnny B Goode]] ([[Обсуждение участника:Johnny B Goode|обсуждение]]) 21:19, 4 апреля 2020 (MSK)&lt;br /&gt;
* Let&#039;s Go! :-) [[Участник:Diman Russkov|Diman Russkov]] ([[Обсуждение участника:Diman Russkov|обсуждение]]) 21:20, 4 апреля 2020 (MSK)&lt;br /&gt;
&lt;br /&gt;
== Баг в расширении ==&lt;br /&gt;
&lt;br /&gt;
[[Служебная:Diff/66887/66981]]. [[Участник:Шаблонист|Шаблонист]] ([[Обсуждение участника:Шаблонист|обсуждение]]) 22:42, 28 апреля 2026 (MSK)&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Diman_Russkov&amp;diff=68357</id>
		<title>Обсуждение участника:Diman Russkov</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Diman_Russkov&amp;diff=68357"/>
		<updated>2026-05-24T17:36:23Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: /* Баг в расширении */ Ответ&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== I&#039;m ready ==&lt;br /&gt;
OK [[Участник:Johnny B Goode|Johnny B Goode]] ([[Обсуждение участника:Johnny B Goode|обсуждение]]) 21:19, 4 апреля 2020 (MSK)&lt;br /&gt;
* Let&#039;s Go! :-) [[Участник:Diman Russkov|Diman Russkov]] ([[Обсуждение участника:Diman Russkov|обсуждение]]) 21:20, 4 апреля 2020 (MSK)&lt;br /&gt;
&lt;br /&gt;
== Баг в расширении ==&lt;br /&gt;
&lt;br /&gt;
[[Служебная:Diff/66887/66981]]. [[Участник:Шаблонист|Шаблонист]] ([[Обсуждение участника:Шаблонист|обсуждение]]) 22:42, 28 апреля 2026 (MSK)&lt;br /&gt;
&lt;br /&gt;
:С переходом на 1.45 потребность в расширении отпала. [[Участник:Diman Russkov|Diman Russkov]] ([[Обсуждение участника:Diman Russkov|обсуждение]]) 20:36, 24 мая 2026 (MSK)&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=68356</id>
		<title>Заготовка:Тестовая страница</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0:%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=68356"/>
		<updated>2026-05-24T17:29:04Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Защитил страницу Заготовка:Тестовая страница: я так возжелал ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Максимальная защита страницы] (бессрочно))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ТЕСТ.&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
	<entry>
		<id>https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68355</id>
		<title>Тестовая страница 8</title>
		<link rel="alternate" type="text/html" href="https://thirdworldcup.ru/index.php?title=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0_8&amp;diff=68355"/>
		<updated>2026-05-24T17:29:04Z</updated>

		<summary type="html">&lt;p&gt;Diman Russkov: Защитил страницу Тестовая страница 6: я так возжелал ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Максимальная защита страницы] (бессрочно))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ТЕСТ.&lt;/div&gt;</summary>
		<author><name>Diman Russkov</name></author>
	</entry>
</feed>