*/
/**
- * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
+ * Interface for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
*/
interface Page {
}
$changed = !$content->equals( $oldContent );
+ $dbw = wfGetDB( DB_MASTER );
+
if ( $changed ) {
$prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
$status->merge( $prepStatus );
return $status;
}
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
+ $dbw->startAtomic( __METHOD__ );
// Get the latest page_latest value while locking it.
// Do a CAS style check to see if it's the same as when this method
// started. If it changed then bail out before touching the DB.
$latestNow = $this->lockAndGetLatest();
if ( $latestNow != $oldid ) {
- $dbw->commit( __METHOD__ );
+ $dbw->endAtomic( __METHOD__ );
// Page updated or deleted in the mean time
$status->fatal( 'edit-conflict' );
$user->incEditCount();
- $dbw->commit( __METHOD__ );
+ $dbw->endAtomic( __METHOD__ );
$this->mTimestamp = $now;
} else {
// Bug 32948: revision ID must be set to page {{REVISIONID}} and
$revision->setId( $this->getLatest() );
}
- // Update links tables, site stats, etc.
- $this->doEditUpdates(
- $revision,
- $user,
- array(
- 'changed' => $changed,
- 'oldcountable' => $meta['oldCountable'],
- 'oldrevision' => $meta['oldRevision']
- )
- );
-
if ( $changed ) {
// Return the new revision to the caller
$status->value['revision'] = $revision;
$this->mTitle->invalidateCache( $now );
}
- // Trigger post-save hook
- $hook_args = array( &$this, &$user, $content, $summary,
- $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $meta['baseRevId'] );
- ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
- Hooks::run( 'PageContentSaveComplete', $hook_args );
+ // Do secondary updates once the main changes have been committed...
+ $that = $this;
+ $dbw->onTransactionIdle(
+ function () use (
+ $dbw, &$that, $revision, &$user, $content, $summary, &$flags,
+ $changed, $meta, &$status
+ ) {
+ // Do per-page updates in a transaction
+ $dbw->setFlag( DBO_TRX );
+ // Update links tables, site stats, etc.
+ $that->doEditUpdates(
+ $revision,
+ $user,
+ array(
+ 'changed' => $changed,
+ 'oldcountable' => $meta['oldCountable'],
+ 'oldrevision' => $meta['oldRevision']
+ )
+ );
+ // Trigger post-save hook
+ $params = array( &$that, &$user, $content, $summary, $flags & EDIT_MINOR,
+ null, null, &$flags, $revision, &$status, $meta['baseRevId'] );
+ ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+ Hooks::run( 'PageContentSaveComplete', $params );
+ }
+ );
return $status;
}
* - 'no-change': don't update the article count, ever
*/
public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
- global $wgRCWatchCategoryMembership;
+ global $wgRCWatchCategoryMembership, $wgContLang;
$options += array(
'changed' => true,
}
MessageCache::singleton()->replace( $shortTitle, $msgtext );
+
+ if ( $wgContLang->hasVariants() ) {
+ $wgContLang->updateConversionTable( $this->mTitle );
+ }
}
if ( $options['created'] ) {
* @param Title $title
*/
public static function onArticleDelete( Title $title ) {
+ global $wgContLang;
+
// Update existence markers on article/talk tabs...
$other = $title->getOtherPage();
// Messages
if ( $title->getNamespace() == NS_MEDIAWIKI ) {
MessageCache::singleton()->replace( $title->getDBkey(), false );
+
+ if ( $wgContLang->hasVariants() ) {
+ $wgContLang->updateConversionTable( $title );
+ }
}
// Images
* @return bool
*/
public static function isKnownLanguageTag( $tag ) {
- static $coreLanguageNames;
-
// Quick escape for invalid input to avoid exceptions down the line
// when code tries to process tags which are not valid at all.
if ( !self::isValidBuiltInCode( $tag ) ) {
return false;
}
- if ( $coreLanguageNames === null ) {
- global $IP;
- include "$IP/languages/Names.php";
- }
-
- if ( isset( $coreLanguageNames[$tag] )
+ if ( isset( MediaWiki\Languages\Data\Names::$names[$tag] )
|| self::fetchLanguageName( $tag, $tag ) !== ''
) {
return true;
*/
private static function fetchLanguageNamesUncached( $inLanguage = null, $include = 'mw' ) {
global $wgExtraLanguageNames;
- static $coreLanguageNames;
-
- if ( $coreLanguageNames === null ) {
- global $IP;
- include "$IP/languages/Names.php";
- }
// If passed an invalid language code to use, fallback to en
if ( $inLanguage !== null && !Language::isValidCode( $inLanguage ) ) {
Hooks::run( 'LanguageGetTranslatedLanguageNames', array( &$names, $inLanguage ) );
}
- $mwNames = $wgExtraLanguageNames + $coreLanguageNames;
+ $mwNames = $wgExtraLanguageNames + MediaWiki\Languages\Data\Names::$names;
foreach ( $mwNames as $mwCode => $mwName ) {
# - Prefer own MediaWiki native name when not using the hook
# - For other names just add if not added through the hook
return $this->mConverter->getParsedTitle();
}
+ /**
+ * Refresh the cache of conversion tables when
+ * MediaWiki:Conversiontable* is updated.
+ *
+ * @param Title $titleobj The Title of the page being updated
+ */
+ public function updateConversionTable( Title $title ) {
+ $this->mConverter->updateConversionTable( $title );
+ }
+
/**
* Prepare external link text for conversion. When the text is
* a URL, it shouldn't be converted, and it'll be wrapped in
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-require_once __DIR__ . '/LanguageZh.php';
-
/**
* @ingroup Language
*/
}
function loadDefaultTables() {
- require __DIR__ . '/../../includes/ZhConversion.php';
$this->mTables = array(
- 'gan-hans' => new ReplacementArray( $zh2Hans ),
- 'gan-hant' => new ReplacementArray( $zh2Hant ),
+ 'gan-hans' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hans ),
+ 'gan-hant' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hant ),
'gan' => new ReplacementArray
);
}
*/
class LanguageGan extends LanguageZh {
function __construct() {
- global $wgHooks;
parent::__construct();
$variants = array( 'gan', 'gan-hans', 'gan-hant' );
$variants, $variantfallbacks,
array(),
$ml );
-
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
/**
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-
/**
* Conversion script between Latin and Syllabics for Inuktitut.
* - Syllabics -> lowercase Latin
*/
class LanguageIu extends Language {
function __construct() {
- global $wgHooks;
-
parent::__construct();
$variants = array( 'iu', 'ike-cans', 'ike-latn' );
$flags = array();
$this->mConverter = new IuConverter( $this, 'iu', $variants, $variantfallbacks, $flags );
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-require_once __DIR__ . '/LanguageKk_cyrl.php';
-
define( 'KK_C_UC', 'АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрстуұүфхһцчшщъыіьэюя' ); # Kazakh Cyrillic lowercase
define( 'KK_L_UC', 'AÄBCÇDEÉFGĞHIİÏJKLMNÑOÖPQRSŞTUÜVWXYÝZ' ); # Kazakh Latin uppercase
*/
class LanguageKk extends LanguageKk_cyrl {
function __construct() {
- global $wgHooks;
parent::__construct();
$variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
);
$this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
-
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
/**
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-require_once __DIR__ . '/LanguageKu_ku.php';
-
/**
* Kurdish converter routines
*
class LanguageKu extends LanguageKu_ku {
function __construct() {
- global $wgHooks;
parent::__construct();
$variants = array( 'ku', 'ku-arab', 'ku-latn' );
);
$this->mConverter = new KuConverter( $this, 'ku', $variants, $variantfallbacks );
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-
/**
* Conversion script between Latin and Tifinagh for Tachelhit.
* - Tifinagh -> lowercase Latin
*/
class LanguageShi extends Language {
function __construct() {
- global $wgHooks;
-
parent::__construct();
$variants = array( 'shi', 'shi-tfng', 'shi-latn' );
$flags = array();
$this->mConverter = new ShiConverter( $this, 'shi', $variants, $variantfallbacks, $flags );
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-
/**
* There are two levels of conversion for Serbian: the script level
* (Cyrillics <-> Latin), and the variant level (ekavian
*/
class LanguageSr extends Language {
function __construct() {
- global $wgHooks;
-
parent::__construct();
$variants = array( 'sr', 'sr-ec', 'sr-el' );
'W' => 'W', 'реч' => 'W', 'reč' => 'W', 'ријеч' => 'W', 'riječ' => 'W'
);
$this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-
/**
* @ingroup Language
*/
*/
class LanguageUz extends Language {
function __construct() {
- global $wgHooks;
parent::__construct();
$variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
);
$this->mConverter = new UzConverter( $this, 'uz', $variants, $variantfallbacks );
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
* @ingroup Language
*/
-require_once __DIR__ . '/../LanguageConverter.php';
-require_once __DIR__ . '/LanguageZh_hans.php';
-
/**
* @ingroup Language
*/
}
function loadDefaultTables() {
- require __DIR__ . "/../../includes/ZhConversion.php";
$this->mTables = array(
- 'zh-hans' => new ReplacementArray( $zh2Hans ),
- 'zh-hant' => new ReplacementArray( $zh2Hant ),
- 'zh-cn' => new ReplacementArray( $zh2CN ),
- 'zh-hk' => new ReplacementArray( $zh2HK ),
- 'zh-mo' => new ReplacementArray( $zh2HK ),
- 'zh-my' => new ReplacementArray( $zh2CN ),
- 'zh-sg' => new ReplacementArray( $zh2CN ),
- 'zh-tw' => new ReplacementArray( $zh2TW ),
+ 'zh-hans' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hans ),
+ 'zh-hant' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hant ),
+ 'zh-cn' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2CN ),
+ 'zh-hk' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2HK ),
+ 'zh-mo' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2HK ),
+ 'zh-my' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2CN ),
+ 'zh-sg' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2CN ),
+ 'zh-tw' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2TW ),
'zh' => new ReplacementArray
);
}
*/
class LanguageZh extends LanguageZh_hans {
function __construct() {
- global $wgHooks;
-
parent::__construct();
$variants = array(
$variants, $variantfallbacks,
array(),
$ml );
-
- $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
/**