修改URL格式

master
落雨楓 3 weeks ago
parent 63fea40ae4
commit 0179fe81ed

@ -1,4 +1,5 @@
<?php <?php
namespace LatinizeUrl; namespace LatinizeUrl;
use Exception; use Exception;
@ -7,6 +8,8 @@ use Fukuball\Jieba\Finalseg;
use Fukuball\Jieba\Posseg; use Fukuball\Jieba\Posseg;
use MediaWiki\MediaWikiServices; use MediaWiki\MediaWikiServices;
use Overtrue\Pinyin\Pinyin; use Overtrue\Pinyin\Pinyin;
use MediaWiki\Status\Status;
use FormatJson;
class ChineseConvertor extends BaseConvertor { class ChineseConvertor extends BaseConvertor {
private $config; private $config;
@ -107,8 +110,10 @@ class ChineseConvertor extends BaseConvertor {
if (is_array($segList)) { if (is_array($segList)) {
$segPinyin = []; $segPinyin = [];
foreach ($segList as $seg) { foreach ($segList as $seg) {
$segPinyin[] = self::$pinyinParser->convert($seg, $segPinyin[] = self::$pinyinParser->convert(
PINYIN_NO_TONE | PINYIN_UMLAUT_V | PINYIN_KEEP_PUNCTUATION | PINYIN_KEEP_ENGLISH | PINYIN_KEEP_NUMBER); $seg,
PINYIN_NO_TONE | PINYIN_UMLAUT_V | PINYIN_KEEP_PUNCTUATION | PINYIN_KEEP_ENGLISH | PINYIN_KEEP_NUMBER
);
} }
$ret[] = $segPinyin; $ret[] = $segPinyin;
} else { } else {
@ -152,11 +157,11 @@ class ChineseConvertor extends BaseConvertor {
'sentence' => $hanzi 'sentence' => $hanzi
], ],
], __METHOD__); ], __METHOD__);
$status = \Status::wrap($req->execute()); $status = Status::wrap($req->execute());
if (!$status->isOK()) { if (!$status->isOK()) {
$this->fallbackOrException($hanzi, 'Cannot use LatinizeUrl remote api.'); $this->fallbackOrException($hanzi, 'Cannot use LatinizeUrl remote api.');
} }
$json = \FormatJson::decode($req->getContent(), true); $json = FormatJson::decode($req->getContent(), true);
if (isset($json["error"])) { if (isset($json["error"])) {
$this->fallbackOrException($hanzi, 'LatinizeUrl remote api error: ' . $json["error"]); $this->fallbackOrException($hanzi, 'LatinizeUrl remote api error: ' . $json["error"]);
} }

@ -1,9 +1,12 @@
<?php <?php
/* Only support api parse yet */ /* Only support api parse yet */
namespace LatinizeUrl; namespace LatinizeUrl;
use Exception; use Exception;
use MediaWiki\MediaWikiServices; use MediaWiki\MediaWikiServices;
use MediaWiki\Status\Status;
use FormatJson;
class JapaneseConvertor extends BaseConvertor { class JapaneseConvertor extends BaseConvertor {
private $config; private $config;
@ -43,11 +46,11 @@ class JapaneseConvertor extends BaseConvertor {
'sentence' => $kanji 'sentence' => $kanji
], ],
], __METHOD__); ], __METHOD__);
$status = \Status::wrap($req->execute()); $status = Status::wrap($req->execute());
if (!$status->isOK()) { if (!$status->isOK()) {
throw new Exception('Cannot use LatinizeUrl remote api.'); throw new Exception('Cannot use LatinizeUrl remote api.');
} }
$json = \FormatJson::decode($req->getContent(), true); $json = FormatJson::decode($req->getContent(), true);
if (isset($json["error"])) { if (isset($json["error"])) {
throw new Exception('LatinizeUrl remote api error: ' . $json["error"]); throw new Exception('LatinizeUrl remote api error: ' . $json["error"]);
} }

