--- /dev/null
+README
\ No newline at end of file
'TitleDependency' => 'includes/cache/CacheDependency.php',
'TitleListDependency' => 'includes/cache/CacheDependency.php',
- # includes/conf
- 'Conf' => 'includes/conf/Conf.php',
- 'DatabaseConf' => 'includes/conf/DatabaseConf.php',
- 'DefaultSettings' => 'includes/conf/DefaultSettings.php',
-
# includes/context
'ContextSource' => 'includes/context/ContextSource.php',
'DerivativeContext' => 'includes/context/DerivativeContext.php',
public static function getDefaultOptions() {
global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
+ static $defOpt = null;
+ if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
+ // Disabling this for the unit tests, as they rely on being able to change $wgContLang
+ // mid-request and see that change reflected in the return value of this function.
+ // Which is insane and would never happen during normal MW operation
+ return $defOpt;
+ }
+
$defOpt = $wgDefaultUserOptions;
# default language setting
$defOpt['variant'] = $wgContLang->getCode();
}
$defOpt['skin'] = $wgDefaultSkin;
- // FIXME: Ideally we'd cache the results of this function so the hook is only run once,
- // but that breaks the parser tests because they rely on being able to change $wgContLang
- // mid-request and see that change reflected in the return value of this function.
- // Which is insane and would never happen during normal MW operation, but is also not
- // likely to get fixed unless and until we context-ify everything.
- // See also https://www.mediawiki.org/wiki/Special:Code/MediaWiki/101488#c25275
wfRunHooks( 'UserGetDefaultOptions', array( &$defOpt ) );
return $defOpt;
// Page ID (number not localised, as it's a database ID)
$pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-article-id' ), $id );
+ // Language in which the page content is (supposed to be) written
+ $pageLang = $title->getPageLanguage()->getCode();
+ $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-language' ),
+ Language::fetchLanguageName( $pageLang, $lang->getCode() )
+ . ' ' . $this->msg( 'parentheses', $pageLang ) );
+
// Search engine status
$pOutput = new ParserOutput();
if ( isset( $pageProperties['noindex'] ) ) {
+++ /dev/null
-<?php
-/**
- * Base configuration class.
- *
- * Get some configuration variable:
- * $mySetting = Conf::get( 'mySetting' );
- *
- * Copyright © 2011 Chad Horohoe <chadh@wikimedia.org>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @defgroup Config Config
- */
-abstract class Conf {
- /**
- * A special value to return when default config items do not exist. Use
- * this to differentiate from 'null' which may be a valid config value.
- *
- * Please don't ever make this a default (or accepted) value for your
- * configuration. It's liable to Break Something.
- */
- const NO_SUCH_DEFAULT_CONFIG = 'mw-no-such-default-config';
-
- /**
- * The Wiki ID (usually $wgDBname)
- * @var String
- */
- private $wikiId;
-
- /**
- * Singleton
- * @var Conf
- */
- private static $__instance;
-
- /**
- * Stores of the core defaults, extension defaults and wiki overrides
- *
- * @var array
- */
- protected $defaults, $extensionDefaults, $values = array();
-
- /**
- * Constructor. Children should call this if implementing.
- * @param $confConfig Array of config vars
- */
- protected function __construct( $confConfig ) {
- $this->wikiId = $confConfig['wikiId'];
- $this->defaults = (array)(new DefaultSettings);
- // @todo implement this:
- // $this->initExtensionDefaults();
- $this->initChangedSettings();
- if( isset( $confConfig['exposeGlobals'] ) ) {
- $this->exposeGlobals();
- }
- }
-
- /**
- * Expose all config variables as globals for back-compat. Ewwww.
- */
- private function exposeGlobals() {
- $allVars = $this->defaults + $this->extensionDefaults + $this->values;
- foreach( $allVars as $name => $value ) {
- $var = 'wg' . ucfirst( $name );
- $GLOBALS[$var] = $value;
- }
- }
-
- /**
- * Load customized settings from whatever the data store is
- */
- abstract protected function initChangedSettings();
-
- /**
- * Apply a setting to the backend store
- * @param $name String Name of the setting
- * @param $value mixed Value to store
- */
- abstract protected function writeSetting( $name, $value );
-
- /**
- * Initialize a new child class based on a configuration array
- * @param $conf Array of configuration settings, see $wgConfiguration
- * for details
- * @throws MWException
- * @return Conf
- */
- private static function newFromSettings( $conf ) {
- $class = ucfirst( $conf['type'] ) . 'Conf';
- if( !class_exists( $class ) ) {
- throw new MWException( '$wgConfiguration misconfigured with invalid "type"' );
- }
- return new $class( $conf );
- }
-
- /**
- * Get the singleton if we don't want a specific wiki
- * @param bool|string $wiki An id for a remote wiki
- * @throws MWException
- * @return Conf child
- */
- public static function load( $wiki = false ) {
- throw new MWException( "Not working yet, don't attempt to use this" );
- if( !self::$__instance ) {
- /**global $wgConfiguration;
- self::$__instance = self::newFromSettings( $wgConfiguration );*/
- }
- if( $wiki && $wiki != self::$__instance->getWikiId() ) {
- // Load configuration for a different wiki, not sure how
- // we're gonna do this yet
- return null;
- }
- return self::$__instance;
- }
-
- /**
- * Get a property from the configuration database, falling back
- * to DefaultSettings if undefined
- * @param $name String Name of setting to retrieve.
- * @param $wiki String An id for a remote wiki
- * @return mixed
- */
- public static function get( $name, $wiki = false ) {
- return self::load( $wiki )->retrieveSetting( $name );
- }
-
- /**
- * Actually get the setting, checking overrides, extensions, then core.
- *
- * @param $name String Name of setting to get
- * @return mixed
- */
- public function retrieveSetting( $name ) {
- // isset() is ok here, because the default is to return null anyway.
- if( isset( $this->values[$name] ) ) {
- return $this->values[$name];
- } elseif( isset( $this->extensionDefaults[$name] ) ) {
- return $this->extensionDefaults[$name];
- } elseif( isset( $this->defaults[$name] ) ) {
- return $this->defaults[$name];
- } else {
- wfDebug( __METHOD__ . " called for unknown configuration item '$name'\n" );
- return null;
- }
- }
-
- /**
- * Apply a setting to the configuration object.
- * @param $name String Name of the config item
- * @param $value mixed Any value to use for the key
- * @param $write bool Whether to write to the static copy (db, file, etc)
- */
- public function applySetting( $name, $value, $write = false ) {
- $this->values[$name] = $value;
- if( $write && ( $value !== $this->getDefaultSetting( $name ) ) ) {
- $this->writeSetting( $name, $value );
- }
- }
-
- /**
- * Get the default for a given setting name. Check core and then extensions.
- * Will return NO_SUCH_DEFAULT_CONFIG if the config item does not exist.
- *
- * @param $name String Name of setting
- * @return mixed
- */
- public function getDefaultSetting( $name ) {
- // Use array_key_exists() here, to make sure we return a default
- // that's really set to null.
- if( array_key_exists( $name, $this->defaults ) ) {
- return $this->defaults[$name];
- } elseif( array_key_exists( $name, $this->extensionDefaults ) ) {
- return $this->extensionDefaults[$name];
- } else {
- wfDebug( __METHOD__ . " called for unknown configuration item '$name'\n" );
- return self::NO_SUCH_DEFAULT_CONFIG;
- }
- }
-
- /**
- * What is the wiki ID for this site?
- * @return String
- */
- public function getWikiId() {
- return $this->wikiId;
- }
-}
+++ /dev/null
-<?php
-/**
- * Database configuration class
- *
- * Copyright © 2011 Chad Horohoe <chadh@wikimedia.org>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Config
- */
-class DatabaseConf extends Conf {
- /**
- * @see Conf::initChangedSettings()
- */
- protected function initChangedSettings() {
- $res = wfGetDB( DB_MASTER )->select( 'config', '*', array(), __METHOD__ );
- foreach( $res as $row ) {
- $this->values[$row->cf_name] = unserialize( $row->cf_value );
- }
- }
-
- /**
- * @see Conf::writeSetting()
- *
- * @param $name
- * @param $value
- *
- * @return bool
- */
- protected function writeSetting( $name, $value ) {
- $dbw = wfGetDB( DB_MASTER );
- $value = serialize( $value );
- if( $dbw->selectRow( 'config', 'cf_name', array( 'cf_name' => $name ), __METHOD__ ) ) {
- $dbw->update( 'config', array( 'cf_value' => $value ),
- array( 'cf_name' => $name ), __METHOD__ );
- } else {
- $dbw->insert( 'config',
- array( 'cf_name' => $name, 'cf_value' => $value ), __METHOD__ );
- }
- return (bool)$dbw->affectedRows();
- }
-}
+++ /dev/null
-<?php
-/**
- * Utility class for holding all of our default settings.
- *
- * Copyright © 2011 Chad Horohoe <chadh@wikimedia.org>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Config
- */
-final class DefaultSettings {
- public $mySetting = 'defaultValue';
-}
public function __construct( $text, $model_id = CONTENT_MODEL_TEXT ) {
parent::__construct( $model_id );
+ if ( $text === null || $text === false ) {
+ wfWarn( "TextContent constructed with \$text = " . var_export( $text, true ) . "! "
+ . "This may indicate an error in the caller's scope." );
+
+ $text = '';
+ }
+
if ( !is_string( $text ) ) {
throw new MWException( "TextContent expects a string in the constructor." );
}
array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
- // 1.20
- array( 'addTable', 'config', 'patch-config.sql' ),
-
// 1.21
array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase.sql' ),
// 1.20
- array( 'addTable', 'config', 'patch-config.sql' ),
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase.sql' ),
//1.20
- array( 'addTable', 'config', 'patch-config.sql' ),
array( 'addIndex', 'ipblocks', 'i05', 'patch-ipblocks_i05_index.sql' ),
array( 'addIndex', 'revision', 'i05', 'patch-revision_i05_index.sql' ),
array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
- array( 'addTable', 'config', 'patch-config.sql' ),
array( 'addTable', 'external_user', 'patch-external_user.sql' ),
# Needed before new field
array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ug_group-length-increase.sql' ),
// 1.20
- array( 'addTable', 'config', 'patch-config.sql' ),
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
$this->mTargetObj = $ret;
$form = new HTMLForm( $this->getFormFields(), $this->getContext() );
- $form->addPreText( $this->msg( 'emailpagetext' )->parse() );
+ // By now we are supposed to be sure that $this->mTarget is a user name
+ $form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() );
$form->setSubmitTextMsg( 'emailsend' );
$form->setTitle( $this->getTitle() );
$form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
'emailuser-title-notarget' => 'E-mail user',
'emailuser-summary' => '', # do not translate or duplicate this message to other languages
'emailpage' => 'E-mail user',
-'emailpagetext' => 'You can use the form below to send an e-mail message to this user.
+// Dummy GENDER to prevent warnings at translatewiki
+'emailpagetext' => 'You can use the form below to send an e-mail message to this {{GENDER:$1|user}}.
The e-mail address you entered in [[Special:Preferences|your user preferences]] will appear as the "From" address of the e-mail, so the recipient will be able to reply directly to you.',
'usermailererror' => 'Mail object returned error:',
'defemailsubject' => '{{SITENAME}} e-mail from user "$1"',
'pageinfo-default-sort' => 'Default sort key',
'pageinfo-length' => 'Page length (in bytes)',
'pageinfo-article-id' => 'Page ID',
+'pageinfo-language' => 'Page content language',
'pageinfo-robot-policy' => 'Search engine status',
'pageinfo-robot-index' => 'Indexable',
'pageinfo-robot-noindex' => 'Not indexable',
'emailpage' => "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
-Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message [[Mediawiki:Noemailtext]] will appear instead of Special:EmailUser.',
+Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message [[Mediawiki:Noemailtext]] will appear instead of Special:EmailUser. Parameters:
+* $1 can be used for GENDER.',
'defemailsubject' => 'The default subject of EmailUser emails. Parameters:
* $1 is the username of the user sending the email and can be used for GENDER.',
'usermaildisabled' => 'Caption for an error message ({{msg-mw|Usermaildisabledtext}}) shown when the user-to-user e-mail feature is disabled on the wiki (see [[mw:Manual:$wgEnableEmail]], [[mw:Manual:$wgEnableUserEmail]]).',
'pageinfo-default-sort' => 'The key by which the page is sorted in categories by default.',
'pageinfo-length' => 'પૃષ્ઠની લંબાઇ બાઇટમાં',
'pageinfo-article-id' => 'The numeric identifier of the page.',
+'pageinfo-language' => 'Language in which the page content is written.',
'pageinfo-robot-policy' => 'The search engine status of the page, e.g. "marked as index".',
'pageinfo-robot-index' => 'An indication that the page is indexable.',
'pageinfo-robot-noindex' => 'An indication that the page is not indexable.',
+++ /dev/null
--- Table for holding configuration changes
-CREATE TABLE /*_*/config (
- -- Config var name
- cf_name varbinary(255) NOT NULL PRIMARY KEY,
- -- Config var value
- cf_value blob NOT NULL
-) /*$wgDBTableOptions*/;
--- Should cover *most* configuration - strings, ints, bools, etc.
-CREATE INDEX /*i*/cf_name_value ON /*_*/config (cf_name,cf_value(255));
);
CREATE UNIQUE INDEX ufg_user_group
ON user_former_groups (ufg_user, ufg_group);
-
-
-
--- Table for holding configuration changes
-CREATE TABLE config (
- cf_name VARCHAR(255) NOT NULL
- PRIMARY KEY,
- cf_value CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-
'pageinfo-default-sort',
'pageinfo-length',
'pageinfo-article-id',
+ 'pageinfo-language',
'pageinfo-robot-policy',
'pageinfo-robot-index',
'pageinfo-robot-noindex',
+++ /dev/null
-define mw_prefix='{$wgDBprefix}';
-
-CREATE TABLE &mw_prefix.config (
- cf_name VARCHAR2(255) NOT NULL,
- cf_value blob NOT NULL
-);
-ALTER TABLE &mw_prefix.config ADD CONSTRAINT &mw_prefix.config_pk PRIMARY KEY (cf_name);
-
);
CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
-CREATE TABLE &mw_prefix.config (
- cf_name VARCHAR2(255) NOT NULL,
- cf_value blob NOT NULL
-);
-ALTER TABLE &mw_prefix.config ADD CONSTRAINT &mw_prefix.config_pk PRIMARY KEY (cf_name);
--- leaving index out for now ...
-
-- do not prefix this table as it breaks parserTests
CREATE TABLE wiki_field_info_full (
table_name VARCHAR2(35) NOT NULL,
+++ /dev/null
-CREATE TABLE config (
- cf_name TEXT NOT NULL PRIMARY KEY,
- cf_value TEXT NOT NULL
-);
-CREATE INDEX cf_name_value ON config (cf_name, cf_value);
\ No newline at end of file
md_deps TEXT NOT NULL
);
CREATE UNIQUE INDEX md_module_skin ON module_deps (md_module, md_skin);
-
-CREATE TABLE config (
- cf_name TEXT NOT NULL PRIMARY KEY,
- cf_value TEXT NOT NULL
-);
-CREATE INDEX cf_name_value ON config (cf_name, cf_value);
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
--- Table for holding configuration changes
-CREATE TABLE /*_*/config (
- -- Config var name
- cf_name varbinary(255) NOT NULL PRIMARY KEY,
- -- Config var value
- cf_value blob NOT NULL
-) /*$wgDBTableOptions*/;
--- Should cover *most* configuration - strings, ints, bools, etc.
-CREATE INDEX /*i*/cf_name_value ON /*_*/config (cf_name,cf_value(255));
-
-- Holds all the sites known to the wiki.
CREATE TABLE /*_*/sites (
-- Numeric id of the site
* if an array is given as first argument).
*/
protected function setMwGlobals( $pairs, $value = null ) {
- if ( !is_array( $pairs ) ) {
- $key = $pairs;
- $this->mwGlobals[$key] = $GLOBALS[$key];
- $GLOBALS[$key] = $value;
- } else {
- foreach ( $pairs as $key => $value ) {
+
+ // Normalize (string, value) to an array
+ if( is_string( $pairs ) ) {
+ $pairs = array( $pairs => $value );
+ }
+
+ foreach ( $pairs as $key => $value ) {
+ // NOTE: make sure we only save the global once or a second call to
+ // setMwGlobals() on the same global would override the original
+ // value.
+ if ( !array_key_exists( $key, $this->mwGlobals ) ) {
$this->mwGlobals[$key] = $GLOBALS[$key];
- $GLOBALS[$key] = $value;
}
+
+ // Override the global
+ $GLOBALS[$key] = $value;
}
}