@ -3,11 +3,11 @@
"author": "Hyperzlib", "author": "Hyperzlib",
"url": "https://github.com/Isekai-Project/mediawiki-extension-LatinizeUrl", "url": "https://github.com/Isekai-Project/mediawiki-extension-LatinizeUrl",
"descriptionmsg": "latinizeurl-desc", "descriptionmsg": "latinizeurl-desc",
"version": "1.0.4", "version": "1.0.5",
"license-name": "MIT", "license-name": "MIT",
"type": "other", "type": "other",
"requires": { "requires": {
"MediaWiki": ">= 1.39.0" "MediaWiki": ">= 1.43.0"
}, },
"ExtensionMessagesFiles": { "ExtensionMessagesFiles": {
"LatinizeUrlAlias": "LatinizeUrl.alias.php" "LatinizeUrlAlias": "LatinizeUrl.alias.php"
@ -32,12 +32,15 @@
"Collation::factory": [ "Collation::factory": [
"LatinizeUrl\\Hooks::onCollationFactory" "LatinizeUrl\\Hooks::onCollationFactory"
], ],
"SkinTemplateNavigation::Universal": [ "SidebarBeforeOutput": [
"LatinizeUrl\\Hooks::addToolboxLink" "LatinizeUrl\\Hooks::addToolboxLink"
], ],
"BeforePageDisplay": [ "BeforePageDisplay": [
"LatinizeUrl\\Hooks::onBeforePageDisplay" "LatinizeUrl\\Hooks::onBeforePageDisplay"
], ],
"BeforeInitialize": [
"LatinizeUrl\\Hooks::onBeforeInitialize"
],
"InitializeParseTitle": [ "InitializeParseTitle": [
"LatinizeUrl\\Hooks::onInitializeParseTitle" "LatinizeUrl\\Hooks::onInitializeParseTitle"
], ],

@ -1,4 +1,5 @@
<?php <?php
namespace LatinizeUrl; namespace LatinizeUrl;
abstract class BaseConvertor { abstract class BaseConvertor {

@ -1,37 +1,44 @@
<?php <?php
namespace LatinizeUrl; namespace LatinizeUrl;
use MediaWiki\Actions\ActionEntryPoint;
use MediaWiki\Linker\LinkTarget; use MediaWiki\Linker\LinkTarget;
use Title; use MediaWiki\Title\Title;
use User; use MediaWiki\SpecialPage\SpecialPage;
use MediaWiki\MediaWikiServices; use MediaWiki\MediaWikiServices;
use MediaWiki\Page\ProperPageIdentity; use MediaWiki\Page\ProperPageIdentity;
use MediaWiki\Permissions\Authority; use MediaWiki\Permissions\Authority;
use MediaWiki\User\UserIdentity; use MediaWiki\User\UserIdentity;
use TitleValue; use MediaWiki\Title\TitleValue;
use Wikimedia\Rdbms\DBQueryError; use Wikimedia\Rdbms\DBQueryError;
use MediaWiki\Output\OutputPage;
use MediaWiki\User\User;
use MediaWiki\Request\WebRequest;
use MediaWiki\Context\RequestContext;
use MediaWiki\Installer\DatabaseUpdater;
class Hooks { class Hooks {
public static $allowedNS = [NS_MAIN, NS_TALK]; public static $allowedNS = [NS_MAIN, NS_TALK];
public static function onLoadExtensionSchemaUpdates($updater){ public static function onLoadExtensionSchemaUpdates(DatabaseUpdater $updater) {
//更新数据库 //更新数据库
$dir = dirname(__DIR__) . '/sql'; $dir = dirname(__DIR__) . '/sql';
$dbType = $updater->getDB()->getType(); $dbType = $updater->getDB()->getType();
// For non-MySQL/MariaDB/SQLite DBMSes, use the appropriately named file // For non-MySQL/MariaDB/SQLite DBMSes, use the appropriately named file
if ($dbType == 'mysql') { if ($dbType == 'mysql') {
$filename = 'mysql.sql'; $updater->addExtensionTable('url_slug', "{$dir}/mysql.sql");
} elseif ($dbType == 'sqlite') { } elseif ($dbType == 'sqlite') {
$filename = 'sqlite.sql'; $updater->addExtensionTable('url_slug', "{$dir}/sqlite.sql");
} else { } else {
throw new \Exception('Database type not currently supported'); throw new \Exception('Database type not currently supported');
} }
$updater->addExtensionTable('url_slug', "{$dir}/{$filename}");
//更新文件patch //更新文件patch
global $IP; global $IP;
$patcher = new Patcher($IP . '/includes/MediaWiki.php', 'LatinizeUrl', Utils::getVersion()); $patcher = new Patcher($IP . '/includes/actions/ActionEntryPoint.php', 'LatinizeUrl', Utils::getVersion());
$patcher->patchInitializeParseTitleHook(); $patcher->patchInitializeParseTitleHook();
$patcher->save(); $patcher->save();
} }
@ -43,34 +50,51 @@ class Hooks {
$config = $service->getMainConfig(); $config = $service->getMainConfig();
$wgLatinizeUrlForceRedirect = $config->get('LatinizeUrlForceRedirect'); $wgLatinizeUrlForceRedirect = $config->get('LatinizeUrlForceRedirect');
$slugText = $title->getText();
if (in_array($title->getNamespace(), self::$allowedNS)) { if (in_array($title->getNamespace(), self::$allowedNS)) {
$realTitle = Utils::getTitleBySlugUrl($title, $title->getNamespace()); $realTitle = Utils::getTitleBySlugUrl($slugText, $title->getNamespace());
if ($realTitle) { if ($realTitle) {
$title = $realTitle; $title = $realTitle;
$request->setVal('title', $title->getPrefixedDBkey()); $request->setVal('title', $title->getPrefixedDBkey());
} elseif($wgLatinizeUrlForceRedirect
if (
$wgLatinizeUrlForceRedirect
&& !($request->getVal('action') && $request->getVal('action') != 'view') && !($request->getVal('action') && $request->getVal('action') != 'view')
&& !$request->getVal('veaction') && !$request->getVal('veaction')
&& !defined('MW_API') && !defined('MW_API')
&& in_array($title->getNamespace(), self::$allowedNS)) { //把原标题页面重定向到拼音页面 && in_array($title->getNamespace(), self::$allowedNS)
$slug = Utils::getSlugUrlByTitle($title); ) { //把原标题页面重定向到拼音页面
if($slug) $title = Title::newFromText($slug, $title->getNamespace()); $absoluteSlug = Utils::getSlugUrlByTitle($title);
$slugText = str_replace(' ', '_', $slugText);
$absoluteSlug = str_replace(' ', '_', $absoluteSlug);
if ($slugText !== $absoluteSlug) {
$title = Title::newFromText($absoluteSlug, $title->getNamespace());
}
}
} }
} }
} }
public static function onGetArticleUrl(\Title &$title, &$url, $query){ public static function onBeforeInitialize(Title &$title, $unused, OutputPage $output, User $user, WebRequest $request, ActionEntryPoint $entryPoint) {
}
public static function onGetArticleUrl(Title &$title, &$url, $query) {
try { try {
if (in_array($title->getNamespace(), self::$allowedNS) && Utils::titleSlugExists($title)) { if (in_array($title->getNamespace(), self::$allowedNS) && Utils::titleSlugExists($title)) {
$slug = Title::newFromText(Utils::getSlugUrlByTitle($title), $title->getNamespace()); $slugText = Utils::getSlugUrlByTitle($title);
if ($slug) { if (!$slugText) return;
$slugEncoded = Utils::encodeUriComponent($slug->getPrefixedText());
$slugTitle = Title::newFromText($slugText, $title->getNamespace());
if (!$slugTitle) return;
$slugEncoded = Utils::encodeUriComponent($slugTitle->getPrefixedText());
$titleEncoded = Utils::encodeUriComponent($title->getPrefixedText()); $titleEncoded = Utils::encodeUriComponent($title->getPrefixedText());
$url = str_replace($titleEncoded, $slugEncoded, $url); $url = str_replace($titleEncoded, $slugEncoded, $url);
} }
}
} catch (DBQueryError $ex) { } catch (DBQueryError $ex) {
} }
} }
@ -97,10 +121,14 @@ class Hooks {
if ($flags & EDIT_NEW) { if ($flags & EDIT_NEW) {
$title = $wikiPage->getTitle(); $title = $wikiPage->getTitle();
$parsedData = Utils::parseTitleToAscii($title, $title->getPageLanguage()); $parsedData = Utils::parseTitleToAscii($title, $title->getPageLanguage());
if ($parsedData) {
Utils::addTitleSlugMap($title->getText(), $parsedData['slug'], $parsedData['latinize']); Utils::addTitleSlugMap($title->getText(), $parsedData['slug'], $parsedData['latinize']);
} }
} }
}
public static function onPageMoveComplete(LinkTarget $old, LinkTarget $new, UserIdentity $userIdentity, $pageid, $redirid, $reason, $revision) { public static function onPageMoveComplete(LinkTarget $old, LinkTarget $new, UserIdentity $userIdentity, $pageid, $redirid, $reason, $revision) {
if (!in_array($new->getNamespace(), self::$allowedNS)) { //不是普通页面就跳过 if (!in_array($new->getNamespace(), self::$allowedNS)) { //不是普通页面就跳过
@ -108,11 +136,10 @@ class Hooks {
} }
$title = MediaWikiServices::getInstance()->getTitleFactory()->newFromLinkTarget($new); $title = MediaWikiServices::getInstance()->getTitleFactory()->newFromLinkTarget($new);
try {
$parsedData = Utils::parseTitleToAscii($title, $title->getPageLanguage()); $parsedData = Utils::parseTitleToAscii($title, $title->getPageLanguage());
Utils::addTitleSlugMap($title->getText(), $parsedData['slug'], $parsedData['latinize']);
} catch (\Exception $e) {
if ($parsedData) {
Utils::addTitleSlugMap($title->getText(), $parsedData['slug'], $parsedData['latinize']);
} }
} }
@ -139,10 +166,10 @@ class Hooks {
$title = $skin->getRelevantTitle(); $title = $skin->getRelevantTitle();
if (in_array($title->getNamespace(), self::$allowedNS)) { if (in_array($title->getNamespace(), self::$allowedNS)) {
if ($service->getPermissionManager()->userHasRight($user, 'delete') || Utils::hasUserEditedPage($title, $user)) { if ($service->getPermissionManager()->userHasRight($user, 'delete') || Utils::hasUserEditedPage($title, $user)) {
$links['page-secondary']['custom-url'] = [ $links['TOOLBOX']['custom-url'] = [
'class' => false, 'class' => false,
'text' => wfMessage('latinizeurl-customurl')->text(), 'text' => wfMessage('latinizeurl-customurl')->text(),
'href' => \SpecialPage::getTitleFor('CustomUrl', $title->getPrefixedDBKey())->getLocalURL(), 'href' => SpecialPage::getTitleFor('CustomUrl', $title->getPrefixedDBKey())->getLocalURL(),
'id' => 'ca-custom-url', 'id' => 'ca-custom-url',
]; ];
} }

@ -1,4 +1,5 @@
<?php <?php
namespace LatinizeUrl; namespace LatinizeUrl;
use Collation; use Collation;
@ -32,7 +33,13 @@ class LatinizeCollation extends Collation {
if ($slug) { if ($slug) {
return ucfirst($slug); return ucfirst($slug);
} else { } else {
return $this->getLatinize($string); $latinize = $this->getLatinize($string);
if ($latinize) {
return $latinize;
}
return ucfirst($slug);
} }
} }
@ -45,7 +52,13 @@ class LatinizeCollation extends Collation {
if ($slug) { if ($slug) {
return strtoupper($slug[0]); return strtoupper($slug[0]);
} else { } else {
return strtoupper(mb_substr($this->getLatinize($string), 0, 1, 'UTF-8')); $latinize = $this->getLatinize($string);
if ($latinize) {
return strtoupper(mb_substr($latinize, 0, 1, 'UTF-8'));
}
} }
return mb_substr(0, 1, $string, 'UTF-8');
} }
} }

@ -1,4 +1,5 @@
<?php <?php
namespace LatinizeUrl; namespace LatinizeUrl;
class Patcher { class Patcher {
@ -29,7 +30,7 @@ class Patcher {
public function patchInitializeParseTitleHook() { public function patchInitializeParseTitleHook() {
$patchName = 'InitializeParseTitleHook'; $patchName = 'InitializeParseTitleHook';
$patchContent = ['MediaWikiServices::getInstance()->getHookContainer()->run( \'InitializeParseTitle\', [ &$ret, $request ] );']; $patchContent = ['\MediaWiki\MediaWikiServices::getInstance()->getHookContainer()->run( \'InitializeParseTitle\', [ &$ret, $request ] );'];
$patchFinalContent = $this->makePatchContent($patchName, $patchContent, 2); $patchFinalContent = $this->makePatchContent($patchName, $patchContent, 2);
$currentPatch = $this->findPatchVersion($patchName); $currentPatch = $this->findPatchVersion($patchName);
if ($currentPatch) { if ($currentPatch) {
@ -39,7 +40,7 @@ class Patcher {
. substr($this->content, $currentPatch['end'] + 1); . substr($this->content, $currentPatch['end'] + 1);
} }
} else { //打新的补丁 } else { //打新的补丁
$regex = '/(?!private function parseTitle\(\) \{(.*?))(?=[\t ]+return \$ret;)/is'; $regex = '/(?!protected function parseTitle\(\) \{(.*?))(?=[\t ]+return \$ret;)/is';
if (preg_match($regex, $this->content, $matches, PREG_OFFSET_CAPTURE)) { if (preg_match($regex, $this->content, $matches, PREG_OFFSET_CAPTURE)) {
$splitPos = $matches[0][1]; $splitPos = $matches[0][1];
$this->content = substr($this->content, 0, $splitPos) $this->content = substr($this->content, 0, $splitPos)

@ -1,15 +1,14 @@
<?php <?php
namespace LatinizeUrl; namespace LatinizeUrl;
use Article;
use Exception; use Exception;
use ExtensionRegistry; use MediaWiki\Title\Title;
use Title; use MediaWiki\User\User;
use User;
use Language; use Language;
use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Tag;
use MediaWiki\MediaWikiServices; use MediaWiki\MediaWikiServices;
use StubUserLang; use StubUserLang;
use MediaWiki\Registration\ExtensionRegistry;
class Utils { class Utils {
private static $dbr = null; private static $dbr = null;
@ -74,12 +73,29 @@ class Utils {
} }
} }
/**
* 从URL中获取标题
* @param Title|string $url
* @param int $namespace
*/
public static function getTitleBySlugUrl($url, $namespace = NS_MAIN) { public static function getTitleBySlugUrl($url, $namespace = NS_MAIN) {
if ($url instanceof Title) { if ($url instanceof Title) {
$namespace = $url->getNamespace(); $namespace = $url->getNamespace();
$url = $url->getText(); $url = $url->getText();
} }
$wikiPageFactory = MediaWikiServices::getInstance()->getWikiPageFactory();
// 新版在URL中加了pageId
if (preg_match('/^(\d+?)~/', $url, $matches)) {
$pageId = intval($matches[1]);
$wikiPage = $wikiPageFactory->newFromID($pageId);
if ($wikiPage) {
return $wikiPage->getTitle();
}
}
// 旧版URL
$titleText = self::getTitleTextBySlugUrl($url); $titleText = self::getTitleTextBySlugUrl($url);
if ($titleText) { if ($titleText) {
return Title::newFromText($titleText, $namespace); return Title::newFromText($titleText, $namespace);
@ -161,26 +177,33 @@ class Utils {
); );
} }
public static function getSlugUrlByTitle($title){ public static function getSlugUrlByTitleWithoutId($title) {
if ($title instanceof Title) { if ($title instanceof Title) {
$title = $title->getText(); $titleText = $title->getText();
} else {
$titleText = $title;
$title = Title::newFromText($title);
} }
self::initCache(); self::initCache();
self::initReplicaDb(); self::initReplicaDb();
return self::$cache->getWithSetCallback( return self::$cache->getWithSetCallback(
self::$cache->makeKey('title2slugurl', $title), self::$cache->makeKey('title2slugurlorig', $titleText),
self::$cache::TTL_MINUTE * 10, self::$cache::TTL_MINUTE * 10,
function() use($title){ function () use ($title, $titleText) {
$res = self::$dbr->select('url_slug', ['url'], [ $res = self::$dbr->select('url_slug', ['url'], [
'title' => $title, 'title' => $title,
], __METHOD__, [ ], __METHOD__, [
'LIMIT' => 1, 'LIMIT' => 1,
]); ]);
if ($res->numRows() > 0) { if ($res->numRows() > 0) {
$data = $res->fetchRow(); $data = $res->fetchRow();
return $data['url'];
$url = $data['url'];
return $url;
} else { } else {
return false; return false;
} }
@ -188,6 +211,36 @@ class Utils {
); );
} }
public static function getSlugUrlByTitle($title) {
if (is_string($title)) {
$title = Title::newFromText($title);
}
if (!$title) return false;
return self::$cache->getWithSetCallback(
self::$cache->makeKey('title2slugurl', $title->getText()),
self::$cache::TTL_MINUTE * 10,
function () use ($title) {
$slugUrl = self::getSlugUrlByTitleWithoutId($title);
if (!$slugUrl) return false;
$wikiPageFactory = MediaWikiServices::getInstance()->getWikiPageFactory();
if (!$title->isMainPage()) {
$wikiPage = $wikiPageFactory->newFromTitle($title);
if ($wikiPage) {
$pageId = $wikiPage->getId();
$slugUrl = "{$pageId}~" . $slugUrl;
}
}
return $slugUrl;
}
);
}
public static function getSlugDataByTitle($title) { public static function getSlugDataByTitle($title) {
if ($title instanceof Title) { if ($title instanceof Title) {
$title = $title->getText(); $title = $title->getText();
@ -321,9 +374,11 @@ class Utils {
public static function hasUserEditedPage(Title $title, User $user) { public static function hasUserEditedPage(Title $title, User $user) {
if ($user->isAnon()) return false; if ($user->isAnon()) return false;
if (!$title->exists()) return false; if (!$title->exists()) return false;
$article = Article::newFromID($title->getArticleID());
if($article == null) return false; $wikiPageFactory = MediaWikiServices::getInstance()->getWikiPageFactory();
$wikiPage = Article::newFromID($title->getArticleID())->getPage();
$wikiPage = $wikiPageFactory->newFromTitle($title);
if (!$wikiPage) return false;
$contributors = $wikiPage->getContributors(); $contributors = $wikiPage->getContributors();
foreach ($contributors as $contributor) { foreach ($contributors as $contributor) {
if ($contributor->equals($user)) { if ($contributor->equals($user)) {
@ -368,6 +423,7 @@ class Utils {
* @return mixed 转换器 * @return mixed 转换器
*/ */
public static function parseTitleToAscii(Title $title, Language $language) { public static function parseTitleToAscii(Title $title, Language $language) {
try {
$convertor = self::getConvertor($language); $convertor = self::getConvertor($language);
if ($title->isSubpage()) { if ($title->isSubpage()) {
//处理子页面,按照页面拆分 //处理子页面,按照页面拆分
@ -413,12 +469,21 @@ class Utils {
return false; return false;
} }
} }
} catch (Exception $ex) {
wfLogWarning('Cannot parse title to ascii: ' . $ex->getMessage());
wfLogWarning($ex->getTraceAsString(), E_USER_ERROR);
return false;
}
} }
public static function getVersion() { public static function getVersion() {
return ExtensionRegistry::getInstance()->getAllThings()['LatinizeUrl']['version']; return ExtensionRegistry::getInstance()->getAllThings()['LatinizeUrl']['version'];
} }
/**
* @param string[] $sentenceList
* @return string
*/
public static function wordListToUrl($sentenceList) { public static function wordListToUrl($sentenceList) {
$strBuilder = []; $strBuilder = [];
foreach ($sentenceList as $pinyinList) { foreach ($sentenceList as $pinyinList) {

@ -1,10 +1,14 @@
<?php <?php
namespace LatinizeUrl; namespace LatinizeUrl;
use UnlistedSpecialPage;
use Html;
use MediaWiki\MediaWikiServices; use MediaWiki\MediaWikiServices;
use MediaWiki\SpecialPage\UnlistedSpecialPage;
use MediaWiki\Html\Html;
use MediaWiki\Session\CsrfTokenSet; use MediaWiki\Session\CsrfTokenSet;
use MediaWiki\Tests\Session\CsrfTokenSetTest;
use MediaWiki\Title\Title;
use MediaWiki\Title\TitleArrayFromResult;
use ThrottledError; use ThrottledError;
class SpecialCustomUrl extends UnlistedSpecialPage { class SpecialCustomUrl extends UnlistedSpecialPage {
@ -14,7 +18,7 @@ class SpecialCustomUrl extends UnlistedSpecialPage {
protected $target; protected $target;
/** /**
* @var \Title * @var Title
*/ */
protected $title; protected $title;
@ -54,10 +58,11 @@ class SpecialCustomUrl extends UnlistedSpecialPage {
$this->outputHeader(); $this->outputHeader();
$service = MediaWikiServices::getInstance(); $service = MediaWikiServices::getInstance();
$request = $this->getRequest(); $request = $this->getRequest();
$this->target = $par ?? $request->getText('target'); $this->target = $par ?? $request->getText('target');
$title = \Title::newFromText($this->target); $title = Title::newFromText($this->target);
$this->title = $title; $this->title = $title;
$this->getSkin()->setRelevantTitle($this->title); $this->getSkin()->setRelevantTitle($this->title);
@ -82,7 +87,9 @@ class SpecialCustomUrl extends UnlistedSpecialPage {
$this->slug = $this->getCurrentSlug(); $this->slug = $this->getCurrentSlug();
if ($request->getRawVal('action') == 'submit' && $request->wasPosted() && $user->matchEditToken($request->getVal('wpEditToken'))) { $csrfTokenObj = $request->getSession()->getToken();
if ($request->getRawVal('action') == 'submit' && $request->wasPosted() && $csrfTokenObj->match($request->getVal('wpEditToken'))) {
$this->doSubmit(); $this->doSubmit();
} else { } else {
$this->showForm([]); $this->showForm([]);
@ -96,7 +103,10 @@ class SpecialCustomUrl extends UnlistedSpecialPage {
protected function showForm($err, $isPermError = false) { protected function showForm($err, $isPermError = false) {
$user = $this->getUser(); $user = $this->getUser();
$out = $this->getOutput(); $out = $this->getOutput();
$out->setPageTitle($this->msg('latinizeurl-customurl')); $request = $this->getRequest();
$csrfTokenObj = $request->getSession()->getToken();
$out->setPageTitle($this->msg('latinizeurl-customurl')->text());
$out->addModuleStyles([ $out->addModuleStyles([
'mediawiki.special', 'mediawiki.special',
'mediawiki.interface.helpers.styles' 'mediawiki.interface.helpers.styles'
@ -162,7 +172,7 @@ class SpecialCustomUrl extends UnlistedSpecialPage {
$form->appendContent( $form->appendContent(
$fieldset, $fieldset,
new \OOUI\HtmlSnippet( new \OOUI\HtmlSnippet(
Html::hidden('wpEditToken', $user->getEditToken()) Html::hidden('wpEditToken', $csrfTokenObj->toString())
) )
); );
@ -182,7 +192,7 @@ class SpecialCustomUrl extends UnlistedSpecialPage {
} }
private function getCurrentSlug() { private function getCurrentSlug() {
$slug = Utils::getSlugUrlByTitle($this->title); $slug = Utils::getSlugUrlByTitleWithoutId($this->title);
if ($slug) { if ($slug) {
return $slug; return $slug;
} else { } else {
@ -249,11 +259,18 @@ class SpecialCustomUrl extends UnlistedSpecialPage {
private function showSubpages($title) { private function showSubpages($title) {
$nsHasSubpages = $this->nsInfo->hasSubpages($title->getNamespace()); $nsHasSubpages = $this->nsInfo->hasSubpages($title->getNamespace());
$subpages = $title->getSubpages(); $subpages = $title->getSubpages();
$count = $subpages instanceof \TitleArray ? $subpages->count() : 0; $count = $subpages instanceof TitleArrayFromResult ? $subpages->count() : 0;
$titleIsTalk = $title->isTalkPage(); $titleIsTalk = $title->isTalkPage();
$subpagesTalk = $title->getTalkPage()->getSubpages();
$countTalk = $subpagesTalk instanceof \TitleArray ? $subpagesTalk->count() : 0; $talkPage = $title->getTalkPageIfDefined();
if ($talkPage) {
$subpagesTalk = $talkPage->getSubpages();
} else {
$subpagesTalk = [];
}
$countTalk = $subpagesTalk instanceof TitleArrayFromResult ? $subpagesTalk->count() : 0;
$totalCount = $count + $countTalk; $totalCount = $count + $countTalk;
if (!$nsHasSubpages && $countTalk == 0) { if (!$nsHasSubpages && $countTalk == 0) {

Loading…
Cancel
Save