summaryrefslogtreecommitdiff
path: root/www/wiki/docs
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2019-01-06 00:20:37 -0300
committerYaco <franco@reevo.org>2019-01-06 00:20:37 -0300
commitdab3fd4a501df5c3fc30b4c9fe79bfada4415958 (patch)
tree3d1971414457ff62418a69b6a95bc4b4e93ab5e9 /www/wiki/docs
parent71ddfdcf197d529e0964059ad7b796913908f2b3 (diff)
grandes avances previos al primer deployment en reevo.wiki
Diffstat (limited to 'www/wiki/docs')
-rw-r--r--www/wiki/docs/README19
-rw-r--r--www/wiki/docs/code-coverage/README2
-rw-r--r--www/wiki/docs/contenthandler.txt182
-rw-r--r--www/wiki/docs/database.txt195
-rw-r--r--www/wiki/docs/databases/postgres.txt112
-rw-r--r--www/wiki/docs/databases/sqlite.txt12
-rw-r--r--www/wiki/docs/deferred.txt36
-rw-r--r--www/wiki/docs/design.txt106
-rw-r--r--www/wiki/docs/distributors.txt204
-rw-r--r--www/wiki/docs/doxygen_first_page.php19
-rw-r--r--www/wiki/docs/export-0.1.xsd76
-rw-r--r--www/wiki/docs/export-0.10.xsd294
-rw-r--r--www/wiki/docs/export-0.2.xsd100
-rw-r--r--www/wiki/docs/export-0.3.xsd154
-rw-r--r--www/wiki/docs/export-0.4.xsd216
-rw-r--r--www/wiki/docs/export-0.5.xsd219
-rw-r--r--www/wiki/docs/export-0.6.xsd226
-rw-r--r--www/wiki/docs/export-0.7.xsd272
-rw-r--r--www/wiki/docs/export-0.8.xsd289
-rw-r--r--www/wiki/docs/export-0.9.xsd292
-rw-r--r--www/wiki/docs/export-demo.xml160
-rw-r--r--www/wiki/docs/extension.schema.json986
-rw-r--r--www/wiki/docs/extension.schema.v1.json707
-rw-r--r--www/wiki/docs/extension.schema.v2.json763
-rw-r--r--www/wiki/docs/globals.txt67
-rw-r--r--www/wiki/docs/hooks.txt3934
-rw-r--r--www/wiki/docs/html/README4
-rw-r--r--www/wiki/docs/injection.txt269
-rw-r--r--www/wiki/docs/kss/Makefile19
-rw-r--r--www/wiki/docs/kss/README.txt21
-rwxr-xr-xwww/wiki/docs/kss/scripts/kss-node-check.sh20
-rw-r--r--www/wiki/docs/kss/styleGuideModules.txt10
-rw-r--r--www/wiki/docs/kss/styleguide-template/index.html87
-rw-r--r--www/wiki/docs/kss/styleguide-template/public/kss.less193
-rw-r--r--www/wiki/docs/language.txt5
-rw-r--r--www/wiki/docs/linkcache.txt24
-rw-r--r--www/wiki/docs/logger.txt71
-rw-r--r--www/wiki/docs/magicword.txt95
-rw-r--r--www/wiki/docs/maintenance.txt57
-rw-r--r--www/wiki/docs/memcached.txt235
-rw-r--r--www/wiki/docs/ontology.owl56
-rw-r--r--www/wiki/docs/php-memcached/ChangeLog28
-rw-r--r--www/wiki/docs/php-memcached/Documentation258
-rw-r--r--www/wiki/docs/php-memcached/README1
-rw-r--r--www/wiki/docs/schema.txt9
-rw-r--r--www/wiki/docs/scripts.txt52
-rw-r--r--www/wiki/docs/sitelist-1.0.xsd68
-rw-r--r--www/wiki/docs/sitelist.txt47
-rw-r--r--www/wiki/docs/sitescache.txt42
-rw-r--r--www/wiki/docs/skin.txt82
-rw-r--r--www/wiki/docs/title.txt67
-rw-r--r--www/wiki/docs/uidesign/child-selector-emu.html100
-rw-r--r--www/wiki/docs/uidesign/confirmable.html147
-rw-r--r--www/wiki/docs/uidesign/design.html36
-rw-r--r--www/wiki/docs/uidesign/mediawiki.action.history.diff.html92
-rw-r--r--www/wiki/docs/uidesign/mediawiki.diff.html92
-rw-r--r--www/wiki/docs/uidesign/monospace.html77
-rw-r--r--www/wiki/docs/uidesign/table-layout.html59
58 files changed, 12065 insertions, 0 deletions
diff --git a/www/wiki/docs/README b/www/wiki/docs/README
new file mode 100644
index 00000000..2d822701
--- /dev/null
+++ b/www/wiki/docs/README
@@ -0,0 +1,19 @@
+/docs Directory README
+======================
+
+The 'docs' directory contain various text files that should help you understand
+the most important parts of the code of MediaWiki. More in-depth documentation
+can be found at:
+ https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Code
+ https://www.mediawiki.org/wiki/Special:MyLanguage/Developer_hub
+API documentation is automatically generated and updated daily at:
+ https://doc.wikimedia.org/mediawiki-core/master/php/html/
+
+You can get a fresh version using 'make doc' or mwdocgen.php in the
+../maintenance/ directory.
+
+
+For end users, most of the documentation is located online at:
+ https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents
+Documentation for MediaWiki site administrators is at:
+ https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents
diff --git a/www/wiki/docs/code-coverage/README b/www/wiki/docs/code-coverage/README
new file mode 100644
index 00000000..76ce9bdc
--- /dev/null
+++ b/www/wiki/docs/code-coverage/README
@@ -0,0 +1,2 @@
+This directory is for the auto-generated phpunit code coverage.
+Run 'make coverage' in the tests/phpunit subdirectory to build.
diff --git a/www/wiki/docs/contenthandler.txt b/www/wiki/docs/contenthandler.txt
new file mode 100644
index 00000000..5f379e7e
--- /dev/null
+++ b/www/wiki/docs/contenthandler.txt
@@ -0,0 +1,182 @@
+The ContentHandler facility adds support for arbitrary content types on wiki pages, instead of relying on wikitext
+for everything. It was introduced in MediaWiki 1.21.
+
+Each kind of content ("content model") supported by MediaWiki is identified by unique name. The content model determines
+how a page's content is rendered, compared, stored, edited, and so on.
+
+Built-in content types are:
+
+* wikitext - wikitext, as usual
+* javascript - user provided javascript code
+* json - simple implementation for use by extensions, etc.
+* css - user provided css code
+* text - plain text
+
+In PHP, use the corresponding CONTENT_MODEL_XXX constant.
+
+A page's content model is available using the Title::getContentModel() method. A page's default model is determined by
+ContentHandler::getDefaultModelFor($title) as follows:
+
+* The global setting $wgNamespaceContentModels specifies a content model for the given namespace.
+* The hook ContentHandlerDefaultModelFor may be used to override the page's default model.
+* Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript model if they end in .css or .js, respectively.
+ Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
+* Otherwise, the wikitext model is used.
+
+Note that is currently no mechanism to convert a page from one content model to another, and there is no guarantee that
+revisions of a page will all have the same content model. Use Revision::getContentModel() to find it.
+
+
+== Architecture ==
+
+Two class hierarchies are used to provide the functionality associated with the different content models:
+
+* Content interface (and AbstractContent base class) define functionality that acts on the concrete content of a page, and
+* ContentHandler base class provides functionality specific to a content model, but not acting on concrete content.
+
+The most important function of ContentHandler is to act as a factory for the appropriate implementation of Content. These
+Content objects are to be used by MediaWiki everywhere, instead of passing page content around as text. All manipulation
+and analysis of page content must be done via the appropriate methods of the Content object.
+
+For each content model, a subclass of ContentHandler has to be registered with $wgContentHandlers. The ContentHandler
+object for a given content model can be obtained using ContentHandler::getForModelID( $id ). Also Title, WikiPage and
+Revision now have getContentHandler() methods for convenience.
+
+ContentHandler objects are singletons that provide functionality specific to the content type, but not directly acting
+on the content of some page. ContentHandler::makeEmptyContent() and ContentHandler::unserializeContent() can be used to
+create a Content object of the appropriate type. However, it is recommended to instead use WikiPage::getContent() resp.
+Revision::getContent() to get a page's content as a Content object. These two methods should be the ONLY way in which
+page content is accessed.
+
+Another important function of ContentHandler objects is to define custom action handlers for a content model, see
+ContentHandler::getActionOverrides(). This is similar to what WikiPage::getActionOverrides() was already doing.
+
+
+== Serialization ==
+
+With the ContentHandler facility, page content no longer has to be text based. Objects implementing the Content interface
+are used to represent and handle the content internally. For storage and data exchange, each content model supports
+at least one serialization format via ContentHandler::serializeContent( $content ). The list of supported formats for
+a given content model can be accessed using ContentHandler::getSupportedFormats().
+
+Content serialization formats are identified using MIME type like strings. The following formats are built in:
+
+* text/x-wiki - wikitext
+* text/javascript - for js pages
+* text/css - for css pages
+* text/plain - for future use, e.g. with plain text messages.
+* text/html - for future use, e.g. with plain html messages.
+* application/vnd.php.serialized - for future use with the api and for extensions
+* application/json - for future use with the api, and for use by extensions
+* application/xml - for future use with the api, and for use by extensions
+
+In PHP, use the corresponding CONTENT_FORMAT_XXX constant.
+
+Note that when using the API to access page content, especially action=edit, action=parse and action=query&prop=revisions,
+the model and format of the content should always be handled explicitly. Without that information, interpretation of
+the provided content is not reliable. The same applies to XML dumps generated via maintenance/dumpBackup.php or
+Special:Export.
+
+Also note that the API will provide encapsulated, serialized content - so if the API was called with format=json, and
+contentformat is also json (or rather, application/json), the page content is represented as a string containing an
+escaped json structure. Extensions that use JSON to serialize some types of page content may provide specialized API
+modules that allow access to that content in a more natural form.
+
+
+== Compatibility ==
+
+The ContentHandler facility is introduced in a way that should allow all existing code to keep functioning at least
+for pages that contain wikitext or other text based content. However, a number of functions and hooks have been
+deprecated in favor of new versions that are aware of the page's content model, and will now generate warnings when
+used.
+
+Most importantly, the following functions have been deprecated:
+
+* Revisions::getText() is deprecated in favor Revisions::getContent()
+* WikiPage::getText() is deprecated in favor WikiPage::getContent()
+
+Also, the old Article::getContent() (which returns text) is superceded by Article::getContentObject(). However, both
+methods should be avoided since they do not provide clean access to the page's actual content. For instance, they may
+return a system message for non-existing pages. Use WikiPage::getContent() instead.
+
+Code that relies on a textual representation of the page content should eventually be rewritten. However,
+ContentHandler::getContentText() provides a stop-gap that can be used to get text for a page. Its behavior is controlled
+by $wgContentHandlerTextFallback; per default it will return the text for text based content, and null for any other
+content.
+
+For rendering page content, Content::getParserOutput() should be used instead of accessing the parser directly.
+ContentHandler::makeParserOptions() can be used to construct appropriate options.
+
+
+Besides some functions, some hooks have also been replaced by new versions (see hooks.txt for details).
+These hooks will now trigger a warning when used:
+
+* ArticleAfterFetchContent was replaced by ArticleAfterFetchContentObject
+* ArticleInsertComplete was replaced by PageContentInsertComplete
+* ArticleSave was replaced by PageContentSave
+* ArticleSaveComplete was replaced by PageContentSaveComplete
+* ArticleViewCustom was replaced by ArticleContentViewCustom (also consider a custom implementation of the view action)
+* EditFilterMerged was replaced by EditFilterMergedContent
+* EditPageGetDiffText was replaced by EditPageGetDiffContent
+* EditPageGetPreviewText was replaced by EditPageGetPreviewContent
+* ShowRawCssJs was deprecated in favor of custom rendering implemented in the respective ContentHandler object.
+
+
+== Database Storage ==
+
+Page content is stored in the database using the same mechanism as before. Non-text content is serialized first. The
+appropriate serialization and deserialization is handled by the Revision class.
+
+Each revision's content model and serialization format is stored in the revision table (resp. in the archive table, if
+the revision was deleted). The page's (current) content model (that is, the content model of the latest revision) is also
+stored in the page table.
+
+Note however that the content model and format is only stored if it differs from the page's default, as determined by
+ContentHandler::getDefaultModelFor( $title ). The default values are represented as NULL in the database, to preserve
+space.
+
+Storage of content model and format can be disabled altogether by setting $wgContentHandlerUseDB = false. In that case,
+the page's default model (and the model's default format) will be used everywhere. Attempts to store a revision of a page
+using a model or format different from the default will result in an error.
+
+
+== Globals ==
+
+There are some new globals that can be used to control the behavior of the ContentHandler facility:
+
+* $wgContentHandlers associates content model IDs with the names of the appropriate ContentHandler subclasses
+ or callbacks that create an instance of the appropriate ContentHandler subclass.
+
+* $wgNamespaceContentModels maps namespace IDs to a content model that should be the default for that namespace.
+
+* $wgContentHandlerUseDB determines whether each revision's content model should be stored in the database.
+ Defaults is true.
+
+* $wgContentHandlerTextFallback determines how the compatibility method ContentHandler::getContentText() will behave for
+ non-text content:
+ 'ignore' causes null to be returned for non-text content (default).
+ 'serialize' causes the serialized form of any non-text content to be returned (scary).
+ 'fail' causes an exception to be thrown for non-text content (strict).
+
+
+== Caveats ==
+
+There are some changes in behavior that might be surprising to users:
+
+* Javascript and CSS pages are no longer parsed as wikitext (though pre-save transform is still applied). Most
+importantly, this means that links, including categorization links, contained in the code will not work.
+
+* With $wgContentHandlerUseDB = false, pages can not be moved in a way that would change the
+default model. E.g. [[MediaWiki:foo.js]] can not be moved to [[MediaWiki:foo bar]], but can still be moved to
+[[User:John/foo.js]]. Also, in this mode, changing the default content model for a page (e.g. by changing
+$wgNamespaceContentModels) may cause it to become inaccessible.
+
+* action=edit will fail for pages with non-text content, unless the respective ContentHandler implementation has
+provided a specialized handler for the edit action. This is true for the API as well.
+
+* action=raw will fail for all non-text content. This seems better than serving content in other formats to an
+unsuspecting recipient. This will also cause client-side diffs to fail.
+
+* File pages provide their own action overrides that do not combine gracefully with any custom handlers defined by a
+ContentHandler. If for example a File page used a content model with a custom revert action, this would be overridden by
+WikiFilePage's handler for the revert action.
diff --git a/www/wiki/docs/database.txt b/www/wiki/docs/database.txt
new file mode 100644
index 00000000..dbc92044
--- /dev/null
+++ b/www/wiki/docs/database.txt
@@ -0,0 +1,195 @@
+Some information about database access in MediaWiki.
+By Tim Starling, January 2006.
+
+------------------------------------------------------------------------
+ Database layout
+------------------------------------------------------------------------
+
+For information about the MediaWiki database layout, such as a
+description of the tables and their contents, please see:
+ https://www.mediawiki.org/wiki/Manual:Database_layout
+ https://phabricator.wikimedia.org/diffusion/MW/browse/master/maintenance/tables.sql
+
+
+------------------------------------------------------------------------
+ API
+------------------------------------------------------------------------
+
+To make a read query, something like this usually suffices:
+
+$dbr = wfGetDB( DB_REPLICA );
+$res = $dbr->select( /* ...see docs... */ );
+foreach ( $res as $row ) {
+ ...
+}
+
+For a write query, use something like:
+
+$dbw = wfGetDB( DB_MASTER );
+$dbw->insert( /* ...see docs... */ );
+
+We use the convention $dbr for read and $dbw for write to help you keep
+track of whether the database object is a slave (read-only) or a master
+(read/write). If you write to a slave, the world will explode. Or to be
+precise, a subsequent write query which succeeded on the master may fail
+when replicated to the slave due to a unique key collision. Replication
+on the slave will stop and it may take hours to repair the database and
+get it back online. Setting read_only in my.cnf on the slave will avoid
+this scenario, but given the dire consequences, we prefer to have as
+many checks as possible.
+
+We provide a query() function for raw SQL, but the wrapper functions
+like select() and insert() are usually more convenient. They take care
+of things like table prefixes and escaping for you. If you really need
+to make your own SQL, please read the documentation for tableName() and
+addQuotes(). You will need both of them.
+
+
+------------------------------------------------------------------------
+ Basic query optimisation
+------------------------------------------------------------------------
+
+MediaWiki developers who need to write DB queries should have some
+understanding of databases and the performance issues associated with
+them. Patches containing unacceptably slow features will not be
+accepted. Unindexed queries are generally not welcome in MediaWiki,
+except in special pages derived from QueryPage. It's a common pitfall
+for new developers to submit code containing SQL queries which examine
+huge numbers of rows. Remember that COUNT(*) is O(N), counting rows in a
+table is like counting beans in a bucket.
+
+
+------------------------------------------------------------------------
+ Replication
+------------------------------------------------------------------------
+
+The largest installation of MediaWiki, Wikimedia, uses a large set of
+slave MySQL servers replicating writes made to a master MySQL server. It
+is important to understand the issues associated with this setup if you
+want to write code destined for Wikipedia.
+
+It's often the case that the best algorithm to use for a given task
+depends on whether or not replication is in use. Due to our unabashed
+Wikipedia-centrism, we often just use the replication-friendly version,
+but if you like, you can use wfGetLB()->getServerCount() > 1 to
+check to see if replication is in use.
+
+=== Lag ===
+
+Lag primarily occurs when large write queries are sent to the master.
+Writes on the master are executed in parallel, but they are executed in
+serial when they are replicated to the slaves. The master writes the
+query to the binlog when the transaction is committed. The slaves poll
+the binlog and start executing the query as soon as it appears. They can
+service reads while they are performing a write query, but will not read
+anything more from the binlog and thus will perform no more writes. This
+means that if the write query runs for a long time, the slaves will lag
+behind the master for the time it takes for the write query to complete.
+
+Lag can be exacerbated by high read load. MediaWiki's load balancer will
+stop sending reads to a slave when it is lagged by more than 30 seconds.
+If the load ratios are set incorrectly, or if there is too much load
+generally, this may lead to a slave permanently hovering around 30
+seconds lag.
+
+If all slaves are lagged by more than 30 seconds, MediaWiki will stop
+writing to the database. All edits and other write operations will be
+refused, with an error returned to the user. This gives the slaves a
+chance to catch up. Before we had this mechanism, the slaves would
+regularly lag by several minutes, making review of recent edits
+difficult.
+
+In addition to this, MediaWiki attempts to ensure that the user sees
+events occurring on the wiki in chronological order. A few seconds of lag
+can be tolerated, as long as the user sees a consistent picture from
+subsequent requests. This is done by saving the master binlog position
+in the session, and then at the start of each request, waiting for the
+slave to catch up to that position before doing any reads from it. If
+this wait times out, reads are allowed anyway, but the request is
+considered to be in "lagged slave mode". Lagged slave mode can be
+checked by calling wfGetLB()->getLaggedSlaveMode(). The only
+practical consequence at present is a warning displayed in the page
+footer.
+
+=== Lag avoidance ===
+
+To avoid excessive lag, queries which write large numbers of rows should
+be split up, generally to write one row at a time. Multi-row INSERT ...
+SELECT queries are the worst offenders should be avoided altogether.
+Instead do the select first and then the insert.
+
+=== Working with lag ===
+
+Despite our best efforts, it's not practical to guarantee a low-lag
+environment. Lag will usually be less than one second, but may
+occasionally be up to 30 seconds. For scalability, it's very important
+to keep load on the master low, so simply sending all your queries to
+the master is not the answer. So when you have a genuine need for
+up-to-date data, the following approach is advised:
+
+1) Do a quick query to the master for a sequence number or timestamp 2)
+Run the full query on the slave and check if it matches the data you got
+from the master 3) If it doesn't, run the full query on the master
+
+To avoid swamping the master every time the slaves lag, use of this
+approach should be kept to a minimum. In most cases you should just read
+from the slave and let the user deal with the delay.
+
+
+------------------------------------------------------------------------
+ Lock contention
+------------------------------------------------------------------------
+
+Due to the high write rate on Wikipedia (and some other wikis),
+MediaWiki developers need to be very careful to structure their writes
+to avoid long-lasting locks. By default, MediaWiki opens a transaction
+at the first query, and commits it before the output is sent. Locks will
+be held from the time when the query is done until the commit. So you
+can reduce lock time by doing as much processing as possible before you
+do your write queries.
+
+Often this approach is not good enough, and it becomes necessary to
+enclose small groups of queries in their own transaction. Use the
+following syntax:
+
+$dbw = wfGetDB( DB_MASTER );
+$dbw->begin( __METHOD__ );
+/* Do queries */
+$dbw->commit( __METHOD__ );
+
+Use of locking reads (e.g. the FOR UPDATE clause) is not advised. They
+are poorly implemented in InnoDB and will cause regular deadlock errors.
+It's also surprisingly easy to cripple the wiki with lock contention.
+
+Instead of locking reads, combine your existence checks into your write
+queries, by using an appropriate condition in the WHERE clause of an
+UPDATE, or by using unique indexes in combination with INSERT IGNORE.
+Then use the affected row count to see if the query succeeded.
+
+------------------------------------------------------------------------
+ Supported DBMSs
+------------------------------------------------------------------------
+
+MediaWiki is written primarily for use with MySQL. Queries are optimized
+for it and its schema is considered the canonical version. However,
+MediaWiki does support the following other DBMSs to varying degrees.
+
+* PostgreSQL
+* SQLite
+* Oracle
+* MSSQL
+
+More information can be found about each of these databases (known issues,
+level of support, extra configuration) in the "databases" subdirectory in
+this folder.
+
+------------------------------------------------------------------------
+ Use of GROUP BY
+------------------------------------------------------------------------
+
+MySQL supports GROUP BY without checking anything in the SELECT clause.
+Other DBMSs (especially Postgres) are stricter and require that all the
+non-aggregate items in the SELECT clause appear in the GROUP BY. For
+this reason, it is highly discouraged to use SELECT * with GROUP BY
+queries.
+
diff --git a/www/wiki/docs/databases/postgres.txt b/www/wiki/docs/databases/postgres.txt
new file mode 100644
index 00000000..6b266a6a
--- /dev/null
+++ b/www/wiki/docs/databases/postgres.txt
@@ -0,0 +1,112 @@
+This document describes the state of Postgres support in MediaWiki.
+
+
+== Overview ==
+
+Support for PostgreSQL has been available since version 1.7
+of MediaWiki, and is fairly well maintained. The main code
+is very well integrated, while extensions are very hit and miss.
+Still, it is probably the most supported database after MySQL.
+Much of the work in making MediaWiki database-agnostic came
+about through the work of creating Postgres support.
+
+
+== Required versions ==
+
+The current minimum version of PostgreSQL for MediaWiki is 8.1.
+It is expected that this will be raised to 8.3 at some point,
+as 8.1 and 8.2 are nearing end of life.
+
+
+
+== Database schema ==
+
+Postgres has its own schema file at maintenance/postgres/tables.sql.
+
+The goal is to keep this file as close as possible to the canonical
+schema at maintenance/tables.sql, but without copying over
+all the usage comments. General notes on the conversion:
+
+* The use of a true TIMESTAMP rather than the text string that
+MySQL uses is highly encouraged. There are still places in the
+code (especially extensions) which make assumptions about the
+textual nature of timestamp fields, but these can almost always
+be programmed around.
+
+* Although Postgres has a true BOOLEAN type, boolean columns
+are always mapped to SMALLINT, as the code does not always treat
+the column as a boolean (which is limited to accepting true,
+false, 0, 1, t, or f)
+
+* The default data type for all VARCHAR, CHAR, and VARBINARY
+columns should simply be TEXT. The only exception is
+when VARBINARY is used to store true binary data, such as
+the math_inputhash column, in which case BYTEA should be used.
+
+* All integer variants should generally be mapped to INTEGER.
+There is small-to-no advantage in using SMALLINT versus
+INTEGER in Postgres, and the possibility of running out of
+room outweighs such concerns. The columns that are BIGINT
+in other schemas should be INTEGER as well, as none of them
+so far are even remotely likely to reach the 32 billion
+limit of an INTEGER.
+
+* Blobs (blob, tinyblog, mediumblob) should be mapped to TEXT
+whenever possible, and to BYTEA if they are known to contain
+binary data.
+
+* All length modifiers on data types should be removed. If
+they are on an INTEGER, it's probably an error, and if on
+any text-based field, simply using TEXT is preferred.
+
+* Sequences should be explicitly named rather than using
+SERIAL, as the code can depend on having a specific name.
+
+* Foreign keys should be used when possible. This makes things
+both easier and harder in the code, but most of the major
+problems have now been overcome. Always add an explicit ON DELETE
+clause, and consider carefully what choice to use (all things
+considered, prefer CASCADE).
+
+* The use of CIDR should be done very carefully, because the code
+will sometimes want to store things such as an empty string or
+other non-IP value in the column. When in doubt, use TEXT.
+
+* Indexes should be created using the original MySQL tables.sql
+as a guide, but keeping in mind the ability of Postgres to use
+partial indexes, functional indexes, and bitmaps. The index names
+should be logical but are not too important, as they are never
+referenced directly by the code (unlike sequence names). Most of
+the indexes in the file as of this writing are there due to production
+testing of expensive queries on a busy wiki.
+
+
+== Keeping in sync with tables.sql ==
+
+The script maintenance/postgres/compare_schemas.pl should be
+periodically run. It will parse both "tables.sql" files and
+produce any differences found. Such differences should be fixed
+or exceptions specifically carved out by editing the script
+itself. This script has also been very useful in finding problems
+in maintenance/tables.sql itself, as it is very strict in the
+format it expects things to be in. :)
+
+
+== MySQL differences ==
+
+The major differences between MySQL and Postgres are represented as
+methods in the Database class. For example, implicitGroupby() is
+true for MySQL and false for Postgres. This means that in those
+places where the code does not add all the non-aggregate items
+from the SELECT clause to the GROUP BY, we can add them in, but in
+a conditional manner with the above method, as simply adding them
+all in to the main query may cause performance problems with
+MySQL.
+
+
+== Getting help ==
+
+In addition to the normal venues (MediaWiki mailing lists
+and IRC channels), the #postgresql channel on irc.freenode.net
+is a friendly and expert resource if you should encounter a
+problem with your Postgres-enabled MediaWiki.
diff --git a/www/wiki/docs/databases/sqlite.txt b/www/wiki/docs/databases/sqlite.txt
new file mode 100644
index 00000000..b8a45553
--- /dev/null
+++ b/www/wiki/docs/databases/sqlite.txt
@@ -0,0 +1,12 @@
+SQLite shares the MySQL schema file at maintenance/tables.sql, with a set of
+compatibility regexes to convert MySQL syntax to SQLite syntax:
+
+* BINARY() and VARBINARY() fields are converted to BLOB
+* the UNSIGNED modifier is removed
+* "INT" fields are converted to "INTEGER"
+* ENUM is converted to BLOB
+* the BINARY collation modifier is removed
+* AUTO_INCREMENT is converted to AUTOINCREMENT
+* Any table options are removed
+* Truncated indexes are upgraded to full-width indexes
+* FULLTEXT indexes are converted to ordinary indexes
diff --git a/www/wiki/docs/deferred.txt b/www/wiki/docs/deferred.txt
new file mode 100644
index 00000000..9a62fda9
--- /dev/null
+++ b/www/wiki/docs/deferred.txt
@@ -0,0 +1,36 @@
+deferred.txt
+
+A few of the database updates required by various functions here can be
+deferred until after the result page is displayed to the user. For example,
+updating the view counts, updating the linked-to tables after a save, etc. PHP
+does not yet have any way to tell the server to actually return and disconnect
+while still running these updates (as a Java servelet could), but it might have
+such a feature in the future.
+
+We handle these by creating a deferred-update object and putting those objects
+on a global list, then executing the whole list after the page is displayed. We
+don't do anything smart like collating updates to the same table or such
+because the list is almost always going to have just one item on it, if that,
+so it's not worth the trouble.
+
+Since 1.6 there is a 'job queue' in the jobs table, which is used to update
+link tables of transcluding pages after edits; this may be extended in the
+future to more general background tasks.
+
+Job queue items are fetched out of the queue and run either at a random rate
+during regular page views (by default) or by a batch process which can be run
+via maintenance/runJobs.php.
+
+Currently there are a few different types of jobs:
+
+ refreshLinks
+ Used to refresh the database tables that store the links between pages.
+ When a page is changed, all pages using that page are also cleared by
+ inserting a new job for all those pages. Each job refreshes only one page.
+
+ htmlCacheUpdate
+ Clear caches when a template is changed to ensure that changes can be seen.
+ Each job clears $wgUpdateRowsPerJob pages (300 by default).
+
+ enotifNotify
+ Used to send mail using the job queue.
diff --git a/www/wiki/docs/design.txt b/www/wiki/docs/design.txt
new file mode 100644
index 00000000..5c04adde
--- /dev/null
+++ b/www/wiki/docs/design.txt
@@ -0,0 +1,106 @@
+design.txt
+
+This is a brief overview of the new design.
+
+More thorough and up-to-date information is available on the documentation
+wiki at https://www.mediawiki.org/
+
+Primary classes:
+
+ User
+ Encapsulates the state of the user viewing/using the site. Can be queried
+ for things like the user's settings, name, etc. Handles the details of
+ getting and saving to the "user" table of the database, and dealing with
+ sessions and cookies.
+
+ OutputPage
+ Encapsulates the entire HTML page that will be sent in response to any
+ server request. It is used by calling its functions to add text, headers,
+ etc., in any order, and then calling output() to send it all. It could be
+ easily changed to send incrementally if that becomes useful, but I prefer
+ the flexibility. This should also do the output encoding. The system
+ allocates a global one in $wgOut.
+
+ Title
+ Represents the title of an article, and does all the work of translating
+ among various forms such as plain text, URL, database key, etc. For
+ convenience, and for historical reasons, it also represents a few features
+ of articles that don't involve their text, such as access rights.
+ See also title.txt.
+
+ Article
+ Encapsulates access to the "page" table of the database. The object
+ represents a an article, and maintains state such as text (in Wikitext
+ format), flags, etc.
+
+ Revision
+ Encapsulates individual page revision data and access to the
+ revision/text/blobs storage system. Higher-level code should never touch
+ text storage directly; this class mediates it.
+
+ Skin
+ Encapsulates a "look and feel" for the wiki. All of the functions that
+ render HTML, and make choices about how to render it, are here, and are
+ called from various other places when needed (most notably,
+ OutputPage::addWikiText()). The StandardSkin object is a complete
+ implementation, and is meant to be subclassed with other skins that may
+ override some of its functions. The User object contains a reference to a
+ skin (according to that user's preference), and so rather than having a
+ global skin object we just rely on the global User and get the skin with
+ $wgUser->getSkin().
+ See also skin.txt.
+
+ Language
+ Represents the language used for incidental text, and also has some
+ character encoding functions and other locale stuff. The current user
+ interface language is instantiated as $wgLang, and the local content
+ language as $wgContLang; be sure to use the *correct* language object
+ depending upon the circumstances.
+ See also language.txt.
+
+ Parser
+ Class used to transform wikitext to html.
+
+ LinkCache
+ Keeps information on existence of articles. See linkcache.txt.
+
+Naming/coding conventions:
+
+ These are meant to be descriptive, not dictatorial; I won't presume to tell
+ you how to program, I'm just describing the methods I chose to use for myself.
+ If you do choose to follow these guidelines, it will probably be easier for
+ you to collaborate with others on the project, but if you want to contribute
+ without bothering, by all means do so (and don't be surprised if I reformat
+ your code).
+
+ - I have the code indented with tabs to save file size and so that users can
+ set their tab stops to any depth they like. I use 4-space tab stops, which
+ work well. I also use K&R brace matching style. I know that's a religious
+ issue for some, so if you want to use a style that puts opening braces on
+ the next line, that's OK too, but please don't use a style where closing
+ braces don't align with either the opening brace on its own line or the
+ statement that opened the block--that's confusing as hell.
+
+ - Certain functions and class members are marked with /* private */, rather
+ than being marked as such. This is a hold-over from PHP 4, which didn't
+ support proper visibilities. You should not access things marked in this
+ manner outside the class/inheritance line as this code is subjected to be
+ updated in a manner that enforces this at some time in the near future, and
+ things will break. New code should use the standard method of setting
+ visibilities as normal.
+
+ - Globals are particularly evil in PHP; it sets a lot of them automatically
+ from cookies, query strings, and such, leading to namespace conflicts; when
+ a variable name is used in a function, it is silently declared as a new
+ local masking the global, so you'll get weird error because you forgot the
+ global declaration; lack of static class member variables means you have to
+ use globals for them, etc. Evil, evil.
+
+ I think I've managed to pare down the number of globals we use to a scant
+ few dozen or so, and I've prefixed them all with "wg" so you can spot errors
+ better (odds are, if you see a "wg" variable being used in a function that
+ doesn't declare it global, that's probably an error).
+
+ Other conventions: Top-level functions are wfFuncname(), names of session
+ variables are wsName, cookies wcName, and form field values wpName ("p" for
+ "POST").
diff --git a/www/wiki/docs/distributors.txt b/www/wiki/docs/distributors.txt
new file mode 100644
index 00000000..f19574c0
--- /dev/null
+++ b/www/wiki/docs/distributors.txt
@@ -0,0 +1,204 @@
+This document is intended to provide useful advice for parties seeking to
+redistribute MediaWiki to end users. It's targeted particularly at maintainers
+for Linux distributions, since it's been observed that distribution packages of
+MediaWiki often break. We've consistently had to recommend that users seeking
+support use official tarballs instead of their distribution's packages, and
+this often solves whatever problem the user is having. It would be nice if
+this could change.
+
+== Background: why web applications are different ==
+
+MediaWiki is intended to be usable on any web host that provides support for
+PHP and a database. Many users of low-end shared hosting have very limited
+access to their machine: often only FTP access to some subdirectory of the web
+root. Support for these users entails several restrictions, such as:
+
+ 1) We cannot require installation of any files outside the web root. Few of
+ our users have access to directories like /usr or /etc.
+ 2) We cannot require the ability to run any utility on the command line.
+ Many shared hosts have exec() and similar PHP functions disabled.
+ 3) We cannot assume that the software has write access anywhere useful. The
+ user account that MediaWiki (including its installer) runs under is often
+ different from the account the user used to upload the files, and we might be
+ restricted by PHP settings such as safe mode or open_basedir.
+ 4) We cannot assume that the software even has read access anywhere useful.
+ Many shared hosts run all users' web applications under the same user, so
+ they can't rely on Unix permissions, and must forbid reads to even standard
+ directories like /tmp lest users read each others' files.
+ 5) We cannot assume that the user has the ability to install or run any
+ programs not written as web-accessible PHP scripts.
+
+Since anything that works on cheap shared hosting will work if you have shell
+or root access too, MediaWiki's design is based around catering to the lowest
+common denominator. Although we support higher-end setups as well (like
+Wikipedia!), the way many things work by default is tailored toward shared
+hosting. These defaults are unconventional from the point of view of normal
+(non-web) applications -- they might conflict with distributors' policies, and
+they certainly aren't ideal for someone who's installing MediaWiki as root.
+
+== Directory structure ==
+
+Because of constraint (1) above, MediaWiki does not conform to normal
+Unix filesystem layout. Hopefully we'll offer direct support for standard
+layouts in the future, but for now *any change to the location of files is
+unsupported*. Moving things and leaving symlinks will *probably* not break
+anything, but it is *strongly* advised not to try any more intrusive changes to
+get MediaWiki to conform more closely to your filesystem hierarchy. Any such
+attempt will almost certainly result in unnecessary bugs.
+
+The standard recommended location to install MediaWiki, relative to the web
+root, is /w (so, e.g., /var/www/w). Rewrite rules can then be used to enable
+"pretty URLs" like /wiki/Article instead of /w/index.php?title=Article. (This
+is the convention Wikipedia uses.) In theory, it should be possible to enable
+the appropriate rewrite rules by default, if you can reconfigure the web
+server, but you'd need to alter LocalSettings.php too. See
+<https://www.mediawiki.org/wiki/Manual:Short_URL> for details on short URLs.
+
+If you really must mess around with the directory structure, note that the
+following files *must* all be web-accessible for MediaWiki to function
+correctly:
+
+ * api.php, img_auth.php, index.php, load.php, opensearch_desc.php, thumb.php,
+ profileinfo.php. These are the entry points for normal usage. This list may be
+ incomplete and is subject to change.
+ * mw-config/index.php: Used for web-based installation (sets up the database,
+ prompts for the name of the wiki, etc.).
+ * images/: Used for uploaded files. This could be somewhere else if
+ $wgUploadDirectory and $wgUploadPath are changed appropriately.
+ * skins/*/: Subdirectories of skins/ contain CSS and JavaScript files that
+ must be accessible to web browsers. The PHP files and Skin.sample in skins/
+ don't need to be accessible. This could be somewhere else if
+ $wgStyleDirectory and $wgStylePath are changed appropriately.
+ * extensions/: Many extensions include CSS and JavaScript files in their
+ extensions directory, and will break if they aren't web-accessible. Some
+ extensions might theoretically provide additional entry points as well, at
+ least in principle.
+
+But all files should keep their position relative to the web-visible
+installation directory no matter what. If you must move includes/ somewhere in
+/usr/share, provide a symlink from /var/www/w. If you don't, you *will* break
+something. You have been warned.
+
+== Configuration ==
+
+MediaWiki is configured using LocalSettings.php. This is a PHP file that's
+generated when the user visits mw-config/index.php to install the software, and
+which the user can edit by hand thereafter. It's just a plain old PHP file,
+and can contain any PHP statements. It usually sets global variables that are
+used for configuration, and includes files used by any extensions.
+
+Distributors can easily change the installer behavior, including LocalSettings
+generated, by placing their overrides into mw-config/overrides directory. Doing
+that is highly preferred to modifying MediaWiki code directly. See
+mw-config/overrides/README for more details and examples.
+
+There's a new maintenance/install.php script which could be used for performing
+an install through the command line.
+
+Some configuration options that distributors might be in a position to set
+intelligently:
+
+ * $wgEmergencyContact: An e-mail address that can be used to contact the wiki
+ administrator. By default, "wikiadmin@ServerName".
+ * $wgPasswordSender: The e-mail address to use when sending password e-mails.
+ By default, "MediaWiki Mail <apache@ServerName>".
+ (with ServerName guessed from the http request)
+ * $wgSMTP: Can be configured to use SMTP for mail sending instead of PHP
+ mail().
+
+== Updates ==
+
+The correct way for updating a wiki is to update the files and then run from
+command line the maintenance/update.php script (with appropriate parameters if
+files were moved). It will perform all the needed steps to update the database
+schema and contents to the version from whatever old one it has.
+Any package manager which replaces the files but doesn't update the db is leaving
+an inconsistent wiki that may produce blank pages (php errors) when new features
+using the changed schema would be used.
+
+Since MediaWiki 1.17 it is possible to upgrade using the web installer by providing
+an arbitrary secret value stored as $wgUpgradeKey in LocalSettings (older versions
+needed to rename LocalSettings.php in order to upgrade using the installer).
+
+== Documentation ==
+
+MediaWiki's official documentation is split between two places: the source
+code, and <https://www.mediawiki.org/>. The source code documentation is written
+exclusively by developers, and so is likely to be reliable (at worst,
+outdated). However, it can be pretty sparse. mediawiki.org documentation is
+often much more thorough, but it's maintained by a wiki that's open to
+anonymous edits, so its quality is sometimes sketchy -- don't assume that
+anything there is officially endorsed!
+
+== Upstream ==
+
+MediaWiki is a project hosted and led by the Wikimedia Foundation, the
+not-for-profit charity that operates Wikipedia. Wikimedia employs the lead
+developer and several other paid developers, but commit access is given out
+liberally and there are multiple very active volunteer developers as well. A
+list of developers can be found at <https://www.mediawiki.org/wiki/Developers>.
+
+MediaWiki's bug tracker is at <https://phabricator.wikimedia.org>. However, you
+might find that the best place to post if you want to get developers' attention
+is the wikitech-l mailing list
+<https://lists.wikimedia.org/mailman/listinfo/wikitech-l>. Posts to wikitech-l
+will inevitably be read by multiple experienced MediaWiki developers. There's
+also an active IRC chat at <irc://irc.freenode.net/mediawiki>, where there are
+usually several developers at reasonably busy times of day.
+
+Our Git repositories are hosted at <https://gerrit.wikimedia.org>, see
+<https://www.mediawiki.org/wiki/Gerrit> for more information. Patches should
+be submitted there. If you know which developers are best suited to review your
+patch, add them to it, otherwise ask on IRC to get better review time.
+
+All redistributors of MediaWiki should be subscribed to mediawiki-announce
+<https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce>. It's
+extremely low-traffic, with an average of less than one post per month. All
+new releases are announced here, including critical security updates.
+
+== Useful software to install ==
+
+There are several other pieces of software that MediaWiki can make good use of.
+Distributors might choose to install these automatically with MediaWiki and
+perhaps configure it to use them (see Configuration section of this document):
+
+ * APC (Alternative PHP Cache), XCache, or similar: Will greatly speed up the
+ execution of MediaWiki, and all other PHP applications, at some cost in
+ memory usage. Will be used automatically for the most part.
+ * clamav: Can be used for virus scanning of uploaded files. Enable with
+ "$wgAntivirus = 'clamav';".
+ * DjVuLibre: Allows processing of DjVu files. To enable this, set
+ "$wgDjvuDump = 'djvudump'; $wgDjvuRenderer = 'ddjvu'; $wgDjvuTxt = 'djvutxt';".
+ * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with
+ "$wgUseTidy = true;".
+ * ImageMagick: For resizing images. "$wgUseImageMagick = true;" will enable
+ it. PHP's GD can also be used, but ImageMagick is preferable.
+ * HTTP cache such as Varnish or Squid: can provide a drastic speedup and a
+ major cut in resource consumption, but enabling it may interfere with other
+ applications. It might be suitable for a separate package. For setup details, see:
+ - <https://www.mediawiki.org/wiki/Manual:Varnish_caching>
+ - <https://www.mediawiki.org/wiki/Manual:Squid_caching>
+ * rsvg or other SVG rasterizer: ImageMagick can be used for SVG support, but
+ is not ideal. Wikipedia (as of the time of this writing) uses rsvg. To
+ enable, set "$wgSVGConverter = 'rsvg';" (or other as appropriate).
+
+MediaWiki uses some standard GNU utilities as well, such as diff and diff3. If
+these are present in /usr/bin or some other reasonable location, they will be
+configured automatically on install.
+
+MediaWiki also has a "job queue" that handles background processing. Because
+shared hosts often don't provide access to cron, the job queue is run on every
+page view by default. This means the background tasks aren't really done in
+the background. Busy wikis can set $wgJobRunRate to 0 and run
+maintenance/runJobs.php periodically out of cron. Distributors probably
+shouldn't set this up as a default, however, since the extra cron job is
+unnecessary overhead for a little-used wiki.
+
+== Web server configuration ==
+
+MediaWiki includes several .htaccess files to restrict access to some
+directories. If the web server is not configured to support these files, and
+the relevant directories haven't been moved someplace inaccessible anyway (e.g.
+symlinked in /usr/share with the web server configured to not follow symlinks),
+then it might be useful to deny web access to those directories in the web
+server's configuration.
diff --git a/www/wiki/docs/doxygen_first_page.php b/www/wiki/docs/doxygen_first_page.php
new file mode 100644
index 00000000..77ae1dcf
--- /dev/null
+++ b/www/wiki/docs/doxygen_first_page.php
@@ -0,0 +1,19 @@
+<?php
+die( "Not a valid entry point\n" );
+/**
+ * This file does not hold any code. It is only there so we can generate
+ * the doxygen documentation main page.
+ *
+ * @file
+ */
+
+/**
+ * @mainpage Introduction
+ *
+ * Welcome on MediaWiki autogenerated documentation system.
+ *
+ * If you are looking to use, install or configure your wiki, you probably
+ * want to look at the main site: https://www.mediawiki.org/
+ *
+ * @note this page is generated from docs/doxygen_first_page.php
+ */
diff --git a/www/wiki/docs/export-0.1.xsd b/www/wiki/docs/export-0.1.xsd
new file mode 100644
index 00000000..9ff48f03
--- /dev/null
+++ b/www/wiki/docs/export-0.1.xsd
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.1.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.1/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.1/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.1/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision data -->
+ <element name="revision" type="mw:RevisionType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="string" minOccurs="0"/>
+ <element name="text" type="string"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.10.xsd b/www/wiki/docs/export-0.10.xsd
new file mode 100644
index 00000000..9d5d49e0
--- /dev/null
+++ b/www/wiki/docs/export-0.10.xsd
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ Version 0.6 adds a separate namespace tag, and resolves the
+ redirect target and adds a separate sha1 tag for each revision.
+
+ Version 0.7 adds a unique identity constraint for both page and
+ revision identifiers. See also bug 4220.
+ Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+ Moves <logitem> to its right location.
+ Add parentid to revision.
+ Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+ Version 0.8 adds support for a <model> and a <format> tag for
+ each revision. See contenthandler.txt.
+
+ Version 0.9 adds the database name to the site information.
+
+ Version 0.10 moved the <model> and <format> tags before the <text> tag.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.10.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.10/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.10/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.10/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType">
+ <!-- Page ID contraint, see bug 4220 -->
+ <unique name="PageIDConstraint">
+ <selector xpath="mw:page" />
+ <field xpath="mw:id" />
+ </unique>
+ <!-- Revision ID contraint, see bug 4220 -->
+ <unique name="RevIDConstraint">
+ <selector xpath="mw:page/mw:revision" />
+ <field xpath="mw:id" />
+ </unique>
+ </element>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1" />
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded" />
+ <element name="logitem" type="mw:LogItemType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="version" type="string" use="required" />
+ <attribute ref="xml:lang" use="required" />
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="dbname" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="RedirectType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="title" type="string" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <simpleType name="ContentModelType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+./a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="ContentFormatType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+.a-zA-Z0-9]*/[a-zA-Z][-+.a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string" />
+
+ <!-- Namespace in canonical form -->
+ <element name="ns" type="nonNegativeInteger" />
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" />
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0" />
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="parentid" type="positiveInteger" minOccurs="0" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="minor" minOccurs="0" maxOccurs="1" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+ <element name="model" type="mw:ContentModelType" />
+ <element name="format" type="mw:ContentFormatType" />
+ <element name="text" type="mw:TextType" />
+ <element name="sha1" type="string" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" />
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+ <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+ <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN" />
+ <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogTextType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogParamsType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0" />
+ <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0" />
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="string" minOccurs="0" />
+
+ <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+ <element name="filename" type="string" />
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI" />
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.2.xsd b/www/wiki/docs/export-0.2.xsd
new file mode 100644
index 00000000..55b05f8d
--- /dev/null
+++ b/www/wiki/docs/export-0.2.xsd
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.2.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.2/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.2/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.2/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ </choice>
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="string" minOccurs="0"/>
+ <element name="text" type="string"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.3.xsd b/www/wiki/docs/export-0.3.xsd
new file mode 100644
index 00000000..ea2b816e
--- /dev/null
+++ b/www/wiki/docs/export-0.3.xsd
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.3.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.3/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.3/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.3/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1"/>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have two titles differing only by case. -->
+ <!-- Not yet implemented as of MediaWiki 1.5 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ </choice>
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="string" minOccurs="0"/>
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.4.xsd b/www/wiki/docs/export-0.4.xsd
new file mode 100644
index 00000000..b3ea3bf8
--- /dev/null
+++ b/www/wiki/docs/export-0.4.xsd
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.4.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.4/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.4/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.4/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1"/>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ <element name="logitem" type="mw:LogItemType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.5.xsd b/www/wiki/docs/export-0.5.xsd
new file mode 100644
index 00000000..ed6c0029
--- /dev/null
+++ b/www/wiki/docs/export-0.5.xsd
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.5.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.5/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.5/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.5/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1"/>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ <element name="logitem" type="mw:LogItemType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN"/>
+ <attribute name="bytes" use="optional" type="nonNegativeInteger"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.6.xsd b/www/wiki/docs/export-0.6.xsd
new file mode 100644
index 00000000..4668794e
--- /dev/null
+++ b/www/wiki/docs/export-0.6.xsd
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ Version 0.6 adds a separate namespace tag, and resolves the
+ redirect target and adds a separate sha1 tag for each revision.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.6.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.6/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.6/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.6/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1"/>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- Namespace in canonical form -->
+ <element name="ns" type="positiveInteger"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" type="string" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ <element name="logitem" type="mw:LogItemType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="sha1" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN"/>
+ <attribute name="bytes" use="optional" type="nonNegativeInteger"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.7.xsd b/www/wiki/docs/export-0.7.xsd
new file mode 100644
index 00000000..48037463
--- /dev/null
+++ b/www/wiki/docs/export-0.7.xsd
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ Version 0.6 adds a separate namespace tag, and resolves the
+ redirect target and adds a separate sha1 tag for each revision.
+
+ Version 0.7 adds a unique identity constraint for both page and
+ revision identifiers. See also bug 4220.
+ Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+ Moves <logitem> to its right location.
+ Add parentid to revision.
+ Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.7.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.7/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.7/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.7/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType">
+ <!-- Page ID contraint, see bug 4220 -->
+ <unique name="PageIDConstraint">
+ <selector xpath="mw:page" />
+ <field xpath="mw:id" />
+ </unique>
+ <!-- Revision ID contraint, see bug 4220 -->
+ <unique name="RevIDConstraint">
+ <selector xpath="mw:page/mw:revision" />
+ <field xpath="mw:id" />
+ </unique>
+ </element>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1" />
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded" />
+ <element name="logitem" type="mw:LogItemType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="version" type="string" use="required" />
+ <attribute ref="xml:lang" use="required" />
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="RedirectType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="title" type="string" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string" />
+
+ <!-- Namespace in canonical form -->
+ <element name="ns" type="nonNegativeInteger" />
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" />
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0" />
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="parentid" type="positiveInteger" minOccurs="0" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="minor" minOccurs="0" maxOccurs="1" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+ <element name="sha1" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" />
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+ <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+ <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN" />
+ <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogTextType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogParamsType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0" />
+ <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0" />
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="string" minOccurs="0" />
+
+ <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+ <element name="filename" type="string" />
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI" />
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.8.xsd b/www/wiki/docs/export-0.8.xsd
new file mode 100644
index 00000000..07b432a1
--- /dev/null
+++ b/www/wiki/docs/export-0.8.xsd
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ Version 0.6 adds a separate namespace tag, and resolves the
+ redirect target and adds a separate sha1 tag for each revision.
+
+ Version 0.7 adds a unique identity constraint for both page and
+ revision identifiers. See also bug 4220.
+ Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+ Moves <logitem> to its right location.
+ Add parentid to revision.
+ Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+ Version 0.8 adds support for a <model> and a <format> tag for
+ each revision. See contenthandler.txt.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.8.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.8/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.8/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.8/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType">
+ <!-- Page ID contraint, see bug 4220 -->
+ <unique name="PageIDConstraint">
+ <selector xpath="mw:page" />
+ <field xpath="mw:id" />
+ </unique>
+ <!-- Revision ID contraint, see bug 4220 -->
+ <unique name="RevIDConstraint">
+ <selector xpath="mw:page/mw:revision" />
+ <field xpath="mw:id" />
+ </unique>
+ </element>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1" />
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded" />
+ <element name="logitem" type="mw:LogItemType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="version" type="string" use="required" />
+ <attribute ref="xml:lang" use="required" />
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="RedirectType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="title" type="string" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <simpleType name="ContentModelType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+./a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="ContentFormatType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+.a-zA-Z0-9]*/[a-zA-Z][-+.a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string" />
+
+ <!-- Namespace in canonical form -->
+ <element name="ns" type="nonNegativeInteger" />
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" />
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0" />
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="parentid" type="positiveInteger" minOccurs="0" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="minor" minOccurs="0" maxOccurs="1" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+ <element name="text" type="mw:TextType" />
+ <element name="sha1" type="string" />
+ <element name="model" type="mw:ContentModelType" />
+ <element name="format" type="mw:ContentFormatType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" />
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+ <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+ <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN" />
+ <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogTextType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogParamsType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0" />
+ <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0" />
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="string" minOccurs="0" />
+
+ <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+ <element name="filename" type="string" />
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI" />
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-0.9.xsd b/www/wiki/docs/export-0.9.xsd
new file mode 100644
index 00000000..d5e7b99a
--- /dev/null
+++ b/www/wiki/docs/export-0.9.xsd
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ Version 0.6 adds a separate namespace tag, and resolves the
+ redirect target and adds a separate sha1 tag for each revision.
+
+ Version 0.7 adds a unique identity constraint for both page and
+ revision identifiers. See also bug 4220.
+ Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+ Moves <logitem> to its right location.
+ Add parentid to revision.
+ Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+ Version 0.8 adds support for a <model> and a <format> tag for
+ each revision. See contenthandler.txt.
+
+ Version 0.9 adds the database name to the site information.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.9.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.9/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.9/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.9/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType">
+ <!-- Page ID contraint, see bug 4220 -->
+ <unique name="PageIDConstraint">
+ <selector xpath="mw:page" />
+ <field xpath="mw:id" />
+ </unique>
+ <!-- Revision ID contraint, see bug 4220 -->
+ <unique name="RevIDConstraint">
+ <selector xpath="mw:page/mw:revision" />
+ <field xpath="mw:id" />
+ </unique>
+ </element>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1" />
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded" />
+ <element name="logitem" type="mw:LogItemType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="version" type="string" use="required" />
+ <attribute ref="xml:lang" use="required" />
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="dbname" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="RedirectType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="title" type="string" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <simpleType name="ContentModelType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+./a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="ContentFormatType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+.a-zA-Z0-9]*/[a-zA-Z][-+.a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string" />
+
+ <!-- Namespace in canonical form -->
+ <element name="ns" type="nonNegativeInteger" />
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" />
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0" />
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="parentid" type="positiveInteger" minOccurs="0" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="minor" minOccurs="0" maxOccurs="1" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+ <element name="text" type="mw:TextType" />
+ <element name="sha1" type="string" />
+ <element name="model" type="mw:ContentModelType" />
+ <element name="format" type="mw:ContentFormatType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" />
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+ <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+ <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN" />
+ <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogTextType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogParamsType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0" />
+ <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0" />
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="string" minOccurs="0" />
+
+ <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+ <element name="filename" type="string" />
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI" />
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/export-demo.xml b/www/wiki/docs/export-demo.xml
new file mode 100644
index 00000000..93b237ff
--- /dev/null
+++ b/www/wiki/docs/export-demo.xml
@@ -0,0 +1,160 @@
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
+
+ <!-- Optional global configuration info -->
+ <siteinfo>
+ <!-- Site name, as set in $wgSitename -->
+ <sitename>DemoWiki</sitename>
+
+ <!-- Database name, as set in $wgDBname -->
+ <dbname>demowiki</dbname>
+
+ <!-- Forgot where you got this set? -->
+ <base>http://example.com/wiki/Main_Page</base>
+
+ <!-- Source software version -->
+ <generator>MediaWiki 1.24</generator>
+
+ <!-- Title case sensitivity options of the wiki this data came from -->
+ <!-- May be 'first-letter', 'case-sensitive', or 'case-insensitive' -->
+ <case>first-letter</case>
+
+ <!-- Defined namespace keys on the source wiki. -->
+ <namespaces>
+ <namespace key="-2" case="first-letter">Media</namespace>
+ <namespace key="-1" case="first-letter">Special</namespace>
+ <namespace key="0" case="first-letter" />
+ <namespace key="1" case="first-letter">Talk</namespace>
+ <namespace key="2" case="first-letter">User</namespace>
+ <namespace key="3" case="first-letter">User talk</namespace>
+ <namespace key="4" case="first-letter">DemoWiki</namespace>
+ <namespace key="5" case="first-letter">DemoWIki talk</namespace>
+ <namespace key="6" case="first-letter">File</namespace>
+ <namespace key="7" case="first-letter">File talk</namespace>
+ <namespace key="8" case="first-letter">MediaWiki</namespace>
+ <namespace key="9" case="first-letter">MediaWiki talk</namespace>
+ <namespace key="10" case="first-letter">Template</namespace>
+ <namespace key="11" case="first-letter">Template talk</namespace>
+ <namespace key="12" case="first-letter">Help</namespace>
+ <namespace key="13" case="first-letter">Help talk</namespace>
+ <namespace key="14" case="first-letter">Category</namespace>
+ <namespace key="15" case="first-letter">Category talk</namespace>
+ </namespaces>
+ </siteinfo>
+
+ <!-- The rest of the data will be a series of page records -->
+ <page>
+ <!-- Titles are listed here in text form, with namespace prefix -->
+ <!-- if any, and spaces rather than the underscores used in URLs. -->
+ <title>Page title</title>
+
+ <!-- Namespace in canonical form -->
+ <ns>0</ns>
+
+ <!-- The page's immutable page_id number in the source database. -->
+ <!-- Page ID numbers are kept across page moves, but may change -->
+ <!-- if a page is deleted and recreated. -->
+ <id>1</id>
+
+ <!-- Tag whether this article is a redirect and its target -->
+ <!-- This corresponds to the page_is_redirect in the page table -->
+ <redirect title="Target" />
+
+ <!-- If restricted, the ACL is listed here raw. -->
+ <restrictions>edit=sysop:move=sysop</restrictions>
+
+ <!-- With a series of revision records... -->
+
+ <!-- Remember this is XML; if you must use a regex-based extractor -->
+ <!-- in place of a standard XML parser, be very careful. -->
+ <!-- * Don't forget to decode character entities! -->
+ <!-- * If using a 'loose' XML parser, ensure that whitespace is -->
+ <!-- preserved in the <text> elements. -->
+ <revision>
+ <!-- Unique revision ID number (rev_id) in the source database. -->
+ <!-- This number uniquely identifies the revision on that wiki. -->
+ <id>100</id>
+ <!-- revision id of the parent revision -->
+ <parentid>99</parentid>
+ <timestamp>2001-01-15T13:15:00Z</timestamp>
+ <contributor>
+ <username>Foobar</username>
+ <id>42</id>
+ </contributor>
+ <minor />
+ <comment>I have just one thing to say!</comment>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="25">A bunch of [[text]] here.</text>
+ <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
+ </revision>
+
+ <revision>
+ <id>99</id>
+ <timestamp>2001-01-15T13:10:27Z</timestamp>
+ <contributor>
+ <ip>10.0.0.2</ip>
+ </contributor>
+ <comment>new!</comment>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="24">An earlier [[revision]].</text>
+ <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
+ </revision>
+ </page>
+
+ <page>
+ <title>Talk:Page title</title>
+ <ns>1</ns>
+ <id>2</id>
+ <revision>
+ <id>101</id>
+ <timestamp>2001-01-15T14:03:00Z</timestamp>
+ <contributor><ip>10.0.0.2</ip></contributor>
+ <comment>hey</comment>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="47">WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
+ <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
+ </revision>
+ </page>
+
+ <page>
+ <title>File:Some image.jpg</title>
+ <ns>6</ns>
+ <id>3</id>
+ <revision>
+ <id>102</id>
+ <timestamp>2001-01-15T20:34:12Z</timestamp>
+ <contributor><username>Foobar</username><id>42</id></contributor>
+ <comment>My awesomeest image!</comment>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="52">This is an awesome little imgae. I lurves it. {{PD}}</text>
+ <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
+ </revision>
+ <upload>
+ <timestamp>2001-01-15T20:34:12Z</timestamp>
+ <contributor><username>Foobar</username><id>42</id></contributor>
+ <comment>My awesomeest image!</comment>
+ <filename>Some_image.jpg</filename>
+ <src>http://upload.wikimedia.org/commons/2/22/Some_image.jpg</src>
+ <size>12345</size>
+ </upload>
+ </page>
+
+ <!-- or a series of logitem records, but normaly page and logitem never exist both in one file -->
+ <logitem>
+ <id>15</id>
+ <timestamp>2008-10-23T03:20:32Z</timestamp>
+ <contributor>
+ <username>Wikimedian</username>
+ <id>12345</id>
+ </contributor>
+ <comment>content was: 'I think this was a silly edit'</comment>
+ <type>delete</type>
+ <action>delete</action>
+ <logtitle>Silly page name</logtitle>
+ <params xml:space="preserve" />
+ </logitem>
+
+</mediawiki>
diff --git a/www/wiki/docs/extension.schema.json b/www/wiki/docs/extension.schema.json
new file mode 100644
index 00000000..c895b2a9
--- /dev/null
+++ b/www/wiki/docs/extension.schema.json
@@ -0,0 +1,986 @@
+{
+ "$schema": "http://json-schema.org/schema#",
+ "description": "MediaWiki extension.json schema",
+ "type": "object",
+ "properties": {
+ "manifest_version": {
+ "type": "integer",
+ "description": "Version of the extension.json schema the extension.json file is in.",
+ "required": true
+ },
+ "name": {
+ "type": "string",
+ "description": "The extension's canonical name.",
+ "required": true
+ },
+ "namemsg": {
+ "type": "string",
+ "description": "i18n message key of the extension's name."
+ },
+ "type": {
+ "type": "string",
+ "description": "The extension's type, as an index to $wgExtensionCredits.",
+ "default": "other"
+ },
+ "author": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "Extension's authors.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of this release of the extension."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL to the homepage for the extension.",
+ "format": "uri"
+ },
+ "description": {
+ "type": "string",
+ "description": "Raw description of the extension."
+ },
+ "descriptionmsg": {
+ "type": "string",
+ "description": "Message key for a i18n message describing the extension."
+ },
+ "license-name": {
+ "type": "string",
+ "description": "Short identifier for the license under which the extension is released.",
+ "enum": [
+ "0BSD",
+ "AAL",
+ "Abstyles",
+ "Adobe-2006",
+ "Adobe-Glyph",
+ "ADSL",
+ "AFL-1.1",
+ "AFL-1.2",
+ "AFL-2.0",
+ "AFL-2.1",
+ "AFL-3.0",
+ "Afmparse",
+ "AGPL-1.0",
+ "AGPL-3.0",
+ "AGPL-3.0-only",
+ "AGPL-3.0-or-later",
+ "Aladdin",
+ "AMDPLPA",
+ "AML",
+ "AMPAS",
+ "ANTLR-PD",
+ "Apache-1.0",
+ "Apache-1.1",
+ "Apache-2.0",
+ "APAFML",
+ "APL-1.0",
+ "APSL-1.0",
+ "APSL-1.1",
+ "APSL-1.2",
+ "APSL-2.0",
+ "Artistic-1.0",
+ "Artistic-1.0-cl8",
+ "Artistic-1.0-Perl",
+ "Artistic-2.0",
+ "Bahyph",
+ "Barr",
+ "Beerware",
+ "BitTorrent-1.0",
+ "BitTorrent-1.1",
+ "Borceux",
+ "BSD-1-Clause",
+ "BSD-2-Clause",
+ "BSD-2-Clause-FreeBSD",
+ "BSD-2-Clause-NetBSD",
+ "BSD-2-Clause-Patent",
+ "BSD-3-Clause",
+ "BSD-3-Clause-Attribution",
+ "BSD-3-Clause-Clear",
+ "BSD-3-Clause-LBNL",
+ "BSD-3-Clause-No-Nuclear-License",
+ "BSD-3-Clause-No-Nuclear-License-2014",
+ "BSD-3-Clause-No-Nuclear-Warranty",
+ "BSD-4-Clause",
+ "BSD-4-Clause-UC",
+ "BSD-Protection",
+ "BSD-Source-Code",
+ "BSL-1.0",
+ "bzip2-1.0.5",
+ "bzip2-1.0.6",
+ "Caldera",
+ "CATOSL-1.1",
+ "CC-BY-1.0",
+ "CC-BY-2.0",
+ "CC-BY-2.5",
+ "CC-BY-3.0",
+ "CC-BY-4.0",
+ "CC-BY-NC-1.0",
+ "CC-BY-NC-2.0",
+ "CC-BY-NC-2.5",
+ "CC-BY-NC-3.0",
+ "CC-BY-NC-4.0",
+ "CC-BY-NC-ND-1.0",
+ "CC-BY-NC-ND-2.0",
+ "CC-BY-NC-ND-2.5",
+ "CC-BY-NC-ND-3.0",
+ "CC-BY-NC-ND-4.0",
+ "CC-BY-NC-SA-1.0",
+ "CC-BY-NC-SA-2.0",
+ "CC-BY-NC-SA-2.5",
+ "CC-BY-NC-SA-3.0",
+ "CC-BY-NC-SA-4.0",
+ "CC-BY-ND-1.0",
+ "CC-BY-ND-2.0",
+ "CC-BY-ND-2.5",
+ "CC-BY-ND-3.0",
+ "CC-BY-ND-4.0",
+ "CC-BY-SA-1.0",
+ "CC-BY-SA-2.0",
+ "CC-BY-SA-2.5",
+ "CC-BY-SA-3.0",
+ "CC-BY-SA-4.0",
+ "CC0-1.0",
+ "CDDL-1.0",
+ "CDDL-1.1",
+ "CDLA-Permissive-1.0",
+ "CDLA-Sharing-1.0",
+ "CECILL-1.0",
+ "CECILL-1.1",
+ "CECILL-2.0",
+ "CECILL-2.1",
+ "CECILL-B",
+ "CECILL-C",
+ "ClArtistic",
+ "CNRI-Jython",
+ "CNRI-Python",
+ "CNRI-Python-GPL-Compatible",
+ "Condor-1.1",
+ "CPAL-1.0",
+ "CPL-1.0",
+ "CPOL-1.02",
+ "Crossword",
+ "CrystalStacker",
+ "CUA-OPL-1.0",
+ "Cube",
+ "curl",
+ "D-FSL-1.0",
+ "diffmark",
+ "DOC",
+ "Dotseqn",
+ "DSDP",
+ "dvipdfm",
+ "ECL-1.0",
+ "ECL-2.0",
+ "eCos-2.0",
+ "EFL-1.0",
+ "EFL-2.0",
+ "eGenix",
+ "Entessa",
+ "EPL-1.0",
+ "EPL-2.0",
+ "ErlPL-1.1",
+ "EUDatagrid",
+ "EUPL-1.0",
+ "EUPL-1.1",
+ "EUPL-1.2",
+ "Eurosym",
+ "Fair",
+ "Frameworx-1.0",
+ "FreeImage",
+ "FSFAP",
+ "FSFUL",
+ "FSFULLR",
+ "FTL",
+ "GFDL-1.1",
+ "GFDL-1.1-only",
+ "GFDL-1.1-or-later",
+ "GFDL-1.2",
+ "GFDL-1.2-only",
+ "GFDL-1.2-or-later",
+ "GFDL-1.3",
+ "GFDL-1.3-only",
+ "GFDL-1.3-or-later",
+ "Giftware",
+ "GL2PS",
+ "Glide",
+ "Glulxe",
+ "gnuplot",
+ "GPL-1.0",
+ "GPL-1.0+",
+ "GPL-1.0-only",
+ "GPL-1.0-or-later",
+ "GPL-2.0",
+ "GPL-2.0+",
+ "GPL-2.0-only",
+ "GPL-2.0-or-later",
+ "GPL-2.0-with-autoconf-exception",
+ "GPL-2.0-with-bison-exception",
+ "GPL-2.0-with-classpath-exception",
+ "GPL-2.0-with-font-exception",
+ "GPL-2.0-with-GCC-exception",
+ "GPL-3.0",
+ "GPL-3.0+",
+ "GPL-3.0-only",
+ "GPL-3.0-or-later",
+ "GPL-3.0-with-autoconf-exception",
+ "GPL-3.0-with-GCC-exception",
+ "gSOAP-1.3b",
+ "HaskellReport",
+ "HPND",
+ "IBM-pibs",
+ "ICU",
+ "IJG",
+ "ImageMagick",
+ "iMatix",
+ "Imlib2",
+ "Info-ZIP",
+ "Intel",
+ "Intel-ACPI",
+ "Interbase-1.0",
+ "IPA",
+ "IPL-1.0",
+ "ISC",
+ "JasPer-2.0",
+ "JSON",
+ "LAL-1.2",
+ "LAL-1.3",
+ "Latex2e",
+ "Leptonica",
+ "LGPL-2.0",
+ "LGPL-2.0+",
+ "LGPL-2.0-only",
+ "LGPL-2.0-or-later",
+ "LGPL-2.1",
+ "LGPL-2.1+",
+ "LGPL-2.1-only",
+ "LGPL-2.1-or-later",
+ "LGPL-3.0",
+ "LGPL-3.0+",
+ "LGPL-3.0-only",
+ "LGPL-3.0-or-later",
+ "LGPLLR",
+ "Libpng",
+ "libtiff",
+ "LiLiQ-P-1.1",
+ "LiLiQ-R-1.1",
+ "LiLiQ-Rplus-1.1",
+ "LPL-1.0",
+ "LPL-1.02",
+ "LPPL-1.0",
+ "LPPL-1.1",
+ "LPPL-1.2",
+ "LPPL-1.3a",
+ "LPPL-1.3c",
+ "MakeIndex",
+ "MirOS",
+ "MIT",
+ "MIT-advertising",
+ "MIT-CMU",
+ "MIT-enna",
+ "MIT-feh",
+ "MITNFA",
+ "Motosoto",
+ "mpich2",
+ "MPL-1.0",
+ "MPL-1.1",
+ "MPL-2.0",
+ "MPL-2.0-no-copyleft-exception",
+ "MS-PL",
+ "MS-RL",
+ "MTLL",
+ "Multics",
+ "Mup",
+ "NASA-1.3",
+ "Naumen",
+ "NBPL-1.0",
+ "NCSA",
+ "Net-SNMP",
+ "NetCDF",
+ "Newsletr",
+ "NGPL",
+ "NLOD-1.0",
+ "NLPL",
+ "Nokia",
+ "NOSL",
+ "Noweb",
+ "NPL-1.0",
+ "NPL-1.1",
+ "NPOSL-3.0",
+ "NRL",
+ "NTP",
+ "Nunit",
+ "OCCT-PL",
+ "OCLC-2.0",
+ "ODbL-1.0",
+ "OFL-1.0",
+ "OFL-1.1",
+ "OGTSL",
+ "OLDAP-1.1",
+ "OLDAP-1.2",
+ "OLDAP-1.3",
+ "OLDAP-1.4",
+ "OLDAP-2.0",
+ "OLDAP-2.0.1",
+ "OLDAP-2.1",
+ "OLDAP-2.2",
+ "OLDAP-2.2.1",
+ "OLDAP-2.2.2",
+ "OLDAP-2.3",
+ "OLDAP-2.4",
+ "OLDAP-2.5",
+ "OLDAP-2.6",
+ "OLDAP-2.7",
+ "OLDAP-2.8",
+ "OML",
+ "OpenSSL",
+ "OPL-1.0",
+ "OSET-PL-2.1",
+ "OSL-1.0",
+ "OSL-1.1",
+ "OSL-2.0",
+ "OSL-2.1",
+ "OSL-3.0",
+ "PDDL-1.0",
+ "PHP-3.0",
+ "PHP-3.01",
+ "Plexus",
+ "PostgreSQL",
+ "psfrag",
+ "psutils",
+ "Python-2.0",
+ "Qhull",
+ "QPL-1.0",
+ "Rdisc",
+ "RHeCos-1.1",
+ "RPL-1.1",
+ "RPL-1.5",
+ "RPSL-1.0",
+ "RSA-MD",
+ "RSCPL",
+ "Ruby",
+ "SAX-PD",
+ "Saxpath",
+ "SCEA",
+ "Sendmail",
+ "SGI-B-1.0",
+ "SGI-B-1.1",
+ "SGI-B-2.0",
+ "SimPL-2.0",
+ "SISSL",
+ "SISSL-1.2",
+ "Sleepycat",
+ "SMLNJ",
+ "SMPPL",
+ "SNIA",
+ "Spencer-86",
+ "Spencer-94",
+ "Spencer-99",
+ "SPL-1.0",
+ "StandardML-NJ",
+ "SugarCRM-1.1.3",
+ "SWL",
+ "TCL",
+ "TCP-wrappers",
+ "TMate",
+ "TORQUE-1.1",
+ "TOSL",
+ "Unicode-DFS-2015",
+ "Unicode-DFS-2016",
+ "Unicode-TOU",
+ "Unlicense",
+ "UPL-1.0",
+ "Vim",
+ "VOSTROM",
+ "VSL-1.0",
+ "W3C",
+ "W3C-19980720",
+ "W3C-20150513",
+ "Watcom-1.0",
+ "Wsuipa",
+ "WTFPL",
+ "wxWindows",
+ "X11",
+ "Xerox",
+ "XFree86-1.1",
+ "xinetd",
+ "Xnet",
+ "xpp",
+ "XSkat",
+ "YPL-1.0",
+ "YPL-1.1",
+ "Zed",
+ "Zend-2.0",
+ "Zimbra-1.3",
+ "Zimbra-1.4",
+ "Zlib",
+ "zlib-acknowledgement",
+ "ZPL-1.1",
+ "ZPL-2.0",
+ "ZPL-2.1"
+ ]
+ },
+ "requires": {
+ "type": "object",
+ "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
+ "properties": {
+ "MediaWiki": {
+ "type": "string",
+ "description": "Version constraint string against MediaWiki core."
+ }
+ }
+ },
+ "ResourceFileModulePaths": {
+ "type": "object",
+ "description": "Default paths to use for all ResourceLoader file modules",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths, relative to current directory"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+ },
+ "remoteSkinPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+ }
+ }
+ },
+ "ResourceModules": {
+ "type": "object",
+ "description": "ResourceLoader modules to register",
+ "patternProperties": {
+ "^[a-zA-Z0-9-\\.]+$": {
+ "type": "object",
+ "anyOf": [
+ {
+ "description": "A ResourceLoaderFileModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+ },
+ "remoteBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+ },
+ "skipFunction": {
+ "type": "string",
+ "description": "Path to a file containing a JavaScript \"skip function\", if desired."
+ },
+ "scripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to always include (array of file paths)",
+ "items": {
+ "type": "string"
+ }
+ },
+ "languageScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+ "patternProperties": {
+ "^[a-zA-Z0-9-]{2,}$": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "skinScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "debugScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in debug contexts",
+ "items": {
+ "type": "string"
+ }
+ },
+ "loaderScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in the startup module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dependencies": {
+ "type": ["string", "array"],
+ "description": "Modules which must be loaded before this module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "styles": {
+ "type": ["string", "array", "object"],
+ "description": "Styles to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "skinStyles": {
+ "type": "object",
+ "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "messages": {
+ "type": ["string", "array"],
+ "description": "Messages to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "group": {
+ "type": "string",
+ "description": "Group which this module should be loaded together with"
+ },
+ "position": {
+ "type": "string",
+ "description": "Position on the page to load this module at",
+ "enum": [
+ "bottom",
+ "top"
+ ]
+ },
+ "templates": {
+ "type": ["object", "array"],
+ "description": "Templates to be loaded for client-side usage"
+ },
+ "targets": {
+ "type": ["string", "array"],
+ "description": "ResourceLoader target the module can run on",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ {
+ "description": "A ResourceLoaderImageModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "class": {
+ "enum": ["ResourceLoaderImageModule"]
+ },
+ "data": {
+ "type": "string"
+ },
+ "prefix": {
+ "type": "string"
+ },
+ "selector": {
+ "type": "string"
+ },
+ "selectorWithoutVariant": {
+ "type": "string"
+ },
+ "selectorWithVariant": {
+ "type": "string"
+ },
+ "variants": {
+ "type": "object"
+ },
+ "images": {
+ "type": "object"
+ },
+ "position": {
+ "enum": [
+ "top",
+ "bottom"
+ ]
+ }
+ }
+ },
+ {
+ "description": "An arbitrary ResourceLoaderModule definition",
+ "properties": {
+ "class": {
+ "type": "string",
+ "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+ }
+ },
+ "required": ["class"]
+ }
+ ]
+ }
+ }
+ },
+ "ResourceModuleSkinStyles": {
+ "type": "object",
+ "description": "ResourceLoader modules for custom skin styles"
+ },
+ "ResourceLoaderSources": {
+ "type": "object",
+ "description": "ResourceLoader sources to register"
+ },
+ "ResourceLoaderLESSVars": {
+ "type": "object",
+ "description": "ResourceLoader LESS variables"
+ },
+ "ResourceLoaderLESSImportPaths": {
+ "type": "object",
+ "description": "ResourceLoader import paths"
+ },
+ "ConfigRegistry": {
+ "type": "object",
+ "description": "Registry of factory functions to create Config objects"
+ },
+ "SessionProviders": {
+ "type": "object",
+ "description": "Session providers"
+ },
+ "AuthManagerAutoConfig": {
+ "type": "object",
+ "description": "AuthManager auto-configuration",
+ "additionalProperties": false,
+ "properties": {
+ "preauth": {
+ "type": "object",
+ "description": "Pre-authentication providers"
+ },
+ "primaryauth": {
+ "type": "object",
+ "description": "Primary authentication providers"
+ },
+ "secondaryauth": {
+ "type": "object",
+ "description": "Secondary authentication providers"
+ }
+ }
+ },
+ "CentralIdLookupProviders": {
+ "type": "object",
+ "description": "Central ID lookup providers"
+ },
+ "namespaces": {
+ "type": "array",
+ "description": "Method to add extra namespaces",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "constant": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "gender": {
+ "type": "object",
+ "properties": {
+ "male": {
+ "type": "string"
+ },
+ "female": {
+ "type": "string"
+ }
+ }
+ },
+ "subpages": {
+ "type": "boolean",
+ "default": false
+ },
+ "content": {
+ "type": "boolean",
+ "default": false
+ },
+ "defaultcontentmodel": {
+ "type": "string"
+ },
+ "protection": {
+ "type": ["string", "array"],
+ "description": "Userright(s) required to edit in this namespace"
+ },
+ "capitallinkoverride": {
+ "type": "boolean",
+ "description": "Set $wgCapitalLinks on a per-namespace basis"
+ },
+ "conditional": {
+ "type": "boolean",
+ "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
+ "default": false
+ }
+ },
+ "required": ["id", "constant", "name"]
+ }
+ },
+ "TrackingCategories": {
+ "type": "array",
+ "description": "Tracking category message keys",
+ "items": {
+ "type": "string"
+ }
+ },
+ "DefaultUserOptions": {
+ "type": "object",
+ "description": "Default values of user options"
+ },
+ "HiddenPrefs": {
+ "type": "array",
+ "description": "Preferences users cannot set",
+ "items": {
+ "type": "string"
+ }
+ },
+ "GroupPermissions": {
+ "type": "object",
+ "description": "Default permissions to give to user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "RevokePermissions": {
+ "type": "object",
+ "description": "Default permissions to revoke from user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "ImplicitGroups": {
+ "type": "array",
+ "description": "Implicit groups"
+ },
+ "GroupsAddToSelf": {
+ "type": "object",
+ "description": "Groups a user can add to themselves"
+ },
+ "GroupsRemoveFromSelf": {
+ "type": "object",
+ "description": "Groups a user can remove from themselves"
+ },
+ "AddGroups": {
+ "type": "object",
+ "description": "Groups a user can add to users"
+ },
+ "RemoveGroups": {
+ "type": "object",
+ "description": "Groups a user can remove from users"
+ },
+ "AvailableRights": {
+ "type": "array",
+ "description": "User rights added by the extension",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ContentHandlers": {
+ "type": "object",
+ "description": "Mapping of model ID to class name",
+ "patternProperties": {
+ "^[A-Za-z]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "RateLimits": {
+ "type": "object",
+ "description": "Rate limits"
+ },
+ "RecentChangesFlags": {
+ "type": "object",
+ "description": "Flags (letter symbols) shown on RecentChanges pages"
+ },
+ "MediaHandlers": {
+ "type": "object",
+ "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
+ },
+ "ExtensionFunctions": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "Function to call after setup has finished",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ExtensionMessagesFiles": {
+ "type": "object",
+ "description": "File paths containing PHP internationalization data"
+ },
+ "MessagesDirs": {
+ "type": "object",
+ "description": "Directory paths containing JSON internationalization data"
+ },
+ "ExtensionEntryPointListFiles": {
+ "type": "object"
+ },
+ "SpecialPages": {
+ "type": "object",
+ "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+ },
+ "AutoloadClasses": {
+ "type": "object"
+ },
+ "Hooks": {
+ "type": [ "string", "object" ],
+ "description": "Hooks this extension uses (mapping of hook name to callback)"
+ },
+ "JobClasses": {
+ "type": "object",
+ "description": "Job types this extension implements (mapping of job type to class name)"
+ },
+ "LogTypes": {
+ "type": "array",
+ "description": "List of new log types this extension uses"
+ },
+ "LogRestrictions": {
+ "type": "object"
+ },
+ "FilterLogTypes": {
+ "type": "object"
+ },
+ "ActionFilteredLogs": {
+ "type": "object",
+ "description": "List of log types which can be filtered by log actions",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "LogNames": {
+ "type": "object"
+ },
+ "LogHeaders": {
+ "type": "object"
+ },
+ "LogActions": {
+ "type": "object"
+ },
+ "LogActionsHandlers": {
+ "type": "object"
+ },
+ "Actions": {
+ "type": "object"
+ },
+ "APIModules": {
+ "type": "object"
+ },
+ "APIFormatModules": {
+ "type": "object"
+ },
+ "APIMetaModules": {
+ "type": "object"
+ },
+ "APIPropModules": {
+ "type": "object"
+ },
+ "APIListModules": {
+ "type": "object"
+ },
+ "ValidSkinNames": {
+ "type": "object"
+ },
+ "FeedClasses": {
+ "type": "object",
+ "description": "Available feeds objects"
+ },
+ "SkinOOUIThemes": {
+ "type": "object"
+ },
+ "callback": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "A function to be called right after MediaWiki processes this file"
+ },
+ "config": {
+ "type": "object",
+ "description": "Configuration options for this extension",
+ "properties": {
+ "_prefix": {
+ "type": "string",
+ "default": "wg",
+ "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+ }
+ },
+ "patternProperties": {
+ "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+ "properties": {
+ "_merge_strategy": {
+ "type": "string",
+ "enum": [
+ "array_merge_recursive",
+ "array_plus_2d",
+ "array_plus",
+ "array_merge"
+ ],
+ "default": "array_merge"
+ }
+ }
+ }
+ }
+ },
+ "ParserTestFiles": {
+ "type": "array",
+ "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
+ },
+ "load_composer_autoloader": {
+ "type": "boolean",
+ "description": "Load the composer autoloader for this extension, if one is present"
+ }
+ }
+}
diff --git a/www/wiki/docs/extension.schema.v1.json b/www/wiki/docs/extension.schema.v1.json
new file mode 100644
index 00000000..7cfebcaf
--- /dev/null
+++ b/www/wiki/docs/extension.schema.v1.json
@@ -0,0 +1,707 @@
+{
+ "$schema": "http://json-schema.org/schema#",
+ "description": "MediaWiki extension.json schema",
+ "type": "object",
+ "properties": {
+ "manifest_version": {
+ "type": "integer",
+ "description": "Version of the extension.json schema the extension.json file is in.",
+ "required": true
+ },
+ "name": {
+ "type": "string",
+ "description": "The extension's canonical name.",
+ "required": true
+ },
+ "namemsg": {
+ "type": "string",
+ "description": "i18n message key of the extension's name."
+ },
+ "type": {
+ "type": "string",
+ "description": "The extension's type, as an index to $wgExtensionCredits.",
+ "default": "other"
+ },
+ "author": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "Extension's authors.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of this release of the extension."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL to the homepage for the extension.",
+ "format": "uri-reference"
+ },
+ "description": {
+ "type": "string",
+ "description": "Raw description of the extension."
+ },
+ "descriptionmsg": {
+ "type": "string",
+ "description": "Message key for a i18n message describing the extension."
+ },
+ "license-name": {
+ "type": "string",
+ "description": "SPDX identifier for the license under which the extension is released."
+ },
+ "requires": {
+ "type": "object",
+ "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+ "additionalProperties": false,
+ "properties": {
+ "MediaWiki": {
+ "type": "string",
+ "description": "Version constraint string against MediaWiki core."
+ },
+ "extensions": {
+ "type": "object",
+ "description": "Set of version constraint strings against specific extensions."
+ },
+ "skins": {
+ "type": "object",
+ "description": "Set of version constraint strings against specific skins."
+ }
+ }
+ },
+ "ResourceFileModulePaths": {
+ "type": "object",
+ "description": "Default paths to use for all ResourceLoader file modules",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths, relative to current directory"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+ },
+ "remoteSkinPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+ }
+ }
+ },
+ "ResourceModules": {
+ "type": "object",
+ "description": "ResourceLoader modules to register",
+ "patternProperties": {
+ "^[a-zA-Z0-9-\\.]+$": {
+ "type": "object",
+ "anyOf": [
+ {
+ "description": "A ResourceLoaderFileModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+ },
+ "remoteBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+ },
+ "skipFunction": {
+ "type": "string",
+ "description": "Path to a file containing a JavaScript \"skip function\", if desired."
+ },
+ "scripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to always include (array of file paths)",
+ "items": {
+ "type": "string"
+ }
+ },
+ "languageScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+ "patternProperties": {
+ "^[a-zA-Z0-9-]{2,}$": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "skinScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "debugScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in debug contexts",
+ "items": {
+ "type": "string"
+ }
+ },
+ "loaderScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in the startup module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dependencies": {
+ "type": ["string", "array"],
+ "description": "Modules which must be loaded before this module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "styles": {
+ "type": ["string", "array", "object"],
+ "description": "Styles to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "skinStyles": {
+ "type": "object",
+ "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "messages": {
+ "type": ["string", "array"],
+ "description": "Messages to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "group": {
+ "type": "string",
+ "description": "Group which this module should be loaded together with"
+ },
+ "deprecated": {
+ "type": ["object", "boolean"],
+ "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
+ },
+ "position": {
+ "type": "string",
+ "description": "Position on the page to load this module at",
+ "enum": [
+ "bottom",
+ "top"
+ ]
+ },
+ "templates": {
+ "type": ["object", "array"],
+ "description": "Templates to be loaded for client-side usage"
+ },
+ "targets": {
+ "type": ["string", "array"],
+ "description": "ResourceLoader target the module can run on",
+ "items": {
+ "type": "string"
+ }
+ },
+ "noflip": {
+ "type": "boolean",
+ "description": "Whether to skip CSSJanus LTR-to-RTL flipping for this module. Recommended for styles imported from libraries that already properly handle their RTL styles. Default is false, meaning CSSJanus will be applied on RTL-mode output."
+ }
+ }
+ },
+ {
+ "description": "A ResourceLoaderWikiModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "class": {
+ "enum": ["ResourceLoaderWikiModule"]
+ },
+ "group": {
+ "type": "string",
+ "description": "Group which this module should be loaded together with"
+ },
+ "position": {
+ "type": "string",
+ "description": "Position on the page to load this module at",
+ "enum": [
+ "bottom",
+ "top"
+ ]
+ },
+ "targets": {
+ "type": ["string", "array"],
+ "description": "ResourceLoader target the module can run on",
+ "items": {
+ "type": "string"
+ }
+ },
+ "scripts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "styles": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ {
+ "description": "A ResourceLoaderImageModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "class": {
+ "enum": ["ResourceLoaderImageModule"]
+ },
+ "data": {
+ "type": "string"
+ },
+ "prefix": {
+ "type": "string"
+ },
+ "selector": {
+ "type": "string"
+ },
+ "selectorWithoutVariant": {
+ "type": "string"
+ },
+ "selectorWithVariant": {
+ "type": "string"
+ },
+ "variants": {
+ "type": "object"
+ },
+ "images": {
+ "type": "object"
+ },
+ "position": {
+ "enum": [
+ "top",
+ "bottom"
+ ]
+ }
+ }
+ },
+ {
+ "description": "An arbitrary ResourceLoaderModule definition",
+ "properties": {
+ "class": {
+ "type": "string",
+ "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+ }
+ },
+ "required": ["class"]
+ }
+ ]
+ }
+ }
+ },
+ "ResourceModuleSkinStyles": {
+ "type": "object",
+ "description": "ResourceLoader modules for custom skin styles"
+ },
+ "ResourceLoaderSources": {
+ "type": "object",
+ "description": "ResourceLoader sources to register"
+ },
+ "ResourceLoaderLESSVars": {
+ "type": "object",
+ "description": "ResourceLoader LESS variables"
+ },
+ "ConfigRegistry": {
+ "type": "object",
+ "description": "Registry of factory functions to create Config objects"
+ },
+ "SessionProviders": {
+ "type": "object",
+ "description": "Session providers"
+ },
+ "AuthManagerAutoConfig": {
+ "type": "object",
+ "description": "AuthManager auto-configuration",
+ "additionalProperties": false,
+ "properties": {
+ "preauth": {
+ "type": "object",
+ "description": "Pre-authentication providers"
+ },
+ "primaryauth": {
+ "type": "object",
+ "description": "Primary authentication providers"
+ },
+ "secondaryauth": {
+ "type": "object",
+ "description": "Secondary authentication providers"
+ }
+ }
+ },
+ "CentralIdLookupProviders": {
+ "type": "object",
+ "description": "Central ID lookup providers"
+ },
+ "namespaces": {
+ "type": "array",
+ "description": "Method to add extra namespaces",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "constant": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "gender": {
+ "type": "object",
+ "properties": {
+ "male": {
+ "type": "string"
+ },
+ "female": {
+ "type": "string"
+ }
+ }
+ },
+ "subpages": {
+ "type": "boolean",
+ "default": false
+ },
+ "content": {
+ "type": "boolean",
+ "default": false
+ },
+ "defaultcontentmodel": {
+ "type": "string"
+ },
+ "protection": {
+ "type": ["string", "array"],
+ "description": "Userright(s) required to edit in this namespace"
+ },
+ "capitallinkoverride": {
+ "type": "boolean",
+ "description": "Set $wgCapitalLinks on a per-namespace basis"
+ },
+ "conditional": {
+ "type": "boolean",
+ "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
+ "default": false
+ }
+ },
+ "required": ["id", "constant", "name"]
+ }
+ },
+ "TrackingCategories": {
+ "type": "array",
+ "description": "Tracking category message keys",
+ "items": {
+ "type": "string"
+ }
+ },
+ "DefaultUserOptions": {
+ "type": "object",
+ "description": "Default values of user options"
+ },
+ "HiddenPrefs": {
+ "type": "array",
+ "description": "Preferences users cannot set",
+ "items": {
+ "type": "string"
+ }
+ },
+ "GroupPermissions": {
+ "type": "object",
+ "description": "Default permissions to give to user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "RevokePermissions": {
+ "type": "object",
+ "description": "Default permissions to revoke from user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "GrantPermissions": {
+ "type": "object",
+ "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "GrantPermissionGroups": {
+ "type": "object",
+ "description": "Map of grants to their UI grouping",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "ImplicitGroups": {
+ "type": "array",
+ "description": "Implicit groups"
+ },
+ "GroupsAddToSelf": {
+ "type": "object",
+ "description": "Groups a user can add to themselves"
+ },
+ "GroupsRemoveFromSelf": {
+ "type": "object",
+ "description": "Groups a user can remove from themselves"
+ },
+ "AddGroups": {
+ "type": "object",
+ "description": "Groups a user can add to users"
+ },
+ "RemoveGroups": {
+ "type": "object",
+ "description": "Groups a user can remove from users"
+ },
+ "AvailableRights": {
+ "type": "array",
+ "description": "User rights added by the extension",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ContentHandlers": {
+ "type": "object",
+ "description": "Mapping of model ID to class name",
+ "patternProperties": {
+ "^[A-Za-z]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "RateLimits": {
+ "type": "object",
+ "description": "Rate limits"
+ },
+ "RecentChangesFlags": {
+ "type": "object",
+ "description": "Flags (letter symbols) shown on RecentChanges pages"
+ },
+ "MediaHandlers": {
+ "type": "object",
+ "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
+ },
+ "ExtensionFunctions": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "Function to call after setup has finished",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ExtensionMessagesFiles": {
+ "type": "object",
+ "description": "File paths containing PHP internationalization data"
+ },
+ "MessagesDirs": {
+ "type": "object",
+ "description": "Directory paths containing JSON internationalization data"
+ },
+ "ExtensionEntryPointListFiles": {
+ "type": "object"
+ },
+ "SpecialPages": {
+ "type": "object",
+ "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+ },
+ "AutoloadClasses": {
+ "type": "object"
+ },
+ "Hooks": {
+ "type": [ "string", "object" ],
+ "description": "Hooks this extension uses (mapping of hook name to callback)"
+ },
+ "JobClasses": {
+ "type": "object",
+ "description": "Job types this extension implements (mapping of job type to class name or factory function)"
+ },
+ "LogTypes": {
+ "type": "array",
+ "description": "List of new log types this extension uses"
+ },
+ "LogRestrictions": {
+ "type": "object"
+ },
+ "FilterLogTypes": {
+ "type": "object"
+ },
+ "ActionFilteredLogs": {
+ "type": "object",
+ "description": "List of log types which can be filtered by log actions",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "LogNames": {
+ "type": "object"
+ },
+ "LogHeaders": {
+ "type": "object"
+ },
+ "LogActions": {
+ "type": "object"
+ },
+ "LogActionsHandlers": {
+ "type": "object"
+ },
+ "Actions": {
+ "type": "object"
+ },
+ "APIModules": {
+ "type": "object"
+ },
+ "APIFormatModules": {
+ "type": "object"
+ },
+ "APIMetaModules": {
+ "type": "object"
+ },
+ "APIPropModules": {
+ "type": "object"
+ },
+ "APIListModules": {
+ "type": "object"
+ },
+ "ValidSkinNames": {
+ "type": "object"
+ },
+ "FeedClasses": {
+ "type": "object",
+ "description": "Available feeds objects"
+ },
+ "SkinOOUIThemes": {
+ "type": "object"
+ },
+ "PasswordPolicy": {
+ "type": "object",
+ "description": "Password policies"
+ },
+ "FileExtensions": {
+ "type": "array",
+ "description": "Preferred file extensions for uploading",
+ "items": {
+ "type": "string"
+ }
+ },
+ "callback": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "A function to be called right after MediaWiki processes this file"
+ },
+ "config": {
+ "type": "object",
+ "description": "Configuration options for this extension",
+ "properties": {
+ "_prefix": {
+ "type": "string",
+ "default": "wg",
+ "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+ }
+ },
+ "patternProperties": {
+ "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+ "properties": {
+ "_merge_strategy": {
+ "type": "string",
+ "enum": [
+ "array_merge_recursive",
+ "array_replace_recursive",
+ "array_plus_2d",
+ "array_plus",
+ "array_merge"
+ ],
+ "default": "array_merge"
+ }
+ }
+ }
+ }
+ },
+ "ParserTestFiles": {
+ "type": "array",
+ "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
+ },
+ "ServiceWiringFiles": {
+ "type": "array",
+ "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices"
+ },
+ "load_composer_autoloader": {
+ "type": "boolean",
+ "description": "Load the composer autoloader for this extension, if one is present"
+ }
+ }
+}
diff --git a/www/wiki/docs/extension.schema.v2.json b/www/wiki/docs/extension.schema.v2.json
new file mode 100644
index 00000000..75a4f2c6
--- /dev/null
+++ b/www/wiki/docs/extension.schema.v2.json
@@ -0,0 +1,763 @@
+{
+ "$schema": "http://json-schema.org/schema#",
+ "description": "MediaWiki extension.json schema",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "manifest_version": {
+ "type": "integer",
+ "description": "Version of the extension.json schema the extension.json file is in.",
+ "required": true
+ },
+ "name": {
+ "type": "string",
+ "description": "The extension's canonical name.",
+ "required": true
+ },
+ "namemsg": {
+ "type": "string",
+ "description": "i18n message key of the extension's name."
+ },
+ "type": {
+ "type": "string",
+ "description": "The extension's type, as an index to $wgExtensionCredits.",
+ "default": "other"
+ },
+ "author": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "Extension's authors.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of this release of the extension."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL to the homepage for the extension.",
+ "format": "uri-reference"
+ },
+ "description": {
+ "type": "string",
+ "description": "Raw description of the extension."
+ },
+ "descriptionmsg": {
+ "type": "string",
+ "description": "Message key for a i18n message describing the extension."
+ },
+ "license-name": {
+ "type": "string",
+ "description": "SPDX identifier for the license under which the extension is released."
+ },
+ "requires": {
+ "type": "object",
+ "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+ "additionalProperties": false,
+ "properties": {
+ "MediaWiki": {
+ "type": "string",
+ "description": "Version constraint string against MediaWiki core."
+ },
+ "extensions": {
+ "type": "object",
+ "description": "Set of version constraint strings against specific extensions."
+ },
+ "skins": {
+ "type": "object",
+ "description": "Set of version constraint strings against specific skins."
+ }
+ }
+ },
+ "ResourceFileModulePaths": {
+ "type": "object",
+ "description": "Default paths to use for all ResourceLoader file modules",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths, relative to current directory"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+ },
+ "remoteSkinPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+ }
+ }
+ },
+ "ResourceModules": {
+ "type": "object",
+ "description": "ResourceLoader modules to register",
+ "patternProperties": {
+ "^[a-zA-Z0-9-\\.]+$": {
+ "type": "object",
+ "anyOf": [
+ {
+ "description": "A ResourceLoaderFileModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+ },
+ "remoteBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+ },
+ "skipFunction": {
+ "type": "string",
+ "description": "Path to a file containing a JavaScript \"skip function\", if desired."
+ },
+ "scripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to always include (array of file paths)",
+ "items": {
+ "type": "string"
+ }
+ },
+ "languageScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+ "patternProperties": {
+ "^[a-zA-Z0-9-]{2,}$": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "skinScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "debugScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in debug contexts",
+ "items": {
+ "type": "string"
+ }
+ },
+ "loaderScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in the startup module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dependencies": {
+ "type": ["string", "array"],
+ "description": "Modules which must be loaded before this module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "styles": {
+ "type": ["string", "array", "object"],
+ "description": "Styles to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "skinStyles": {
+ "type": "object",
+ "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "messages": {
+ "type": ["string", "array"],
+ "description": "Messages to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "group": {
+ "type": "string",
+ "description": "Group with which this module should be loaded"
+ },
+ "deprecated": {
+ "type": ["object", "boolean"],
+ "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
+ },
+ "position": {
+ "type": "string",
+ "description": "Position on the page to load this module at",
+ "enum": [
+ "bottom",
+ "top"
+ ]
+ },
+ "templates": {
+ "type": ["object", "array"],
+ "description": "Templates to be loaded for client-side usage"
+ },
+ "targets": {
+ "type": ["string", "array"],
+ "description": "ResourceLoader target the module can run on",
+ "items": {
+ "type": "string"
+ }
+ },
+ "noflip": {
+ "type": "boolean",
+ "description": "Whether to skip CSSJanus LTR-to-RTL flipping for this module. Recommended for styles imported from libraries that already properly handle their RTL styles. Default is false, meaning CSSJanus will be applied on RTL-mode output."
+ }
+ }
+ },
+ {
+ "description": "A ResourceLoaderWikiModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "class": {
+ "enum": ["ResourceLoaderWikiModule"]
+ },
+ "group": {
+ "type": "string",
+ "description": "Group with which this module should be loaded"
+ },
+ "position": {
+ "type": "string",
+ "description": "Position on the page to load this module at",
+ "enum": [
+ "bottom",
+ "top"
+ ]
+ },
+ "targets": {
+ "type": ["string", "array"],
+ "description": "ResourceLoader target the module can run on",
+ "items": {
+ "type": "string"
+ }
+ },
+ "scripts": {
+ "type": "array",
+ "description": "A list of on-wiki pages containing JavaScript that should be loaded",
+ "items": {
+ "type": "string"
+ }
+ },
+ "styles": {
+ "type": "array",
+ "description": "A list of on-wiki pages containing CSS that should be loaded",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ {
+ "description": "A ResourceLoaderImageModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "class": {
+ "enum": ["ResourceLoaderImageModule"]
+ },
+ "data": {
+ "type": "string"
+ },
+ "prefix": {
+ "type": "string"
+ },
+ "selector": {
+ "type": "string"
+ },
+ "selectorWithoutVariant": {
+ "type": "string"
+ },
+ "selectorWithVariant": {
+ "type": "string"
+ },
+ "variants": {
+ "type": "object"
+ },
+ "images": {
+ "type": "object"
+ },
+ "position": {
+ "enum": [
+ "top",
+ "bottom"
+ ]
+ }
+ }
+ },
+ {
+ "description": "An arbitrary ResourceLoaderModule definition by class",
+ "properties": {
+ "class": {
+ "type": "string",
+ "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+ }
+ },
+ "required": ["class"]
+ },
+ {
+ "description": "An arbitrary ResourceLoaderModule definition with instantiator",
+ "properties": {
+ "factory": {
+ "type": "string",
+ "description": "A static instantiator function for creating the ResourceLoaderModule object."
+ }
+ },
+ "required": ["factory"]
+ }
+ ]
+ }
+ }
+ },
+ "ResourceModuleSkinStyles": {
+ "type": "object",
+ "description": "ResourceLoader modules for custom skin styles"
+ },
+ "ResourceLoaderSources": {
+ "type": "object",
+ "description": "ResourceLoader sources to register"
+ },
+ "ResourceLoaderLESSVars": {
+ "type": "object",
+ "description": "ResourceLoader LESS variables"
+ },
+ "ConfigRegistry": {
+ "type": "object",
+ "description": "Registry of factory functions to create Config objects"
+ },
+ "SessionProviders": {
+ "type": "object",
+ "description": "Session providers"
+ },
+ "AuthManagerAutoConfig": {
+ "type": "object",
+ "description": "AuthManager auto-configuration",
+ "additionalProperties": false,
+ "properties": {
+ "preauth": {
+ "type": "object",
+ "description": "Pre-authentication providers"
+ },
+ "primaryauth": {
+ "type": "object",
+ "description": "Primary authentication providers"
+ },
+ "secondaryauth": {
+ "type": "object",
+ "description": "Secondary authentication providers"
+ }
+ }
+ },
+ "CentralIdLookupProviders": {
+ "type": "object",
+ "description": "Central ID lookup providers"
+ },
+ "ChangeCredentialsBlacklist": {
+ "type": "object",
+ "description": "AuthenticationRequest classes which can only be used internally for credentials change"
+ },
+ "RemoveCredentialsBlacklist": {
+ "type": "object",
+ "description": "AuthenticationRequest classes which can only be used internally for credentials removal"
+ },
+ "namespaces": {
+ "type": "array",
+ "description": "Method to add extra namespaces",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "constant": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "gender": {
+ "type": "object",
+ "properties": {
+ "male": {
+ "type": "string"
+ },
+ "female": {
+ "type": "string"
+ }
+ }
+ },
+ "subpages": {
+ "type": "boolean",
+ "default": false
+ },
+ "content": {
+ "type": "boolean",
+ "default": false
+ },
+ "defaultcontentmodel": {
+ "type": "string"
+ },
+ "protection": {
+ "type": ["string", "array"],
+ "description": "Userright(s) required to edit in this namespace"
+ },
+ "capitallinkoverride": {
+ "type": "boolean",
+ "description": "Set $wgCapitalLinks on a per-namespace basis"
+ },
+ "conditional": {
+ "type": "boolean",
+ "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
+ "default": false
+ }
+ },
+ "required": ["id", "constant", "name"]
+ }
+ },
+ "TrackingCategories": {
+ "type": "array",
+ "description": "Tracking category message keys",
+ "items": {
+ "type": "string"
+ }
+ },
+ "DefaultUserOptions": {
+ "type": "object",
+ "description": "Default values of user options"
+ },
+ "HiddenPrefs": {
+ "type": "array",
+ "description": "Preferences users cannot set",
+ "items": {
+ "type": "string"
+ }
+ },
+ "GroupPermissions": {
+ "type": "object",
+ "description": "Default permissions to give to user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "RevokePermissions": {
+ "type": "object",
+ "description": "Default permissions to revoke from user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "GrantPermissions": {
+ "type": "object",
+ "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "GrantPermissionGroups": {
+ "type": "object",
+ "description": "Map of grants to their UI grouping",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "ImplicitGroups": {
+ "type": "array",
+ "description": "Implicit groups"
+ },
+ "GroupsAddToSelf": {
+ "type": "object",
+ "description": "Groups a user can add to themselves"
+ },
+ "GroupsRemoveFromSelf": {
+ "type": "object",
+ "description": "Groups a user can remove from themselves"
+ },
+ "AddGroups": {
+ "type": "object",
+ "description": "Groups a user can add to users"
+ },
+ "RemoveGroups": {
+ "type": "object",
+ "description": "Groups a user can remove from users"
+ },
+ "AvailableRights": {
+ "type": "array",
+ "description": "User rights added by the extension",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ContentHandlers": {
+ "type": "object",
+ "description": "Mapping of model ID to class name",
+ "patternProperties": {
+ "^[A-Za-z]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "RateLimits": {
+ "type": "object",
+ "description": "Rate limits"
+ },
+ "RecentChangesFlags": {
+ "type": "object",
+ "description": "Flags (letter symbols) shown on RecentChanges pages"
+ },
+ "MediaHandlers": {
+ "type": "object",
+ "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
+ },
+ "ExtensionFunctions": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "Function to call after setup has finished",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ExtensionMessagesFiles": {
+ "type": "object",
+ "description": "File paths containing PHP internationalization data"
+ },
+ "MessagesDirs": {
+ "type": "object",
+ "description": "Directory paths containing JSON internationalization data"
+ },
+ "ExtensionEntryPointListFiles": {
+ "type": "object"
+ },
+ "SpecialPages": {
+ "type": "object",
+ "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+ },
+ "AutoloadClasses": {
+ "type": "object"
+ },
+ "Hooks": {
+ "type": [ "string", "object" ],
+ "description": "Hooks this extension uses (mapping of hook name to callback)"
+ },
+ "JobClasses": {
+ "type": "object",
+ "description": "Job types this extension implements (mapping of job type to class name or factory function)"
+ },
+ "LogTypes": {
+ "type": "array",
+ "description": "List of new log types this extension uses"
+ },
+ "LogRestrictions": {
+ "type": "object"
+ },
+ "FilterLogTypes": {
+ "type": "object"
+ },
+ "ActionFilteredLogs": {
+ "type": "object",
+ "description": "List of log types which can be filtered by log actions",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "LogNames": {
+ "type": "object"
+ },
+ "LogHeaders": {
+ "type": "object"
+ },
+ "LogActions": {
+ "type": "object"
+ },
+ "LogActionsHandlers": {
+ "type": "object"
+ },
+ "Actions": {
+ "type": "object"
+ },
+ "APIModules": {
+ "type": "object"
+ },
+ "APIFormatModules": {
+ "type": "object"
+ },
+ "APIMetaModules": {
+ "type": "object"
+ },
+ "APIPropModules": {
+ "type": "object"
+ },
+ "APIListModules": {
+ "type": "object"
+ },
+ "ValidSkinNames": {
+ "type": "object"
+ },
+ "FeedClasses": {
+ "type": "object",
+ "description": "Available feeds objects"
+ },
+ "SkinOOUIThemes": {
+ "type": "object",
+ "description": "Map of skin names to OOjs UI themes to use. Same format as ResourceLoaderOOUIModule::$builtinSkinThemeMap."
+ },
+ "PasswordPolicy": {
+ "type": "object",
+ "description": "Password policies"
+ },
+ "FileExtensions": {
+ "type": "array",
+ "description": "Preferred file extensions for uploading",
+ "items": {
+ "type": "string"
+ }
+ },
+ "callback": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "A function to be called right after MediaWiki processes this file"
+ },
+ "config_prefix": {
+ "type": "string",
+ "default": "wg",
+ "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+ },
+ "config": {
+ "type": "object",
+ "description": "Configuration options for this extension",
+ "patternProperties": {
+ "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "required": true
+ },
+ "merge_strategy": {
+ "type": "string",
+ "enum": [
+ "array_merge_recursive",
+ "array_replace_recursive",
+ "array_plus_2d",
+ "array_plus",
+ "array_merge"
+ ],
+ "default": "array_merge"
+ },
+ "path": {
+ "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root",
+ "type": "boolean",
+ "default": false
+ },
+ "description": {
+ "type": ["string", "array"],
+ "description": "A description of the config setting, mostly for documentation/developers"
+ },
+ "decriptionmsg": {
+ "type": "string",
+ "description": "The message key which should be used as a description for this configuration option in a user interface. If empty, description will be used."
+ },
+ "public": {
+ "type": "boolean",
+ "default": false,
+ "description": "Whether this configuration option and its value is allowed to be revealed in public or not."
+ }
+ }
+ }
+ }
+ },
+ "ParserTestFiles": {
+ "type": "array",
+ "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
+ },
+ "ServiceWiringFiles": {
+ "type": "array",
+ "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices"
+ },
+ "attributes": {
+ "description":"Registration information for other extensions",
+ "type": "object",
+ "patternProperties": {
+ ".*": {
+ "type": "object",
+ "patternProperties": {
+ ".*": {
+ "type": ["array", "object"]
+ }
+ }
+ }
+ }
+ },
+ "load_composer_autoloader": {
+ "type": "boolean",
+ "description": "Load the composer autoloader for this extension, if one is present"
+ }
+ }
+}
diff --git a/www/wiki/docs/globals.txt b/www/wiki/docs/globals.txt
new file mode 100644
index 00000000..8b4c755b
--- /dev/null
+++ b/www/wiki/docs/globals.txt
@@ -0,0 +1,67 @@
+globals.txt
+
+Globals are evil. The original MediaWiki code relied on globals for processing
+context far too often. MediaWiki development since then has been a story of
+slowly moving context out of global variables and into objects. Storing
+processing context in object member variables allows those objects to be reused
+in a much more flexible way. Consider the elegance of:
+
+ # Generate the article HTML as if viewed by a web request
+ $article = new Article( Title::newFromText( $t ) );
+ $article->view();
+
+versus
+
+ # Save current globals
+ $oldTitle = $wgTitle;
+ $oldArticle = $wgArticle;
+
+ # Generate the HTML
+ $wgTitle = Title::newFromText( $t );
+ $wgArticle = new Article;
+ $wgArticle->view();
+
+ # Restore globals
+ $wgTitle = $oldTitle
+ $wgArticle = $oldArticle
+
+Some of the current MediaWiki developers have an idle fantasy that some day,
+globals will be eliminated from MediaWiki entirely, replaced by an application
+object which would be passed to constructors. Whether that would be an
+efficient, convenient solution remains to be seen, but certainly PHP 5 makes
+such object-oriented programming models easier than they were in previous
+versions.
+
+For the time being though, MediaWiki programmers will have to work in an
+environment with some global context. At the time of writing, 418 globals were
+initialised on startup by MediaWiki. 304 of these were configuration settings,
+which are documented in DefaultSettings.php. There is no comprehensive
+documentation for the remaining 114 globals, however some of the most important
+ones are listed below. They are typically initialised either in index.php or in
+Setup.php.
+
+For a description of the classes, see design.txt.
+
+$wgTitle
+ Title object created from the request URL.
+
+$wgOut
+ OutputPage object for HTTP response.
+
+$wgUser
+ User object for the user associated with the current request.
+
+$wgLang
+ Language object selected by user preferences.
+
+$wgContLang
+ Language object associated with the wiki being viewed.
+
+$wgParser
+ Parser object. Parser extensions register their hooks here.
+
+$wgRequest
+ WebRequest object, to get request data
+
+$wgMemc, $messageMemc, $parserMemc
+ Object caches
diff --git a/www/wiki/docs/hooks.txt b/www/wiki/docs/hooks.txt
new file mode 100644
index 00000000..a19e9fc0
--- /dev/null
+++ b/www/wiki/docs/hooks.txt
@@ -0,0 +1,3934 @@
+hooks.txt
+
+This document describes how event hooks work in MediaWiki; how to add hooks for
+an event; and how to run hooks for an event.
+
+==Glossary==
+
+event
+ Something that happens with the wiki. For example: a user logs in. A wiki
+ page is saved. A wiki page is deleted. Often there are two events
+ associated with a single action: one before the code is run to make the
+ event happen, and one after. Each event has a name, preferably in
+ CamelCase. For example, 'UserLogin', 'PageContentSave',
+ 'PageContentSaveComplete', 'ArticleDelete'.
+
+hook
+ A clump of code and data that should be run when an event happens. This can
+ be either a function and a chunk of data, or an object and a method.
+
+hook function
+ The function part of a hook.
+
+==Rationale==
+
+Hooks allow us to decouple optionally-run code from code that is run for
+everyone. It allows MediaWiki hackers, third-party developers and local
+administrators to define code that will be run at certain points in the mainline
+code, and to modify the data run by that mainline code. Hooks can keep mainline
+code simple, and make it easier to write extensions. Hooks are a principled
+alternative to local patches.
+
+Consider, for example, two options in MediaWiki. One reverses the order of a
+title before displaying the article; the other converts the title to all
+uppercase letters. Currently, in MediaWiki code, we would handle this as follows
+(note: not real code, here):
+
+ function showAnArticle( $article ) {
+ global $wgReverseTitle, $wgCapitalizeTitle;
+
+ if ( $wgReverseTitle ) {
+ wfReverseTitle( $article );
+ }
+
+ if ( $wgCapitalizeTitle ) {
+ wfCapitalizeTitle( $article );
+ }
+
+ # code to actually show the article goes here
+ }
+
+An extension writer, or a local admin, will often add custom code to the
+function -- with or without a global variable. For example, someone wanting
+email notification when an article is shown may add:
+
+ function showAnArticle( $article ) {
+ global $wgReverseTitle, $wgCapitalizeTitle, $wgNotifyArticle;
+
+ if ( $wgReverseTitle ) {
+ wfReverseTitle( $article );
+ }
+
+ if ( $wgCapitalizeTitle ) {
+ wfCapitalizeTitle( $article );
+ }
+
+ # code to actually show the article goes here
+
+ if ( $wgNotifyArticle ) {
+ wfNotifyArticleShow( $article );
+ }
+ }
+
+Using a hook-running strategy, we can avoid having all this option-specific
+stuff in our mainline code. Using hooks, the function becomes:
+
+ function showAnArticle( $article ) {
+ if ( Hooks::run( 'ArticleShow', array( &$article ) ) ) {
+ # code to actually show the article goes here
+
+ Hooks::run( 'ArticleShowComplete', array( &$article ) );
+ }
+ }
+
+We've cleaned up the code here by removing clumps of weird, infrequently used
+code and moving them off somewhere else. It's much easier for someone working
+with this code to see what's _really_ going on, and make changes or fix bugs.
+
+In addition, we can take all the code that deals with the little-used
+title-reversing options (say) and put it in one place. Instead of having little
+title-reversing if-blocks spread all over the codebase in showAnArticle,
+deleteAnArticle, exportArticle, etc., we can concentrate it all in an extension
+file:
+
+ function reverseArticleTitle( $article ) {
+ # ...
+ }
+
+ function reverseForExport( $article ) {
+ # ...
+ }
+
+The setup function for the extension just has to add its hook functions to the
+appropriate events:
+
+ setupTitleReversingExtension() {
+ global $wgHooks;
+
+ $wgHooks['ArticleShow'][] = 'reverseArticleTitle';
+ $wgHooks['ArticleDelete'][] = 'reverseArticleTitle';
+ $wgHooks['ArticleExport'][] = 'reverseForExport';
+ }
+
+Having all this code related to the title-reversion option in one place means
+that it's easier to read and understand; you don't have to do a grep-find to see
+where the $wgReverseTitle variable is used, say.
+
+If the code is well enough isolated, it can even be excluded when not used --
+making for some slight savings in memory and load-up performance at runtime.
+Admins who want to have all the reversed titles can add:
+
+ require_once 'extensions/ReverseTitle.php';
+
+...to their LocalSettings.php file; those of us who don't want or need it can
+just leave it out.
+
+The extensions don't even have to be shipped with MediaWiki; they could be
+provided by a third-party developer or written by the admin him/herself.
+
+==Writing hooks==
+
+A hook is a chunk of code run at some particular event. It consists of:
+
+ * a function with some optional accompanying data, or
+ * an object with a method and some optional accompanying data.
+
+Hooks are registered by adding them to the global $wgHooks array for a given
+event. All the following are valid ways to define hooks:
+
+ $wgHooks['EventName'][] = 'someFunction'; # function, no data
+ $wgHooks['EventName'][] = array( 'someFunction', $someData );
+ $wgHooks['EventName'][] = array( 'someFunction' ); # weird, but OK
+
+ $wgHooks['EventName'][] = $object; # object only
+ $wgHooks['EventName'][] = array( $object, 'someMethod' );
+ $wgHooks['EventName'][] = array( $object, 'someMethod', $someData );
+ $wgHooks['EventName'][] = array( $object ); # weird but OK
+
+When an event occurs, the function (or object method) will be called with the
+optional data provided as well as event-specific parameters. The above examples
+would result in the following code being executed when 'EventName' happened:
+
+ # function, no data
+ someFunction( $param1, $param2 )
+ # function with data
+ someFunction( $someData, $param1, $param2 )
+
+ # object only
+ $object->onEventName( $param1, $param2 )
+ # object with method
+ $object->someMethod( $param1, $param2 )
+ # object with method and data
+ $object->someMethod( $someData, $param1, $param2 )
+
+Note that when an object is the hook, and there's no specified method, the
+default method called is 'onEventName'. For different events this would be
+different: 'onArticleSave', 'onUserLogin', etc.
+
+The extra data is useful if we want to use the same function or object for
+different purposes. For example:
+
+ $wgHooks['PageContentSaveComplete'][] = array( 'ircNotify', 'TimStarling' );
+ $wgHooks['PageContentSaveComplete'][] = array( 'ircNotify', 'brion' );
+
+This code would result in ircNotify being run twice when an article is saved:
+once for 'TimStarling', and once for 'brion'.
+
+Hooks can return three possible values:
+
+ * No return value (or null): the hook has operated successfully. Previously,
+ true was required. This is the default since MediaWiki 1.23.
+ * "some string": an error occurred; processing should stop and the error
+ should be shown to the user
+ * false: the hook has successfully done the work necessary and the calling
+ function should skip
+
+The last result would be for cases where the hook function replaces the main
+functionality. For example, if you wanted to authenticate users to a custom
+system (LDAP, another PHP program, whatever), you could do:
+
+ $wgHooks['UserLogin'][] = array( 'ldapLogin', $ldapServer );
+
+ function ldapLogin( $username, $password ) {
+ # log user into LDAP
+ return false;
+ }
+
+Returning false makes less sense for events where the action is complete, and
+will normally be ignored.
+
+Note that none of the examples made use of create_function() as a way to
+attach a function to a hook. This is known to cause problems (notably with
+Special:Version), and should be avoided when at all possible.
+
+==Using hooks==
+
+A calling function or method uses the Hooks::run() function to run the hooks
+related to a particular event, like so:
+
+ class Article {
+ # ...
+ function protect() {
+ global $wgUser;
+
+ // Avoid PHP 7.1 warning from passing $this by reference
+ $article = $this;
+
+ if ( Hooks::run( 'ArticleProtect', [ &$article, &$wgUser ] ) ) {
+ # protect the article
+ Hooks::run( 'ArticleProtectComplete', [ &$article, &$wgUser ] );
+ }
+ }
+ }
+
+Hooks::run() returns true if the calling function should continue processing
+(the hooks ran OK, or there are no hooks to run), or false if it shouldn't (an
+error occurred, or one of the hooks handled the action already). Checking the
+return value matters more for "before" hooks than for "complete" hooks.
+
+Hooks::run() was added in MediaWiki 1.18, before that the global function
+wfRunHooks must be used, which was deprecated in MediaWiki 1.25.
+
+Note that hook parameters are passed in an array; this is a necessary
+inconvenience to make it possible to pass reference values (that can be changed)
+into the hook code. Also note that earlier versions of wfRunHooks took a
+variable number of arguments; the array() calling protocol came about after
+MediaWiki 1.4rc1.
+
+==Events and parameters==
+
+This is a list of known events and parameters; please add to it if you're going
+to add events to the MediaWiki code.
+
+'AbortAutoAccount': DEPRECATED! Create a PreAuthenticationProvider instead.
+Return false to cancel automated local account creation, where normally
+authentication against an external auth plugin would be creating a local
+account.
+$user: the User object about to be created (read-only, incomplete)
+&$abortMsg: out parameter: name of error message to be displayed to user
+
+'AbortAutoblock': Return false to cancel an autoblock.
+$autoblockip: The IP going to be autoblocked.
+&$block: The block from which the autoblock is coming.
+
+'AbortDiffCache': Can be used to cancel the caching of a diff.
+&$diffEngine: DifferenceEngine object
+
+'AbortEmailNotification': Can be used to cancel email notifications for an edit.
+$editor: The User who made the change.
+$title: The Title of the page that was edited.
+$rc: The current RecentChange object.
+
+'AbortLogin': DEPRECATED! Create a PreAuthenticationProvider instead.
+Return false to cancel account login.
+$user: the User object being authenticated against
+$password: the password being submitted, not yet checked for validity
+&$retval: a LoginForm class constant to return from authenticateUserData();
+ default is LoginForm::ABORTED. Note that the client may be using a machine
+ API rather than the HTML user interface.
+&$msg: the message identifier for abort reason (new in 1.18, not available
+ before 1.18)
+
+'AbortNewAccount': DEPRECATED! Create a PreAuthenticationProvider instead.
+Return false to cancel explicit account creation.
+$user: the User object about to be created (read-only, incomplete)
+&$msg: out parameter: HTML to display on abort
+&$status: out parameter: Status object to return, replaces the older $msg param
+ (added in 1.23)
+ Create the object with Status::newFatal() to ensure proper API error
+ messages are returned when creating account through API clients.
+
+'AbortTalkPageEmailNotification': Return false to cancel talk page email
+notification
+$targetUser: the user whom to send talk page email notification
+$title: the page title
+
+'ActionBeforeFormDisplay': Before executing the HTMLForm object.
+$name: name of the action
+&$form: HTMLForm object
+$article: Article object
+
+'ActionModifyFormFields': Before creating an HTMLForm object for a page action;
+Allows to change the fields on the form that will be generated.
+$name: name of the action
+&$fields: HTMLForm descriptor array
+$article: Article object
+
+'AddNewAccount': DEPRECATED! Use LocalUserCreated.
+After a user account is created.
+$user: the User object that was created. (Parameter added in 1.7)
+$byEmail: true when account was created "by email" (added in 1.12)
+
+'AfterBuildFeedLinks': Executed in OutputPage.php after all feed links (atom, rss,...)
+are created. Can be used to omit specific feeds from being outputted. You must not use
+this hook to add feeds, use OutputPage::addFeedLink() instead.
+&$feedLinks: Array of created feed links
+
+'AfterFinalPageOutput': Nearly at the end of OutputPage::output() but
+before OutputPage::sendCacheControl() and final ob_end_flush() which
+will send the buffered output to the client. This allows for last-minute
+modification of the output within the buffer by using ob_get_clean().
+$output: The OutputPage object where output() was called
+
+'AfterImportPage': When a page import is completed.
+$title: Title under which the revisions were imported
+$foreignTitle: ForeignTitle object based on data provided by the XML file
+$revCount: Number of revisions in the XML file
+$sRevCount: Number of successfully imported revisions
+$pageInfo: associative array of page information
+
+'AfterParserFetchFileAndTitle': After an image gallery is formed by Parser,
+just before adding its HTML to parser output.
+$parser: Parser object that called the hook
+$ig: Gallery, an object of one of the gallery classes (inheriting from
+ ImageGalleryBase)
+&$html: HTML generated by the gallery
+
+'AlternateEdit': Before checking if a user can edit a page and before showing
+the edit form ( EditPage::edit() ). This is triggered on &action=edit.
+$editPage: the EditPage object
+
+'AlternateEditPreview': Before generating the preview of the page when editing
+( EditPage::getPreviewText() ).
+Return false and set $previewHTML and $parserOutput to output custom page
+preview HTML.
+$editPage: the EditPage object
+&$content: the Content object for the text field from the edit page
+&$previewHTML: Text to be placed into the page for the preview
+&$parserOutput: the ParserOutput object for the preview
+
+'AlternateUserMailer': Called before mail is sent so that mail could be logged
+(or something else) instead of using PEAR or PHP's mail(). Return false to skip
+the regular method of sending mail. Return a string to return a php-mail-error
+message containing the error. Returning true will continue with sending email
+in the regular way.
+$headers: Associative array of headers for the email
+$to: MailAddress object or array
+$from: From address
+$subject: Subject of the email
+$body: Body of the message
+
+'APIAfterExecute': After calling the execute() method of an API module. Use
+this to extend core API modules.
+&$module: Module object
+
+'ApiBeforeMain': Before calling ApiMain's execute() method in api.php.
+&$main: ApiMain object
+
+'ApiCheckCanExecute': Called during ApiMain::checkCanExecute. Use to further
+authenticate and authorize API clients before executing the module. Return
+false and set a message to cancel the request.
+$module: Module object
+$user: Current user
+&$message: API message to die with. Specific values accepted depend on the
+ MediaWiki version:
+ * 1.29+: IApiMessage, Message, string message key, or key+parameters array to
+ pass to ApiBase::dieWithError().
+ * 1.27+: IApiMessage, or a key or key+parameters in ApiBase::$messageMap.
+ * Earlier: A key or key+parameters in ApiBase::$messageMap.
+
+'ApiDeprecationHelp': Add messages to the 'deprecation-help' warning generated
+from ApiBase::addDeprecation().
+&$msgs: Message[] Messages to include in the help. Multiple messages will be
+ joined with spaces.
+
+'APIEditBeforeSave': DEPRECATED! Use EditFilterMergedContent instead.
+Before saving a page with api.php?action=edit, after
+processing request parameters. Return false to let the request fail, returning
+an error message or an <edit result="Failure"> tag if $resultArr was filled.
+Unlike for example 'EditFilterMergedContent' this also being run on undo.
+Since MediaWiki 1.25, 'EditFilterMergedContent' can also return error details
+for the API and it's recommended to use it instead of this hook.
+$editPage: the EditPage object
+$text: the text passed to the API. Note that this includes only the single
+ section for section edit, and is not necessarily the final text in case of
+ automatically resolved edit conflicts.
+&$resultArr: data in this array will be added to the API result
+
+'ApiFeedContributions::feedItem': Called to convert the result of ContribsPager
+into a FeedItem instance that ApiFeedContributions can consume. Implementors of
+this hook may cancel the hook to signal that the item is not viewable in the
+provided context.
+$row: A row of data from ContribsPager. The set of data returned by
+ ContribsPager can be adjusted by handling the ContribsPager::reallyDoQuery
+ hook.
+$context: An IContextSource implementation.
+&$feedItem: Set this to a FeedItem instance if the callback can handle the
+ provided row. This is provided to the hook as a null, if it is non null then
+ another callback has already handled the hook.
+
+'ApiFormatHighlight': Use to syntax-highlight API pretty-printed output. When
+highlighting, add output to $context->getOutput() and return false.
+$context: An IContextSource.
+$text: Text to be highlighted.
+$mime: MIME type of $text.
+$format: API format code for $text.
+
+'APIGetAllowedParams': Use this hook to modify a module's parameters.
+&$module: ApiBase Module object
+&$params: Array of parameters
+$flags: int zero or OR-ed flags like ApiBase::GET_VALUES_FOR_HELP
+
+'APIGetDescription': DEPRECATED! Use APIGetDescriptionMessages instead.
+Use this hook to modify a module's description.
+&$module: ApiBase Module object
+&$desc: String description, or array of description strings
+
+'APIGetDescriptionMessages': Use this hook to modify a module's help message.
+$module: ApiBase Module object
+&$msg: Array of Message objects
+
+'APIGetParamDescription': DEPRECATED! Use APIGetParamDescriptionMessages
+instead.
+Use this hook to modify a module's parameter descriptions.
+&$module: ApiBase Module object
+&$desc: Array of parameter descriptions
+
+'APIGetParamDescriptionMessages': Use this hook to modify a module's parameter
+descriptions.
+$module: ApiBase Module object
+&$msg: Array of arrays of Message objects
+
+'APIHelpModifyOutput': Use this hook to modify an API module's help output.
+$module: ApiBase Module object
+&$help: Array of HTML strings to be joined for the output.
+$options: Array Options passed to ApiHelp::getHelp
+&$tocData: Array If a TOC is being generated, this array has keys as anchors in
+ the page and values as for Linker::generateTOC().
+
+'ApiMain::moduleManager': Called when ApiMain has finished initializing its
+module manager. Can be used to conditionally register API modules.
+$moduleManager: ApiModuleManager Module manager instance
+
+'ApiMain::onException': Called by ApiMain::executeActionWithErrorHandling() when
+an exception is thrown during API action execution.
+$apiMain: Calling ApiMain instance.
+$e: Exception object.
+
+'ApiMakeParserOptions': Called from ApiParse and ApiExpandTemplates to allow
+extensions to adjust the ParserOptions before parsing.
+$options: ParserOptions object
+$title: Title to be parsed
+$params: Parameter array for the API module
+$module: API module (which is also a ContextSource)
+&$reset: Set to a ScopedCallback used to reset any hooks after the parse is done.
+&$suppressCache: Set true if cache should be suppressed.
+
+'ApiOpenSearchSuggest': Called when constructing the OpenSearch results. Hooks
+can alter or append to the array.
+&$results: array with integer keys to associative arrays. Keys in associative
+ array:
+ - title: Title object.
+ - redirect from: Title or null.
+ - extract: Description for this result.
+ - extract trimmed: If truthy, the extract will not be trimmed to
+ $wgOpenSearchDescriptionLength.
+ - image: Thumbnail for this result. Value is an array with subkeys 'source'
+ (url), 'width', 'height', 'alt', 'align'.
+ - url: Url for the given title.
+
+'ApiQuery::moduleManager': Called when ApiQuery has finished initializing its
+module manager. Can be used to conditionally register API query modules.
+$moduleManager: ApiModuleManager Module manager instance
+
+'APIQueryAfterExecute': After calling the execute() method of an
+action=query submodule. Use this to extend core API modules.
+&$module: Module object
+
+'ApiQueryBaseAfterQuery': Called for (some) API query modules after the
+database query has returned. An API query module wanting to use this hook
+should see the ApiQueryBase::select() and ApiQueryBase::processRow()
+documentation.
+$module: ApiQueryBase module in question
+$result: ResultWrapper|bool returned from the IDatabase::select()
+&$hookData: array that was passed to the 'ApiQueryBaseBeforeQuery' hook and
+ will be passed to the 'ApiQueryBaseProcessRow' hook, intended for inter-hook
+ communication.
+
+'ApiQueryBaseBeforeQuery': Called for (some) API query modules before a
+database query is made. WARNING: It would be very easy to misuse this hook and
+break the module! Any joins added *must* join on a unique key of the target
+table unless you really know what you're doing. An API query module wanting to
+use this hook should see the ApiQueryBase::select() and
+ApiQueryBase::processRow() documentation.
+$module: ApiQueryBase module in question
+&$tables: array of tables to be queried
+&$fields: array of columns to select
+&$conds: array of WHERE conditionals for query
+&$query_options: array of options for the database request
+&$join_conds: join conditions for the tables
+&$hookData: array that will be passed to the 'ApiQueryBaseAfterQuery' and
+ 'ApiQueryBaseProcessRow' hooks, intended for inter-hook communication.
+
+'ApiQueryBaseProcessRow': Called for (some) API query modules as each row of
+the database result is processed. Return false to stop processing the result
+set. An API query module wanting to use this hook should see the
+ApiQueryBase::select() and ApiQueryBase::processRow() documentation.
+$module: ApiQueryBase module in question
+$row: stdClass Database result row
+&$data: array to be included in the ApiResult.
+&$hookData: array that was be passed to the 'ApiQueryBaseBeforeQuery' and
+ 'ApiQueryBaseAfterQuery' hooks, intended for inter-hook communication.
+
+'APIQueryGeneratorAfterExecute': After calling the executeGenerator() method of
+an action=query submodule. Use this to extend core API modules.
+&$module: Module object
+&$resultPageSet: ApiPageSet object
+
+'APIQueryInfoTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to add custom tokens to prop=info. Every token has an action,
+which will be used in the intoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($pageid, $title), where $pageid is the page ID of the page the
+token is requested for and $title is the associated Title object. In the hook,
+just add your callback to the $tokenFunctions array and return true (returning
+false makes no sense).
+&$tokenFunctions: array(action => callback)
+
+'APIQueryRecentChangesTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes
+instead.
+Use this hook to add custom tokens to list=recentchanges. Every token has an
+action, which will be used in the rctoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($pageid, $title, $rc), where $pageid is the page ID of the
+page associated to the revision the token is requested for, $title the
+associated Title object and $rc the associated RecentChange object. In the
+hook, just add your callback to the $tokenFunctions array and return true
+(returning false makes no sense).
+&$tokenFunctions: array(action => callback)
+
+'APIQueryRevisionsTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to add custom tokens to prop=revisions. Every token has an
+action, which will be used in the rvtoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($pageid, $title, $rev), where $pageid is the page ID of the
+page associated to the revision the token is requested for, $title the
+associated Title object and $rev the associated Revision object. In the hook,
+just add your callback to the $tokenFunctions array and return true (returning
+false makes no sense).
+&$tokenFunctions: array(action => callback)
+
+'APIQuerySiteInfoGeneralInfo': Use this hook to add extra information to the
+sites general information.
+$module: the current ApiQuerySiteInfo module
+&$results: array of results, add things here
+
+'APIQuerySiteInfoStatisticsInfo': Use this hook to add extra information to the
+sites statistics information.
+&$results: array of results, add things here
+
+'ApiQueryTokensRegisterTypes': Use this hook to add additional token types to
+action=query&meta=tokens. Note that most modules will probably be able to use
+the 'csrf' token instead of creating their own token types.
+&$salts: array( type => salt to pass to User::getEditToken() or array of salt
+ and key to pass to Session::getToken() )
+
+'APIQueryUsersTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to add custom token to list=users. Every token has an action,
+which will be used in the ustoken parameter and in the output
+(actiontoken="..."), and a callback function which should return the token, or
+false if the user isn't allowed to obtain it. The prototype of the callback
+function is func($user) where $user is the User object. In the hook, just add
+your callback to the $tokenFunctions array and return true (returning false
+makes no sense).
+&$tokenFunctions: array(action => callback)
+
+'ApiQueryWatchlistExtractOutputData': Extract row data for ApiQueryWatchlist.
+$module: ApiQueryWatchlist instance
+$watchedItem: WatchedItem instance
+$recentChangeInfo: Array of recent change info data
+&$vals: Associative array of data to be output for the row
+
+'ApiQueryWatchlistPrepareWatchedItemQueryServiceOptions': Populate the options
+to be passed from ApiQueryWatchlist to WatchedItemQueryService.
+$module: ApiQueryWatchlist instance
+$params: Array of parameters, as would be returned by $module->extractRequestParams()
+&$options: Array of options for WatchedItemQueryService::getWatchedItemsWithRecentChangeInfo()
+
+'ApiRsdServiceApis': Add or remove APIs from the RSD services list. Each service
+should have its own entry in the $apis array and have a unique name, passed as
+key for the array that represents the service data. In this data array, the
+key-value-pair identified by the apiLink key is required.
+&$apis: array of services
+
+'ApiTokensGetTokenTypes': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
+Use this hook to extend action=tokens with new token types.
+&$tokenTypes: supported token types in format 'type' => callback function
+ used to retrieve this type of tokens.
+
+'ApiValidatePassword': Called from ApiValidatePassword.
+$module: ApiValidatePassword instance.
+&$r: Result array.
+
+'Article::MissingArticleConditions': Before fetching deletion & move log entries
+to display a message of a non-existing page being deleted/moved, give extensions
+a chance to hide their (unrelated) log entries.
+&$conds: Array of query conditions (all of which have to be met; conditions will
+ AND in the final query)
+$logTypes: Array of log types being queried
+
+'ArticleAfterFetchContentObject': After fetching content of an article from the
+database.
+&$article: the article (object) being loaded from the database
+&$content: the content of the article, as a Content object
+
+'ArticleConfirmDelete': Before writing the confirmation form for article
+deletion.
+$article: the article (object) being deleted
+$output: the OutputPage object
+&$reason: the reason (string) the article is being deleted
+
+'ArticleContentOnDiff': Before showing the article content below a diff. Use
+this to change the content in this area or how it is loaded.
+$diffEngine: the DifferenceEngine
+$output: the OutputPage object
+
+'ArticleContentViewCustom': Allows to output the text of the article in a
+different format than wikitext. Note that it is preferable to implement proper
+handing for a custom data type using the ContentHandler facility.
+$content: content of the page, as a Content object
+$title: title of the page
+$output: reference to $wgOut
+
+'ArticleDelete': Before an article is deleted.
+&$wikiPage: the WikiPage (object) being deleted
+&$user: the user (object) deleting the article
+&$reason: the reason (string) the article is being deleted
+&$error: if the deletion was prohibited, the (raw HTML) error message to display
+ (added in 1.13)
+&$status: Status object, modify this to throw an error. Overridden by $error
+ (added in 1.20)
+$suppress: Whether this is a suppression deletion or not (added in 1.27)
+
+'ArticleDeleteAfterSuccess': Output after an article has been deleted.
+$title: Title of the article that has been deleted.
+$outputPage: OutputPage that can be used to append the output.
+
+'ArticleDeleteComplete': After an article is deleted.
+&$wikiPage: the WikiPage that was deleted
+&$user: the user that deleted the article
+$reason: the reason the article was deleted
+$id: id of the article that was deleted
+$content: the Content of the deleted page (or null, when deleting a broken page)
+$logEntry: the ManualLogEntry used to record the deletion
+$archivedRevisionCount: the number of revisions archived during the deletion
+
+'ArticleEditUpdateNewTalk': Before updating user_newtalk when a user talk page
+was changed.
+&$wikiPage: WikiPage (object) of the user talk page
+$recipient: User (object) who's talk page was edited
+
+'ArticleEditUpdates': When edit updates (mainly link tracking) are made when an
+article has been changed.
+&$wikiPage: the WikiPage (object)
+&$editInfo: data holder that includes the parser output ($editInfo->output) for
+ that page after the change
+$changed: bool for if the page was changed
+
+'ArticleEditUpdatesDeleteFromRecentchanges': Before deleting old entries from
+recentchanges table, return false to not delete old entries.
+&$wikiPage: WikiPage (object) being modified
+
+'ArticleFromTitle': when creating an article object from a title object using
+Wiki::articleFromTitle().
+&$title: Title (object) used to create the article object
+&$article: Article (object) that will be returned
+$context: IContextSource (object)
+
+'ArticleMergeComplete': After merging to article using Special:Mergehistory.
+$targetTitle: target title (object)
+$destTitle: destination title (object)
+
+'ArticlePageDataAfter': After loading data of an article from the database.
+&$wikiPage: WikiPage (object) whose data were loaded
+&$row: row (object) returned from the database server
+
+'ArticlePageDataBefore': Before loading data of an article from the database.
+&$wikiPage: WikiPage (object) that data will be loaded
+&$fields: fields (array) to load from the database
+
+'ArticlePrepareTextForEdit': Called when preparing text to be saved.
+$wikiPage: the WikiPage being saved
+$popts: parser options to be used for pre-save transformation
+
+'ArticleProtect': Before an article is protected.
+&$wikiPage: the WikiPage being protected
+&$user: the user doing the protection
+$protect: Set of restriction keys
+$reason: Reason for protect
+
+'ArticleProtectComplete': After an article is protected.
+&$wikiPage: the WikiPage that was protected
+&$user: the user who did the protection
+$protect: Set of restriction keys
+$reason: Reason for protect
+
+'ArticlePurge': Before executing "&action=purge".
+&$wikiPage: WikiPage (object) to purge
+
+'ArticleRevisionUndeleted': After an article revision is restored.
+&$title: the article title
+$revision: the revision
+$oldPageID: the page ID of the revision when archived (may be null)
+
+'ArticleRevisionVisibilitySet': Called when changing visibility of one or more
+revisions of an article.
+$title: Title object of the article
+$ids: Ids to set the visibility for
+$visibilityChangeMap: Map of revision id to oldBits and newBits. This array can be
+ examined to determine exactly what visibility bits have changed for each
+ revision. This array is of the form
+ [id => ['oldBits' => $oldBits, 'newBits' => $newBits], ... ]
+
+'ArticleRollbackComplete': After an article rollback is completed.
+$wikiPage: the WikiPage that was edited
+$user: the user who did the rollback
+$revision: the revision the page was reverted back to
+$current: the reverted revision
+
+'ArticleUndelete': When one or more revisions of an article are restored.
+&$title: Title corresponding to the article restored
+$create: Whether or not the restoration caused the page to be created (i.e. it
+ didn't exist before).
+$comment: The comment associated with the undeletion.
+$oldPageId: ID of page previously deleted (from archive table). This ID will be used
+ for the restored page.
+$restoredPages: Set of page IDs that have revisions restored for this undelete,
+ with keys being page IDs and values are 'true'.
+
+'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved.
+$pageArchive: the PageArchive object
+&$logEntry: ManualLogEntry object
+$user: User who is performing the log action
+
+'ArticleUpdateBeforeRedirect': After a page is updated (usually on save), before
+the user is redirected back to the page.
+$article: the article
+&$sectionanchor: The section anchor link (e.g. "#overview" )
+&$extraq: Extra query parameters which can be added via hooked functions
+
+'ArticleViewFooter': After showing the footer section of an ordinary page view
+$article: Article object
+$patrolFooterShown: boolean whether patrol footer is shown
+
+'ArticleViewHeader': Before the parser cache is about to be tried for article
+viewing.
+&$article: the article
+&$pcache: whether to try the parser cache or not
+&$outputDone: whether the output for this page finished or not. Set to
+ a ParserOutput object to both indicate that the output is done and what
+ parser output was used.
+
+'ArticleViewRedirect': Before setting "Redirected from ..." subtitle when a
+redirect was followed.
+&$article: target article (object)
+
+'AuthChangeFormFields': After converting a field information array obtained
+from a set of AuthenticationRequest classes into a form descriptor; hooks
+can tweak the array to change how login etc. forms should look.
+$requests: array of AuthenticationRequests the fields are created from
+$fieldInfo: field information array (union of all AuthenticationRequest::getFieldInfo() responses).
+&$formDescriptor: HTMLForm descriptor. The special key 'weight' can be set
+ to change the order of the fields.
+$action: one of the AuthManager::ACTION_* constants.
+
+'AuthManagerLoginAuthenticateAudit': A login attempt either succeeded or failed
+for a reason other than misconfiguration or session loss. No return data is
+accepted; this hook is for auditing only.
+$response: The MediaWiki\Auth\AuthenticationResponse in either a PASS or FAIL state.
+$user: The User object being authenticated against, or null if authentication
+ failed before getting that far.
+$username: A guess at the user name being authenticated, or null if we can't
+ even determine that.
+
+'AuthPluginAutoCreate': DEPRECATED! Use the 'LocalUserCreated' hook instead.
+Called when creating a local account for an user logged in from an external
+authentication method.
+$user: User object created locally
+
+'AuthPluginSetup': DEPRECATED! Extensions should be updated to use AuthManager.
+Update or replace authentication plugin object ($wgAuth). Gives a chance for an
+extension to set it programmatically to a variable class.
+&$auth: the $wgAuth object, probably a stub
+
+'AutopromoteCondition': Check autopromote condition for user.
+$type: condition type
+$args: arguments
+$user: user
+&$result: result of checking autopromote condition
+
+'BacklinkCacheGetConditions': Allows to set conditions for query when links to
+certain title are fetched.
+$table: table name
+$title: title of the page to which backlinks are sought
+&$conds: query conditions
+
+'BacklinkCacheGetPrefix': Allows to set prefix for a specific link table.
+$table: table name
+&$prefix: prefix
+
+'BadImage': When checking against the bad image list. Change $bad and return
+false to override. If an image is "bad", it is not rendered inline in wiki
+pages or galleries in category pages.
+$name: Image name being checked
+&$bad: Whether or not the image is "bad"
+
+'BaseTemplateAfterPortlet': After output of portlets, allow injecting
+custom HTML after the section. Any uses of the hook need to handle escaping.
+$template: BaseTemplate
+$portlet: string portlet name
+&$html: string
+
+'BaseTemplateToolbox': Called by BaseTemplate when building the $toolbox array
+and returning it for the skin to output. You can add items to the toolbox while
+still letting the skin make final decisions on skin-specific markup conventions
+using this hook.
+&$sk: The BaseTemplate base skin template
+&$toolbox: An array of toolbox items, see BaseTemplate::getToolbox and
+ BaseTemplate::makeListItem for details on the format of individual items
+ inside of this array.
+
+'BeforeDisplayNoArticleText': Before displaying message key "noarticletext" or
+"noarticletext-nopermission" at Article::showMissingArticle().
+$article: article object
+
+'BeforeHttpsRedirect': Prior to forcing HTTP->HTTPS redirect. Gives a chance to
+override how the redirect is output by modifying, or by returning false, and
+letting standard HTTP rendering take place.
+ATTENTION: This hook is likely to be removed soon due to overall design of the
+system.
+$context: IContextSource object
+&$redirect: string URL, modifiable
+
+'BeforeInitialize': Before anything is initialized in
+MediaWiki::performRequest().
+&$title: Title being used for request
+&$unused: null
+&$output: OutputPage object
+&$user: User
+$request: WebRequest object
+$mediaWiki: Mediawiki object
+
+'BeforePageDisplay': Prior to outputting a page.
+&$out: OutputPage object
+&$skin: Skin object
+
+'BeforePageRedirect': Prior to sending an HTTP redirect. Gives a chance to
+override how the redirect is output by modifying, or by returning false and
+taking over the output.
+$out: OutputPage object
+&$redirect: URL, modifiable
+&$code: HTTP code (eg '301' or '302'), modifiable
+
+'BeforeParserFetchFileAndTitle': Before an image is rendered by Parser.
+$parser: Parser object
+$nt: the image title
+&$options: array of options to RepoGroup::findFile. If it contains 'broken'
+ as a key then the file will appear as a broken thumbnail.
+&$descQuery: query string to add to thumbnail URL
+
+'BeforeParserFetchTemplateAndtitle': Before a template is fetched by Parser.
+$parser: Parser object
+$title: title of the template
+&$skip: skip this template and link it?
+&$id: the id of the revision being parsed
+
+'BeforeParserrenderImageGallery': Before an image gallery is rendered by Parser.
+&$parser: Parser object
+&$ig: ImageGallery object
+
+'BeforeWelcomeCreation': Before the welcomecreation message is displayed to a
+newly created user.
+&$welcome_creation_msg: MediaWiki message name to display on the welcome screen
+ to a newly created user account.
+&$injected_html: Any HTML to inject after the "logged in" message of a newly
+ created user account
+
+'BitmapHandlerCheckImageArea': By BitmapHandler::normaliseParams, after all
+normalizations have been performed, except for the $wgMaxImageArea check.
+$image: File
+&$params: Array of parameters
+&$checkImageAreaHookResult: null, set to true or false to override the
+ $wgMaxImageArea check result.
+
+'BitmapHandlerTransform': before a file is transformed, gives extension the
+possibility to transform it themselves
+$handler: BitmapHandler
+$image: File
+&$scalerParams: Array with scaler parameters
+&$mto: null, set to a MediaTransformOutput
+
+'BlockIp': Before an IP address or user is blocked.
+&$block: the Block object about to be saved
+&$user: the user _doing_ the block (not the one being blocked)
+&$reason: if the hook is aborted, the error message to be returned in an array
+
+'BlockIpComplete': After an IP address or user is blocked.
+$block: the Block object that was saved
+$user: the user who did the block (not the one being blocked)
+$priorBlock: the Block object for the prior block or null if there was none
+
+'BookInformation': Before information output on Special:Booksources.
+$isbn: ISBN to show information for
+$output: OutputPage object in use
+
+'CanIPUseHTTPS': Determine whether the client at a given source IP is likely
+to be able to access the wiki via HTTPS.
+$ip: The IP address in human-readable form
+&$canDo: This reference should be set to false if the client may not be able
+ to use HTTPS
+
+'CanonicalNamespaces': For extensions adding their own namespaces or altering
+the defaults.
+Note that if you need to specify namespace protection or content model for
+a namespace that is added in a CanonicalNamespaces hook handler, you
+should do so by altering $wgNamespaceProtection and
+$wgNamespaceContentModels outside the handler, in top-level scope. The
+point at which the CanonicalNamespaces hook fires is too late for altering
+these variables. This applies even if the namespace addition is
+conditional; it is permissible to declare a content model and protection
+for a namespace and then decline to actually register it.
+&$namespaces: Array of namespace numbers with corresponding canonical names
+
+'CategoryAfterPageAdded': After a page is added to a category.
+$category: Category that page was added to
+$wikiPage: WikiPage that was added
+
+'CategoryAfterPageRemoved': After a page is removed from a category.
+$category: Category that page was removed from
+$wikiPage: WikiPage that was removed
+$id: the page ID (original ID in case of page deletions)
+
+'CategoryPageView': Before viewing a categorypage in CategoryPage::view.
+&$catpage: CategoryPage instance
+
+'CategoryViewer::doCategoryQuery': After querying for pages to be displayed
+in a Category page. Gives extensions the opportunity to batch load any
+related data about the pages.
+$type: The category type. Either 'page', 'file' or 'subcat'
+$res: Query result from DatabaseBase::select()
+
+'CategoryViewer::generateLink': Before generating an output link allow
+extensions opportunity to generate a more specific or relevant link.
+$type: The category type. Either 'page', 'img' or 'subcat'
+$title: Title object for the categorized page
+$html: Requested html content of anchor
+&$link: Returned value. When set to a non-null value by a hook subscriber
+ this value will be used as the anchor instead of Linker::link
+
+'ChangeAuthenticationDataAudit': Called when user changes his password.
+No return data is accepted; this hook is for auditing only.
+$req: AuthenticationRequest object describing the change (and target user)
+$status: StatusValue with the result of the action
+
+'ChangePasswordForm': DEPRECATED! Use AuthChangeFormFields or security levels.
+For extensions that need to add a field to the ChangePassword form via the
+Preferences form.
+&$extraFields: An array of arrays that hold fields like would be passed to the
+ pretty function.
+
+'ChangesListInitRows': Batch process change list rows prior to rendering.
+$changesList: ChangesList instance
+$rows: The data that will be rendered. May be a ResultWrapper instance or
+ an array.
+
+'ChangesListInsertArticleLink': Override or augment link to article in RC list.
+&$changesList: ChangesList instance.
+&$articlelink: HTML of link to article (already filled-in).
+&$s: HTML of row that is being constructed.
+&$rc: RecentChange instance.
+$unpatrolled: Whether or not we are showing unpatrolled changes.
+$watched: Whether or not the change is watched by the user.
+
+'ChangesListSpecialPageFilters': DEPRECATED! Use 'ChangesListSpecialPageStructuredFilters'
+instead.
+Called after building form options on pages
+inheriting from ChangesListSpecialPage (in core: RecentChanges,
+RecentChangesLinked and Watchlist).
+$special: ChangesListSpecialPage instance
+&$filters: associative array of filter definitions. The keys are the HTML
+ name/URL parameters. Each key maps to an associative array with a 'msg'
+ (message key) and a 'default' value.
+
+'ChangesListSpecialPageQuery': Called when building SQL query on pages
+inheriting from ChangesListSpecialPage (in core: RecentChanges,
+RecentChangesLinked and Watchlist).
+Do not use this to implement individual filters if they are compatible with the
+ChangesListFilter and ChangesListFilterGroup structure.
+Instead, use sub-classes of those classes, in conjunction with the
+ChangesListSpecialPageStructuredFilters hook.
+This hook can be used to implement filters that do not implement that structure,
+or custom behavior that is not an individual filter.
+$name: name of the special page, e.g. 'Watchlist'
+&$tables: array of tables to be queried
+&$fields: array of columns to select
+&$conds: array of WHERE conditionals for query
+&$query_options: array of options for the database request
+&$join_conds: join conditions for the tables
+$opts: FormOptions for this request
+
+'ChangesListSpecialPageStructuredFilters': Called to allow extensions to register
+filters for pages inheriting from ChangesListSpecialPage (in core: RecentChanges,
+RecentChangesLinked, and Watchlist). Generally, you will want to construct
+new ChangesListBooleanFilter or ChangesListStringOptionsFilter objects.
+When constructing them, you specify which group they belong to. You can reuse
+existing groups (accessed through $special->getFilterGroup), or create your own
+(ChangesListBooleanFilterGroup or ChangesListStringOptionsFilterGroup).
+If you create new groups, you must register them with $special->registerFilterGroup.
+Note that this is called regardless of whether the user is currently using
+the new (structured) or old (unstructured) filter UI. If you want your boolean
+filter to show on both the new and old UI, specify all the supported fields.
+These include showHide, label, and description.
+See the constructor of each ChangesList* class for documentation of supported
+fields.
+$special: ChangesListSpecialPage instance
+
+'ChangeTagAfterDelete': Called after a change tag has been deleted (that is,
+removed from all revisions and log entries to which it was applied). This gives
+extensions a chance to take it off their books.
+$tag: name of the tag
+&$status: Status object. Add warnings to this as required. There is no point
+ setting errors, as the deletion has already been partly carried out by this
+ point.
+
+'ChangeTagCanCreate': Tell whether a change tag should be able to be created
+from the UI (Special:Tags) or via the API. You could use this hook if you want
+to reserve a specific "namespace" of tags, or something similar.
+$tag: name of the tag
+$user: user initiating the action
+&$status: Status object. Add your errors using `$status->fatal()` or warnings
+ using `$status->warning()`. Errors and warnings will be relayed to the user.
+ If you set an error, the user will be unable to create the tag.
+
+'ChangeTagCanDelete': Tell whether a change tag should be able to be
+deleted from the UI (Special:Tags) or via the API. The default is that tags
+defined using the ListDefinedTags hook are not allowed to be deleted unless
+specifically allowed. If you wish to allow deletion of the tag, set
+`$status = Status::newGood()` to allow deletion, and then `return false` from
+the hook function. Ensure you consume the 'ChangeTagAfterDelete' hook to carry
+out custom deletion actions.
+$tag: name of the tag
+$user: user initiating the action
+&$status: Status object. See above.
+
+'ChangeTagsListActive': Allows you to nominate which of the tags your extension
+uses are in active use.
+&$tags: list of all active tags. Append to this array.
+
+'ChangeTagsAfterUpdateTags': Called after tags have been updated with the
+ChangeTags::updateTags function. Params:
+$addedTags: tags effectively added in the update
+$removedTags: tags effectively removed in the update
+$prevTags: tags that were present prior to the update
+$rc_id: recentchanges table id
+$rev_id: revision table id
+$log_id: logging table id
+$params: tag params
+$rc: RecentChange being tagged when the tagging accompanies the action or null
+$user: User who performed the tagging when the tagging is subsequent to the action or null
+
+'ChangeTagsAllowedAdd': Called when checking if a user can add tags to a change.
+&$allowedTags: List of all the tags the user is allowed to add. Any tags the
+ user wants to add ($addTags) that are not in this array will cause it to fail.
+ You may add or remove tags to this array as required.
+$addTags: List of tags user intends to add.
+$user: User who is adding the tags.
+
+'ChangeUserGroups': Called before user groups are changed.
+$performer: The User who will perform the change
+$user: The User whose groups will be changed
+&$add: The groups that will be added
+&$remove: The groups that will be removed
+
+'Collation::factory': Called if $wgCategoryCollation is an unknown collation.
+$collationName: Name of the collation in question
+&$collationObject: Null. Replace with a subclass of the Collation class that
+ implements the collation given in $collationName.
+
+'ConfirmEmailComplete': Called after a user's email has been confirmed
+successfully.
+$user: user (object) whose email is being confirmed
+
+'ContentAlterParserOutput': Modify parser output for a given content object.
+Called by Content::getParserOutput after parsing has finished. Can be used
+for changes that depend on the result of the parsing but have to be done
+before LinksUpdate is called (such as adding tracking categories based on
+the rendered HTML).
+$content: The Content to render
+$title: Title of the page, as context
+$parserOutput: ParserOutput to manipulate
+
+'ContentGetParserOutput': Customize parser output for a given content object,
+called by AbstractContent::getParserOutput. May be used to override the normal
+model-specific rendering of page content.
+$content: The Content to render
+$title: Title of the page, as context
+$revId: The revision ID, as context
+$options: ParserOptions for rendering. To avoid confusing the parser cache,
+ the output can only depend on parameters provided to this hook function, not
+ on global state.
+$generateHtml: boolean, indicating whether full HTML should be generated. If
+ false, generation of HTML may be skipped, but other information should still
+ be present in the ParserOutput object.
+&$output: ParserOutput, to manipulate or replace
+
+'ContentHandlerDefaultModelFor': Called when the default content model is
+determined for a given title. May be used to assign a different model for that
+title.
+$title: the Title in question
+&$model: the model name. Use with CONTENT_MODEL_XXX constants.
+
+'ContentHandlerForModelID': Called when a ContentHandler is requested for
+a given content model name, but no entry for that model exists in
+$wgContentHandlers.
+Note: if your extension implements additional models via this hook, please
+use GetContentModels hook to make them known to core.
+$modeName: the requested content model name
+&$handler: set this to a ContentHandler object, if desired.
+
+'ContentModelCanBeUsedOn': Called to determine whether that content model can
+be used on a given page. This is especially useful to prevent some content
+models to be used in some special location.
+$contentModel: ID of the content model in question
+$title: the Title in question.
+&$ok: Output parameter, whether it is OK to use $contentModel on $title.
+ Handler functions that modify $ok should generally return false to prevent
+ further hooks from further modifying $ok.
+
+'ContribsPager::getQueryInfo': Before the contributions query is about to run
+&$pager: Pager object for contributions
+&$queryInfo: The query for the contribs Pager
+
+'ContribsPager::reallyDoQuery': Called before really executing the query for My
+Contributions
+&$data: an array of results of all contribs queries
+$pager: The ContribsPager object hooked into
+$offset: Index offset, inclusive
+$limit: Exact query limit
+$descending: Query direction, false for ascending, true for descending
+
+'ContributionsLineEnding': Called before a contributions HTML line is finished
+$page: SpecialPage object for contributions
+&$ret: the HTML line
+$row: the DB row for this line
+&$classes: the classes to add to the surrounding <li>
+&$attribs: associative array of other HTML attributes for the <li> element.
+ Currently only data attributes reserved to MediaWiki are allowed
+ (see Sanitizer::isReservedDataAttribute).
+
+'ContributionsToolLinks': Change tool links above Special:Contributions
+$id: User identifier
+$title: User page title
+&$tools: Array of tool links
+$specialPage: SpecialPage instance for context and services. Can be either
+ SpecialContributions or DeletedContributionsPage. Extensions should type
+ hint against a generic SpecialPage though.
+
+'ConvertContent': Called by AbstractContent::convert when a conversion to
+another content model is requested.
+Handler functions that modify $result should generally return false to disable
+further attempts at conversion.
+$content: The Content object to be converted.
+$toModel: The ID of the content model to convert to.
+$lossy: boolean indicating whether lossy conversion is allowed.
+&$result: Output parameter, in case the handler function wants to provide a
+ converted Content object. Note that $result->getContentModel() must return
+ $toModel.
+
+'CustomEditor': When invoking the page editor
+Return true to allow the normal editor to be used, or false if implementing
+a custom editor, e.g. for a special namespace, etc.
+$article: Article being edited
+$user: User performing the edit
+
+'DatabaseOraclePostInit': Called after initialising an Oracle database
+$db: the DatabaseOracle object
+
+'DeletedContribsPager::reallyDoQuery': Called before really executing the query
+for Special:DeletedContributions
+Similar to ContribsPager::reallyDoQuery
+&$data: an array of results of all contribs queries
+$pager: The DeletedContribsPager object hooked into
+$offset: Index offset, inclusive
+$limit: Exact query limit
+$descending: Query direction, false for ascending, true for descending
+
+'DeletedContributionsLineEnding': Called before a DeletedContributions HTML line
+is finished.
+Similar to ContributionsLineEnding
+$page: SpecialPage object for DeletedContributions
+&$ret: the HTML line
+$row: the DB row for this line
+&$classes: the classes to add to the surrounding <li>
+&$attribs: associative array of other HTML attributes for the <li> element.
+ Currently only data attributes reserved to MediaWiki are allowed
+ (see Sanitizer::isReservedDataAttribute).
+
+'DifferenceEngineAfterLoadNewText': called in DifferenceEngine::loadNewText()
+after the new revision's content has been loaded into the class member variable
+$differenceEngine->mNewContent but before returning true from this function.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineLoadTextAfterNewContentIsLoaded': called in
+DifferenceEngine::loadText() after the new revision's content has been loaded
+into the class member variable $differenceEngine->mNewContent but before
+checking if the variable's value is null.
+This hook can be used to inject content into said class member variable.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineMarkPatrolledLink': Allows extensions to change the "mark as patrolled" link
+which is shown both on the diff header as well as on the bottom of a page, usually
+wrapped in a span element which has class="patrollink".
+$differenceEngine: DifferenceEngine object
+&$markAsPatrolledLink: The "mark as patrolled" link HTML (string)
+$rcid: Recent change ID (rc_id) for this change (int)
+
+'DifferenceEngineMarkPatrolledRCID': Allows extensions to possibly change the rcid parameter.
+For example the rcid might be set to zero due to the user being the same as the
+performer of the change but an extension might still want to show it under certain
+conditions.
+&$rcid: rc_id (int) of the change or 0
+$differenceEngine: DifferenceEngine object
+$change: RecentChange object
+$user: User object representing the current user
+
+'DifferenceEngineNewHeader': Allows extensions to change the $newHeader variable, which
+contains information about the new revision, such as the revision's author, whether
+the revision was marked as a minor edit or not, etc.
+$differenceEngine: DifferenceEngine object
+&$newHeader: The string containing the various #mw-diff-otitle[1-5] divs, which
+include things like revision author info, revision comment, RevisionDelete link and more
+$formattedRevisionTools: Array containing revision tools, some of which may have
+been injected with the DiffRevisionTools hook
+$nextlink: String containing the link to the next revision (if any); also included in $newHeader
+$rollback: Rollback link (string) to roll this revision back to the previous one, if any
+$newminor: String indicating if the new revision was marked as a minor edit
+$diffOnly: Boolean parameter passed to DifferenceEngine#showDiffPage, indicating
+whether we should show just the diff; passed in as a query string parameter to the
+various URLs constructed here (i.e. $nextlink)
+$rdel: RevisionDelete link for the new revision, if the current user is allowed
+to use the RevisionDelete feature
+$unhide: Boolean parameter indicating whether to show RevisionDeleted revisions
+
+'DifferenceEngineOldHeader': Allows extensions to change the $oldHeader variable, which
+contains information about the old revision, such as the revision's author, whether
+the revision was marked as a minor edit or not, etc.
+$differenceEngine: DifferenceEngine object
+&$oldHeader: The string containing the various #mw-diff-otitle[1-5] divs, which
+include things like revision author info, revision comment, RevisionDelete link and more
+$prevlink: String containing the link to the previous revision (if any); also included in $oldHeader
+$oldminor: String indicating if the old revision was marked as a minor edit
+$diffOnly: Boolean parameter passed to DifferenceEngine#showDiffPage, indicating
+whether we should show just the diff; passed in as a query string parameter to the
+various URLs constructed here (i.e. $prevlink)
+$ldel: RevisionDelete link for the old revision, if the current user is allowed
+to use the RevisionDelete feature
+$unhide: Boolean parameter indicating whether to show RevisionDeleted revisions
+
+'DifferenceEngineOldHeaderNoOldRev': Change the $oldHeader variable in cases when
+there is no old revision
+&$oldHeader: empty string by default
+
+'DifferenceEngineRenderRevisionAddParserOutput': Allows extensions to change the parser output.
+Return false to not add parser output via OutputPage's addParserOutput method.
+$differenceEngine: DifferenceEngine object
+$out: OutputPage object
+$parserOutput: ParserOutput object
+$wikiPage: WikiPage object
+
+'DifferenceEngineRenderRevisionShowFinalPatrolLink': An extension can hook into this hook
+point and return false to not show the final "mark as patrolled" link on the bottom
+of a page.
+This hook has no arguments.
+
+'DifferenceEngineShowDiff': Allows extensions to affect the diff text which
+eventually gets sent to the OutputPage object.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineShowEmptyOldContent': Allows extensions to change the diff table
+body (without header) in cases when there is no old revision or the old and new
+revisions are identical.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineShowDiffPage': Add additional output via the available OutputPage
+object into the diff view
+$out: OutputPage object
+
+'DifferenceEngineShowDiffPageMaybeShowMissingRevision': called in
+DifferenceEngine::showDiffPage() when revision data cannot be loaded.
+Return false in order to prevent displaying the missing revision message
+(i.e. to prevent DifferenceEngine::showMissingRevision() from being called).
+$differenceEngine: DifferenceEngine object
+
+'DiffRevisionTools': Override or extend the revision tools available from the
+diff view, i.e. undo, etc.
+$newRev: Revision object of the "new" revision
+&$links: Array of HTML links
+$oldRev: Revision object of the "old" revision (may be null)
+$user: Current user object
+
+'DiffViewHeader': Called before diff display
+$diff: DifferenceEngine object that's calling
+$oldRev: Revision object of the "old" revision (may be null/invalid)
+$newRev: Revision object of the "new" revision
+
+'DisplayOldSubtitle': before creating subtitle when browsing old versions of
+an article
+&$article: article (object) being viewed
+&$oldid: oldid (int) being viewed
+
+'DoEditSectionLink': DEPRECATED! Use SkinEditSectionLinks instead.
+Override the HTML generated for section edit links
+$skin: Skin object rendering the UI
+$title: Title object for the title being linked to (may not be the same as
+ the page title, if the section is included from a template)
+$section: The designation of the section being pointed to, to be included in
+ the link, like "&section=$section"
+$tooltip: The default tooltip. Escape before using.
+ By default, this is wrapped in the 'editsectionhint' message.
+&$result: The HTML to return, prefilled with the default plus whatever other
+ changes earlier hooks have made
+$lang: The language code to use for the link in the wfMessage function
+
+'EditFilter': Perform checks on an edit
+$editor: EditPage instance (object). The edit form (see includes/EditPage.php)
+$text: Contents of the edit box
+$section: Section being edited
+&$error: Error message to return
+$summary: Edit summary for page
+
+
+'EditFilterMergedContent': Post-section-merge edit filter.
+This may be triggered by the EditPage or any other facility that modifies page
+content. Use the $status object to indicate whether the edit should be allowed,
+and to provide a reason for disallowing it. Return false to abort the edit, and
+true to continue. Returning true if $status->isOK() returns false means "don't
+save but continue user interaction", e.g. show the edit form.
+$status->apiHookResult can be set to an array to be returned by api.php
+action=edit. This is used to deliver captchas.
+$context: object implementing the IContextSource interface.
+$content: content of the edit box, as a Content object.
+$status: Status object to represent errors, etc.
+$summary: Edit summary for page
+$user: the User object representing the user whois performing the edit.
+$minoredit: whether the edit was marked as minor by the user.
+
+'EditFormInitialText': Allows modifying the edit form when editing existing
+pages
+$editPage: EditPage object
+
+'EditFormPreloadText': Allows population of the edit form when creating
+new pages
+&$text: Text to preload with
+&$title: Title object representing the page being created
+
+'EditPage::attemptSave': Called before an article is
+saved, that is before WikiPage::doEditContent() is called
+$editpage_Obj: the current EditPage object
+
+'EditPage::attemptSave:after': Called after an article save attempt
+$editpage_Obj: the current EditPage object
+$status: the resulting Status object
+$resultDetails: Result details array
+
+'EditPage::importFormData': allow extensions to read additional data
+posted in the form
+$editpage: EditPage instance
+$request: Webrequest
+return value is ignored (should always return true)
+
+'EditPage::showEditForm:fields': allows injection of form field into edit form
+Return value is ignored (should always return true)
+&$editor: the EditPage instance for reference
+&$out: an OutputPage instance to write to
+
+'EditPage::showEditForm:initial': before showing the edit form
+Return false to halt editing; you'll need to handle error messages, etc.
+yourself. Alternatively, modifying $error and returning true will cause the
+contents of $error to be echoed at the top of the edit form as wikitext.
+Return true without altering $error to allow the edit to proceed.
+&$editor: EditPage instance (object)
+&$out: an OutputPage instance to write to
+
+'EditPage::showReadOnlyForm:initial': similar to EditPage::showEditForm:initial
+but for the read-only 'view source' variant of the edit form.
+Return value is ignored (should always return true)
+$editor: EditPage instance (object)
+&$out: an OutputPage instance to write to
+
+'EditPage::showStandardInputs:options': allows injection of form fields into
+the editOptions area
+Return value is ignored (should always be true)
+$editor: EditPage instance (object)
+$out: an OutputPage instance to write to
+&$tabindex: HTML tabindex of the last edit check/button
+
+'EditPageBeforeConflictDiff': allows modifying the EditPage object and output
+when there's an edit conflict. Return false to halt normal diff output; in
+this case you're responsible for computing and outputting the entire "conflict"
+part, i.e., the "difference between revisions" and "your text" headers and
+sections.
+&$editor: EditPage instance
+&$out: OutputPage instance
+
+'EditPageBeforeEditButtons': Allows modifying the edit buttons below the
+textarea in the edit form.
+&$editpage: The current EditPage object
+&$buttons: Array of edit buttons "Save", "Preview", "Live", and "Diff"
+&$tabindex: HTML tabindex of the last edit check/button
+
+'EditPageBeforeEditChecks': DEPRECATED! Use 'EditPageGetCheckboxesDefinition' instead,
+or 'EditPage::showStandardInputs:options' if you don't actually care about checkboxes
+and just want to add some HTML to the page.
+Allows modifying the edit checks below the textarea in the edit form.
+&$editpage: The current EditPage object
+&$checks: Array of the HTML for edit checks like "watch this page"/"minor edit"
+&$tabindex: HTML tabindex of the last edit check/button
+
+'EditPageBeforeEditToolbar': Allows modifying the edit toolbar above the
+textarea in the edit form.
+&$toolbar: The toolbar HTML
+Hook subscribers can return false to avoid the default toolbar code being loaded.
+
+'EditPageCopyrightWarning': Allow for site and per-namespace customization of
+contribution/copyright notice.
+$title: title of page being edited
+&$msg: localization message name, overridable. Default is either
+ 'copyrightwarning' or 'copyrightwarning2'.
+
+'EditPageGetCheckboxesDefinition': Allows modifying the edit checkboxes
+below the textarea in the edit form.
+$editpage: The current EditPage object
+&$checkboxes: Array of checkbox definitions. See EditPage::getCheckboxesDefinition()
+for the format.
+
+'EditPageGetDiffContent': Allow modifying the wikitext that will be used in
+"Show changes". Note that it is preferable to implement diff handling for
+different data types using the ContentHandler facility.
+$editPage: EditPage object
+&$newtext: wikitext that will be used as "your version"
+
+'EditPageGetPreviewContent': Allow modifying the wikitext that will be
+previewed. Note that it is preferable to implement previews for different data
+types using the ContentHandler facility.
+$editPage: EditPage object
+&$content: Content object to be previewed (may be replaced by hook function)
+
+'EditPageNoSuchSection': When a section edit request is given for an
+non-existent section
+&$editpage: The current EditPage object
+&$res: the HTML of the error text
+
+'EditPageTosSummary': Give a chance for site and per-namespace customizations
+of terms of service summary link that might exist separately from the copyright
+notice.
+$title: title of page being edited
+&$msg: localization message name, overridable. Default is 'editpage-tos-summary'
+
+'EmailConfirmed': When checking that the user's email address is "confirmed".
+This runs before the other checks, such as anonymity and the real check; return
+true to allow those checks to occur, and false if checking is done.
+&$user: User being checked
+&$confirmed: Whether or not the email address is confirmed
+
+'EmailUser': Before sending email from one user to another.
+&$to: MailAddress object of receiving user
+&$from: MailAddress object of sending user
+&$subject: subject of the mail
+&$text: text of the mail
+&$error: Out-param for an error. Should be set to a Status object or boolean false.
+
+'EmailUserCC': Before sending the copy of the email to the author.
+&$to: MailAddress object of receiving user
+&$from: MailAddress object of sending user
+&$subject: subject of the mail
+&$text: text of the mail
+
+'EmailUserComplete': After sending email from one user to another.
+$to: MailAddress object of receiving user
+$from: MailAddress object of sending user
+$subject: subject of the mail
+$text: text of the mail
+
+'EmailUserForm': After building the email user form object.
+&$form: HTMLForm object
+
+'EmailUserPermissionsErrors': to retrieve permissions errors for emailing a
+user.
+$user: The user who is trying to email another user.
+$editToken: The user's edit token.
+&$hookErr: Out-param for the error. Passed as the parameters to
+ OutputPage::showErrorPage.
+
+'EnhancedChangesList::getLogText': to alter, remove or add to the links of a
+group of changes in EnhancedChangesList.
+Hook subscribers can return false to omit this line from recentchanges.
+$changesList: EnhancedChangesList object
+&$links: The links that were generated by EnhancedChangesList
+$block: The RecentChanges objects in that block
+
+'EnhancedChangesListModifyLineData': to alter data used to build
+a grouped recent change inner line in EnhancedChangesList.
+Hook subscribers can return false to omit this line from recentchanges.
+$changesList: EnhancedChangesList object
+&$data: An array with all the components that will be joined in order to create the line
+$block: An array of RecentChange objects in that block
+$rc: The RecentChange object for this line
+&$classes: An array of classes to change
+&$attribs: associative array of other HTML attributes for the <tr> element.
+ Currently only data attributes reserved to MediaWiki are allowed
+ (see Sanitizer::isReservedDataAttribute).
+
+'EnhancedChangesListModifyBlockLineData': to alter data used to build
+a non-grouped recent change line in EnhancedChangesList.
+$changesList: EnhancedChangesList object
+&$data: An array with all the components that will be joined in order to create the line
+$rc: The RecentChange object for this line
+
+'ExemptFromAccountCreationThrottle': Exemption from the account creation
+throttle.
+$ip: The ip address of the user
+
+'ExtensionTypes': Called when generating the extensions credits, use this to
+change the tables headers.
+&$extTypes: associative array of extensions types
+
+'FetchChangesList': When fetching the ChangesList derivative for a particular
+user.
+$user: User the list is being fetched for
+&$skin: Skin object to be used with the list
+&$list: List object (defaults to NULL, change it to an object instance and
+ return false override the list derivative used)
+
+'FileDeleteComplete': When a file is deleted.
+&$file: reference to the deleted file
+&$oldimage: in case of the deletion of an old image, the name of the old file
+&$article: in case all revisions of the file are deleted a reference to the
+ WikiFilePage associated with the file.
+&$user: user who performed the deletion
+&$reason: reason
+
+'FileTransformed': When a file is transformed and moved into storage.
+$file: reference to the File object
+$thumb: the MediaTransformOutput object
+$tmpThumbPath: The temporary file system path of the transformed file
+$thumbPath: The permanent storage path of the transformed file
+
+'FileUndeleteComplete': When a file is undeleted
+$title: title object to the file
+$fileVersions: array of undeleted versions. Empty if all versions were restored
+$user: user who performed the undeletion
+$reason: reason
+
+'FileUpload': When a file upload occurs.
+$file: Image object representing the file that was uploaded
+$reupload: Boolean indicating if there was a previously another image there or
+ not (since 1.17)
+$hasDescription: Boolean indicating that there was already a description page
+ and a new one from the comment wasn't created (since 1.17)
+
+'FormatAutocomments': When an autocomment is formatted by the Linker.
+&$comment: Reference to the accumulated comment. Initially null, when set the
+ default code will be skipped.
+$pre: Boolean, true if there is text before this autocomment
+$auto: The extracted part of the parsed comment before the call to the hook.
+$post: Boolean, true if there is text after this autocomment
+$title: An optional title object used to links to sections. Can be null.
+$local: Boolean indicating whether section links should refer to local page.
+$wikiId: String containing the ID (as used by WikiMap) of the wiki from which the
+ autocomment originated; null for the local wiki. Added in 1.26, should default
+ to null in handler functions, for backwards compatibility.
+
+'GalleryGetModes': Get list of classes that can render different modes of a
+gallery.
+&$modeArray: An associative array mapping mode names to classes that implement
+ that mode. It is expected all registered classes are a subclass of
+ ImageGalleryBase.
+
+'GetAutoPromoteGroups': When determining which autopromote groups a user is
+entitled to be in.
+$user: user to promote.
+&$promote: groups that will be added.
+
+'GetBlockedStatus': after loading blocking status of an user from the database
+&$user: user (object) being checked
+
+'GetCacheVaryCookies': Get cookies that should vary cache options.
+$out: OutputPage object
+&$cookies: array of cookies name, add a value to it if you want to add a cookie
+ that have to vary cache options
+
+'GetCanonicalURL': Modify fully-qualified URLs used for IRC and e-mail
+notifications.
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
+$query: query options passed to Title::getCanonicalURL()
+
+'GetContentModels': Add content models to the list of available models.
+&$models: array containing current model list, as strings. Extensions should add to this list.
+
+'GetDefaultSortkey': Override the default sortkey for a page.
+$title: Title object that we need to get a sortkey for
+&$sortkey: Sortkey to use.
+
+'GetDifferenceEngine': Called when getting a new difference engine interface
+object Return false for valid object in $differenceEngine or true for the
+default difference engine.
+$context: IContextSource context to be used for diff
+$old: Revision ID to show and diff with
+$new: Either a revision ID or one of the strings 'cur', 'prev' or 'next'
+$refreshCache: If set, refreshes the diff cache
+$unhide: If set, allow viewing deleted revs
+&$differenceEngine: output parameter, difference engine object to be used for
+ diff
+
+'GetDoubleUnderscoreIDs': Modify the list of behavior switch (double
+underscore) magic words. Called by MagicWord.
+&$doubleUnderscoreIDs: array of strings
+
+'GetExtendedMetadata': Get extended file metadata for the API
+&$combinedMeta: Array of the form:
+ 'MetadataPropName' => array(
+ value' => prop value,
+ 'source' => 'name of hook'
+ ).
+$file: File object of file in question
+$context: RequestContext (including language to use)
+$single: Only extract the current language; if false, the prop value should
+ be in the metadata multi-language array format:
+ mediawiki.org/wiki/Manual:File_metadata_handling#Multi-language_array_format
+&$maxCacheTime: how long the results can be cached
+
+'GetFullURL': Modify fully-qualified URLs used in redirects/export/offsite data.
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
+$query: query options passed to Title::getFullURL()
+
+'GetHumanTimestamp': Pre-emptively override the human-readable timestamp
+generated by MWTimestamp::getHumanTimestamp(). Return false in this hook to use
+the custom output.
+&$output: string for the output timestamp
+$timestamp: MWTimestamp object of the current (user-adjusted) timestamp
+$relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp
+$user: User whose preferences are being used to make timestamp
+$lang: Language that will be used to render the timestamp
+
+'GetInternalURL': Modify fully-qualified URLs used for squid cache purging.
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
+$query: query options passed to Title::getInternalURL()
+
+'GetIP': modify the ip of the current user (called only once).
+&$ip: string holding the ip as determined so far
+
+'GetLinkColours': modify the CSS class of an array of page links.
+$linkcolour_ids: array of prefixed DB keys of the pages linked to,
+ indexed by page_id.
+&$colours: (output) array of CSS classes, indexed by prefixed DB keys
+
+'GetLocalURL': Modify local URLs as output into page links. Note that if you are
+working with internal urls (non-interwiki) then it may be preferable to work
+with the GetLocalURL::Internal or GetLocalURL::Article hooks as GetLocalURL can
+be buggy for internal urls on render if you do not re-implement the horrible
+hack that Title::getLocalURL uses in your own extension.
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
+$query: query options passed to Title::getLocalURL()
+
+'GetLocalURL::Article': Modify local URLs specifically pointing to article paths
+without any fancy queries or variants.
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
+
+'GetLocalURL::Internal': Modify local URLs to internal pages.
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
+$query: query options passed to Title::getLocalURL()
+
+'GetLogTypesOnUser': Add log types where the target is a userpage
+&$types: Array of log types
+
+'GetMetadataVersion': Modify the image metadata version currently in use. This
+is used when requesting image metadata from a ForeignApiRepo. Media handlers
+that need to have versioned metadata should add an element to the end of the
+version array of the form 'handler_name=version'. Most media handlers won't need
+to do this unless they broke backwards compatibility with a previous version of
+the media handler metadata output.
+&$version: Array of version strings
+
+'GetNewMessagesAlert': Disable or modify the new messages alert
+&$newMessagesAlert: An empty string by default. If the user has new talk page
+ messages, this should be populated with an alert message to that effect
+$newtalks: An empty array if the user has no new messages or an array
+ containing links and revisions if there are new messages (See
+ User::getNewMessageLinks)
+$user: The user object of the user who is loading the page
+$out: OutputPage object (to check what type of page the user is on)
+
+'GetPreferences': Modify user preferences.
+$user: User whose preferences are being modified.
+&$preferences: Preferences description array, to be fed to an HTMLForm object
+
+'GetRelativeTimestamp': Pre-emptively override the relative timestamp generated
+by MWTimestamp::getRelativeTimestamp(). Return false in this hook to use the
+custom output.
+&$output: string for the output timestamp
+&$diff: DateInterval representing the difference between the timestamps
+$timestamp: MWTimestamp object of the current (user-adjusted) timestamp
+$relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp
+$user: User whose preferences are being used to make timestamp
+$lang: Language that will be used to render the timestamp
+
+'getUserPermissionsErrors': Add a permissions error when permissions errors are
+checked for. Use instead of userCan for most cases. Return false if the user
+can't do it, and populate $result with the reason in the form of
+array( messagename, param1, param2, ... ) or a MessageSpecifier instance (you
+might want to use ApiMessage to provide machine-readable details for the API).
+For consistency, error messages
+should be plain text with no special coloring, bolding, etc. to show that
+they're errors; presenting them properly to the user as errors is done by the
+caller.
+&$title: Title object being checked against
+&$user: Current user object
+$action: Action being checked
+&$result: User permissions error to add. If none, return true.
+
+'getUserPermissionsErrorsExpensive': Equal to getUserPermissionsErrors, but is
+called only if expensive checks are enabled. Add a permissions error when
+permissions errors are checked for. Return false if the user can't do it, and
+populate $result with the reason in the form of array( messagename, param1,
+param2, ... ) or a MessageSpecifier instance (you might want to use ApiMessage
+to provide machine-readable details for the API). For consistency, error
+messages should be plain text with no
+special coloring, bolding, etc. to show that they're errors; presenting them
+properly to the user as errors is done by the caller.
+&$title: Title object being checked against
+&$user: Current user object
+$action: Action being checked
+&$result: User permissions error to add. If none, return true.
+
+'GitViewers': Called when generating the list of git viewers for
+Special:Version, use this to change the list.
+&$extTypes: associative array of repo URLS to viewer URLs.
+
+'HistoryRevisionTools': Override or extend the revision tools available from the
+page history view, i.e. undo, rollback, etc.
+$rev: Revision object
+&$links: Array of HTML links
+$prevRev: Revision object, next in line in page history, or null
+$user: Current user object
+
+'HTMLFileCache::useFileCache': Override whether a page should be cached in file
+cache.
+$context: An IContextSource object with information about the request being
+ served.
+
+'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
+image insertion. You can skip the default logic entirely by returning false, or
+just modify a few things using call-by-reference.
+&$skin: Skin object
+&$title: Title object of the image
+&$file: File object, or false if it doesn't exist
+&$frameParams: Various parameters with special meanings; see documentation in
+ includes/Linker.php for Linker::makeImageLink
+&$handlerParams: Various parameters with special meanings; see documentation in
+ includes/Linker.php for Linker::makeImageLink
+&$time: Timestamp of file in 'YYYYMMDDHHIISS' string form, or false for current
+&$res: Final HTML output, used if you return false
+
+'ImageOpenShowImageInlineBefore': Call potential extension just before showing
+the image on an image page.
+&$imagePage: ImagePage object ($this)
+&$output: $wgOut
+
+'ImagePageAfterImageLinks': Called after the image links section on an image
+page is built.
+$imagePage: ImagePage object ($this)
+&$html: HTML for the hook to add
+
+'ImagePageFileHistoryLine': Called when a file history line is constructed.
+$imagePage: ImagePage object ($this)
+$file: the file
+&$line: the HTML of the history line
+&$css: the line CSS class
+
+'ImagePageFindFile': Called when fetching the file associated with an image
+page.
+$page: ImagePage object
+&$file: File object
+&$displayFile: displayed File object
+
+'ImagePageShowTOC': Called when the file toc on an image page is generated.
+$page: ImagePage object
+&$toc: Array of <li> strings
+
+'ImgAuthBeforeStream': executed before file is streamed to user, but only when
+using img_auth.php.
+&$title: the Title object of the file as it would appear for the upload page
+&$path: the original file and path name when img_auth was invoked by the web
+ server
+&$name: the name only component of the file
+&$result: The location to pass back results of the hook routine (only used if
+ failed)
+ $result[0]=The index of the header message
+ $result[1]=The index of the body text message
+ $result[2 through n]=Parameters passed to body text message. Please note the
+ header message cannot receive/use parameters.
+
+'ImportHandleLogItemXMLTag': When parsing a XML tag in a log item.
+Return false to stop further processing of the tag
+$reader: XMLReader object
+$logInfo: Array of information
+
+'ImportHandlePageXMLTag': When parsing a XML tag in a page.
+Return false to stop further processing of the tag
+$reader: XMLReader object
+&$pageInfo: Array of information
+
+'ImportHandleRevisionXMLTag': When parsing a XML tag in a page revision.
+Return false to stop further processing of the tag
+$reader: XMLReader object
+$pageInfo: Array of page information
+$revisionInfo: Array of revision information
+
+'ImportHandleToplevelXMLTag': When parsing a top level XML tag.
+Return false to stop further processing of the tag
+$reader: XMLReader object
+
+'ImportHandleUploadXMLTag': When parsing a XML tag in a file upload.
+Return false to stop further processing of the tag
+$reader: XMLReader object
+$revisionInfo: Array of information
+
+'ImportLogInterwikiLink': Hook to change the interwiki link used in log entries
+and edit summaries for transwiki imports.
+&$fullInterwikiPrefix: Interwiki prefix, may contain colons.
+&$pageTitle: String that contains page title.
+
+'ImportSources': Called when reading from the $wgImportSources configuration
+variable. Can be used to lazy-load the import sources list.
+&$importSources: The value of $wgImportSources. Modify as necessary. See the
+comment in DefaultSettings.php for the detail of how to structure this array.
+
+'InfoAction': When building information to display on the action=info page.
+$context: IContextSource object
+&$pageInfo: Array of information
+
+'InitializeArticleMaybeRedirect': MediaWiki check to see if title is a redirect.
+&$title: Title object for the current page
+&$request: WebRequest
+&$ignoreRedirect: boolean to skip redirect check
+&$target: Title/string of redirect target
+&$article: Article object
+
+'InternalParseBeforeLinks': during Parser's internalParse method before links
+but after nowiki/noinclude/includeonly/onlyinclude and other processings.
+&$parser: Parser object
+&$text: string containing partially parsed text
+&$stripState: Parser's internal StripState object
+
+'InternalParseBeforeSanitize': during Parser's internalParse method just before
+the parser removes unwanted/dangerous HTML tags and after nowiki/noinclude/
+includeonly/onlyinclude and other processings. Ideal for syntax-extensions after
+template/parser function execution which respect nowiki and HTML-comments.
+&$parser: Parser object
+&$text: string containing partially parsed text
+&$stripState: Parser's internal StripState object
+
+'InterwikiLoadPrefix': When resolving if a given prefix is an interwiki or not.
+Return true without providing an interwiki to continue interwiki search.
+$prefix: interwiki prefix we are looking for.
+&$iwData: output array describing the interwiki with keys iw_url, iw_local,
+ iw_trans and optionally iw_api and iw_wikiid.
+
+'InvalidateEmailComplete': Called after a user's email has been invalidated
+successfully.
+$user: user (object) whose email is being invalidated
+
+'IRCLineURL': When constructing the URL to use in an IRC notification.
+Callee may modify $url and $query, URL will be constructed as $url . $query
+&$url: URL to index.php
+&$query: Query string
+$rc: RecentChange object that triggered url generation
+
+'IsFileCacheable': Override the result of Article::isFileCacheable() (if true)
+&$article: article (object) being checked
+
+'IsTrustedProxy': Override the result of IP::isTrustedProxy()
+&$ip: IP being check
+&$result: Change this value to override the result of IP::isTrustedProxy()
+
+'IsUploadAllowedFromUrl': Override the result of UploadFromUrl::isAllowedUrl()
+$url: URL used to upload from
+&$allowed: Boolean indicating if uploading is allowed for given URL
+
+'isValidEmailAddr': Override the result of Sanitizer::validateEmail(), for
+instance to return false if the domain name doesn't match your organization.
+$addr: The e-mail address entered by the user
+&$result: Set this and return false to override the internal checks
+
+'isValidPassword': Override the result of User::isValidPassword()
+$password: The password entered by the user
+&$result: Set this and return false to override the internal checks
+$user: User the password is being validated for
+
+'Language::getMessagesFileName':
+$code: The language code or the language we're looking for a messages file for
+&$file: The messages file path, you can override this to change the location.
+
+'LanguageGetMagic': DEPRECATED! Use $magicWords in a file listed in
+$wgExtensionMessagesFiles instead.
+Use this to define synonyms of magic words depending of the language
+&$magicExtensions: associative array of magic words synonyms
+$lang: language code (string)
+
+'LanguageGetNamespaces': Provide custom ordering for namespaces or
+remove namespaces. Do not use this hook to add namespaces. Use
+CanonicalNamespaces for that.
+&$namespaces: Array of namespaces indexed by their numbers
+
+'LanguageGetSpecialPageAliases': DEPRECATED! Use $specialPageAliases in a file
+listed in $wgExtensionMessagesFiles instead.
+Use to define aliases of special pages names depending of the language
+&$specialPageAliases: associative array of magic words synonyms
+$lang: language code (string)
+
+'LanguageGetTranslatedLanguageNames': Provide translated language names.
+&$names: array of language code => language name
+$code: language of the preferred translations
+
+'LanguageLinks': Manipulate a page's language links. This is called
+in various places to allow extensions to define the effective language
+links for a page.
+$title: The page's Title.
+&$links: Array with elements of the form "language:title" in the order
+ that they will be output.
+&$linkFlags: Associative array mapping prefixed links to arrays of flags.
+ Currently unused, but planned to provide support for marking individual
+ language links in the UI, e.g. for featured articles.
+
+'LanguageSelector': Hook to change the language selector available on a page.
+$out: The output page.
+$cssClassName: CSS class name of the language selector.
+
+'LinkBegin': DEPRECATED! Use HtmlPageLinkRendererBegin instead.
+Used when generating internal and interwiki links in
+Linker::link(), before processing starts. Return false to skip default
+processing and return $ret. See documentation for Linker::link() for details on
+the expected meanings of parameters.
+$skin: the Skin object
+$target: the Title that the link is pointing to
+&$html: the contents that the <a> tag should have (raw HTML); null means
+ "default".
+&$customAttribs: the HTML attributes that the <a> tag should have, in
+ associative array form, with keys and values unescaped. Should be merged
+ with default values, with a value of false meaning to suppress the
+ attribute.
+&$query: the query string to add to the generated URL (the bit after the "?"),
+ in associative array form, with keys and values unescaped.
+&$options: array of options. Can include 'known', 'broken', 'noclasses'.
+&$ret: the value to return if your hook returns false.
+
+'LinkEnd': DEPRECATED! Use HtmlPageLinkRendererEnd hook instead
+Used when generating internal and interwiki links in Linker::link(),
+just before the function returns a value. If you return true, an <a> element
+with HTML attributes $attribs and contents $html will be returned. If you
+return false, $ret will be returned.
+$skin: the Skin object
+$target: the Title object that the link is pointing to
+$options: the options. Will always include either 'known' or 'broken', and may
+ include 'noclasses'.
+&$html: the final (raw HTML) contents of the <a> tag, after processing.
+&$attribs: the final HTML attributes of the <a> tag, after processing, in
+ associative array form.
+&$ret: the value to return if your hook returns false.
+
+'LinkerMakeExternalImage': At the end of Linker::makeExternalImage() just
+before the return.
+&$url: the image url
+&$alt: the image's alt text
+&$img: the new image HTML (if returning false)
+
+'LinkerMakeExternalLink': At the end of Linker::makeExternalLink() just
+before the return.
+&$url: the link url
+&$text: the link text
+&$link: the new link HTML (if returning false)
+&$attribs: the attributes to be applied.
+$linkType: The external link type
+
+'LinkerMakeMediaLinkFile': At the end of Linker::makeMediaLinkFile() just
+before the return.
+$title: the Title object that the link is pointing to
+$file: the File object or false if broken link
+&$html: the link text
+&$attribs: the attributes to be applied
+&$ret: the value to return if your hook returns false
+
+'LogEventsListLineEnding': Called before a Special:Log line is finished
+$page: the LogEventsList object
+&$ret: the HTML line
+$entry: the DatabaseLogEntry object for this row
+&$classes: the classes to add to the surrounding <li>
+&$attribs: associative array of other HTML attributes for the <li> element.
+ Currently only data attributes reserved to MediaWiki are allowed
+ (see Sanitizer::isReservedDataAttribute).
+
+
+'HtmlPageLinkRendererBegin':
+Used when generating internal and interwiki links in
+LinkRenderer, before processing starts. Return false to skip default
+processing and return $ret.
+$linkRenderer: the LinkRenderer object
+$target: the LinkTarget that the link is pointing to
+&$text: the contents that the <a> tag should have; either a plain, unescaped
+ string or a HtmlArmor object; null means "default".
+&$customAttribs: the HTML attributes that the <a> tag should have, in
+ associative array form, with keys and values unescaped. Should be merged
+ with default values, with a value of false meaning to suppress the
+ attribute.
+&$query: the query string to add to the generated URL (the bit after the "?"),
+ in associative array form, with keys and values unescaped.
+&$ret: the value to return if your hook returns false.
+
+'HtmlPageLinkRendererEnd':
+Used when generating internal and interwiki links in LinkRenderer,
+just before the function returns a value. If you return true, an <a> element
+with HTML attributes $attribs and contents $html will be returned. If you
+return false, $ret will be returned.
+$linkRenderer: the LinkRenderer object
+$target: the LinkTarget object that the link is pointing to
+$isKnown: boolean indicating whether the page is known or not
+&$text: the contents that the <a> tag should have; either a plain, unescaped
+ string or a HtmlArmor object.
+&$attribs: the final HTML attributes of the <a> tag, after processing, in
+ associative array form.
+&$ret: the value to return if your hook returns false.
+
+'LinksUpdate': At the beginning of LinksUpdate::doUpdate() just before the
+actual update.
+&$linksUpdate: the LinksUpdate object
+
+'LinksUpdateAfterInsert': At the end of LinksUpdate::incrTableUpdate() after
+each link table insert. For example, pagelinks, imagelinks, externallinks.
+$linksUpdate: LinksUpdate object
+$table: the table to insert links to
+$insertions: an array of links to insert
+
+'LinksUpdateComplete': At the end of LinksUpdate::doUpdate() when updating,
+including delete and insert, has completed for all link tables
+&$linksUpdate: the LinksUpdate object
+$ticket: prior result of LBFactory::getEmptyTransactionTicket()
+
+'LinksUpdateConstructed': At the end of LinksUpdate() is construction.
+&$linksUpdate: the LinksUpdate object
+
+'ListDefinedTags': When trying to find all defined tags.
+&$tags: The list of tags.
+
+'LoadExtensionSchemaUpdates': Called during database installation and updates.
+$updater: A DatabaseUpdater subclass
+
+'LocalFile::getHistory': Called before file history query performed.
+&$file: the File object
+&$tables: tables
+&$fields: select fields
+&$conds: conditions
+&$opts: query options
+&$join_conds: JOIN conditions
+
+'LocalFilePurgeThumbnails': Called before thumbnails for a local file a purged.
+$file: the File object
+$archiveName: name of an old file version or false if it's the current one
+
+'LocalisationCacheRecache': Called when loading the localisation data into
+cache.
+$cache: The LocalisationCache object
+$code: language code
+&$alldata: The localisation data from core and extensions
+&$purgeBlobs: whether to purge/update the message blobs via
+ MessageBlobStore::clear()
+
+'LocalisationCacheRecacheFallback': Called for each language when merging
+fallback data into the cache.
+$cache: The LocalisationCache object
+$code: language code
+&$alldata: The localisation data from core and extensions. Note some keys may
+ be omitted if they won't be merged into the final result.
+
+'LocalisationChecksBlacklist': When fetching the blacklist of
+localisation checks.
+&$blacklist: array of checks to blacklist. See the bottom of
+ maintenance/language/checkLanguage.inc for the format of this variable.
+
+'LocalisationIgnoredOptionalMessages': When fetching the list of ignored and
+optional localisation messages
+&$ignored: Array of ignored message keys
+&$optional: Array of optional message keys
+
+'LocalUserCreated': Called when a local user has been created
+$user: User object for the created user
+$autocreated: Boolean, whether this was an auto-creation
+
+'LogEventsListGetExtraInputs': When getting extra inputs to display on
+Special:Log for a specific log type
+$type: String of log type being displayed
+$logEventsList: LogEventsList object for context and access to the WebRequest
+&$input: string HTML of an input element
+
+'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
+Returning false will prevent the string from being added to the OutputPage.
+&$s: html string to show for the log extract
+$types: String or Array Log types to show
+$page: String or Title The page title to show log entries for
+$user: String The user who made the log entries
+$param: Associative Array with the following additional options:
+ - lim Integer Limit of items to show, default is 50
+ - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
+ - showIfEmpty boolean Set to false if you don't want any output in case the
+ loglist is empty if set to true (default), "No matching items in log" is
+ displayed if loglist is empty
+ - msgKey Array If you want a nice box with a message, set this to the key of
+ the message. First element is the message key, additional optional elements
+ are parameters for the key that are processed with
+ wfMessage()->params()->parseAsBlock()
+ - offset Set to overwrite offset parameter in $wgRequest set to '' to unset
+ offset
+ - wrap String Wrap the message in html (usually something like
+ "&lt;div ...>$1&lt;/div>").
+ - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
+
+'LogException': Called before an exception (or PHP error) is logged. This is
+meant for integration with external error aggregation services; returning false
+will NOT prevent logging.
+$e: The exception (in case of a plain old PHP error, a wrapping ErrorException)
+$suppressed: true if the error was suppressed via
+ error_reporting()/wfSuppressWarnings()
+
+'LoginFormValidErrorMessages': Called in LoginForm when a function gets valid
+error messages. Allows to add additional error messages (except messages already
+in LoginForm::$validErrorMessages).
+&$messages: Already added messages (inclusive messages from
+ LoginForm::$validErrorMessages)
+
+'LoginUserMigrated': DEPRECATED! Create a PreAuthenticationProvider instead.
+Called during login to allow extensions the opportunity to inform a user that
+their username doesn't exist for a specific reason, instead of letting the
+login form give the generic error message that the account does not exist. For
+example, when the account has been renamed or deleted.
+$user: the User object being authenticated against.
+&$msg: the message identifier for abort reason, or an array to pass a message
+ key and parameters.
+
+'LogLine': Processes a single log entry on Special:Log.
+$log_type: string for the type of log entry (e.g. 'move'). Corresponds to
+ logging.log_type database field.
+$log_action: string for the type of log action (e.g. 'delete', 'block',
+ 'create2'). Corresponds to logging.log_action database field.
+$title: Title object that corresponds to logging.log_namespace and
+ logging.log_title database fields.
+$paramArray: Array of parameters that corresponds to logging.log_params field.
+ Note that only $paramArray[0] appears to contain anything.
+&$comment: string that corresponds to logging.log_comment database field, and
+ which is displayed in the UI.
+&$revert: string that is displayed in the UI, similar to $comment.
+$time: timestamp of the log entry (added in 1.12)
+
+'LonelyPagesQuery': Allow extensions to modify the query used by
+Special:LonelyPages.
+&$tables: tables to join in the query
+&$conds: conditions for the query
+&$joinConds: join conditions for the query
+
+'MagicWordwgVariableIDs': When defining new magic words IDs.
+&$variableIDs: array of strings
+
+'MaintenanceRefreshLinksInit': before executing the refreshLinks.php maintenance
+script.
+$refreshLinks: RefreshLinks object
+
+'MakeGlobalVariablesScript': Called at end of OutputPage::getJSVars.
+Ideally, this hook should only be used to add variables that depend on
+the current page/request; static configuration should be added through
+ResourceLoaderGetConfigVars instead.
+&$vars: variable (or multiple variables) to be added into the output of
+ Skin::makeVariablesScript
+$out: The OutputPage which called the hook, can be used to get the real title.
+
+'MarkPatrolled': Before an edit is marked patrolled.
+$rcid: ID of the revision to be marked patrolled
+&$user: the user (object) marking the revision as patrolled
+$wcOnlySysopsCanPatrol: config setting indicating whether the user needs to be a
+ sysop in order to mark an edit patrolled.
+$auto: true if the edit is being marked as patrolled automatically
+
+'MarkPatrolledComplete': After an edit is marked patrolled.
+$rcid: ID of the revision marked as patrolled
+&$user: user (object) who marked the edit patrolled
+$wcOnlySysopsCanPatrol: config setting indicating whether the user must be a
+ sysop to patrol the edit.
+$auto: true if the edit is being marked as patrolled automatically
+
+'MediaWikiPerformAction': Override MediaWiki::performAction(). Use this to do
+something completely different, after the basic globals have been set up, but
+before ordinary actions take place.
+$output: $wgOut
+$article: Article on which the action will be performed
+$title: Title on which the action will be performed
+$user: $wgUser
+$request: $wgRequest
+$mediaWiki: The $mediawiki object
+
+'MediaWikiServices': Called when a global MediaWikiServices instance is
+initialized. Extensions may use this to define, replace, or wrap services.
+However, the preferred way to define a new service is
+the $wgServiceWiringFiles array.
+$services: MediaWikiServices
+
+'MessageCache::get': When fetching a message. Can be used to override the key
+for customisations. Given and returned message key must be in special format:
+1) first letter must be in lower case according to the content language.
+2) spaces must be replaced with underscores
+&$key: message key (string)
+
+'MessageCacheReplace': When a message page is changed. Useful for updating
+caches.
+$title: name of the page changed.
+$text: new contents of the page.
+
+'MessagesPreLoad': When loading a message from the database.
+$title: title of the message (string)
+&$message: value (string), change it to the message you want to define
+$code: code (string) denoting the language to try.
+
+'MimeMagicGuessFromContent': Allows MW extensions guess the MIME by content.
+$mimeMagic: Instance of MimeMagic.
+&$head: First 1024 bytes of the file in a string (in - Do not alter!).
+&$tail: More or equal than last 65558 bytes of the file in a string
+ (in - Do not alter!).
+$file: File path.
+&$mime: MIME type (out).
+
+'MimeMagicImproveFromExtension': Allows MW extensions to further improve the
+MIME type detected by considering the file extension.
+$mimeMagic: Instance of MimeMagic.
+$ext: File extension.
+&$mime: MIME type (in/out).
+
+'MimeMagicInit': Before processing the list mapping MIME types to media types
+and the list mapping MIME types to file extensions.
+As an extension author, you are encouraged to submit patches to MediaWiki's
+core to add new MIME types to mime.types.
+$mimeMagic: Instance of MimeMagic.
+ Use $mimeMagic->addExtraInfo( $stringOfInfo );
+ for adding new MIME info to the list.
+ Use $mimeMagic->addExtraTypes( $stringOfTypes );
+ for adding new MIME types to the list.
+
+'ModifyExportQuery': Modify the query used by the exporter.
+$db: The database object to be queried.
+&$tables: Tables in the query.
+&$conds: Conditions in the query.
+&$opts: Options for the query.
+&$join_conds: Join conditions for the query.
+
+'MovePageCheckPermissions': Specify whether the user is allowed to move the
+page.
+$oldTitle: Title object of the current (old) location
+$newTitle: Title object of the new location
+$user: User making the move
+$reason: string of the reason provided by the user
+$status: Status object to pass error messages to
+
+'MovePageIsValidMove': Specify whether a page can be moved for technical
+reasons.
+$oldTitle: Title object of the current (old) location
+$newTitle: Title object of the new location
+$status: Status object to pass error messages to
+
+'NamespaceIsMovable': Called when determining if it is possible to pages in a
+namespace.
+$index: Integer; the index of the namespace being checked.
+&$result: Boolean; whether MediaWiki currently thinks that pages in this
+ namespace are movable. Hooks may change this value to override the return
+ value of MWNamespace::isMovable().
+
+'NewDifferenceEngine': Called when a new DifferenceEngine object is made
+$title: the diff page title (nullable)
+&$oldId: the actual old Id to use in the diff
+&$newId: the actual new Id to use in the diff (0 means current)
+$old: the ?old= param value from the url
+$new: the ?new= param value from the url
+
+'NewPagesLineEnding': Called before a NewPages line is finished.
+$page: the SpecialNewPages object
+&$ret: the HTML line
+$row: the database row for this page (the recentchanges record and a few extras - see
+ NewPagesPager::getQueryInfo)
+&$classes: the classes to add to the surrounding <li>
+&$attribs: associative array of other HTML attributes for the <li> element.
+ Currently only data attributes reserved to MediaWiki are allowed
+ (see Sanitizer::isReservedDataAttribute).
+
+'NewRevisionFromEditComplete': Called when a revision was inserted due to an
+edit.
+$wikiPage: the WikiPage edited
+$rev: the new revision
+$baseID: the revision ID this was based off, if any
+$user: the editing user
+
+'OldChangesListRecentChangesLine': Customize entire recent changes line, or
+return false to omit the line from RecentChanges and Watchlist special pages.
+&$changeslist: The OldChangesList instance.
+&$s: HTML of the form "<li>...</li>" containing one RC entry.
+$rc: The RecentChange object.
+&$classes: array of css classes for the <li> element.
+&$attribs: associative array of other HTML attributes for the <li> element.
+ Currently only data attributes reserved to MediaWiki are allowed
+ (see Sanitizer::isReservedDataAttribute).
+
+'OpenSearchUrls': Called when constructing the OpenSearch description XML. Hooks
+can alter or append to the array of URLs for search & suggestion formats.
+&$urls: array of associative arrays with Url element attributes
+
+'OpportunisticLinksUpdate': Called by WikiPage::triggerOpportunisticLinksUpdate
+when a page view triggers a re-rendering of the page. This may happen
+particularly if the parser cache is split by user language, and no cached
+rendering of the page exists in the user's language. The hook is called
+before checking whether page_links_updated indicates that the links are up
+to date. Returning false will cause triggerOpportunisticLinksUpdate() to abort
+without triggering any updates.
+$page: the Page that was rendered.
+$title: the Title of the rendered page.
+$parserOutput: ParserOutput resulting from rendering the page.
+
+'OtherAutoblockLogLink': Get links to the autoblock log from extensions which
+autoblocks users and/or IP addresses too.
+&$otherBlockLink: An array with links to other autoblock logs
+
+'OtherBlockLogLink': Get links to the block log from extensions which blocks
+users and/or IP addresses too.
+&$otherBlockLink: An array with links to other block logs
+$ip: The requested IP address or username
+
+'OutputPageBeforeHTML': A page has been processed by the parser and the
+resulting HTML is about to be displayed.
+&$parserOutput: the parserOutput (object) that corresponds to the page
+&$text: the text that will be displayed, in HTML (string)
+
+'OutputPageBodyAttributes': Called when OutputPage::headElement is creating the
+body tag to allow for extensions to add attributes to the body of the page they
+might need. Or to allow building extensions to add body classes that aren't of
+high enough demand to be included in core.
+$out: The OutputPage which called the hook, can be used to get the real title
+$sk: The Skin that called OutputPage::headElement
+&$bodyAttrs: An array of attributes for the body tag passed to Html::openElement
+
+'OutputPageCheckLastModified': when checking if the page has been modified
+since the last visit.
+&$modifiedTimes: array of timestamps.
+ The following keys are set: page, user, epoch
+$out: OutputPage object (since 1.28)
+
+'OutputPageMakeCategoryLinks': Links are about to be generated for the page's
+categories. Implementations should return false if they generate the category
+links, so the default link generation is skipped.
+&$out: OutputPage instance (object)
+$categories: associative array, keys are category names, values are category
+ types ("normal" or "hidden")
+&$links: array, intended to hold the result. Must be an associative array with
+ category types as keys and arrays of HTML links as values.
+
+'OutputPageParserOutput': after adding a parserOutput to $wgOut
+&$out: OutputPage instance (object)
+$parserOutput: parserOutput instance being added in $out
+
+'PageContentInsertComplete': After a new article is created.
+$wikiPage: WikiPage created
+$user: User creating the article
+$content: New content as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+
+'PageContentLanguage': Allows changing the language in which the content of a
+page is written. Defaults to the wiki content language ($wgContLang).
+$title: Title object
+&$pageLang: the page content language (either an object or a language code)
+$wgLang: the user language
+
+'PageContentSave': Before an article is saved.
+$wikiPage: the WikiPage (object) being saved
+$user: the user (object) saving the article
+$content: the new article content, as a Content object
+$summary: the article summary (comment)
+$isminor: minor flag
+$iswatch: watch flag
+$section: section #
+
+'PageContentSaveComplete': After an article has been updated.
+$wikiPage: WikiPage modified
+$user: User performing the modification
+$content: New content, as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article (can be null for edits that change
+ nothing)
+$status: Status object about to be returned by doEditContent()
+$baseRevId: the rev ID (or false) this edit was based on
+$undidRevId: the rev ID (or 0) this edit undid
+
+'PageHistoryBeforeList': When a history page list is about to be constructed.
+&$article: the article that the history is loading for
+$context: RequestContext object
+
+'PageHistoryLineEnding': Right before the end <li> is added to a history line.
+$historyAction: the action object
+&$row: the revision row for this line
+&$s: the string representing this parsed line
+&$classes: array containing the <li> element classes
+&$attribs: associative array of other HTML attributes for the <li> element.
+ Currently only data attributes reserved to MediaWiki are allowed
+ (see Sanitizer::isReservedDataAttribute).
+
+'PageHistoryPager::doBatchLookups': Called after the pager query was run, before
+any output is generated, to allow batch lookups for prefetching information
+needed for display. If the hook handler returns false, the regular behavior of
+doBatchLookups() is skipped.
+$pager: the PageHistoryPager
+$result: a ResultWrapper representing the query result
+
+'PageHistoryPager::getQueryInfo': when a history pager query parameter set is
+constructed.
+&$pager: the pager
+&$queryInfo: the query parameters
+
+'PageRenderingHash': NOTE: Consider using ParserOptionsRegister instead.
+Alter the parser cache option hash key. A parser extension
+which depends on user options should install this hook and append its values to
+the key.
+&$confstr: reference to a hash key string which can be modified
+$user: User (object) requesting the page
+&$forOptions: array of options the hash is for
+
+'PageViewUpdates': Allow database (or other) changes to be made after a
+page view is seen by MediaWiki. Note this does not capture views made
+via external caches such as Squid.
+$wikipage: WikiPage (object) for the page being viewed.
+$user: User (object) for the user who is viewing.
+
+'ParserAfterParse': Called from Parser::parse() just after the call to
+Parser::internalParse() returns.
+&$parser: parser object
+&$text: text being parsed
+&$stripState: stripState used (object)
+
+'ParserAfterStrip': Called at end of parsing time.
+TODO: No more strip, deprecated ?
+&$parser: parser object
+&$text: text being parsed
+&$stripState: stripState used (object)
+
+'ParserAfterTidy': Called after Parser::tidy() in Parser::parse()
+&$parser: Parser object being used
+&$text: text that will be returned
+
+'ParserAfterUnstrip': Called after the first unstripGeneral() in
+Parser::internalParseHalfParsed()
+&$parser: Parser object being used
+&$text: text that will be returned
+
+'ParserBeforeInternalParse': Called at the beginning of Parser::internalParse().
+&$parser: Parser object
+&$text: text to parse
+&$stripState: StripState instance being used
+
+'ParserBeforeStrip': Called at start of parsing time.
+TODO: No more strip, deprecated ?
+&$parser: parser object
+&$text: text being parsed
+&$stripState: stripState used (object)
+
+'ParserBeforeTidy': Called before tidy and custom tags replacements.
+&$parser: Parser object being used
+&$text: actual text
+
+'ParserCacheSaveComplete': Called after a ParserOutput has been committed to
+the parser cache.
+$parserCache: ParserCache object $parserOutput was stored in
+$parserOutput: ParserOutput object that was stored
+$title: Title of the page that was parsed to generate $parserOutput
+$popts: ParserOptions used for generating $parserOutput
+$revId: ID of the revision that was parsed to create $parserOutput
+
+'ParserClearState': Called at the end of Parser::clearState().
+&$parser: Parser object being cleared
+
+'ParserCloned': Called when the parser is cloned.
+$parser: Newly-cloned Parser object
+
+'ParserFetchTemplate': Called when the parser fetches a template
+$parser: Parser Parser object or false
+$title: Title object of the template to be fetched
+$rev: Revision object of the template
+&$text: Transclusion text of the template or false or null
+&$deps: Array of template dependencies with 'title', 'page_id', 'rev_id' keys
+
+'ParserFirstCallInit': Called when the parser initialises for the first time.
+&$parser: Parser object being cleared
+
+'ParserGetVariableValueSwitch': Called when the parser need the value of a
+custom magic word
+&$parser: Parser object
+&$varCache: array to store the value in case of multiples calls of the
+ same magic word
+&$index: index (string) of the magic
+&$ret: value of the magic word (the hook should set it)
+&$frame: PPFrame object to use for expanding any template variables
+
+'ParserGetVariableValueTs': Use this to change the value of the time for the
+{{LOCAL...}} magic word.
+&$parser: Parser object
+&$time: actual time (timestamp)
+
+'ParserGetVariableValueVarCache': use this to change the value of the variable
+cache or return false to not use it.
+&$parser: Parser object
+&$varCache: variable cache (array)
+
+'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare and
+ParserLimitReportFormat instead.
+Called at the end of Parser:parse() when the parser will
+include comments about size of the text parsed.
+$parser: Parser object
+&$limitReport: text that will be included (without comment tags)
+
+'ParserLimitReportFormat': Called for each row in the parser limit report that
+needs formatting. If nothing handles this hook, the default is to use "$key" to
+get the label, and "$key-value" or "$key-value-text"/"$key-value-html" to
+format the value.
+$key: Key for the limit report item (string)
+&$value: Value of the limit report item
+&$report: String onto which to append the data
+$isHTML: If true, $report is an HTML table with two columns; if false, it's
+ text intended for display in a monospaced font.
+$localize: If false, $report should be output in English.
+
+'ParserLimitReportPrepare': Called at the end of Parser:parse() when the parser
+will include comments about size of the text parsed. Hooks should use
+$output->setLimitReportData() to populate data. Functions for this hook should
+not use $wgLang; do that in ParserLimitReportFormat instead.
+$parser: Parser object
+$output: ParserOutput object
+
+'ParserMakeImageParams': Called before the parser make an image link, use this
+to modify the parameters of the image.
+$title: title object representing the file
+$file: file object that will be used to create the image
+&$params: 2-D array of parameters
+$parser: Parser object that called the hook
+
+'ParserOptionsRegister': Register additional parser options. Note that if you
+change the default value for an option, all existing parser cache entries will
+be invalid. To avoid bugs, you'll need to handle that somehow (e.g. with the
+RejectParserCacheValue hook) because MediaWiki won't do it for you.
+&$defaults: Set the default value for your option here.
+&$inCacheKey: To fragment the parser cache on your option, set a truthy value here.
+&$lazyLoad: To lazy-initialize your option, set it null in $defaults and set a
+ callable here. The callable is passed the ParserOptions object and the option
+ name.
+
+'ParserSectionCreate': Called each time the parser creates a document section
+from wikitext. Use this to apply per-section modifications to HTML (like
+wrapping the section in a DIV). Caveat: DIVs are valid wikitext, and a DIV
+can begin in one section and end in another. Make sure your code can handle
+that case gracefully. See the EditSectionClearerLink extension for an example.
+$parser: the calling Parser instance
+$section: the section number, zero-based, but section 0 is usually empty
+&$sectionContent: ref to the content of the section. modify this.
+$showEditLinks: boolean describing whether this section has an edit link
+
+'ParserTestGlobals': Allows to define globals for parser tests.
+&$globals: Array with all the globals which should be set for parser tests.
+ The arrays keys serve as the globals names, its values are the globals values.
+
+'ParserTestTables': Alter the list of tables to duplicate when parser tests are
+run. Use when page save hooks require the presence of custom tables to ensure
+that tests continue to run properly.
+&$tables: array of table names
+
+'ParserOutputStashForEdit': Called when an edit stash parse finishes, before the output is cached.
+$page: the WikiPage of the candidate edit
+$content: the Content object of the candidate edit
+$output: the ParserOutput result of the candidate edit
+$summary: the change summary of the candidate edit
+$user: the User considering the edit
+
+'PasswordPoliciesForUser': Alter the effective password policy for a user.
+$user: User object whose policy you are modifying
+&$effectivePolicy: Array of policy statements that apply to this user
+
+'PerformRetroactiveAutoblock': Called before a retroactive autoblock is applied
+to a user.
+$block: Block object (which is set to be autoblocking)
+&$blockIds: Array of block IDs of the autoblock
+
+'PersonalUrls': Alter the user-specific navigation links (e.g. "my page,
+my talk page, my contributions" etc).
+&$personal_urls: Array of link specifiers (see SkinTemplate.php)
+&$title: Title object representing the current page
+$skin: SkinTemplate object providing context (e.g. to check if the user is
+ logged in, etc.)
+
+'PingLimiter': Allows extensions to override the results of User::pingLimiter().
+&$user: User performing the action
+$action: Action being performed
+&$result: Whether or not the action should be prevented
+ Change $result and return false to give a definitive answer, otherwise
+ the built-in rate limiting checks are used, if enabled.
+$incrBy: Amount to increment counter by
+
+'PlaceNewSection': Override placement of new sections. Return false and put the
+merged text into $text to override the default behavior.
+$wikipage: WikiPage object
+$oldtext: the text of the article before editing
+$subject: subject of the new section
+&$text: text of the new section
+
+'PostLoginRedirect': Modify the post login redirect behavior.
+Occurs after signing up or logging in, allows for interception of redirect.
+&$returnTo: The page name to return to, as a string
+&$returnToQuery: array of url parameters, mapping parameter names to values
+&$type: type of login redirect as string;
+ error: display a return to link ignoring $wgRedirectOnLogin
+ signup: display a return to link using $wgRedirectOnLogin if needed
+ success: display a return to link using $wgRedirectOnLogin if needed
+ successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+
+'PreferencesFormPreSave': Override preferences being saved
+$formData: array of user submitted data
+$form: PreferencesForm object, also a ContextSource
+$user: User object with preferences to be saved set
+&$result: boolean indicating success
+$oldUserOptions: array with user old options (before save)
+
+'PreferencesGetLegend': Override the text used for the <legend> of a
+preferences section.
+$form: the PreferencesForm object. This is a ContextSource as well
+$key: the section name
+&$legend: the legend text. Defaults to wfMessage( "prefs-$key" )->text() but may
+ be overridden
+
+'PrefixSearchBackend': DEPRECATED! Override SearchEngine::completionSearchBackend instead.
+Override the title prefix search used for OpenSearch and
+AJAX search suggestions. Put results into &$results outparam and return false.
+$ns: array of int namespace keys to search in
+$search: search term (not guaranteed to be conveniently normalized)
+$limit: maximum number of results to return
+&$results: out param: array of page names (strings)
+$offset: number of results to offset from the beginning
+
+'PrefixSearchExtractNamespace': Called if core was not able to extract a
+namespace from the search string so that extensions can attempt it.
+&$namespaces: array of int namespace keys to search in (change this if you can
+ extract namespaces)
+&$search: search term (replace this with term without the namespace if you can
+ extract one)
+
+'PrefsEmailAudit': Called when user changes their email address.
+$user: User (object) changing his email address
+$oldaddr: old email address (string)
+$newaddr: new email address (string)
+
+'ProtectionForm::buildForm': Called after all protection type fieldsets are made
+in the form.
+$article: the title being (un)protected
+&$output: a string of the form HTML so far
+
+'ProtectionForm::save': Called when a protection form is submitted.
+$article: the Page being (un)protected
+&$errorMsg: an html message string of an error or an array of message name and
+ its parameters
+$reasonstr: a string describing the reason page protection level is altered
+
+'ProtectionForm::showLogExtract': Called after the protection log extract is
+shown.
+$article: the page the form is shown for
+$out: OutputPage object
+
+'RandomPageQuery': Lets you modify the query used by Special:Random to select
+random pages.
+&$tables: Database tables to be used in the query
+&$conds: Conditions to be applied in the query
+&$joinConds: Join conditions to be applied in the query
+
+'RawPageViewBeforeOutput': Right before the text is blown out in action=raw.
+&$obj: RawAction object
+&$text: The text that's going to be the output
+
+'RecentChange_save': Called at the end of RecentChange::save().
+&$recentChange: RecentChange object
+
+'RecentChangesPurgeRows': Called when old recentchanges rows are purged, after
+deleting those rows but within the same transaction.
+$rows: The deleted rows as an array of recentchanges row objects (with up to
+ $wgUpdateRowsPerQuery items).
+
+'RedirectSpecialArticleRedirectParams': Lets you alter the set of parameter
+names such as "oldid" that are preserved when using redirecting special pages
+such as Special:MyPage and Special:MyTalk.
+&$redirectParams: An array of parameters preserved by redirecting special pages.
+
+'RejectParserCacheValue': Return false to reject an otherwise usable
+cached value from the Parser cache. NOTE: CARELESS USE OF THIS HOOK CAN
+HAVE CATASTROPHIC CONSEQUENCES FOR HIGH-TRAFFIC INSTALLATIONS. USE WITH
+EXTREME CARE.
+$parserOutput: ParserOutput value.
+$wikiPage: WikiPage object.
+$parserOptions: ParserOptions object.
+
+'RequestContextCreateSkin': Called when RequestContext::getSkin creates a skin
+instance. Can be used by an extension override what skin is used in certain
+contexts.
+$context: (IContextSource) The RequestContext the skin is being created for.
+&$skin: A variable reference you may set a Skin instance or string key on to
+ override the skin that will be used for the context.
+
+'RequestHasSameOriginSecurity': Called to determine if the request is somehow
+flagged to lack same-origin security. Return false to indicate the lack. Note
+if the "somehow" involves HTTP headers, you'll probably need to make sure
+the header is varied on.
+$request: The WebRequest object.
+
+'ResetPasswordExpiration': Allow extensions to set a default password expiration
+$user: The user having their password expiration reset
+&$newExpire: The new expiration date
+
+'ResourceLoaderForeignApiModules': Called from ResourceLoaderForeignApiModule.
+Use this to add dependencies to 'mediawiki.ForeignApi' module when you wish
+to override its behavior. See the module docs for more information.
+&$dependencies: string[] List of modules that 'mediawiki.ForeignApi' should
+depend on
+$context: ResourceLoaderContext|null
+
+'ResourceLoaderGetConfigVars': Called at the end of
+ResourceLoaderStartUpModule::getConfigSettings(). Use this to export static
+configuration variables to JavaScript. Things that depend on the current page
+or request state must be added through MakeGlobalVariablesScript instead.
+&$vars: array( variable name => value )
+
+'ResourceLoaderGetLessVars': DEPRECATED! Called in ResourceLoader::getLessVars
+to add global LESS variables. Loaded after $wgResourceLoaderLESSVars is added.
+Global LESS variables are deprecated. Use ResourceLoaderModule::getLessVars()
+instead to expose variables only in modules that need them.
+&$lessVars: array of variables already added
+
+'ResourceLoaderJqueryMsgModuleMagicWords': Called in
+ResourceLoaderJqueryMsgModule to allow adding magic words for jQueryMsg.
+The value should be a string, and they can depend only on the
+ResourceLoaderContext.
+$context: ResourceLoaderContext
+&$magicWords: Associative array mapping all-caps magic word to a string value
+
+'ResourceLoaderRegisterModules': Right before modules information is required,
+such as when responding to a resource
+loader request or generating HTML output.
+&$resourceLoader: ResourceLoader object
+
+'ResourceLoaderTestModules': Let you add new JavaScript testing modules. This is
+called after the addition of 'qunit' and MediaWiki testing resources.
+&$testModules: array of JavaScript testing modules. The 'qunit' framework,
+ included in core, is fed using tests/qunit/QUnitTestResources.php.
+ To add a new qunit module named 'myext.tests':
+ $testModules['qunit']['myext.tests'] = array(
+ 'script' => 'extension/myext/tests.js',
+ 'dependencies' => <any module dependency you might have>
+ );
+ For QUnit framework, the mediawiki.tests.qunit.testrunner dependency will be
+ added to any module.
+&$ResourceLoader: object
+
+'RevisionInsertComplete': Called after a revision is inserted into the database.
+&$revision: the Revision
+$data: the data stored in old_text. The meaning depends on $flags: if external
+ is set, it's the URL of the revision text in external storage; otherwise,
+ it's the revision text itself. In either case, if gzip is set, the revision
+ text is gzipped.
+$flags: a comma-delimited list of strings representing the options used. May
+ include: utf8 (this will always be set for new revisions); gzip; external.
+
+'SearchableNamespaces': An option to modify which namespaces are searchable.
+&$arr: Array of namespaces ($nsId => $name) which will be used.
+
+'SearchAfterNoDirectMatch': If there was no match for the exact result. This
+runs before lettercase variants are attempted, whereas 'SearchGetNearMatch'
+runs after.
+$term: Search term string
+&$title: Outparam; set to $title object and return false for a match
+
+'SearchGetNearMatch': An extra chance for exact-title-matches in "go" searches
+if nothing was found.
+$term: Search term string
+&$title: Outparam; set to $title object and return false for a match
+
+'SearchGetNearMatchBefore': Perform exact-title-matches in "go" searches before
+the normal operations.
+$allSearchTerms: Array of the search terms in all content languages
+&$titleResult: Outparam; the value to return. A Title object or null.
+
+'SearchGetNearMatchComplete': A chance to modify exact-title-matches in "go"
+searches.
+$term: Search term string
+&$title: Current Title object that is being returned (null if none found).
+
+'SearchResultInitFromTitle': Set the revision used when displaying a page in
+search results.
+$title: Current Title object being displayed in search results.
+&$id: Revision ID (default is false, for latest)
+
+'SearchIndexFields': Add fields to search index mapping.
+&$fields: Array of fields, all implement SearchIndexField
+$engine: SearchEngine instance for which mapping is being built.
+
+'SearchDataForIndex': Add data to search document. Allows to add any data to
+the field map used to index the document.
+&$fields: Array of name => value pairs for fields
+$handler: ContentHandler for the content being indexed
+$page: WikiPage that is being indexed
+$output: ParserOutput that is produced from the page
+$engine: SearchEngine for which the indexing is intended
+
+'SearchResultsAugment': Allows extension to add its code to the list of search
+result augmentors.
+&$setAugmentors: List of whole-set augmentor objects, must implement ResultSetAugmentor
+&$rowAugmentors: List of per-row augmentor objects, must implement ResultAugmentor.
+Note that lists should be in the format name => object and the names in both lists should
+be distinct.
+
+'SecondaryDataUpdates': Allows modification of the list of DataUpdates to
+perform when page content is modified. Currently called by
+AbstractContent::getSecondaryDataUpdates.
+$title: Title of the page that is being edited.
+$oldContent: Content object representing the page's content before the edit.
+$recursive: bool indicating whether DataUpdates should trigger recursive
+ updates (relevant mostly for LinksUpdate).
+$parserOutput: ParserOutput representing the rendered version of the page
+ after the edit.
+&$updates: a list of DataUpdate objects, to be modified or replaced by
+ the hook handler.
+
+'SecuritySensitiveOperationStatus': Affect the return value from
+MediaWiki\Auth\AuthManager::securitySensitiveOperationStatus().
+&$status: (string) The status to be returned. One of the AuthManager::SEC_*
+ constants. SEC_REAUTH will be automatically changed to SEC_FAIL if
+ authentication isn't possible for the current session type.
+$operation: (string) The operation being checked.
+$session: (MediaWiki\Session\Session) The current session. The
+ currently-authenticated user may be retrieved as $session->getUser().
+$timeSinceAuth: (int) The time since last authentication. PHP_INT_MAX if
+ the time of last auth is unknown, or -1 if authentication is not possible.
+
+'SelfLinkBegin': Called before a link to the current article is displayed to
+allow the display of the link to be customized.
+$nt: the Title object
+&$html: html to display for the link
+&$trail: optional text to display before $html
+&$prefix: optional text to display after $html
+&$ret: the value to return if your hook returns false
+
+'SendWatchlistEmailNotification': Return true to send watchlist email
+notification
+$targetUser: the user whom to send watchlist email notification
+$title: the page title
+$enotif: EmailNotification object
+
+'SessionCheckInfo': Validate a MediaWiki\Session\SessionInfo as it's being
+loaded from storage. Return false to prevent it from being used.
+&$reason: String rejection reason to be logged
+$info: MediaWiki\Session\SessionInfo being validated
+$request: WebRequest being loaded from
+$metadata: Array|false Metadata array for the MediaWiki\Session\Session
+$data: Array|false Data array for the MediaWiki\Session\Session
+
+'SessionMetadata': Add metadata to a session being saved.
+$backend: MediaWiki\Session\SessionBackend being saved.
+&$metadata: Array Metadata to be stored. Add new keys here.
+$requests: Array of WebRequests potentially being saved to. Generally 0-1 real
+ request and 0+ FauxRequests.
+
+'SetupAfterCache': Called in Setup.php, after cache objects are set
+
+'ShortPagesQuery': Allow extensions to modify the query used by
+Special:ShortPages.
+&$tables: tables to join in the query
+&$conds: conditions for the query
+&$joinConds: join conditions for the query
+&$options: options for the query
+
+'ShowMissingArticle': Called when generating the output for a non-existent page.
+$article: The article object corresponding to the page
+
+'ShowSearchHit': Customize display of search hit.
+$searchPage: The SpecialSearch instance.
+$result: The SearchResult to show
+$terms: Search terms, for highlighting
+&$link: HTML of link to the matching page. May be modified.
+&$redirect: HTML of redirect info. May be modified.
+&$section: HTML of matching section. May be modified.
+&$extract: HTML of content extract. May be modified.
+&$score: HTML of score. May be modified.
+&$size: HTML of page size. May be modified.
+&$date: HTML of of page modification date. May be modified.
+&$related: HTML of additional info for the matching page. May be modified.
+&$html: May be set to the full HTML that should be used to represent the search
+ hit. Must include the <li> ... </li> tags. Will only be used if the hook
+ function returned false.
+
+'ShowSearchHitTitle': Customise display of search hit title/link.
+&$title: Title to link to
+&$titleSnippet: Label for the link representing the search result. Typically the article title.
+$result: The SearchResult object
+$terms: String of the search terms entered
+$specialSearch: The SpecialSearch object
+&$query: Array of query string parameters for the link representing the search result.
+
+'SidebarBeforeOutput': Allows to edit sidebar just before it is output by skins.
+Warning: This hook is run on each display. You should consider to use
+'SkinBuildSidebar' that is aggressively cached.
+$skin: Skin object
+&$bar: Sidebar content
+ Modify $bar to add or modify sidebar portlets.
+
+'SiteNoticeAfter': After the sitenotice/anonnotice is composed.
+&$siteNotice: HTML sitenotice. Alter the contents of $siteNotice to add to/alter
+ the sitenotice/anonnotice.
+$skin: Skin object
+
+'SiteNoticeBefore': Before the sitenotice/anonnotice is composed. Return true to
+allow the normal method of notice selection/rendering to work, or change the
+value of $siteNotice and return false to alter it.
+&$siteNotice: HTML returned as the sitenotice
+$skin: Skin object
+
+'SkinAfterBottomScripts': At the end of Skin::bottomScripts().
+$skin: Skin object
+&$text: bottomScripts Text. Append to $text to add additional text/scripts after
+ the stock bottom scripts.
+
+'SkinAfterContent': Allows extensions to add text after the page content and
+article metadata. This hook should work in all skins. Set the &$data variable to
+the text you're going to add.
+&$data: (string) Text to be printed out directly (without parsing)
+$skin: Skin object
+
+'SkinBuildSidebar': At the end of Skin::buildSidebar().
+$skin: Skin object
+&$bar: Sidebar contents
+Modify $bar to add or modify sidebar portlets.
+
+'SkinCopyrightFooter': Allow for site and per-namespace customization of
+copyright notice.
+$title: displayed page title
+$type: 'normal' or 'history' for old/diff views
+&$msg: overridable message; usually 'copyright' or 'history_copyright'. This
+ message must be in HTML format, not wikitext!
+&$link: overridable HTML link to be passed into the message as $1
+&$forContent: DEPRECATED! overridable flag if copyright footer is shown in
+ content language.
+
+'SkinEditSectionLinks': Modify the section edit links
+$skin: Skin object rendering the UI
+$title: Title object for the title being linked to (may not be the same as
+ the page title, if the section is included from a template)
+$section: The designation of the section being pointed to, to be included in
+ the link, like "&section=$section"
+$tooltip: The default tooltip. Escape before using.
+ By default, this is wrapped in the 'editsectionhint' message.
+&$result: Array containing all link detail arrays. Each link detail array should
+ contain the following keys:
+ - targetTitle - Target Title object
+ - text - String for the text
+ - attribs - Array of attributes
+ - query - Array of query parameters to add to the URL
+ - options - Array of options for Linker::link
+$lang: The language code to use for the link in the wfMessage function
+
+'SkinGetPoweredBy': TODO
+&$text: additional 'powered by' icons in HTML. Note: Modern skin does not use
+ the MediaWiki icon but plain text instead.
+$skin: Skin object
+
+'SkinPreloadExistence': Supply titles that should be added to link existence
+cache before the page is rendered.
+&$titles: Array of Title objects
+$skin: Skin object
+
+'SkinSubPageSubtitle': At the beginning of Skin::subPageSubtitle().
+If false is returned $subpages will be used instead of the HTML
+subPageSubtitle() generates.
+If true is returned, $subpages will be ignored and the rest of
+subPageSubtitle() will run.
+&$subpages: Subpage links HTML
+$skin: Skin object
+$out: OutputPage object
+
+'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink': After creating the "permanent
+link" tab.
+&$sktemplate: SkinTemplate object
+&$nav_urls: array of tabs
+&$revid: The revision id of the permanent link
+&$revid2: The revision id of the permanent link, second time
+
+'SkinTemplateGetLanguageLink': After building the data for a language link from
+which the actual html is constructed.
+&$languageLink: array containing data about the link. The following keys can be
+ modified: href, text, title, class, lang, hreflang. Each of them is a string.
+$languageLinkTitle: Title object belonging to the external language link.
+$title: Title object of the page the link belongs to.
+$outputPage: The OutputPage object the links are built from.
+
+'SkinTemplateNavigation': Called on content pages after the tabs have been
+added, but before variants have been added.
+&$sktemplate: SkinTemplate object
+&$links: Structured navigation links. This is used to alter the navigation for
+ skins which use buildNavigationUrls such as Vector.
+
+'SkinTemplateNavigation::SpecialPage': Called on special pages after the special
+tab is added but before variants have been added.
+&$sktemplate: SkinTemplate object
+&$links: Structured navigation links. This is used to alter the navigation for
+ skins which use buildNavigationUrls such as Vector.
+
+'SkinTemplateNavigation::Universal': Called on both content and special pages
+after variants have been added.
+&$sktemplate: SkinTemplate object
+&$links: Structured navigation links. This is used to alter the navigation for
+ skins which use buildNavigationUrls such as Vector.
+
+'SkinTemplateOutputPageBeforeExec': Before SkinTemplate::outputPage() starts
+page output.
+&$sktemplate: SkinTemplate object
+&$tpl: QuickTemplate engine object
+
+'SkinTemplatePreventOtherActiveTabs': Use this to prevent showing active tabs.
+&$sktemplate: SkinTemplate object
+&$res: set to true to prevent active tabs
+
+'SkinTemplateTabAction': Override SkinTemplate::tabAction().
+You can either create your own array, or alter the parameters for
+the normal one.
+&$sktemplate: The SkinTemplate instance.
+$title: Title instance for the page.
+$message: Visible label of tab.
+$selected: Whether this is a selected tab.
+$checkEdit: Whether or not the action=edit query should be added if appropriate.
+&$classes: Array of CSS classes to apply.
+&$query: Query string to add to link.
+&$text: Link text.
+&$result: Complete assoc. array if you want to return true.
+
+'SkinTemplateToolboxEnd': Called by SkinTemplate skins after toolbox links have
+been rendered (useful for adding more).
+&$sk: The QuickTemplate based skin template running the hook.
+$dummy: Called when SkinTemplateToolboxEnd is used from a BaseTemplate skin,
+ extensions that add support for BaseTemplateToolbox should watch for this
+ dummy parameter with "$dummy=false" in their code and return without echoing
+ any HTML to avoid creating duplicate toolbox items.
+
+'SoftwareInfo': Called by Special:Version for returning information about the
+software.
+&$software: The array of software in format 'name' => 'version'. See
+ SpecialVersion::softwareInformation().
+
+'SpecialBlockModifyFormFields': Add more fields to Special:Block
+$sp: SpecialPage object, for context
+&$fields: Current HTMLForm fields
+
+'SpecialContributionsBeforeMainOutput': Before the form on Special:Contributions
+$id: User id number, only provided for backwards-compatibility
+$user: User object representing user contributions are being fetched for
+$sp: SpecialPage instance, providing context
+
+'SpecialContributions::formatRow::flags': Called before rendering a
+Special:Contributions row.
+$context: IContextSource object
+$row: Revision information from the database
+&$flags: List of flags on this row
+
+'SpecialContributions::getForm::filters': Called with a list of filters to render
+on Special:Contributions.
+$sp: SpecialContributions object, for context
+&$filters: List of filters rendered as HTML
+
+'SpecialListusersDefaultQuery': Called right before the end of
+UsersPager::getDefaultQuery().
+$pager: The UsersPager instance
+&$query: The query array to be returned
+
+'SpecialListusersFormatRow': Called right before the end of
+UsersPager::formatRow().
+&$item: HTML to be returned. Will be wrapped in <li></li> after the hook finishes
+$row: Database row object
+
+'SpecialListusersHeader': Called after adding the submit button in
+UsersPager::getPageHeader().
+$pager: The UsersPager instance
+&$out: The header HTML
+
+'SpecialListusersHeaderForm': Called before adding the submit button in
+UsersPager::getPageHeader().
+$pager: The UsersPager instance
+&$out: The header HTML
+
+'SpecialListusersQueryInfo': Called right before the end of.
+UsersPager::getQueryInfo()
+$pager: The UsersPager instance
+&$query: The query array to be returned
+
+'SpecialLogAddLogSearchRelations': Add log relations to the current log
+$type: String of the log type
+$request: WebRequest object for getting the value provided by the current user
+&$qc: Array for query conditions to add
+
+'SpecialMovepageAfterMove': Called after moving a page.
+&$movePage: MovePageForm object
+&$oldTitle: old title (object)
+&$newTitle: new title (object)
+
+'SpecialNewpagesConditions': Called when building sql query for
+Special:NewPages.
+&$special: NewPagesPager object (subclass of ReverseChronologicalPager)
+$opts: FormOptions object containing special page options
+&$conds: array of WHERE conditionals for query
+&$tables: array of tables to be queried
+&$fields: array of columns to select
+&$join_conds: join conditions for the tables
+
+'SpecialNewPagesFilters': Called after building form options at NewPages.
+$special: the special page object
+&$filters: associative array of filter definitions. The keys are the HTML
+ name/URL parameters. Each key maps to an associative array with a 'msg'
+ (message key) and a 'default' value.
+
+'SpecialPage_initList': Called when setting up SpecialPageFactory::$list, use
+this hook to remove a core special page or conditionally register special pages.
+&$list: list (array) of core special pages
+
+'SpecialPageAfterExecute': Called after SpecialPage::execute.
+$special: the SpecialPage object
+$subPage: the subpage string or null if no subpage was specified
+
+'SpecialPageBeforeExecute': Called before SpecialPage::execute.
+Return false to prevent execution.
+$special: the SpecialPage object
+$subPage: the subpage string or null if no subpage was specified
+
+'SpecialPageBeforeFormDisplay': Before executing the HTMLForm object.
+$name: name of the special page
+&$form: HTMLForm object
+
+'SpecialPasswordResetOnSubmit': When executing a form submission on
+Special:PasswordReset.
+&$users: array of User objects.
+$data: array of data submitted by the user
+&$error: string, error code (message key) used to describe to error (out
+ parameter). The hook needs to return false when setting this, otherwise it
+ will have no effect.
+
+'SpecialRandomGetRandomTitle': Called during the execution of Special:Random,
+use this to change some selection criteria or substitute a different title.
+&$randstr: The random number from wfRandom()
+&$isRedir: Boolean, whether to select a redirect or non-redirect
+&$namespaces: An array of namespace indexes to get the title from
+&$extra: An array of extra SQL statements
+&$title: If the hook returns false, a Title object to use instead of the
+ result from the normal query
+
+'SpecialRecentChangesFilters': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
+instead.
+Called after building form options at RecentChanges.
+$special: the special page object
+&$filters: associative array of filter definitions. The keys are the HTML
+ name/URL parameters. Each key maps to an associative array with a 'msg'
+ (message key) and a 'default' value.
+
+'SpecialRecentChangesPanel': Called when building form options in
+SpecialRecentChanges.
+&$extraOpts: array of added items, to which can be added
+$opts: FormOptions for this request
+
+'SpecialRecentChangesQuery': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
+or ChangesListSpecialPageQuery instead.
+Called when building SQL query for SpecialRecentChanges and
+SpecialRecentChangesLinked.
+&$conds: array of WHERE conditionals for query
+&$tables: array of tables to be queried
+&$join_conds: join conditions for the tables
+$opts: FormOptions for this request
+&$query_options: array of options for the database request
+&$select: Array of columns to select
+
+'SpecialResetTokensTokens': Called when building token list for
+SpecialResetTokens.
+&$tokens: array of token information arrays in the format of
+ array(
+ 'preference' => '<preference-name>',
+ 'label-message' => '<message-key>',
+ )
+
+'SpecialSearchCreateLink': Called when making the message to create a page or
+go to the existing page.
+$t: title object searched for
+&$params: an array of the default message name and page title (as parameter)
+
+'SpecialSearchGoResult': If a hook returns false the 'go' feature will be
+canceled and a normal search will be performed. Returning true without setting
+$url does a standard redirect to $title. Setting $url redirects to the
+specified URL.
+$term: The string the user searched for
+$title: The title the 'go' feature has decided to forward the user to
+&$url: Initially null, hook subscribers can set this to specify the final url to redirect to
+
+'SpecialSearchNogomatch': Called when the 'Go' feature is triggered (generally
+from autocomplete search other than the main bar on Special:Search) and the
+target doesn't exist. Full text search results are generated after this hook is
+called.
+&$title: title object generated from the text entered by the user
+
+'SpecialSearchPowerBox': The equivalent of SpecialSearchProfileForm for
+the advanced form, a.k.a. power search box.
+&$showSections: an array to add values with more options to
+$term: the search term (not a title object)
+$opts: an array of hidden options (containing 'redirs' and 'profile')
+
+'SpecialSearchProfileForm': Allows modification of search profile forms.
+$search: special page object
+&$form: String: form html
+$profile: String: current search profile
+$term: String: search term
+$opts: Array: key => value of hidden options for inclusion in custom forms
+
+'SpecialSearchProfiles': Allows modification of search profiles.
+&$profiles: profiles, which can be modified.
+
+'SpecialSearchResults': Called before search result display
+$term: string of search term
+&$titleMatches: empty or SearchResultSet object
+&$textMatches: empty or SearchResultSet object
+
+'SpecialSearchResultsPrepend': Called immediately before returning HTML
+on the search results page. Useful for including an external search
+provider. To disable the output of MediaWiki search output, return
+false.
+$specialSearch: SpecialSearch object ($this)
+$output: $wgOut
+$term: Search term specified by the user
+
+'SpecialSearchResultsAppend': Called immediately before returning HTML
+on the search results page. Useful for including a feedback link.
+$specialSearch: SpecialSearch object ($this)
+$output: $wgOut
+$term: Search term specified by the user
+
+'SpecialSearchSetupEngine': Allows passing custom data to search engine.
+$search: SpecialSearch special page object
+$profile: String: current search profile
+$engine: the search engine
+
+'SpecialStatsAddExtra': Add extra statistic at the end of Special:Statistics.
+&$extraStats: Array to save the new stats
+ $extraStats['<name of statistic>'] => <value>;
+ <value> can be an array with the keys "name" and "number":
+ "name" is the HTML to be displayed in the name column
+ "number" is the number to be displayed.
+ or, <value> can be the number to be displayed and <name> is the
+ message key to use in the name column,
+$context: IContextSource object
+
+'SpecialTrackingCategories::preprocess': Called after LinkBatch on Special:TrackingCategories
+$specialPage: The SpecialTrackingCategories object
+$trackingCategories: Array of data from Special:TrackingCategories with msg and cats
+
+'SpecialTrackingCategories::generateCatLink': Called for each cat link on Special:TrackingCategories
+$specialPage: The SpecialTrackingCategories object
+$catTitle: The Title object of the linked category
+&$html: The Result html
+
+'SpecialUploadComplete': Called after successfully uploading a file from
+Special:Upload.
+&$form: The SpecialUpload object
+
+'SpecialVersionVersionUrl': Called when building the URL for Special:Version.
+$wgVersion: Current $wgVersion for you to use
+&$versionUrl: Raw url to link to (eg: release notes)
+
+'SpecialWatchlistFilters': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
+instead.
+Called after building form options at Watchlist.
+$special: the special page object
+&$filters: associative array of filter definitions. The keys are the HTML
+ name/URL parameters. Each key maps to an associative array with a 'msg'
+ (message key) and a 'default' value.
+
+'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
+SpecialWatchlist. Allows extensions to register custom values they have
+inserted to rc_type so they can be returned as part of the watchlist.
+&$nonRevisionTypes: array of values in the rc_type field of recentchanges table
+
+'SpecialWatchlistQuery': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
+or ChangesListSpecialPageQuery instead.
+Called when building sql query for SpecialWatchlist.
+&$conds: array of WHERE conditionals for query
+&$tables: array of tables to be queried
+&$join_conds: join conditions for the tables
+&$fields: array of query fields
+$opts: A FormOptions object with watchlist options for the current request
+
+'TestCanonicalRedirect': Called when about to force a redirect to a canonical
+URL for a title when we have no other parameters on the URL. Gives a chance for
+extensions that alter page view behavior radically to abort that redirect or
+handle it manually.
+$request: WebRequest
+$title: Title of the currently found title obj
+$output: OutputPage object
+
+'ThumbnailBeforeProduceHTML': Called before an image HTML is about to be
+rendered (by ThumbnailImage:toHtml method).
+$thumbnail: the ThumbnailImage object
+&$attribs: image attribute array
+&$linkAttribs: image link attribute array
+
+'TitleArrayFromResult': Called when creating an TitleArray object from a
+database result.
+&$titleArray: set this to an object to override the default object returned
+$res: database result used to create the object
+
+'TitleExists': Called when determining whether a page exists at a given title.
+$title: The title being tested.
+&$exists: Whether the title exists.
+
+'TitleGetEditNotices': Allows extensions to add edit notices
+$title: The Title object for the page the edit notices are for
+$oldid: Revision ID that the edit notices are for (or 0 for latest)
+&$notices: Array of notices. Keys are i18n message keys, values are
+parseAsBlock()ed messages.
+
+'TitleGetRestrictionTypes': Allows extensions to modify the types of protection
+that can be applied.
+$title: The title in question.
+&$types: The types of protection available.
+
+'TitleIsAlwaysKnown': Called when determining if a page exists. Allows
+overriding default behavior for determining if a page exists. If $isKnown is
+kept as null, regular checks happen. If it's a boolean, this value is returned
+by the isKnown method.
+$title: Title object that is being checked
+&$isKnown: Boolean|null; whether MediaWiki currently thinks this page is known
+
+'TitleIsMovable': Called when determining if it is possible to move a page. Note
+that this hook is not called for interwiki pages or pages in immovable
+namespaces: for these, isMovable() always returns false.
+$title: Title object that is being checked
+&$result: Boolean; whether MediaWiki currently thinks this page is movable.
+ Hooks may change this value to override the return value of
+ Title::isMovable().
+
+
+'TitleMove': Before moving an article (title).
+$old: old title
+$nt: new title
+$user: user who does the move
+
+'TitleMoveStarting': Before moving an article (title), but just after the atomic DB section starts.
+$old: old title
+$nt: new title
+$user: user who does the move
+
+'TitleMoveComplete': After moving an article (title), post-commit.
+&$old: old title
+&$nt: new title
+&$user: user who did the move
+$pageid: database ID of the page that's been moved
+$redirid: database ID of the created redirect
+$reason: reason for the move
+$revision: the Revision created by the move
+
+'TitleMoveCompleting': After moving an article (title), pre-commit.
+$old: old title
+$nt: new title
+$user: user who did the move
+$pageid: database ID of the page that's been moved
+$redirid: database ID of the created redirect
+$reason: reason for the move
+$revision: the Revision created by the move
+
+'TitleQuickPermissions': Called from Title::checkQuickPermissions to add to
+or override the quick permissions check.
+$title: The Title object being accessed
+$user: The User performing the action
+$action: Action being performed
+&$errors: Array of errors
+$doExpensiveQueries: Whether to do expensive DB queries
+$short: Whether to return immediately on first error
+
+'TitleReadWhitelist': Called at the end of read permissions checks, just before
+adding the default error message if nothing allows the user to read the page. If
+a handler wants a title to *not* be whitelisted, it should also return false.
+$title: Title object being checked against
+$user: Current user object
+&$whitelisted: Boolean value of whether this title is whitelisted
+
+'TitleSquidURLs': Called to determine which URLs to purge from HTTP caches.
+$title: Title object to purge
+&$urls: An array of URLs to purge from the caches, to be manipulated.
+
+'UnblockUser': Before an IP address or user is unblocked.
+&$block: The Block object about to be saved
+&$user: The user performing the unblock (not the one being unblocked)
+&$reason: If the hook is aborted, the error message to be returned in an array
+
+'UnblockUserComplete': After an IP address or user has been unblocked.
+$block: The Block object that was saved
+$user: The user who performed the unblock (not the one being unblocked)
+
+'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
+PageArchive object has been created but before any further processing is done.
+&$archive: PageArchive object
+$title: Title object of the page that we're viewing
+
+'UndeleteForm::showRevision': Called in UndeleteForm::showRevision, after a
+PageArchive object has been created but before any further processing is done.
+&$archive: PageArchive object
+$title: Title object of the page that we're viewing
+
+'UndeleteForm::undelete': Called in UndeleteForm::undelete, after checking that
+the site is not in read-only mode, that the Title object is not null and after
+a PageArchive object has been constructed but before performing any further
+processing.
+&$archive: PageArchive object
+$title: Title object of the page that we're about to undelete
+
+'UndeleteShowRevision': Called when showing a revision in Special:Undelete.
+$title: title object related to the revision
+$rev: revision (object) that will be viewed
+
+'UnitTestsAfterDatabaseSetup': Called right after MediaWiki's test infrastructure
+has finished creating/duplicating core tables for unit tests.
+$database: Database in question
+$prefix: Table prefix to be used in unit tests
+
+'UnitTestsBeforeDatabaseTeardown': Called right before MediaWiki tears down its
+database infrastructure used for unit tests.
+
+'UnitTestsList': Called when building a list of paths containing PHPUnit tests.
+Since 1.24: Paths pointing to a directory will be recursively scanned for
+test case files matching the suffix "Test.php".
+&$paths: list of test cases and directories to search.
+
+'UnknownAction': DEPRECATED! To add an action in an extension,
+create a subclass of Action, and add a new key to $wgActions.
+An unknown "action" has occurred (useful for defining your own actions).
+$action: action name
+$article: article "acted on"
+
+'UnwatchArticle': Before a watch is removed from an article.
+&$user: user watching
+&$page: WikiPage object to be removed
+&$status: Status object to be returned if the hook returns false
+
+'UnwatchArticleComplete': After a watch is removed from an article.
+$user: user that watched
+&$page: WikiPage object that was watched
+
+'UpdateUserMailerFormattedPageStatus': Before notification email gets sent.
+&$formattedPageStatus: list of valid page states
+
+'UploadComplete': Upon completion of a file upload.
+&$uploadBase: UploadBase (or subclass) object. File can be accessed by
+ $uploadBase->getLocalFile().
+
+'UploadCreateFromRequest': When UploadBase::createFromRequest has been called.
+$type: (string) the requested upload type
+&$className: the class name of the Upload instance to be created
+
+'UploadForm:BeforeProcessing': At the beginning of processUpload(). Lets you
+poke at member variables like $mUploadDescription before the file is saved. Do
+not use this hook to break upload processing. This will return the user to a
+blank form with no error message; use UploadVerification and UploadVerifyFile
+instead.
+&$form: UploadForm object
+
+'UploadForm:initial': Before the upload form is generated. You might set the
+member-variables $uploadFormTextTop and $uploadFormTextAfterSummary to inject
+text (HTML) either before or after the editform.
+&$form: UploadForm object
+
+'UploadFormInitDescriptor': After the descriptor for the upload form as been
+assembled.
+&$descriptor: (array) the HTMLForm descriptor
+
+'UploadFormSourceDescriptors': after the standard source inputs have been
+added to the descriptor
+&$descriptor: (array) the HTMLForm descriptor
+&$radio: Boolean, if source type should be shown as radio button
+$selectedSourceType: The selected source type
+
+'UploadStashFile': Before a file is stashed (uploaded to stash).
+Note that code which has not been updated for MediaWiki 1.28 may not call this
+hook. If your extension absolutely, positively must prevent some files from
+being uploaded, use UploadVerifyFile or UploadVerifyUpload.
+$upload: (object) An instance of UploadBase, with all info about the upload
+$user: (object) An instance of User, the user uploading this file
+$props: (array) File properties, as returned by FSFile::getPropsFromPath()
+&$error: output: If the file stashing should be prevented, set this to the reason
+ in the form of array( messagename, param1, param2, ... ) or a MessageSpecifier
+ instance (you might want to use ApiMessage to provide machine-readable details
+ for the API).
+
+'UploadVerification': DEPRECATED! Use UploadVerifyFile instead.
+Additional chances to reject an uploaded file.
+$saveName: (string) destination file name
+$tempName: (string) filesystem path to the temporary file for checks
+&$error: (string) output: message key for message to show if upload canceled by
+ returning false. May also be an array, where the first element is the message
+ key and the remaining elements are used as parameters to the message.
+
+'UploadVerifyFile': extra file verification, based on MIME type, etc. Preferred
+in most cases over UploadVerification.
+$upload: (object) an instance of UploadBase, with all info about the upload
+$mime: (string) The uploaded file's MIME type, as detected by MediaWiki.
+ Handlers will typically only apply for specific MIME types.
+&$error: (object) output: true if the file is valid. Otherwise, set this to the reason
+ in the form of array( messagename, param1, param2, ... ) or a MessageSpecifier
+ instance (you might want to use ApiMessage to provide machine-readable details
+ for the API).
+
+'UploadVerifyUpload': Upload verification, based on both file properties like
+MIME type (same as UploadVerifyFile) and the information entered by the user
+(upload comment, file page contents etc.).
+$upload: (object) An instance of UploadBase, with all info about the upload
+$user: (object) An instance of User, the user uploading this file
+$props: (array) File properties, as returned by FSFile::getPropsFromPath()
+$comment: (string) Upload log comment (also used as edit summary)
+$pageText: (string) File description page text (only used for new uploads)
+&$error: output: If the file upload should be prevented, set this to the reason
+ in the form of array( messagename, param1, param2, ... ) or a MessageSpecifier
+ instance (you might want to use ApiMessage to provide machine-readable details
+ for the API).
+
+'UserIsBot': when determining whether a user is a bot account
+$user: the user
+&$isBot: whether this is user a bot or not (boolean)
+
+'User::mailPasswordInternal': before creation and mailing of a user's new
+temporary password
+&$user: the user who sent the message out
+&$ip: IP of the user who sent the message out
+&$u: the account whose new password will be set
+
+'UserAddGroup': Called when adding a group or changing a group's expiry; return
+false to override stock group addition.
+$user: the user object that is to have a group added
+&$group: the group to add; can be modified
+&$expiry: the expiry time in TS_MW format, or null if the group is not to
+expire; can be modified
+
+'UserArrayFromResult': Called when creating an UserArray object from a database
+result.
+&$userArray: set this to an object to override the default object returned
+$res: database result used to create the object
+
+'userCan': To interrupt/advise the "user can do X to Y article" check. If you
+want to display an error message, try getUserPermissionsErrors.
+&$title: Title object being checked against
+&$user: Current user object
+$action: Action being checked
+&$result: Pointer to result returned if hook returns false. If null is returned,
+ userCan checks are continued by internal code.
+
+'UserCanSendEmail': To override User::canSendEmail() permission check.
+&$user: User (object) whose permission is being checked
+&$canSend: bool set on input, can override on output
+
+'UserClearNewTalkNotification': Called when clearing the "You have new
+messages!" message, return false to not delete it.
+&$user: User (object) that will clear the message
+$oldid: ID of the talk page revision being viewed (0 means the most recent one)
+
+'UserCreateForm': DEPRECATED! Create an AuthenticationProvider instead.
+Manipulate the login form.
+&$template: SimpleTemplate instance for the form
+
+'UserEffectiveGroups': Called in User::getEffectiveGroups().
+&$user: User to get groups for
+&$groups: Current effective groups
+
+'UserGetAllRights': After calculating a list of all available rights.
+&$rights: Array of rights, which may be added to.
+
+'UserGetDefaultOptions': After fetching the core default, this hook is run right
+before returning the options to the caller. Warning: This hook is called for
+every call to User::getDefaultOptions(), which means it's potentially called
+dozens or hundreds of times. You may want to cache the results of non-trivial
+operations in your hook function for this reason.
+&$defaultOptions: Array of preference keys and their default values.
+
+'UserGetEmail': Called when getting an user email address.
+$user: User object
+&$email: email, change this to override local email
+
+'UserGetEmailAuthenticationTimestamp': Called when getting the timestamp of
+email authentication.
+$user: User object
+&$timestamp: timestamp, change this to override local email authentication
+ timestamp
+
+'UserGetImplicitGroups': DEPRECATED!
+Called in User::getImplicitGroups().
+&$groups: List of implicit (automatically-assigned) groups
+
+'UserGetLanguageObject': Called when getting user's interface language object.
+$user: User object
+&$code: Language code that will be used to create the object
+$context: IContextSource object
+
+'UserGetReservedNames': Allows to modify $wgReservedUsernames at run time.
+&$reservedUsernames: $wgReservedUsernames
+
+'UserGetRights': Called in User::getRights().
+$user: User to get rights for
+&$rights: Current rights
+
+'UserGroupsChanged': Called after user groups are changed.
+$user: User whose groups changed
+$added: Groups added
+$removed: Groups removed
+$performer: User who performed the change, false if via autopromotion
+$reason: The reason, if any, given by the user performing the change,
+false if via autopromotion.
+$oldUGMs: An associative array (group name => UserGroupMembership object) of
+the user's group memberships before the change.
+$newUGMs: An associative array (group name => UserGroupMembership object) of
+the user's current group memberships.
+
+'UserIsBlockedFrom': Check if a user is blocked from a specific page (for
+specific block exemptions).
+$user: User in question
+$title: Title of the page in question
+&$blocked: Out-param, whether or not the user is blocked from that page.
+&$allowUsertalk: If the user is blocked, whether or not the block allows users
+ to edit their own user talk pages.
+
+'UserIsBlockedGlobally': Check if user is blocked on all wikis.
+&$user: User object
+$ip: User's IP address
+&$blocked: Whether the user is blocked, to be modified by the hook
+&$block: The Block object, to be modified by the hook
+
+'UserIsEveryoneAllowed': Check if all users are allowed some user right; return
+false if a UserGetRights hook might remove the named right.
+$right: The user right being checked
+
+'UserIsHidden': Check if the user's name should be hidden. See User::isHidden().
+$user: User in question.
+&$hidden: Set true if the user's name should be hidden.
+
+'UserIsLocked': Check if the user is locked. See User::isLocked().
+$user: User in question.
+&$locked: Set true if the user should be locked.
+
+'UserLoadAfterLoadFromSession': Called to authenticate users on external or
+environmental means; occurs after session is loaded.
+$user: user object being loaded
+
+'UserLoadDefaults': Called when loading a default user.
+$user: user object
+$name: user name
+
+'UserLoadFromDatabase': Called when loading a user from the database.
+$user: user object
+&$s: database query object
+
+'UserLoadFromSession': DEPRECATED! Create a MediaWiki\Session\SessionProvider instead.
+Called to authenticate users on external/environmental means; occurs before
+session is loaded.
+$user: user object being loaded
+&$result: set this to a boolean value to abort the normal authentication
+ process
+
+'UserLoadOptions': When user options/preferences are being loaded from the
+database.
+$user: User object
+&$options: Options, can be modified.
+
+'UserLoggedIn': Called after a user is logged in
+$user: User object for the logged-in user
+
+'UserLoginComplete': Show custom content after a user has logged in via the web interface.
+For functionality that needs to run after any login (API or web) use UserLoggedIn.
+&$user: the user object that was created on login
+&$inject_html: Any HTML to inject after the "logged in" message.
+$direct: (bool) The hook is called directly after a successful login. This will only happen once
+ per login. A UserLoginComplete call with direct=false can happen when the user visits the login
+ page while already logged in.
+
+'UserLoginForm': DEPRECATED! Create an AuthenticationProvider instead.
+Manipulate the login form.
+&$template: QuickTemplate instance for the form
+
+'UserLogout': Before a user logs out.
+&$user: the user object that is about to be logged out
+
+'UserLogoutComplete': After a user has logged out.
+&$user: the user object _after_ logout (won't have name, ID, etc.)
+&$inject_html: Any HTML to inject after the "logged out" message.
+$oldName: name of the user before logout (string)
+
+'UserMailerChangeReturnPath': Called to generate a VERP return address
+when UserMailer sends an email, with a bounce handling extension.
+$to: Array of MailAddress objects for the recipients
+&$returnPath: The return address string
+
+'UserMailerSplitTo': Called in UserMailer::send() to give extensions a chance
+to split up an email with multiple the To: field into separate emails.
+&$to: array of MailAddress objects; unset the ones which should be mailed separately
+
+'UserMailerTransformContent': Called in UserMailer::send() to change email contents.
+Extensions can block sending the email by returning false and setting $error.
+$to: array of MailAdresses of the targets
+$from: MailAddress of the sender
+&$body: email body, either a string (for plaintext emails) or an array with 'text' and 'html' keys
+&$error: should be set to an error message string
+
+'UserMailerTransformMessage': Called in UserMailer::send() to change email after it has gone through
+the MIME transform. Extensions can block sending the email by returning false and setting $error.
+$to: array of MailAdresses of the targets
+$from: MailAddress of the sender
+&$subject: email subject (not MIME encoded)
+&$headers: email headers (except To: and Subject:) as an array of header name => value pairs
+&$body: email body (in MIME format) as a string
+&$error: should be set to an error message string
+
+'UserRemoveGroup': Called when removing a group; return false to override stock
+group removal.
+$user: the user object that is to have a group removed
+&$group: the group to be removed, can be modified
+
+'UserRequiresHTTPS': Called to determine whether a user needs
+to be switched to HTTPS.
+$user: User in question.
+&$https: Boolean whether $user should be switched to HTTPS.
+
+'UserResetAllOptions': Called in User::resetOptions() when user preferences
+have been requested to be reset. This hook can be used to exclude certain
+options from being reset even when the user has requested all prefs to be reset,
+because certain options might be stored in the user_properties database table
+despite not being visible and editable via Special:Preferences.
+$user: the User (object) whose preferences are being reset
+&$newOptions: array of new (site default) preferences
+$options: array of the user's old preferences
+$resetKinds: array containing the kinds of preferences to reset
+
+'UserRetrieveNewTalks': Called when retrieving "You have new messages!"
+message(s).
+&$user: user retrieving new talks messages
+&$talks: array of new talks page(s)
+
+'UserRights': DEPRECATED! Use UserGroupsChanged instead.
+After a user's group memberships are changed.
+&$user: User object that was changed
+$add: Array of strings corresponding to groups added
+$remove: Array of strings corresponding to groups removed
+
+'UserSaveOptions': Called just before saving user preferences/options.
+$user: User object
+&$options: Options, modifiable
+
+'UserSaveSettings': Called when saving user settings.
+$user: User object
+
+'UserSetCookies': DEPRECATED! If you're trying to replace core session cookie
+handling, you want to create a subclass of MediaWiki\Session\CookieSessionProvider
+instead. Otherwise, you can no longer count on user data being saved to cookies
+versus some other mechanism.
+Called when setting user cookies.
+$user: User object
+&$session: session array, will be added to the session
+&$cookies: cookies array mapping cookie name to its value
+
+'UserSetEmail': Called when changing user email address.
+$user: User object
+&$email: new email, change this to override new email address
+
+'UserSetEmailAuthenticationTimestamp': Called when setting the timestamp of
+email authentication.
+$user: User object
+&$timestamp: new timestamp, change this to override local email
+authentication timestamp
+
+'UserToolLinksEdit': Called when generating a list of user tool links, e.g.
+"Foobar (Talk | Contribs | Block)".
+$userId: User id of the current user
+$userText: User name of the current user
+&$items: Array of user tool links as HTML fragments
+
+'UsersPagerDoBatchLookups': Called in UsersPager::doBatchLookups() to give
+extensions providing user group data from an alternate source a chance to add
+their data into the cache array so that things like global user groups are
+displayed correctly in Special:ListUsers.
+$dbr: Read-only database handle
+$userIds: Array of user IDs whose groups we should look up
+&$cache: Array of user ID -> (array of internal group name (e.g. 'sysop') ->
+UserGroupMembership object)
+&$groups: Array of group name -> bool true mappings for members of a given user
+group
+
+'ValidateExtendedMetadataCache': Called to validate the cached metadata in
+FormatMetadata::getExtendedMeta (return false means cache will be
+invalidated and GetExtendedMetadata hook called again).
+$timestamp: The timestamp metadata was generated
+$file: The file the metadata is for
+
+'WantedPages::getQueryInfo': Called in WantedPagesPage::getQueryInfo(), can be
+used to alter the SQL query which gets the list of wanted pages.
+&$wantedPages: WantedPagesPage object
+&$query: query array, see QueryPage::getQueryInfo() for format documentation
+
+'WatchArticle': Before a watch is added to an article.
+&$user: user that will watch
+&$page: WikiPage object to be watched
+&$status: Status object to be returned if the hook returns false
+
+'WatchArticleComplete': After a watch is added to an article.
+&$user: user that watched
+&$page: WikiPage object watched
+
+'WatchedItemQueryServiceExtensions': Create a WatchedItemQueryServiceExtension.
+&$extensions: Add WatchedItemQueryServiceExtension objects to this array
+$watchedItemQueryService: Service object
+
+'WatchlistEditorBeforeFormRender': Before building the Special:EditWatchlist
+form, used to manipulate the list of pages or preload data based on that list.
+&$watchlistInfo: array of watchlisted pages in
+ [namespaceId => ['title1' => 1, 'title2' => 1]] format
+
+'WatchlistEditorBuildRemoveLine': when building remove lines in
+Special:Watchlist/edit.
+&$tools: array of extra links
+$title: Title object
+$redirect: whether the page is a redirect
+$skin: Skin object
+&$link: HTML link to title
+
+'WebRequestPathInfoRouter': While building the PathRouter to parse the
+REQUEST_URI.
+$router: The PathRouter instance
+
+'WebResponseSetCookie': when setting a cookie in WebResponse::setcookie().
+Return false to prevent setting of the cookie.
+&$name: Cookie name passed to WebResponse::setcookie()
+&$value: Cookie value passed to WebResponse::setcookie()
+&$expire: Cookie expiration, as for PHP's setcookie()
+&$options: Options passed to WebResponse::setcookie()
+
+'wfShellWikiCmd': Called when generating a shell-escaped command line string to
+run a MediaWiki cli script.
+&$script: MediaWiki cli script path
+&$parameters: Array of arguments and options to the script
+&$options: Associative array of options, may contain the 'php' and 'wrapper'
+ keys
+
+'wgQueryPages': Called when initialising list of QueryPage subclasses, use this
+to add new query pages to be updated with maintenance/updateSpecialPages.php.
+&$qp: The list of QueryPages
+
+'WhatLinksHereProps': Allows annotations to be added to WhatLinksHere
+$row: The DB row of the entry.
+$title: The Title of the page where the link comes FROM
+$target: The Title of the page where the link goes TO
+&$props: Array of HTML strings to display after the title.
+
+'WikiExporter::dumpStableQuery': Get the SELECT query for "stable" revisions
+dumps. One, and only one hook should set this, and return false.
+&$tables: Database tables to use in the SELECT query
+&$opts: Options to use for the query
+&$join: Join conditions
+
+'WikiPageDeletionUpdates': manipulate the list of DataUpdates to be applied when
+a page is deleted. Called in WikiPage::getDeletionUpdates(). Note that updates
+specific to a content model should be provided by the respective Content's
+getDeletionUpdates() method.
+$page: the WikiPage
+$content: the Content to generate updates for (or null, if the Content could not be loaded
+due to an error)
+&$updates: the array of DataUpdate objects. Hook function may want to add to it.
+
+'WikiPageFactory': Override WikiPage class used for a title
+$title: Title of the page
+&$page: Variable to set the created WikiPage to.
+
+'XmlDumpWriterOpenPage': Called at the end of XmlDumpWriter::openPage, to allow
+extra metadata to be added.
+$obj: The XmlDumpWriter object.
+&$out: The output string.
+$row: The database row for the page.
+$title: The title of the page.
+
+'XmlDumpWriterWriteRevision': Called at the end of a revision in an XML dump, to
+add extra metadata.
+&$obj: The XmlDumpWriter object.
+&$out: The text being output.
+$row: The database row for the revision.
+$text: The revision text.
+
+More hooks might be available but undocumented, you can execute
+"php maintenance/findHooks.php" to find hidden ones.
diff --git a/www/wiki/docs/html/README b/www/wiki/docs/html/README
new file mode 100644
index 00000000..90de167f
--- /dev/null
+++ b/www/wiki/docs/html/README
@@ -0,0 +1,4 @@
+This directory is for the auto-generated doxygen documentation.
+Run 'php mwdocgen.php' in the maintenance subdirectory to build the docs.
+
+Get Doxygen from http://www.doxygen.org/
diff --git a/www/wiki/docs/injection.txt b/www/wiki/docs/injection.txt
new file mode 100644
index 00000000..2badea98
--- /dev/null
+++ b/www/wiki/docs/injection.txt
@@ -0,0 +1,269 @@
+injection.txt
+
+This is an overview of how MediaWiki makes use of dependency injection.
+The design described here grew from the discussion of RFC T384.
+
+
+The term "dependency injection" (DI) refers to a pattern on object oriented
+programming that tries to improve modularity by reducing strong coupling
+between classes. In practical terms, this means that anything an object needs
+to operate should be injected from the outside, the object itself should only
+know narrow interfaces, no concrete implementation of the logic it relies on.
+
+The requirement to inject everything typically results in an architecture that
+based on two main types of objects: simple value objects with no business logic
+(and often immutable), and essentially stateless service objects that use
+other service objects to operate on the value objects.
+
+As of the beginning of 2016 (MW version 1.27), MediaWiki is only starting to
+use the DI approach. Much of the code still relies on global state or direct
+instantiation, resulting in a highly cyclical dependency graph.
+
+
+== Overview ==
+The heart of the DI in MediaWiki is the central service locator,
+MediaWikiServices, which acts as the top level factory for services in
+MediaWiki. MediaWikiServices::getInstance() returns the default service
+locator instance, which can be used to gain access to default instances of
+various services. MediaWikiServices however also allows new services to be
+defined and default services to be redefined. Services are defined or
+redefined by providing a callback function, the "instantiator" function,
+that will return a new instance of the service.
+
+When MediaWikiServices::getInstance() is first called, it will create an
+instance of MediaWikiServices and populate it with the services defined
+in the files listed by $wgServiceWiringFiles, thereby "bootstrapping" the
+DI framework. Per default, $wgServiceWiringFiles lists
+includes/ServiceWiring.php, which defines all default service
+implementations, and specifies how they depend on each other ("wiring").
+
+When a new service is added to MediaWiki core, an instantiator function
+that will create the appropriate default instance for that service must
+be added to ServiceWiring.php. This makes the service available through
+the generic getService() method on the service locator returned by
+MediaWikiServices::getInstance().
+
+Extensions can add their own wiring files to $wgServiceWiringFiles, in order
+to define their own service. Extensions may also use the 'MediaWikiServices'
+hook to define or redefined services by calling methods on the default
+MediaWikiServices instance.
+
+
+It should be noted that the term "service locator" is often used to refer to a
+top level factory that is accessed directly, throughout the code, to avoid
+explicit dependency injection. In contrast, the term "DI container" is often
+used to describe a top level factory that is only accessed when services
+are created. We use the term "service locator" for the top level factory
+because it is more descriptive than "DI container", even though application
+logic is strongly discouraged from accessing MediaWikiServices directly.
+MediaWikiServices::getInstance() should ideally be accessed only in "static
+entry points" such as hook handler functions. See "Migration" below.
+
+
+== Service Reset ==
+
+Services get their configuration injected, and changes to global
+configuration variables will not have any effect on services that were already
+instantiated. This would typically be the case for low level services like
+the ConfigFactory or the ObjectCacheManager, which are used during extension
+registration. To address this issue, Setup.php resets the global service
+locator instance by calling MediaWikiServices::resetGlobalInstance() once
+configuration and extension registration is complete.
+
+Note that "unmanaged" legacy services services that manage their own singleton
+must not keep references to services managed by MediaWikiServices, to allow a
+clean reset. After the global MediaWikiServices instance got reset, any such
+references would be stale, and using a stale service will result in an error.
+
+Services should either have all dependencies injected and be themselves managed
+by MediaWikiServices, or they should use the Service Locator pattern, accessing
+service instances via the global MediaWikiServices instance state when needed.
+This ensures that no stale service references remain after a reset.
+
+
+== Configuration ==
+
+When the default MediaWikiServices instance is created, a Config object is
+provided to the constructor. This Config object represents the "bootstrap"
+configuration which will become available as the 'BootstrapConfig' service.
+As of MW 1.27, the bootstrap config is a GlobalVarConfig object providing
+access to the $wgXxx configuration variables.
+
+The bootstrap config is then used to construct a 'ConfigFactory' service,
+which in turn is used to construct the 'MainConfig' service. Application
+logic should use the 'MainConfig' service (or a more specific configuration
+object). 'BootstrapConfig' should only be used for bootstrapping basic
+services that are needed to load the 'MainConfig'.
+
+
+Note: Several well known services in MediaWiki core act as factories
+themselves, e.g. ApiModuleManager, ObjectCache, SpecialPageFactory, etc.
+The registries these factories are based on are currently managed as part of
+the configuration. This may however change in the future.
+
+
+== Migration ==
+
+This section provides some recipes for improving code modularity by reducing
+strong coupling. The dependency injection mechanism described above is an
+essential tool in this effort.
+
+Migrate access to global service instances and config variables:
+Assume Foo is a class that uses the $wgScriptPath global and calls
+wfGetDB() to get a database connection, in non-static methods.
+* Add $scriptPath as a constructor parameter and use $this->scriptPath
+ instead of $wgScriptPath.
+* Add LoadBalancer $dbLoadBalancer as a constructor parameter. Use
+ $this->dbLoadBalancer->getConnection() instead of wfGetDB().
+* Any code that calls Foo's constructor would now need to provide the
+ $scriptPath and $dbLoadBalancer. To avoid this, avoid direct instantiation
+ of services all together - see below.
+
+Migrate class-level singleton getters:
+Assume class Foo has mostly non-static methods, and provides a static
+getInstance() method that returns a singleton (or default instance).
+* Add an instantiator function for Foo into ServiceWiring.php. The instantiator
+ would do exactly what Foo::getInstance() did. However, it should
+ replace any access to global state with calls to $services->getXxx() to get a
+ service, or $services->getMainConfig()->get() to get a configuration setting.
+* Add a getFoo() method to MediaWikiServices. Don't forget to add the
+ appropriate test cases in MediaWikiServicesTest.
+* Turn Foo::getInstance() into a deprecated alias for
+ MediaWikiServices::getInstance()->getFoo(). Change all calls to
+ Foo::getInstance() to use injection (see above).
+
+Migrate direct service instantiation:
+Assume class Bar calls new Foo().
+* Add an instantiator function for Foo into ServiceWiring.php and add a getFoo()
+ method to MediaWikiServices. Don't forget to add the appropriate test cases
+ in MediaWikiServicesTest.
+* In the instantiator, replace any access to global state with calls
+ to $services->getXxx() to get a service, or $services->getMainConfig()->get()
+ to get a configuration setting.
+* The code in Bar that calls Foo's constructor should be changed to have a Foo
+ instance injected; Eventually, the only code that instantiates Foo is the
+ instantiator in ServiceWiring.php.
+* As an intermediate step, Bar's constructor could initialize the $foo member
+ variable by calling MediaWikiServices::getInstance()->getFoo(). This is
+ acceptable as a stepping stone, but should be replaced by proper injection
+ via a constructor argument. Do not however inject the MediaWikiServices
+ object!
+
+Migrate parameterized helper instantiation:
+Assume class Bar creates some helper object by calling new Foo( $x ),
+and Foo uses a global singleton of the Xyzzy service.
+* Define a FooFactory class (or a FooFactory interface along with a MyFooFactory
+ implementation). FooFactory defines the method newFoo( $x ) or getFoo( $x ),
+ depending on the desired semantics (newFoo would guarantee a fresh instance).
+ When Foo gets refactored to have Xyzzy injected, FooFactory will need a
+ Xyzzy instance, so newFoo() can pass it to new Foo().
+* Add an instantiator function for FooFactory into ServiceWiring.php and add a
+ getFooFactory() method to MediaWikiServices. Don't forget to add the
+ appropriate test cases in MediaWikiServicesTest.
+* The code in Bar that calls Foo's constructor should be changed to have a
+ FooFactory instance injected; Eventually, the only code that instantiates
+ Foo are implementations of FooFactory, and the only code that instantiates
+ FooFactory is the instantiator in ServiceWiring.php.
+* As an intermediate step, Bar's constructor could initialize the $fooFactory
+ member variable by calling MediaWikiServices::getInstance()->getFooFactory().
+ This is acceptable as a stepping stone, but should be replaced by proper
+ injection via a constructor argument. Do not however inject the
+ MediaWikiServices object!
+
+Migrate a handler registry:
+Assume class Bar calls FooRegistry::getFoo( $x ) to get a specialized Foo
+instance for handling $x.
+* Turn getFoo into a non-static method.
+* Add an instantiator function for FooRegistry into ServiceWiring.php and add
+ a getFooRegistry() method to MediaWikiServices. Don't forget to add the
+ appropriate test cases in MediaWikiServicesTest.
+* Change all code that calls FooRegistry::getFoo() statically to call this
+ method on a FooRegistry instance. That is, Bar would have a $fooRegistry
+ member, initialized from a constructor parameter.
+* As an intermediate step, Bar's constructor could initialize the $fooRegistry
+ member variable by calling MediaWikiServices::getInstance()->
+ getFooRegistry(). This is acceptable as a stepping stone, but should be
+ replaced by proper injection via a constructor argument. Do not however
+ inject the MediaWikiServices object!
+
+Migrate deferred service instantiation:
+Assume class Bar calls new Foo(), but only when needed, to avoid the cost of
+instantiating Foo().
+* Define a FooFactory interface and a MyFooFactory implementation of that
+ interface. FooFactory defines the method getFoo() with no parameters.
+* Precede as for the "parameterized helper instantiation" case described above.
+
+Migrate a class with only static methods:
+Assume Foo is a class with only static methods, such as frob(), which
+interacts with global state or system resources.
+* Introduce a FooService interface and a DefaultFoo implementation of that
+ interface. FooService contains the public methods defined by Foo.
+* Add an instantiator function for FooService into ServiceWiring.php and
+ add a getFooService() method to MediaWikiServices. Don't forget to
+ add the appropriate test cases in MediaWikiServicesTest.
+* Add a private static getFooService() method to Foo. That method just
+ calls MediaWikiServices::getInstance()->getFooService().
+* Make all methods in Foo delegate to the FooService returned by
+ getFooService(). That is, Foo::frob() would do self::getFooService()->frob().
+* Deprecate Foo. Inject a FooService into all code that calls methods
+ on Foo, and change any calls to static methods in foo to the methods
+ provided by the FooService interface.
+
+Migrate static hook handler functions (to allow unit testing):
+Assume MyExtHooks::onFoo is a static hook handler function that is called with
+the parameter $x; Further assume MyExt::onFoo needs service Bar, which is
+already known to MediaWikiServices (if not, see above).
+* Create a non-static doFoo( $x ) method in MyExtHooks that has the same
+ signature as onFoo( $x ). Move the code from onFoo() into doFoo(), replacing
+ any access to global or static variables with access to instance member
+ variables.
+* Add a constructor to MyExtHooks that takes a Bar service as a parameter.
+* Add a static method called newFromGlobalState() with no parameters. It should
+ just return new MyExtHooks( MediaWikiServices::getBar() ).
+* The original static handler method onFoo( $x ) is then implemented as
+ self::newFromGlobalState()->doFoo( $x ).
+
+Migrate a "smart record":
+Assume Thingy is a "smart record" that "knows" how to load and store itself.
+For this purpose, Thingy uses wfGetDB().
+* Create a "dumb" value class ThingyRecord that contains all the information
+ that Thingy represents (e.g. the information from a database row). The value
+ object should not know about any service.
+* Create a DAO-style service for loading and storing ThingyRecords, called
+ ThingyStore. It may be useful to split the interfaces for reading and
+ writing, with a single class implementing both interfaces, so we in the
+ end have the ThingyLookup and ThingyStore interfaces, and a SqlThingyStore
+ implementation.
+* Add instantiator functions for ThingyLookup and ThingyStore in
+ ServiceWiring.php. Since we want to use the same instance for both service
+ interfaces, the instantiator for ThingyLookup would return
+ $services->getThingyStore().
+* Add getThingyLookup() and getThingyStore methods to MediaWikiServices.
+ Don't forget to add the appropriate test cases in MediaWikiServicesTest.
+* In the old Thingy class, replace all member variables that represent the
+ record's data with a single ThingyRecord object.
+* In the old Thingy class, replace all calls to static methods or functions,
+ such as wfGetDB(), with calls to the appropriate services, such as
+ LoadBalancer::getConnection().
+* In Thingy's constructor, pull in any services needed, such as the
+ LoadBalancer, by using MediaWikiServices::getInstance(). These services
+ cannot be injected without changing the constructor signature, which
+ is often impractical for "smart records" that get instantiated directly
+ in many places in the code base.
+* Deprecate the old Thingy class. Replace all usages of it with one of the
+ three new classes: loading needs a ThingyLookup, storing needs a ThingyStore,
+ and reading data needs a ThingyRecord.
+
+Migrate lazy loading:
+Assume Thingy is a "smart record" as described above, but requires lazy loading
+of some or all the data it represents.
+* Instead of a plain object, define ThingyRecord to be an interface. Provide a
+ "simple" and "lazy" implementations, called SimpleThingyRecord and
+ LazyThingyRecord. LazyThingyRecord knows about some lower level storage
+ interface, like a LoadBalancer, and uses it to load information on demand.
+* Any direct instantiation of a ThingyRecord would use the SimpleThingyRecord
+ implementation.
+* SqlThingyStore however creates instances of LazyThingyRecord, and injects
+ whatever storage layer service LazyThingyRecord needs to perform lazy loading.
+
+
diff --git a/www/wiki/docs/kss/Makefile b/www/wiki/docs/kss/Makefile
new file mode 100644
index 00000000..392ad1ac
--- /dev/null
+++ b/www/wiki/docs/kss/Makefile
@@ -0,0 +1,19 @@
+MEDIAWIKI_LOAD_URL ?= http://localhost/w/load.php
+
+kss: kssnodecheck
+# Generates CSS of mediawiki.ui and mediawiki.ui.button using ResourceLoader, then applies it to the
+# KSS style guide
+ $(eval KSS_RL_TMP := $(shell mktemp /tmp/tmp.XXXXXXXXXX))
+ $(eval MODULE_STR := $(shell paste -sd "|" styleGuideModules.txt))
+# See ResourceLoaderClientHtml::makeLoad.
+ @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=${MODULE_STR}&only=styles" > $(KSS_RL_TMP)
+ @node_modules/.bin/kss-node ../../resources/src/mediawiki.ui static/ --css $(KSS_RL_TMP) -t styleguide-template
+ @rm $(KSS_RL_TMP)
+
+kssopen: kss
+ @echo Opening the generated style guide...
+ @command -v xdg-open >/dev/null 2>&1 || { open ${PWD}/static/index.html; exit 0; }
+ @xdg-open ${PWD}/static/index.html
+
+kssnodecheck:
+ @scripts/kss-node-check.sh
diff --git a/www/wiki/docs/kss/README.txt b/www/wiki/docs/kss/README.txt
new file mode 100644
index 00000000..76cfb627
--- /dev/null
+++ b/www/wiki/docs/kss/README.txt
@@ -0,0 +1,21 @@
+The Makefile, package.json, scripts, styleguide-template, and
+mediawiki.ui/styleguide.md files and directories here and in
+resources/src/mediawiki.ui/ support the automatic generation
+of CSS documentation from the source LESS files using kss for
+node.js, https://github.com/kneath/kss
+
+To build and open in your web browser, run:
+
+MEDIAWIKI_LOAD_URL=mediawiki_hostname/w/load.php make kssopen
+
+For example,
+
+MEDIAWIKI_LOAD_URL=1.2.3.4/w/load.php make kssopen
+
+If MediaWiki is running on localhost, you can omit MEDIAWIKI_LOAD_URL.
+
+To rebuild without opening the web browser, run:
+
+MEDIAWIKI_LOAD_URL=mediawiki_hostname/w/load.php make
+
+When modifying styleGuideModules.txt, keep the list in strict alphabetical order (with no extra formatting), so CSS loads in the same order as ResourceLoader's addModuleStyles does; this can affect rendering.
diff --git a/www/wiki/docs/kss/scripts/kss-node-check.sh b/www/wiki/docs/kss/scripts/kss-node-check.sh
new file mode 100755
index 00000000..84ee1c4e
--- /dev/null
+++ b/www/wiki/docs/kss/scripts/kss-node-check.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+if command -v npm > /dev/null ; then
+ npm install
+else
+ # If npm isn't installed, but kss-node is, exit normally.
+ # This allows setting it up on one machine, and running it on
+ # another (e.g. Tools Labs execution nodes) that doesn't have npm
+ # installed. However, "npm install" still needs to be run
+ # occasionally to keep kss updated.
+
+ KSS_NODE="${BASH_SOURCE%/*}/../node_modules/.bin/kss-node"
+ if ! [ -x "$KSS_NODE" ] ; then
+ echo "Neither kss-node nor npm are installed."
+ echo "To install npm, see http://nodejs.org/"
+ echo "When npm is installed, the Makefile can automatically"
+ echo "install kss-node."
+ exit 1
+ fi
+fi
diff --git a/www/wiki/docs/kss/styleGuideModules.txt b/www/wiki/docs/kss/styleGuideModules.txt
new file mode 100644
index 00000000..20910105
--- /dev/null
+++ b/www/wiki/docs/kss/styleGuideModules.txt
@@ -0,0 +1,10 @@
+mediawiki.legacy.commonPrint
+mediawiki.legacy.shared
+mediawiki.ui
+mediawiki.ui.anchor
+mediawiki.ui.button
+mediawiki.ui.checkbox
+mediawiki.ui.icon
+mediawiki.ui.input
+mediawiki.ui.radio
+mediawiki.ui.text
diff --git a/www/wiki/docs/kss/styleguide-template/index.html b/www/wiki/docs/kss/styleguide-template/index.html
new file mode 100644
index 00000000..d1ae26af
--- /dev/null
+++ b/www/wiki/docs/kss/styleguide-template/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="generator" content="kss-node" />
+
+ <title>MediaWiki Living Styleguide</title>
+
+ <link rel="stylesheet" href="public/kss.css">
+ <link rel="stylesheet" href="public/style.css">
+</head>
+<body><div id="kss-wrapper">
+ <header id="kss-header">
+ <div class="container">
+ <hgroup><h1>Mediawiki.UI</h1></hgroup>
+ </div>
+ </header>
+
+ <div class="container">
+ <nav>
+ <ul>
+ <li><a href="index.html"><span>0.0</span> Overview</a></li>
+ {{#eachRoot}}
+ <li>
+ <a href="section-{{ reference }}.html">
+ <span>{{ reference }}.0</span> {{ header }}
+ </a>
+ <ul>
+ {{#eachSection reference}}
+ {{#whenDepth 2}}
+ <li>
+ <a href="section-{{../../reference}}.html#section-{{ reference }}">
+ <span>{{ reference }}</span>
+ {{ header }}
+ </a>
+ </li>
+ {{/whenDepth}}
+ {{/eachSection}}
+ </ul>
+ </li>
+ {{/eachRoot}}
+ </ul>
+ </nav>
+
+ <div class="content">
+ {{#if overview}}
+ {{html overview}}
+ {{else}}
+ {{#eachSection rootNumber}}
+ <div>
+ {{#whenDepth 1}}
+ <h1>{{ reference }}.0 {{ header }}</h1>
+ {{else}}
+ {{#whenDepth 2}}
+ <a name="section-{{ reference }}"></a>
+ <h2><a href="#section-{{ reference }}">{{ reference }} {{ header }}</a></h2>
+ {{/whenDepth}}
+ {{#whenDepth 3}}
+ <a name="section-{{ reference }}"></a>
+ <h3><a href="#section-{{ reference }}">{{ reference }} {{ header }}</a></h3>
+ {{/whenDepth}}
+ {{/whenDepth}}
+ {{#ifAny markup modifiers}}
+ <div>{{html description}}</div>
+ <div class="example">
+ <pre class="prettyprint lang-html">{{markup}}</pre>
+ <blockquote>{{modifierMarkup}}</blockquote>
+ </div>
+ {{#eachModifier}}
+ <h4>{{name}}</h4>
+ {{html description}}
+ <blockquote>{{modifierMarkup}}</blockquote>
+ {{/eachModifier}}
+ {{else}}
+ {{#if description}}
+ {{html description}}
+ {{/if}}
+ {{/ifAny}}
+ </div>
+ {{/eachSection}}
+ {{/if}}
+ </div>
+ </div>
+</div></body>
+</html>
diff --git a/www/wiki/docs/kss/styleguide-template/public/kss.less b/www/wiki/docs/kss/styleguide-template/public/kss.less
new file mode 100644
index 00000000..3727694d
--- /dev/null
+++ b/www/wiki/docs/kss/styleguide-template/public/kss.less
@@ -0,0 +1,193 @@
+.container {
+ width: 100%;
+}
+
+nav {
+ display: none;
+}
+
+.content {
+ .example {
+ blockquote {
+ margin-top: 20px;
+ }
+ }
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ padding-top: 3px;
+ padding-bottom: 40px;
+
+ // FIXME: Remove when typography module in mediawiki-ui
+ font-family: "Nimbus Sans L", "Liberation Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+}
+
+.kss-no-margin {
+ // FIXME: Is this being used anywhere? Remove if not.
+ margin: 0;
+}
+
+.container {
+ margin: 0 auto;
+ display: -webkit-flex;
+ display: flex;
+
+}
+
+header {
+ padding: 0;
+ margin: 0;
+ border-bottom: 1px solid #eee;
+
+ hgroup {
+ min-width: 149px;
+
+ h1 {
+ padding: 16px 28px;
+ font-size: 15px;
+ text-transform: uppercase;
+ margin: 0;
+ width: 92px;
+ border-right: 1px solid #eee;
+ }
+ }
+}
+
+nav {
+ -webkit-flex: initial;
+ flex: initial;
+ min-width: 139px;
+ margin-top: 25px;
+
+ ul {
+ list-style: none;
+ padding: 0;
+
+ li {
+ margin-left: 10px;
+ margin-bottom: 20px;
+
+ a {
+ text-transform: uppercase;
+ color: #aaa;
+ font-size: 12px;
+ font-weight: bold;
+ text-decoration: none;
+
+ &:hover {
+ color: #538DF8;
+ }
+
+ span {
+ display: inline-block;
+ width: 35px;
+ }
+ }
+
+ ul {
+ li {
+ margin: 0;
+ }
+
+ li a {
+ text-transform: none;
+ font-weight: normal;
+ }
+ }
+ }
+ }
+}
+
+.content {
+ -webkit-flex: 1;
+ flex: 1;
+
+ h1, h2, h3, h4, h5, h6, p {
+ margin-left: 20px;
+
+ a {
+ text-decoration: none;
+ color: #000;
+ }
+ }
+
+ p {
+ width: 338px;
+ }
+
+ h1 {
+ margin-bottom: 0;
+ }
+
+ .example {
+ display: -webkit-flex;
+ display: flex;
+ flex-wrap: wrap;
+
+ pre {
+ -webkit-flex: initial;
+ flex: initial;
+ background: #f8f8f8;
+ padding: 20px;
+ color: #999;
+ word-wrap: break-word;
+ // word-wrap in pre not affecting Firefox, so add white-space.
+ white-space: pre-wrap;
+ float: left;
+ margin: 0;
+ margin-right: 22px;
+ }
+
+ blockquote {
+ -webkit-flex: 1;
+ flex: 1;
+ display: block;
+ margin: 0;
+ margin-left: 20px;
+
+ div {
+ margin-bottom: 5px;
+ }
+ }
+ }
+}
+
+@media (min-width: 768px) {
+ nav {
+ display: block;
+ width: 100px;
+ }
+
+ @columnWidth: (768px - 100px ) / 2;
+ .example {
+ pre,
+ blockquote {
+ width: @columnWidth;
+ }
+ }
+}
+
+@media (min-width: 980px) {
+ nav {
+ width: auto;
+ }
+
+ .content {
+ margin-left: 30px;
+ }
+
+ .container {
+ width: 980px;
+ }
+
+ .example {
+ pre {
+ width: 338px;
+ }
+ blockquote {
+ width: auto;
+ }
+ }
+}
diff --git a/www/wiki/docs/language.txt b/www/wiki/docs/language.txt
new file mode 100644
index 00000000..8f4cf751
--- /dev/null
+++ b/www/wiki/docs/language.txt
@@ -0,0 +1,5 @@
+language.txt
+
+The Language object handles all readable text produced by the software.
+
+See https://www.mediawiki.org/wiki/Localisation#General_use_.28for_developers.29
diff --git a/www/wiki/docs/linkcache.txt b/www/wiki/docs/linkcache.txt
new file mode 100644
index 00000000..13b69613
--- /dev/null
+++ b/www/wiki/docs/linkcache.txt
@@ -0,0 +1,24 @@
+linkcache.txt
+
+The LinkCache class maintains a list of article titles and the information about
+whether or not the article exists in the database. This is used to mark up links
+when displaying a page. If the same link appears more than once on any page,
+then it only has to be looked up once. In most cases, link lookups are done in
+batches with the LinkBatch class, or the equivalent in Parser::replaceLinkHolders(),
+so the link cache is mostly useful for short snippets of parsed text (such as
+the site notice), and for links in the navigation areas of the skin.
+
+The link cache was formerly used to track links used in a document for the
+purposes of updating the link tables. This application is now deprecated.
+
+To create a batch, you can use the following code:
+
+$pages = array( 'Main Page', 'Project:Help', /* ... */ );
+$titles = array();
+
+foreach( $pages as $page ){
+ $titles[] = Title::newFromText( $page );
+}
+
+$batch = new LinkBatch( $titles );
+$batch->execute();
diff --git a/www/wiki/docs/logger.txt b/www/wiki/docs/logger.txt
new file mode 100644
index 00000000..89e620af
--- /dev/null
+++ b/www/wiki/docs/logger.txt
@@ -0,0 +1,71 @@
+MediaWiki\Logger\LoggerFactory implements a PSR-3 [0] compatible message
+logging system.
+
+Named Psr\Log\LoggerInterface instances can be obtained from the
+MediaWiki\Logger\LoggerFactory::getInstance() static method.
+MediaWiki\Logger\LoggerFactory expects a class implementing the
+MediaWiki\Logger\Spi interface to act as a factory for new
+Psr\Log\LoggerInterface instances.
+
+The "Spi" in MediaWiki\Logger\Spi stands for "service provider interface". An
+SPI is an API intended to be implemented or extended by a third party. This
+software design pattern is intended to enable framework extension and
+replaceable components. It is specifically used in the
+MediaWiki\Logger\LoggerFactory service to allow alternate PSR-3 logging
+implementations to be easily integrated with MediaWiki.
+
+The service provider interface allows the backend logging library to be
+implemented in multiple ways. The $wgMWLoggerDefaultSpi global provides the
+classname of the default MediaWiki\Logger\Spi implementation to be loaded at
+runtime. This can either be the name of a class implementing the
+MediaWiki\Logger\Spi with a zero argument constructor or a callable that will
+return an MediaWiki\Logger\Spi instance. Alternately the
+MediaWiki\Logger\LoggerFactory::registerProvider() static method can be called
+to inject an MediaWiki\Logger\Spi instance into the LoggerFactory and bypass
+the use of the default configuration variable.
+
+The MediaWiki\Logger\LegacySpi class implements a service provider to generate
+MediaWiki\Logger\LegacyLogger instances. The MediaWiki\Logger\LegacyLogger
+class implements the PSR-3 logger interface and provides output and
+configuration equivalent to the historic logging output of wfDebug,
+wfDebugLog, wfLogDBError and wfErrorLog. The MediaWiki\Logger\LegacySpi class
+is the default service provider configured in DefaultSettings.php. It's usage
+should be transparent for users who are not ready or do not wish to switch to
+a alternate logging platform.
+
+The MediaWiki\Logger\MonologSpi class implements a service provider to
+generate Psr\Log\LoggerInterface instances that use the Monolog [1] logging
+library. See the PHP docs (or source) for MediaWiki\Logger\MonologSpi for
+details on the configuration of this provider. The default configuration
+installs a null handler that will silently discard all logging events. The
+documentation provided by the class describes a more feature rich logging
+configuration.
+
+== Classes ==
+; MediaWiki\Logger\LoggerFactory
+: Factory for Psr\Log\LoggerInterface loggers
+; MediaWiki\Logger\Spi
+: Service provider interface for MediaWiki\Logger\LoggerFactory
+; MediaWiki\Logger\NullSpi
+: MediaWiki\Logger\Spi for creating instances that discard all log events
+; MediaWiki\Logger\LegacySpi
+: Service provider for creating MediaWiki\Logger\LegacyLogger instances
+; MediaWiki\Logger\LegacyLogger
+: PSR-3 logger that mimics the historical output and configuration of wfDebug,
+ wfErrorLog and other global logging functions.
+; MediaWiki\Logger\MonologSpi
+: MediaWiki\Logger\Spi for creating instances backed by the monolog logging library
+; MediaWiki\Logger\Monolog\LegacyHandler
+: Monolog handler that replicates the udp2log and file logging
+ functionality of wfErrorLog()
+; MediaWiki\Logger\Monolog\WikiProcessor
+: Monolog log processer that adds host: wfHostname() and wiki: wfWikiID()
+ to all records
+
+== Globals ==
+; $wgMWLoggerDefaultSpi
+: Specification for creating the default service provider interface to use
+ with MediaWiki\Logger\LoggerFactory
+
+[0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
+[1]: https://github.com/Seldaek/monolog
diff --git a/www/wiki/docs/magicword.txt b/www/wiki/docs/magicword.txt
new file mode 100644
index 00000000..6b4d37ee
--- /dev/null
+++ b/www/wiki/docs/magicword.txt
@@ -0,0 +1,95 @@
+magicword.txt
+
+Magic Words are some phrases used in the wikitext. They are used for two things:
+* Variables (like {{PAGENAME}}, {{SERVER}}, ...): part of wikitext, that looks
+ like templates but that don't accept any parameter.
+* Parser functions (like {{fullurl:...}}, {{#special:...}}): behaves like
+ functions and accepts parameters.
+
+The localized arrays keys are the internal name, and the values are an array,
+whose include their case-sensitivity and their alias forms. The first form
+defined is used by the program, for example, when moving a page and its old name
+should include #REDIRECT.
+
+They can be added in several arrays:
+* By adding a file to $wgExtensionMessagesFiles and defining there $magicWords.
+ This array is associative with the language code in the first dimension key
+ and then a "normal" array of magic words.
+* Localized arrays (languages/messages/LanguageXX.php) include their different
+ names to be used by the users.
+
+To add a new variable, you should use the "MagicWordwgVariableIDs" hook to add
+the internal name to the $magicWords array. You'll need to define the value of
+the variable with the "ParserGetVariableValueSwitch" hook.
+
+For example to add a new variable:
+
+Create a file called ExtensionName.i18n.magic.php with the following contents:
+----
+<?php
+
+$magicWords = array();
+
+$magicWords['en'] = array(
+ // Case sensitive.
+ 'mag_custom' => array( 1, 'CUSTOM' ),
+);
+
+$magicWords['es'] = array(
+ 'mag_custom' => array( 1, 'ADUANERO' ),
+);
+----
+
+$wgExtensionMessagesFiles['ExtensionNameMagic'] = __DIR__ . '/ExtensionName.i18n.magic.php';
+$wgHooks['MagicWordwgVariableIDs'][] = 'wfAddCustomMagicWordID';
+$wgHooks['ParserGetVariableValueSwitch'][] = 'wfGetCustomMagicWordValue';
+
+function wfAddCustomMagicWordID( &$magicWords ) {
+ $magicWords[] = 'mag_custom';
+ return true;
+}
+
+function wfGetCustomMagicWordValue( &$parser, &$varCache, &$index, &$ret ){
+ if( $index == 'mag_custom' ){
+ $ret = $varCache['mag_custom'] = "Custom value";
+ }
+ return true;
+}
+
+And to add a new parser function:
+
+Create a file called ExtensionName.i18n.magic.php with the following contents:
+----
+<?php
+
+$magicWords = array();
+
+$magicWords['en'] = array(
+ // Case insensitive.
+ 'mag_custom' => array( 0, 'custom' ),
+);
+
+$magicWords['es'] = array(
+ 'mag_custom' => array( 0, 'aduanero' ),
+);
+----
+
+$wgExtensionMessagesFiles['ExtensionNameMagic'] = __DIR__ . '/ExtensionName.i18n.magic.php';
+$wgHooks['ParserFirstCallInit'][] = 'wfRegisterCustomMagicWord';
+
+function wfRegisterCustomMagicWord( &$parser ){
+ $parser->setFunctionHook( 'mag_custom', 'wfGetCustomMagicWordValue' );
+ return true;
+}
+
+function wfGetCustomMagicWordValue( &$parser, $var1, $var2 ){
+ return "custom: var1 is $var1, var2 is $var2";
+}
+
+Note: the 'ParserFirstCallInit' hook is only available since 1.12. To work with
+an older version, you'll need to use an extension function.
+
+Online documentation (contains more informations):
+Magic words: https://www.mediawiki.org/wiki/Manual:Magic_words
+Variables: https://www.mediawiki.org/wiki/Manual:Variable
+Parser functions: https://www.mediawiki.org/wiki/Manual:Parser_functions
diff --git a/www/wiki/docs/maintenance.txt b/www/wiki/docs/maintenance.txt
new file mode 100644
index 00000000..87071f2a
--- /dev/null
+++ b/www/wiki/docs/maintenance.txt
@@ -0,0 +1,57 @@
+Prior to version 1.16, maintenance scripts were a hodgepodge of code that
+had no cohesion or formal method of action. Beginning in 1.16, maintenance
+scripts have been cleaned up to use a unified class.
+
+1. Directory structure
+2. How to run a script
+3. How to write your own
+
+1. DIRECTORY STRUCTURE
+ The /maintenance directory of a MediaWiki installation contains several
+subdirectories, all of which have unique purposes.
+
+2. HOW TO RUN A SCRIPT
+ Ridiculously simple, just call 'php someScript.php' that's in the top-
+level /maintenance directory.
+
+Example:
+ php clearCacheStats.php
+
+The following parameters are available to all maintenance scripts
+--help : Print a help message
+--quiet : Quiet non-error output
+--dbuser : The database user to use for the script (if needed)
+--dbpass : Same as above (if needed)
+--conf : Location of LocalSettings.php, if not default
+--wiki : For specifying the wiki ID
+--batch-size : If the script supports batch operations, do this many per batch
+
+3. HOW TO WRITE YOUR OWN
+Make a file in the maintenance directory called myScript.php or something.
+In it, write the following:
+
+==BEGIN==
+
+<?php
+
+require_once 'Maintenance.php';
+
+class DemoMaint extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ }
+
+ public function execute() {
+ }
+}
+
+$maintClass = "DemoMaint";
+require_once RUN_MAINTENANCE_IF_MAIN;
+
+==END==
+
+That's it. In the execute() method, you have access to all of the normal
+MediaWiki functions, so you can get a DB connection, use the cache, etc.
+For full docs on the Maintenance class, see the auto-generated docs at
+https://doc.wikimedia.org/mediawiki-core/master/php/html/classMaintenance.html
diff --git a/www/wiki/docs/memcached.txt b/www/wiki/docs/memcached.txt
new file mode 100644
index 00000000..8c59e72d
--- /dev/null
+++ b/www/wiki/docs/memcached.txt
@@ -0,0 +1,235 @@
+MediaWiki has optional support for memcached, a "high-performance,
+distributed memory object caching system". For general information
+on it, see: http://www.danga.com/memcached/
+
+Memcached is likely more trouble than a small site will need, but
+for a larger site with heavy load, like Wikipedia, it should help
+lighten the load on the database servers by caching data and objects
+in memory.
+
+== Installation ==
+
+Packages are available for Fedora, Debian, Ubuntu and probably other
+Linux distributions. If there's no package available for your
+distribution, you can compile it from source.
+
+== Compilation ==
+
+* PHP must be compiled with --enable-sockets
+
+* libevent: http://www.monkey.org/~provos/libevent/
+ (as of 2003-08-11, 0.7a is current)
+
+* optionally, epoll-rt patch for Linux kernel:
+ http://www.xmailserver.org/linux-patches/nio-improve.html
+
+* memcached: http://www.danga.com/memcached/download.bml
+ (as of this writing, 1.1.9 is current)
+
+Memcached and libevent are under BSD-style licenses.
+
+The server should run on Linux and other Unix-like systems... you
+can run multiple servers on one machine or on multiple machines on
+a network; storage can be distributed across multiple servers, and
+multiple web servers can use the same cache cluster.
+
+********************* W A R N I N G ! ! ! ! ! ***********************
+Memcached has no security or authentication. Please ensure that your
+server is appropriately firewalled, and that the port(s) used for
+memcached servers are not publicly accessible. Otherwise, anyone on
+the internet can put data into and read data from your cache.
+
+An attacker familiar with MediaWiki internals could use this to steal
+passwords and email addresses, or to make themselves a sysop and
+install malicious javascript on the site. There may be other types
+of vulnerability, no audit has been done -- so be safe and keep it
+behind a firewall.
+********************* W A R N I N G ! ! ! ! ! ***********************
+
+== Setup ==
+
+If you installed memcached using a distro, the daemon should be started
+automatically using /etc/init.d/memcached.
+
+To start the daemon manually, use something like:
+
+ memcached -d -l 127.0.0.1 -p 11211 -m 64
+
+(to run in daemon mode, accessible only via loopback interface,
+on port 11211, using up to 64MB of memory)
+
+In your LocalSettings.php file, set:
+
+ $wgMainCacheType = CACHE_MEMCACHED;
+ $wgMemCachedServers = array( "127.0.0.1:11211" );
+
+The wiki should then use memcached to cache various data. To use
+multiple servers (physically separate boxes or multiple caches
+on one machine on a large-memory x86 box), just add more items
+to the array. To increase the weight of a server (say, because
+it has twice the memory of the others and you want to spread
+usage evenly), make its entry a subarray:
+
+ $wgMemCachedServers = array(
+ "127.0.0.1:11211", # one gig on this box
+ array("192.168.0.1:11211", 2 ) # two gigs on the other box
+ );
+
+== PHP client for memcached ==
+
+MediaWiki uses a fork of Ryan T. Dean's pure-PHP memcached client.
+It also supports the PECL PHP extension for memcached.
+
+MediaWiki uses three object for object caching:
+* $wgMemc, controlled by $wgMainCacheType
+* $parserMemc, controlled by $wgParserCacheType
+* $messageMemc, controlled by $wgMessageCacheType
+If you set CACHE_NONE to one of the three control variable, (default
+value for $wgMainCacheType), MediaWiki still create a MemCacheClient,
+but requests to it are no-ops and we always fall through to the
+database. If the cache daemon can't be contacted, it should also
+disable itself fairly smoothly.
+
+By default, $wgMemc is used but when it is $parserMemc or $messageMemc
+this is mentioned below.
+
+== Keys used ==
+
+(incomplete, out of date)
+
+Date Formatter:
+ key: $wgDBname:dateformatter
+ ex: wikidb:dateformatter
+ stores: a single instance of the DateFormatter class
+ cleared by: nothing
+ expiry: one hour
+
+Difference Engine:
+ key: $wgDBname:diff:version:{MW_DIFF_VERSION}:oldid:$old:newid:$new
+ ex: wikidb:diff:version:1.11a:oldid:1:newid:2
+ stores: body of a difference
+ cleared by: nothing
+ expiry: one week
+
+Interwiki:
+ key: $wgDBname:interwiki:$prefix
+ ex: wikidb:interwiki:w
+ stores: object from the interwiki table of the database
+ expiry: $wgInterwikiExpiry
+ cleared by: nothing
+
+Lag time of the databases:
+ key: $wgDBname:lag_times
+ ex: wikidb:lag_times
+ stores: array mapping the database id to its lag time
+ expiry: 5 secondes
+ cleared by: nothing
+
+Localisation:
+ key: $wgDBname:localisation:$lang
+ ex: wikidb:localisation:de
+ stores: array of localisation settings
+ set in: Language::loadLocalisation()
+ expiry: none
+ cleared by: Language::loadLocalisation()
+
+Message Cache:
+ stored in: $messageMemc
+ key: $wgDBname:messages, $wgDBname:messages-hash, $wgDBname:messages-status
+ ex: wikidb:messages, wikidb:messages-hash, wikidb:messages-status
+ stores: an array where the keys are DB keys and the values are messages
+ set in: wfMessage(), Article::editUpdates() and Title::moveTo()
+ expiry: $wgMsgCacheExpiry
+ cleared by: nothing
+
+Newtalk:
+ key: $wgDBname:newtalk:ip:$ip
+ ex: wikidb:newtalk:ip:123.45.67.89
+ stores: integer, 0 or 1
+ set in: User::loadFromDatabase()
+ cleared by: User::saveSettings() # ?
+ expiry: 30 minutes
+
+Parser Cache:
+ stored in: $parserMemc
+ key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash
+ $pageid: id of the page
+ $renderkey: 1 if action=render, 0 otherwise
+ $hash: hash of user options applied to the page, see ParserOptions::optionsHash()
+ ex: wikidb:pcache:idhash:1-0!1!0!!en!2
+ stores: ParserOutput object
+ modified by: WikiPage::doEditUpdates() or PoolWorkArticleView::doWork()
+ expiry: $wgParserCacheExpireTime or less if it contains short lived functions
+
+ key: $wgDBname:pcache:idoptions:$pageid
+ stores: CacheTime object with an additional list of used options for the hash,
+ serves as ParserCache pointer.
+ modified by: ParserCache::save()
+ expiry: The same as the ParserCache entry it points to.
+
+Ping limiter:
+ controlled by: $wgRateLimits
+ key: $wgDBname:limiter:action:$action:ip:$ip,
+ $wgDBname:limiter:action:$action:user:$id,
+ mediawiki:limiter:action:$action:ip:$ip and
+ mediawiki:limiter:action:$action:subnet:$sub
+ ex: wikidb:limiter:action:edit:ip:123.45.67.89,
+ wikidb:limiter:action:edit:user:1012
+ mediawiki:limiter:action:edit:ip:123.45.67.89 and
+ mediawiki:limiter:action:$action:subnet:123.45.67
+ stores: number of action made by user/ip/subnet
+ cleared by: nothing
+ expiry: expiry set for the action and group in $wgRateLimits
+
+
+Proxy Check: (deprecated)
+ key: $wgDBname:proxy:ip:$ip
+ ex: wikidb:proxy:ip:123.45.67.89
+ stores: 1 if the ip is a proxy
+ cleared by: nothing
+ expiry: $wgProxyMemcExpiry
+
+Revision text:
+ key: $wgDBname:revisiontext:textid:$id
+ ex: wikidb:revisiontext:textid:1012
+ stores: text of a revision
+ cleared by: nothing
+ expiry: $wgRevisionCacheExpiry
+
+Sessions:
+ controlled by: $wgSessionsInObjectCache
+ key: $wgBDname:session:$id
+ ex: wikidb:session:38d7c5b8d3bfc51egf40c69bc40f8be3
+ stores: $SESSION, useful when using a multi-sever wiki
+ expiry: one hour
+ cleared by: session_destroy()
+
+Sidebar:
+ stored in: $parserMemc
+ controlled by: $wgEnableSidebarCache
+ key: $wgDBname:sidebar
+ ex: wikidb:sidebar
+ stores: the html output of the sidebar
+ expiry: $wgSidebarCacheExpiry
+ cleared by: MessageCache::replace()
+
+Special:Allpages:
+ key: $wgDBname:allpages:ns:$ns
+ ex: wikidb:allpages:ns:0
+ stores: array of pages in a namespace
+ expiry: one hour
+ cleared by: nothing
+
+Special:Recentchanges (feed):
+ stored in: $messageMemc
+ key: $wgDBname:rcfeed:$format:$limit:$hideminor:$target and
+ rcfeed:$format:timestamp
+ ex: wikidb:rcfeed:rss:50:: and rcfeed:rss:timestamp
+ stores: xml output of feed
+ expiry: one day
+ clear by: maintenance/rebuildrecentchanges.php script, or
+ calling Special:Recentchanges?action=purge&feed=rss,
+ Special:Recentchanges?action=purge&feed=atom,
+ but note need $wgGroupPermissions[...]['purge'] permission.
+
+... more to come ...
diff --git a/www/wiki/docs/ontology.owl b/www/wiki/docs/ontology.owl
new file mode 100644
index 00000000..6b2e0b7f
--- /dev/null
+++ b/www/wiki/docs/ontology.owl
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE rdf:RDF [
+ <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
+ <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
+ <!ENTITY owl "http://www.w3.org/2002/07/owl#">
+ <!ENTITY mediawiki "https://www.mediawiki.org/ontology#">
+]>
+
+<rdf:RDF
+ xmlns:xsd="&xsd;"
+ xmlns:rdf="&rdf;"
+ xmlns:rdfs="&rdfs;"
+ xmlns:owl="&owl;"
+>
+
+ <owl:Ontology rdf:about="&mediawiki;">
+ <rdfs:label>MediaWiki ontology</rdfs:label>
+ <rdfs:comment>The ontology of MediaWiki</rdfs:comment>
+ </owl:Ontology>
+
+ <!--
+ ///////////////////////////////////////////////////////////////////////////////////////
+ //
+ // Classes
+ //
+ ///////////////////////////////////////////////////////////////////////////////////////
+ -->
+
+ <owl:Class rdf:about="&mediawiki;Dump">
+ <rdfs:label>Dump</rdfs:label>
+ <rdfs:comment>A dump of MediaWiki content.</rdfs:comment>
+ </owl:Class>
+
+ <owl:Class rdf:about="&mediawiki;Category">
+ <rdfs:label>Category</rdfs:label>
+ <rdfs:comment>MediaWiki category.</rdfs:comment>
+ </owl:Class>
+
+ <!--
+ ///////////////////////////////////////////////////////////////////////////////////////
+ //
+ // Properties
+ //
+ ///////////////////////////////////////////////////////////////////////////////////////
+ -->
+
+ <owl:ObjectProperty rdf:about="&mediawiki;isInCategory">
+ <rdfs:label>isInCategory</rdfs:label>
+ <rdfs:comment>One category is the parent of another.</rdfs:comment>
+ <rdfs:range rdf:resource="&mediawiki;Category"/>
+ <rdfs:domain rdf:resource="&mediawiki;Category"/>
+ </owl:ObjectProperty>
+
+</rdf:RDF>
diff --git a/www/wiki/docs/php-memcached/ChangeLog b/www/wiki/docs/php-memcached/ChangeLog
new file mode 100644
index 00000000..553aaa19
--- /dev/null
+++ b/www/wiki/docs/php-memcached/ChangeLog
@@ -0,0 +1,28 @@
+09 Oct 2003:
+ 1455 UTC:
+ Released version 0.1.2
+ Fixed bug in get_multi; when debugging was enabled but no keys were fetched,
+ script execution would halt (uninitialized $val)
+
+08 Oct 2003:
+ 1848 UTC:
+ Released version 0.1.1
+
+ 1825 UTC:
+ Fixed bug in memcached::memcached; was attempting to initialize
+ memcached::_dead_sock (function) instead of memcached::_dead_hosts
+ (oops!)
+
+ 1812 UTC:
+ Fixed memcached::enable_compression;
+ thanks to Justin Matlock <jmat@shutdown.net> for pointing it out
+
+07 Oct 2003:
+ 1635 UTC:
+ Fixed call to memcached::_dead_sock in memcached::delete
+ Added documentation for class variable $_buckets
+
+06 Oct 2003:
+ 2039 UTC:
+ Initial release of memcached-client-php; version 0.1
+
diff --git a/www/wiki/docs/php-memcached/Documentation b/www/wiki/docs/php-memcached/Documentation
new file mode 100644
index 00000000..32e340ac
--- /dev/null
+++ b/www/wiki/docs/php-memcached/Documentation
@@ -0,0 +1,258 @@
+Ryan Gilfether <hotrodder@rocketmail.com>
+http://www.gilfether.com
+This module is Copyright (c) 2003 Ryan Gilfether.
+All rights reserved.
+
+You may distribute under the terms of the GNU General Public License
+This is free software. IT COMES WITHOUT WARRANTY OF ANY KIND.
+
+See the memcached website: http://www.danga.com/memcached/
+
+
+// Takes one parameter, a array of options. The most important key is
+// options["servers"], but that can also be set later with the set_servers()
+// method. The servers must be an array of hosts, each of which is
+// either a scalar of the form <10.0.0.10:11211> or an array of the
+// former and an integer weight value. (the default weight if
+// unspecified is 1.) It's recommended that weight values be kept as low
+// as possible, as this module currently allocates memory for bucket
+// distribution proportional to the total host weights.
+// $options["debug"] turns the debugging on if set to true
+MemCachedClient::MemCachedClient($options);
+
+// sets up the list of servers and the ports to connect to
+// takes an array of servers in the same format as in the constructor
+MemCachedClient::set_servers($servers);
+
+// Retrieves a key from the memcache. Returns the value (automatically
+// unserialized, if necessary) or FALSE if it fails.
+// The $key can optionally be an array, with the first element being the
+// hash value, if you want to avoid making this module calculate a hash
+// value. You may prefer, for example, to keep all of a given user's
+// objects on the same memcache server, so you could use the user's
+// unique id as the hash value.
+// Possible errors set are:
+// MC_ERR_GET
+MemCachedClient::get($key);
+
+// just like get(), but takes an array of keys, returns FALSE on error
+// Possible errors set are:
+// MC_ERR_NOT_ACTIVE
+MemCachedClient::get_multi($keys)
+
+// Unconditionally sets a key to a given value in the memcache. Returns true
+// if it was stored successfully.
+// The $key can optionally be an arrayref, with the first element being the
+// hash value, as described above.
+// returns TRUE on success else FALSE
+// Possible errors set are:
+// MC_ERR_NOT_ACTIVE
+// MC_ERR_GET_SOCK
+// MC_ERR_SOCKET_WRITE
+// MC_ERR_SOCKET_READ
+// MC_ERR_SET
+MemCachedClient::set($key, $value, $exptime);
+
+// Like set(), but only stores in memcache if the key doesn't already exist.
+// returns TRUE on success else FALSE
+// Possible errors set are:
+// MC_ERR_NOT_ACTIVE
+// MC_ERR_GET_SOCK
+// MC_ERR_SOCKET_WRITE
+// MC_ERR_SOCKET_READ
+// MC_ERR_SET
+MemCachedClient::add($key, $value, $exptime);
+
+// Like set(), but only stores in memcache if the key already exists.
+// returns TRUE on success else FALSE
+// Possible errors set are:
+// MC_ERR_NOT_ACTIVE
+// MC_ERR_GET_SOCK
+// MC_ERR_SOCKET_WRITE
+// MC_ERR_SOCKET_READ
+// MC_ERR_SET
+MemCachedClient::replace($key, $value, $exptime);
+
+// removes the key from the MemCache
+// $time is the amount of time in seconds (or Unix time) until which
+// the client wishes the server to refuse "add" and "replace" commands
+// with this key. For this amount of item, the item is put into a
+// delete queue, which means that it won't possible to retrieve it by
+// the "get" command, but "add" and "replace" command with this key
+// will also fail (the "set" command will succeed, however). After the
+// time passes, the item is finally deleted from server memory.
+// The parameter $time is optional, and, if absent, defaults to 0
+// (which means that the item will be deleted immediately and further
+// storage commands with this key will succeed).
+// returns TRUE on success else returns FALSE
+// Possible errors set are:
+// MC_ERR_NOT_ACTIVE
+// MC_ERR_GET_SOCK
+// MC_ERR_SOCKET_WRITE
+// MC_ERR_SOCKET_READ
+// MC_ERR_DELETE
+MemCachedClient::delete($key, $time = 0);
+
+// Sends a command to the server to atomically increment the value for
+// $key by $value, or by 1 if $value is undefined. Returns FALSE if $key
+// doesn't exist on server, otherwise it returns the new value after
+// incrementing. Value should be zero or greater. Overflow on server
+// is not checked. Be aware of values approaching 2**32. See decr.
+// Possible errors set are:
+// MC_ERR_NOT_ACTIVE
+// MC_ERR_GET_SOCK
+// MC_ERR_SOCKET_WRITE
+// MC_ERR_SOCKET_READ
+// returns new value on success, else returns FALSE
+// ONLY WORKS WITH NUMERIC VALUES
+MemCachedClient::incr($key[, $value]);
+
+// Like incr, but decrements. Unlike incr, underflow is checked and new
+// values are capped at 0. If server value is 1, a decrement of 2
+// returns 0, not -1.
+// Possible errors set are:
+// MC_ERR_NOT_ACTIVE
+// MC_ERR_GET_SOCK
+// MC_ERR_SOCKET_WRITE
+// MC_ERR_SOCKET_READ
+// returns new value on success, else returns FALSE
+// ONLY WORKS WITH NUMERIC VALUES
+MemCachedClient::decr($key[, $value]);
+
+// disconnects from all servers
+MemCachedClient::disconnect_all();
+
+// if $do_debug is set to true, will print out
+// debugging info, else debug is turned off
+MemCachedClient::set_debug($do_debug);
+
+// remove all cached hosts that are no longer good
+MemCachedClient::forget_dead_hosts();
+
+// When a function returns FALSE, an error code is set.
+// This funtion will return the error code.
+// See error_string()
+// returns last error code set
+MemCachedClient::error()
+
+// Returns a string describing the error set in error()
+// See error()
+// returns a string describing the error code given
+MemCachedClient::error_string()
+
+// Resets the error number and error string
+MemCachedClient::error_clear()
+
+Error codes are as follows:
+MC_ERR_NOT_ACTIVE // no active servers
+MC_ERR_SOCKET_WRITE // socket_write() failed
+MC_ERR_SOCKET_READ // socket_read() failed
+MC_ERR_SOCKET_CONNECT // failed to connect to host
+MC_ERR_DELETE // delete() did not recieve DELETED command
+MC_ERR_HOST_FORMAT // sock_to_host() invalid host format
+MC_ERR_HOST_DEAD // sock_to_host() host is dead
+MC_ERR_GET_SOCK // get_sock() failed to find a valid socket
+MC_ERR_SET // _set() failed to receive the STORED response
+MC_ERR_LOADITEM_HEADER // _load_items failed to receive valid data header
+MC_ERR_LOADITEM_END // _load_items failed to receive END response
+MC_ERR_LOADITEM_BYTES // _load_items bytes read larger than bytes available
+MC_ERR_GET // failed to get value associated with key
+
+// Turns compression on or off; 0=off, 1=on
+MemCacheClient::set_compression($setting)
+
+EXAMPLE:
+<?php
+require 'MemCachedClient.inc.php';
+
+// set the servers, with the last one having an integer weight value of 3
+$options["servers"] = array("10.0.0.15:11000","10.0.0.16:11001",array("10.0.0.17:11002", 3));
+$options["debug"] = false;
+
+$memc = new MemCachedClient($options);
+
+
+/***********************
+ * STORE AN ARRAY
+ ***********************/
+$myarr = array("one","two", 3);
+$memc->set("key_one", $myarr);
+$val = $memc->get("key_one");
+print $val[0]."\n"; // prints 'one'
+print $val[1]."\n"; // prints 'two'
+print $val[2]."\n"; // prints 3
+
+
+print "\n";
+
+
+/***********************
+ * STORE A CLASS
+ ***********************/
+class tester
+{
+ var $one;
+ var $two;
+ var $three;
+}
+
+$t = new tester;
+$t->one = "one";
+$t->two = "two";
+$t->three = 3;
+$memc->set("key_two", $t);
+$val = $memc->get("key_two");
+print $val->one."\n";
+print $val->two."\n";
+print $val->three."\n";
+
+
+print "\n";
+
+
+/***********************
+ * STORE A STRING
+ ***********************/
+$memc->set("key_three", "my string");
+$val = $memc->get("key_three");
+print $val; // prints 'my string'
+
+$memc->delete("key_one");
+$memc->delete("key_two");
+$memc->delete("key_three");
+
+$memc->disconnect_all();
+
+
+
+print "\n";
+
+
+/***********************
+ * STORE A BINARY FILE
+ ***********************/
+
+ // first read the file and save it in memcache
+$fp = fopen( "./image.jpg", "rb" ) ;
+if ( !$fp )
+{
+ print "Could not open ./file.dat!\n" ;
+ exit ;
+}
+$data = fread( $fp, filesize( "./image.jpg" ) ) ;
+fclose( $fp ) ;
+print "Data length is " . strlen( $data ) . "\n" ;
+$memc->set( "key", $data ) ;
+
+// now open a file for writing and write the data
+// retrieved from memcache
+$fp = fopen("./test.jpg","wb");
+$data = $memc->get( "key" ) ;
+print "Data length is " . strlen( $data ) . "\n" ;
+fwrite($fp,$data,strlen( $data ));
+fclose($fp);
+
+
+?>
+
+
diff --git a/www/wiki/docs/php-memcached/README b/www/wiki/docs/php-memcached/README
new file mode 100644
index 00000000..07812dda
--- /dev/null
+++ b/www/wiki/docs/php-memcached/README
@@ -0,0 +1 @@
+HTML documentation is under http://phpca.cytherianage.net/memcached/doc/
diff --git a/www/wiki/docs/schema.txt b/www/wiki/docs/schema.txt
new file mode 100644
index 00000000..7a92d0a6
--- /dev/null
+++ b/www/wiki/docs/schema.txt
@@ -0,0 +1,9 @@
+The most up-to-date schema for the tables in the database
+will always be "tables.sql" in the maintenance directory,
+which is called from the installation script.
+
+That file has been commented with details of the usage for
+each table and field.
+
+Historical information and some other notes are available at
+https://www.mediawiki.org/wiki/Manual:Database_layout
diff --git a/www/wiki/docs/scripts.txt b/www/wiki/docs/scripts.txt
new file mode 100644
index 00000000..53dff36e
--- /dev/null
+++ b/www/wiki/docs/scripts.txt
@@ -0,0 +1,52 @@
+scripts.txt
+
+MediaWiki primary scripts are in the root directory of the software. Users
+should only use these scripts to access the wiki. There are also some .php that
+aren't primary scripts but helper files and won't work if they are accessed
+directly by the web.
+
+Primary scripts:
+
+ index.php
+ Main access point. It handles the most of requests.
+ See https://www.mediawiki.org/wiki/Manual:Index.php
+
+ api.php
+ Script to provide an API for bots to fetch content and informations about
+ the site and also modify it. See https://www.mediawiki.org/wiki/API
+ for more informations.
+
+ img_auth.php
+ Script that only serve images to logged in users. To configure the wiki
+ to use that script, see https://www.mediawiki.org/wiki/Manual:Image_Authorisation.
+
+ load.php
+ Used by ResourceLoader to serve minified, concatenated and gzipped CSS and JS.
+
+ opensearch_desc.php
+ Returns a OpenSearch description document (see http://www.opensearch.org/)
+ that points to the search engines of the wiki.
+
+ profileinfo.php
+ Allow users to see the profiling information that are stored in the
+ database.
+
+ To save the profiling information in the database (required to use this
+ script), you have to modify StartProfiler.php to use the Profiler class and
+ not the stub profiler which is enabled by default.
+ You will also need to set $wgProfiler['output'] to 'db' in LocalSettings.php
+ to force the profiler to save the informations in the database and apply the
+ maintenance/archives/patch-profiling.sql patch to the database.
+
+ To enable the profileinfo.php itself, you'll need to set $wgDBadminuser
+ and $wgDBadminpassword in your LocalSettings.php, as well as $wgEnableProfileInfo
+ See also https://www.mediawiki.org/wiki/Manual:Profiling .
+
+ thumb.php
+ Script used to resize images if it is configured to be done when the web
+ browser requests the image and not when generating the page. This script can
+ be used as a 404 handler to generate image thumbs when they don't exist.
+
+There is also a file with a .php5 extension for each script. They can be used if
+the web server needs a .php5 to run the file with the PHP 5 engine and runs .php
+scripts with PHP 4. You should not use them anymore.
diff --git a/www/wiki/docs/sitelist-1.0.xsd b/www/wiki/docs/sitelist-1.0.xsd
new file mode 100644
index 00000000..126cd039
--- /dev/null
+++ b/www/wiki/docs/sitelist-1.0.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ used by MediaWiki's exportSites.php and importSites.php
+ scripts.
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mwsl="http://www.mediawiki.org/xml/sitelist-1.0/"
+ targetNamespace="http://www.mediawiki.org/xml/sitelist-1.0/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's export format for site definitions.
+ </documentation>
+ </annotation>
+
+ <!-- Our root element -->
+ <element name="sites" type="mwsl:MediaWikiSiteListType">
+ <unique name="GlobalIDConstraint">
+ <selector xpath="mwsl:Site" />
+ <field xpath="mwsl:GlobalID" />
+ </unique>
+ </element>
+
+ <simpleType name="EmptyTagType">
+ <restriction base="string">
+ <length value="0"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="TypedIDType">
+ <simpleContent>
+ <extension base="NCName">
+ <attribute name="type" use="required" type="NCName" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="TypedURIType">
+ <simpleContent>
+ <extension base="anyURI">
+ <attribute name="type" use="required" type="NCName" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="MediaWikiSiteListType">
+ <sequence>
+ <element name="site" type="mwsl:SiteType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="version" type="string" use="optional" />
+ </complexType>
+
+ <complexType name="SiteType">
+ <choice maxOccurs="unbounded">
+ <element name="globalid" type="ID" minOccurs="1" maxOccurs="1" />
+ <element name="localid" type="mwsl:TypedIDType" minOccurs="0" />
+ <element name="group" type="NCName" minOccurs="0" maxOccurs="1" />
+ <element name="source" type="NCName" minOccurs="0" maxOccurs="1" />
+ <element name="forward" type="mwsl:EmptyTagType" minOccurs="0" maxOccurs="1" />
+ <element name="path" type="mwsl:TypedURIType" minOccurs="0" />
+ </choice>
+ <attribute name="type" use="optional" type="NCName" />
+ </complexType>
+
+</schema>
diff --git a/www/wiki/docs/sitelist.txt b/www/wiki/docs/sitelist.txt
new file mode 100644
index 00000000..24e1b9a7
--- /dev/null
+++ b/www/wiki/docs/sitelist.txt
@@ -0,0 +1,47 @@
+This document describes the XML format used to represent information about external sites known
+to a MediaWiki installation. This information about external sites is used to allow "inter-wiki"
+links, cross-language navigation, as well as close integration via direct access to the other
+site's web API or even directly to their database.
+
+Lists of external sites can be imported and exported using the importSites.php and exportSites.php
+scripts. In the database, external sites are described by the sites and site_ids tables.
+
+The formal specification of the format used by importSites.php and exportSites.php can be found in
+the sitelist-1.0.xsd file. Below is an example and a brief description of what the individual XML
+elements and attributes mean:
+
+
+ <sites version="1.0">
+ <site>
+ <globalid>acme.com</globalid>
+ <localid type="interwiki">acme</localid>
+ <group>Vendor</group>
+ <path type="link">http://acme.com/</path>
+ <source>meta.wikimedia.org</source>
+ </site>
+ <site type="mediawiki">
+ <globalid>de.wikidik.example</globalid>
+ <localid type="equivalent">de</localid>
+ <group>Dictionary</group>
+ <forward/>
+ <path type="page_path">http://acme.com/</path>
+ </site>
+ </sites>
+
+
+The XML elements are used as follows:
+
+* sites: The root element, containing a set of site tags. May have a version attribute with the value 1.0.
+* site: A site entry, representing an external website. May have a type attribute with one of the following values:
+** ''unknown'': (default) any website
+** ''mediawiki'': A MediaWiki site
+* globalid: A unique identifier for the site. For a given site, the same unique global ID must be used across all wikis in a wiki farm (aka wiki family).
+* localid: An identifier for the site, for use on the local wiki. Multiple local IDs may be assigned to a given site. The same local ID can be used to refer to different sites by different wikis on the same farm/family. The localid element may have a type attribute with one of the following values:
+** interwiki: Used as an "interwiki" link prefix, for creating cross-wiki links.
+** equivalent: Used as a "language" link prefix, for cross-linking equivalent content in different languages.
+* group: The site group (e.g. wiki family) the site belongs to.
+* path: A URL template for accessing resources on the site. Several paths may be defined for a given site, for accessing different kinds of resources, identified by the type attribute, using one of the following values:
+** link: Generic URL template, often the document root.
+** page_path: (for mediawiki sites) URL template for wiki pages (corresponds to the target wiki's $wgArticlePath setting)
+** file_path: (for mediawiki sites) URL pattern for application entry points and resources (corresponds to the target wiki's $wgScriptPath setting).
+* forward: Whether using a prefix defined by a localid tag in the URL will cause the request to be redirected to the corresponding page on the target wiki (currently unused). E.g. whether http://wiki.acme.com/wiki/foo:Buzz should be forwarded to http://wiki.foo.com/read/Buzz. (CAVEAT: not yet implement, can be specified but has no effect)
diff --git a/www/wiki/docs/sitescache.txt b/www/wiki/docs/sitescache.txt
new file mode 100644
index 00000000..13bf371d
--- /dev/null
+++ b/www/wiki/docs/sitescache.txt
@@ -0,0 +1,42 @@
+MediaWiki's SiteStore can be cached and stored in a flat file,
+in a json format. If the SiteStore is frequently accessed, the
+file cache may provide a performance benefit over a database
+store, even with memcached in front of it.
+
+Configuration:
+
+File-based caching can be enabled by setting $wgSitesCacheFile
+to the file path of the cache file.
+
+The file can then be generated with the rebuildSitesCache.php
+maintenance script.
+
+Format:
+
+In the sites cache file, sites are listed in a key-value
+map, with the key being the site's global id (e.g. "enwiki")
+and a key-value map as the value. The site list is wrapped
+with in a "sites" key.
+
+Example:
+
+"sites": {
+ "aawiktionary": {
+ "globalid": "aawiktionary",
+ "type": "mediawiki",
+ "group": "wiktionary",
+ "source": "local",
+ "language": "aa",
+ "localids": [],
+ "config": [],
+ "data": {
+ "paths": {
+ "file_path": "http:\/\/aa.wiktionary.org\/w\/$1",
+ "page_path": "http:\/\/aa.wiktionary.org\/wiki\/$1"
+ }
+ },
+ "forward": false,
+ "internalid": 2666,
+ "identifiers": []
+ }
+}
diff --git a/www/wiki/docs/skin.txt b/www/wiki/docs/skin.txt
new file mode 100644
index 00000000..a3c8c334
--- /dev/null
+++ b/www/wiki/docs/skin.txt
@@ -0,0 +1,82 @@
+skin.txt
+
+MediaWiki includes four core skins:
+
+* Vector: The default skin. Introduced in the 1.16 release (2010), it has been
+ set as the default in MediaWiki since the 1.17 release (2011), replacing
+ Monobook.
+
+* Monobook: Named after the black-and-white photo of a book in the page
+ background. Introduced in the 2004 release of 1.3, it had been the
+ default skin since then, before being replaced by Vector.
+
+* Modern: An attractive blue/grey theme with sidebar and top bar. Derived from
+ Monobook.
+
+* Cologne Blue: A lightweight skin with minimal formatting. The oldest of the
+ currently bundled skins, largely rewritten in 2012 while keeping its
+ appearance.
+
+
+Several legacy skins were removed in the 1.22 release, as the burden of
+supporting them became too heavy to bear. Those were:
+
+* Standard (a.k.a. Classic): The old default skin written by Lee Crocker during
+ the phase 3 rewrite, in 2002.
+
+* Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
+ This skin is now used for the old Wikipedia snapshot at
+ http://nostalgia.wikipedia.org/
+
+* Chick: A lightweight Monobook skin with no sidebar. The sidebar links were
+ given at the bottom of the page instead.
+
+* Simple: A lightweight skin with a simple white-background sidebar and no top
+ bar.
+
+* MySkin: Essentially Monobook without the CSS. The idea was that it could be
+ customised using user-specific or site-wide CSS (see below).
+
+
+== Custom CSS/JS ==
+
+It is possible to customise the site CSS and JavaScript without editing any
+server-side source files. This is done by editing some pages on the wiki:
+
+* [[MediaWiki:Common.css]] -- for skin-independent CSS
+* [[MediaWiki:Common.js]] -- for skin-independent JavaScript
+* [[MediaWiki:Vector.css]], [[MediaWiki:Monobook.css]], etc. -- for
+ skin-dependent CSS
+* [[MediaWiki:Vector.js]], [[MediaWiki:Monobook.js]], etc. -- for
+ skin-dependent JavaScript
+
+These can also be customised on a per-user basis, by editing
+[[User:<name>/vector.css]], [[User:<name>/vector.js]], etc.
+
+
+== Custom skins ==
+
+Several custom skins are available as of 2014.
+
+https://www.mediawiki.org/wiki/Category:All_skins
+
+Installing a skin requires adding its files in a subdirectory under skins/ and
+adding an appropriate require_once line to LocalSettings.php, similarly to how
+extensions are installed.
+
+You can then make that skin the default by adding:
+ $wgDefaultSkin = '<name>';
+
+Or disable it entirely by removing the require_once line. (User settings will
+not be lost if it's reenabled later.)
+
+See https://www.mediawiki.org/wiki/Manual:Skinning for more information on
+writing new skins.
+
+
+Until MediaWiki 1.25 it used to be possible to just put a <name>.php file in
+MediaWiki's skins/ directory, which would be loaded and expected to contain the
+Skin<name> class. This way has always been discouraged because of its limitations
+(inability to add localisation messages, ResourceLoader modules, etc.) and
+awkwardness in managing such skins. For information on migrating skins using
+this old method, see <https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery>.
diff --git a/www/wiki/docs/title.txt b/www/wiki/docs/title.txt
new file mode 100644
index 00000000..454711dc
--- /dev/null
+++ b/www/wiki/docs/title.txt
@@ -0,0 +1,67 @@
+title.txt
+
+The MediaWiki software's "Title" class represents article titles, which are used
+for many purposes: as the human-readable text title of the article, in the URL
+used to access the article, the wikitext link to the article, the key into the
+article database, and so on. The class in instantiated from one of these forms
+and can be queried for the others, and for other attributes of the title. This
+is intended to be an immutable "value" class, so there are no mutator functions.
+
+To get a new instance, call Title::newFromText(). Once instantiated, the
+non-static accessor methods can be used, such as getText(), getDBkey(),
+getNamespace(), etc. Note that Title::newFromText() may return false if the text
+is illegal according to the rules below.
+
+The prefix rules: a title consists of an optional interwiki prefix (such as "m:"
+for meta or "de:" for German), followed by an optional namespace, followed by
+the remainder of the title. Both interwiki prefixes and namespace prefixes have
+the same rules: they contain only letters, digits, space, and underscore, must
+start with a letter, are case insensitive, and spaces and underscores are
+interchangeable. Prefixes end with a ":". A prefix is only recognized if it is
+one of those specifically allowed by the software. For example, "de:name" is a
+link to the article "name" in the German Wikipedia, because "de" is recognized
+as one of the allowable interwikis. The title "talk:name" is a link to the
+article "name" in the "talk" namespace of the current wiki, because "talk" is a
+recognized namespace. Both may be present, and if so, the interwiki must
+come first, for example, "m:talk:name". If a title begins with a colon as its
+first character, no prefixes are scanned for, and the colon is just removed.
+Note that because of these rules, it is possible to have articles with colons in
+their names. "E. Coli 0157:H7" is a valid title, as is "2001: A Space Odyssey",
+because "E. Coli 0157" and "2001" are not valid interwikis or namespaces.
+
+It is not possible to have an article whose bare name includes a namespace or
+interwiki prefix.
+
+An initial colon in a title listed in wiki text may however suppress special
+handling for interlanguage links, image links, and category links. It is also
+used to indicate the main namespace in template inclusions.
+
+Once prefixes have been stripped, the rest of the title processed this way:
+
+* Spaces and underscores are treated as equivalent and each is converted to the
+ other in the appropriate context (underscore in URL and database keys, spaces
+ in plain text).
+* Multiple consecutive spaces are converted to a single space.
+* Leading or trailing space is removed.
+* If $wgCapitalLinks is enabled (the default), the first letter is capitalised,
+ using the capitalisation function of the content language object.
+* The unicode characters LRM (U+200E) and RLM (U+200F) are silently stripped.
+* Invalid UTF-8 sequences or instances of the replacement character (U+FFFD) are
+ considered illegal.
+* A percent sign followed by two hexadecimal characters is illegal
+* Anything that looks like an XML/HTML character reference is illegal
+* Any character not matched by the $wgLegalTitleChars regex is illegal
+* Zero-length titles (after whitespace stripping) are illegal
+
+All titles except special pages must be less than 255 bytes when encoded with
+UTF-8, because that is the size of the database field. Special page titles may
+be up to 512 bytes.
+
+Note that Unicode Normal Form C (NFC) is enforced by MediaWiki's user interface
+input functions, and so titles will typically be in this form.
+
+getArticleID() needs some explanation: for "internal" articles, it should return
+the "page_id" field if the article exists, else it returns 0. For all external
+articles it returns 0. All of the IDs for all instances of Title created during
+a request are cached, so they can be looked up quickly while rendering wiki text
+with lots of internal links. See linkcache.txt.
diff --git a/www/wiki/docs/uidesign/child-selector-emu.html b/www/wiki/docs/uidesign/child-selector-emu.html
new file mode 100644
index 00000000..dedb3a67
--- /dev/null
+++ b/www/wiki/docs/uidesign/child-selector-emu.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CSS Child selector emulation for IE 6</title>
+ <style>
+ /** Common rules **/
+ body { background-color: #CCC; }
+ table { border:1px black solid; }
+ caption {
+ background-color: #98fb98;
+ border:1px solid #40FF40;
+ }
+
+ /** "old" rules" **/
+ table.global th,
+ table.global td
+ {
+ border: 1px red solid;
+ background-color:white;
+ padding:1em;
+ }
+ table.global th
+ {
+ background-color: #ffc0cb;
+ }
+
+ /** second table. Try to emulate child selector */
+ table.childemu th,
+ table.childemu td {
+ border: 1px red solid;
+ background-color:white;
+ padding:1em;
+ }
+ table.childemu th
+ {
+ background-color: #ffc0cb;
+ }
+
+ /** Reset style applied in childemu classes */
+ /** TODO: find the real default value!! */
+ table.childemu tr * th,
+ table.childemu tr * td {
+ border: none;
+ background-color: transparent;
+ padding: 0;
+ }
+
+
+ /** child selector emulation */
+ </style>
+</head>
+<body>
+<p>
+The following table show how nested tables inherit colors from the wikitable class (here it was renamed "global").
+</p>
+<table class="global">
+<caption>Global table</caption>
+<tr>
+ <th>TH: should have pink bg</th>
+</tr>
+<tr>
+ <td>TD: white bg</td>
+</tr>
+<tr>
+ <td>
+ <table class="nested">
+ <caption>Nested table</caption>
+ <tr>
+ <th>Nested TH: transparent</th>
+ <td>Nested TD: transparent</td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+
+<p>
+With child selector we could limit the wikitable styling to the direct childs of the table. Unfortunately, Internet Explorer 6.0 does not support child selector. See <a href="https://bugzilla.wikimedia.org/show_bug.cgi?id=33752">our bug #33752</a>.
+</p>
+<table class="childemu">
+<caption>Global table</caption>
+<tr>
+ <th>TH: should have pink bg</th>
+</tr>
+<tr>
+ <td>TD: white bg</td>
+</tr>
+<tr>
+ <td>
+ <table class="nested">
+ <caption>Nested table</caption>
+ <tr>
+ <th>Nested TH: transparent</th>
+ <td>Nested TD: transparent</td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+<p><strong>NOTE:</strong>The nested caption keep the green background. The nested table keep the black border. This is because those declarations are global so we did not reset them.</p>
diff --git a/www/wiki/docs/uidesign/confirmable.html b/www/wiki/docs/uidesign/confirmable.html
new file mode 100644
index 00000000..d0358214
--- /dev/null
+++ b/www/wiki/docs/uidesign/confirmable.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+ <meta charset="utf-8">
+ <!--
+ The jquery.confirmable module uses some additional modules and files
+ for internationalization support. These are omitted here for simplicity.
+ -->
+ <script type="text/javascript" src="../../resources/lib/jquery/jquery.js"></script>
+ <link rel="stylesheet" href="../../resources/src/jquery/jquery.confirmable.css">
+ <script type="text/javascript" src="../../resources/src/jquery/jquery.confirmable.js"></script>
+ <style>
+ body {
+ font: small sans-serif;
+ }
+ .mw-rollback-link a,
+ .mw-unwatch-link a,
+ .mw-thanks-thank-link a {
+ background: #ccf;
+ }
+ </style>
+</head>
+<body>
+ <h2>Introduction</h2>
+
+ <p>The jquery.confirmable module provides a simple inline confirmation script for potentially destructive or uncancellable actions.</p>
+
+ <p>Possible uses include confirmable "rollback" links in histories, confirmable "unwatch" links on watchlists, or confirmable "thanks" links (provided by the Echo extension).</p>
+
+ <p>Shown below is a demo of how each of those could work on history and watchlist entries, in an LTR and RTL language. The enhanced links are highlighted in blue.</p>
+
+ <h2>Examples</h2>
+
+ <h3>LTR (English)</h3>
+
+ <p>Watchlist:</p>
+
+ <ul lang="en" dir="ltr">
+ <li class="mw-line-even mw-changeslist-line-not-watched">
+ (<a href="#">diff</a> | <a href="#">hist</a>)
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="mw-title"><a href="#" class="mw-changeslist-title">Example page</a></span>; <span class="mw-changeslist-date">13:38</span>
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="mw-plusminus-neg">(-130)</span>
+ <span class="mw-changeslist-separator">. .</span>
+ <a href="#" class="mw-userlink">Example user</a>
+ <span class="mw-usertoollinks">(<a href="#">Talk</a> | <a href="#">contribs</a> | <a href="#">block</a>)</span>
+ <span class="comment">(example edit)</span>
+ <span class="mw-rollback-link">[<a href="https://www.mediawiki.org/wiki/Random_ideas_for_rollback_to_be_shelved_and_forgotten_about">rollback</a>]</span>
+ (<span class="mw-unwatch-link"><a href="#">unwatch</a></span>)
+ </li>
+ </ul>
+
+ <p>History:</p>
+
+ <ul lang="en" dir="ltr">
+ <li>
+ <span class="mw-history-histlinks">(cur | <a href="#">prev</a>)</span>
+ <input type="radio" style="visibility: hidden;" /><input type="radio" checked />
+ <a href="#" class="mw-changeslist-date">13:38, 28 October 2013</a>
+ <span class='history-user'>
+ <a href="#" class="mw-userlink">Example user</a>
+ <span class="mw-usertoollinks">(<a href="#">Talk</a> | <a href="#">contribs</a> | <a href="#">block</a>)</span>
+ </span>
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="history-size">(1,654 bytes)</span>
+ <span class="mw-plusminus-neg">(-130)</span>
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="comment">(example edit)</span>
+ (<span class="mw-rollback-link"><a href="https://www.mediawiki.org/wiki/Random_ideas_for_rollback_to_be_shelved_and_forgotten_about">rollback 1 edit</a></span> | <span class="mw-history-undo"><a href="#">undo</a></span> | <span class="mw-thanks-thank-link"><a href="#">thank</a></span>)
+ </li>
+ </ul>
+
+ <script type="text/javascript">
+ $( 'ul[lang="en"] .mw-rollback-link a' )
+ .confirmable({ i18n: { confirm: 'Are you sure you want to rollback?' } });
+ $( 'ul[lang="en"] .mw-unwatch-link a' )
+ .confirmable({ handler: function(){ alert('Unwatched!') } });
+ $( 'ul[lang="en"] .mw-thanks-thank-link a' )
+ .confirmable({ handler: function(){ alert('Thanked!') } });
+ </script>
+
+ <h3>RTL (Hebrew)</h3>
+ <!-- All of the Hebrew text below has been basically pulled out of my hat. -->
+
+ <p>Watchlist:</p>
+
+ <ul lang="he" dir="rtl">
+ <li class="mw-line-even mw-changeslist-line-not-watched">
+ (<a href="#">הבדל</a> | <a href="#">היסטוריה</a>)
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="mw-title"><a href="#" class="mw-changeslist-title">דף דוגמה</a></span>; <span class="mw-changeslist-date">13:38</span>
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="mw-plusminus-neg">(-57)</span>
+ <span class="mw-changeslist-separator">. .</span>
+ <a href="#" class="mw-userlink">דוגמא אדם</a>
+ <span class="mw-usertoollinks">(<a href="#">שיחה</a> | <a href="#">תרומות</a> | <a href="#">חסימה</a>)</span>
+ <span class="comment">(עריכה לדוגמה)</span>
+ <span class="mw-rollback-link">[<a href="https://www.mediawiki.org/wiki/Random_ideas_for_rollback_to_be_shelved_and_forgotten_about">שחזור</a>]</span>
+ (<span class="mw-unwatch-link"><a href="#">הפסקת מעקב</a></span>)
+ </li>
+ </ul>
+
+ <p>History:</p>
+
+ <ul lang="he" dir="rtl">
+ <li>
+ <span class="mw-history-histlinks">(נוכחית | <a href="#">קודמת</a>)</span>
+ <input type="radio" style="visibility: hidden;" /><input type="radio" checked />
+ <a href="#" class="mw-changeslist-date">23:41, 12 במאי 2012</a>
+ <span class='history-user'>
+ <a href="#" class="mw-userlink">דוגמא אדם</a>
+ <span class="mw-usertoollinks">(<a href="#">שיחה</a> | <a href="#">תרומות</a> | <a href="#">חסימה</a>)</span>
+ </span>
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="history-size">(1,762 בתים)</span>
+ <span class="mw-plusminus-neg">(-57)</span>
+ <span class="mw-changeslist-separator">. .</span>
+ <span class="comment">(עריכה לדוגמה)</span>
+ (<span class="mw-rollback-link"><a href="https://www.mediawiki.org/wiki/Random_ideas_for_rollback_to_be_shelved_and_forgotten_about">שחזור עריכה אחת</a></span> | <span class="mw-history-undo"><a href="#">ביטול</a></span> | <span class="mw-thanks-thank-link"><a href="#">תודה</a></span>)
+ </li>
+ </ul>
+
+ <script type="text/javascript">
+ var hebrewI18n = {
+ confirm: 'האם ברצונך להמשיך?',
+ yes: 'כן',
+ no: 'לא',
+ }
+
+ $( 'ul[lang="he"] .mw-rollback-link a' )
+ .confirmable({ i18n: $.extend( {}, hebrewI18n, { confirm: 'האם ברצונך לשחזר?' } ) });
+ $( 'ul[lang="he"] .mw-unwatch-link a' )
+ .confirmable({ i18n: hebrewI18n, handler: function(){ alert('Unwatched!') } });
+ $( 'ul[lang="he"] .mw-thanks-thank-link a' )
+ .confirmable({ i18n: hebrewI18n, handler: function(){ alert('Thanked!') } });
+ </script>
+ <style type="text/css">
+ /* This is normally handled by CSSJanus. */
+ ul[dir=rtl] .jquery-confirmable-button {
+ margin-left: 0;
+ margin-right: 1ex;
+ }
+ </style>
+</body>
+</html>
+
diff --git a/www/wiki/docs/uidesign/design.html b/www/wiki/docs/uidesign/design.html
new file mode 100644
index 00000000..6ab57d7d
--- /dev/null
+++ b/www/wiki/docs/uidesign/design.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+ <link rel="stylesheet" href="../../resources/src/mediawiki.legacy/shared.css">
+ <link rel="stylesheet" href="../../resources/src/mediawiki/mediawiki.feedlink.css">
+</head>
+<body style="font-size: small;">
+
+ <h2>Messages</h2>
+ <p class="success">Success message</p>
+ <p class="warning">Warning message</p>
+ <p class="error">Error message</p>
+
+ <h2>Messages box</h2>
+ <p class="visualClear successbox">Success message</p>
+ <p class="visualClear warningbox">Warning message</p>
+ <p class="visualClear errorbox">Error message</p>
+
+ <br class="visualClear"/>
+ <h2>Various</h2>
+ <span class="comment">span.comment</span>
+ <a class="feedlink">a.feedlink</a>
+ <table class="wikitable">
+ <tr><th colspan="2">table.wikitable</th></tr>
+ <tr><td>cell</td><td>cell</td></tr>
+ <tr><td>cell</td><td>cell</td></tr>
+ </table>
+
+ <table class="mw-datatable">
+ <tr><th colspan="2">table.mw-datatable</th></tr>
+ <tr><td>line with hover</td><td>line with hover</td></tr>
+ <tr><td>line with hover</td><td>line with hover</td></tr>
+ </table>
+
+</body>
+</html>
diff --git a/www/wiki/docs/uidesign/mediawiki.action.history.diff.html b/www/wiki/docs/uidesign/mediawiki.action.history.diff.html
new file mode 100644
index 00000000..615558f2
--- /dev/null
+++ b/www/wiki/docs/uidesign/mediawiki.action.history.diff.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.css">
+ <link rel="stylesheet" media="print" href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.print.css">
+</head>
+<body>
+
+<p>This show various styles for our diff action. Style sheet: <code><a href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.css">resources/src/mediawiki.action/mediawiki.action.history.diff.css</a></code>.</p>
+<p>This file might help us fix our diff colors which have been a recurring issues among the community for a loooong time.</p>
+<p>Try it out in print mode, too. Style sheet: <code><a href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.print.css">resources/src/mediawiki.action/mediawiki.action.history.diff.print.css</a></code>.</p>
+
+<p>Practical example copied from MediaWiki's HTML output:</p>
+
+<table class="diff diff-contentalign-left">
+ <colgroup><col class="diff-marker">
+ <col class="diff-content">
+ <col class="diff-marker">
+ <col class="diff-content">
+ </colgroup>
+<tbody>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"><div>Lorem ipsum dolor sit amet<del class="diffchange diffchange-inline">, consectetur adipisicing elit</del>, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div></td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"><div>Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div></td>
+</tr>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"></td>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+</tr>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"><div>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div></td>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+</tr>
+<tr>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+</tr>
+<tr>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"><div>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</div></td>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"><div>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</div></td>
+</tr>
+<tr>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+</tr>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"><div>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim<del class="diffchange diffchange-inline"> id est laborum</del>.</div></td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"><div>Excepteur sint occaecat cupidatat non proident, sunt<ins class="diffchange diffchange-inline"> reprehenderit in voluptate</ins> in culpa qui officia deserunt mollit anim.</div></td>
+</tr>
+<tr>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"></td>
+</tr>
+<tr>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"><div>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div></td>
+</tr>
+</tbody></table>
+
+<p>Below are some basic lines being applied one or two classes. Mainly for debugging purposes.</p>
+
+<table class="diff">
+ <tr><th>Diff</th></tr>
+
+ <tr><td class="diff-addedline"><code>diff-addedline</code>: added line</td></tr>
+ <tr><td class="diff-deletedline"><code>diff-deletedline</code>: deleted line</td></tr>
+ <tr><td class="diff-context"><code>diff-context</code>: context</td></tr>
+
+ <tr><th>Same as above with a <code>&lt;ins&gt;</code> or <code>&lt;del&gt;</code> child element having the <code>diffchange</code> class:</th></tr>
+
+ <tr><td class="diffchange">Diffchange</td></tr>
+ <tr><td class="diff-addedline"><ins class="diffchange">Added line + diffchange</ins></td></tr>
+ <tr><td class="diff-deletedline"><del class="diffchange">Deleted line + diffchange</del></td></tr>
+</table>
+
+</body>
+</html>
diff --git a/www/wiki/docs/uidesign/mediawiki.diff.html b/www/wiki/docs/uidesign/mediawiki.diff.html
new file mode 100644
index 00000000..0372595c
--- /dev/null
+++ b/www/wiki/docs/uidesign/mediawiki.diff.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="../../resources/src/mediawiki/mediawiki.diff.styles.css">
+ <link rel="stylesheet" media="print" href="../../resources/src/mediawiki/mediawiki.diff.styles.print.css">
+</head>
+<body>
+
+<p>This show various styles for our diff action. Style sheet: <code><a href="../../resources/src/mediawiki/mediawiki.diff.styles.css">resources/src/mediawiki/mediawiki.diff.styles.css</a></code>.</p>
+<p>This file might help us fix our diff colors which have been a recurring issues among the community for a loooong time.</p>
+<p>Try it out in print mode, too. Style sheet: <code><a href="../../resources/src/mediawiki/mediawiki.diff.styles.print.css">resources/src/mediawiki/mediawiki.diff.styles.print.css</a></code>.</p>
+
+<p>Practical example copied from MediaWiki's HTML output:</p>
+
+<table class="diff diff-contentalign-left">
+ <colgroup><col class="diff-marker">
+ <col class="diff-content">
+ <col class="diff-marker">
+ <col class="diff-content">
+ </colgroup>
+<tbody>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"><div>Lorem ipsum dolor sit amet<del class="diffchange diffchange-inline">, consectetur adipisicing elit</del>, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div></td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"><div>Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div></td>
+</tr>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"></td>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+</tr>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"><div>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div></td>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+</tr>
+<tr>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+</tr>
+<tr>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"><div>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</div></td>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"><div>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</div></td>
+</tr>
+<tr>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+ <td class="diff-marker">&nbsp;</td>
+ <td class="diff-context"></td>
+</tr>
+<tr>
+ <td class="diff-marker">−</td>
+ <td class="diff-deletedline"><div>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim<del class="diffchange diffchange-inline"> id est laborum</del>.</div></td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"><div>Excepteur sint occaecat cupidatat non proident, sunt<ins class="diffchange diffchange-inline"> reprehenderit in voluptate</ins> in culpa qui officia deserunt mollit anim.</div></td>
+</tr>
+<tr>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"></td>
+</tr>
+<tr>
+ <td colspan="2" class="diff-empty">&nbsp;</td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"><div>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div></td>
+</tr>
+</tbody></table>
+
+<p>Below are some basic lines being applied one or two classes. Mainly for debugging purposes.</p>
+
+<table class="diff">
+ <tr><th>Diff</th></tr>
+
+ <tr><td class="diff-addedline"><code>diff-addedline</code>: added line</td></tr>
+ <tr><td class="diff-deletedline"><code>diff-deletedline</code>: deleted line</td></tr>
+ <tr><td class="diff-context"><code>diff-context</code>: context</td></tr>
+
+ <tr><th>Same as above with a <code>&lt;ins&gt;</code> or <code>&lt;del&gt;</code> child element having the <code>diffchange</code> class:</th></tr>
+
+ <tr><td class="diffchange">Diffchange</td></tr>
+ <tr><td class="diff-addedline"><ins class="diffchange">Added line + diffchange</ins></td></tr>
+ <tr><td class="diff-deletedline"><del class="diffchange">Deleted line + diffchange</del></td></tr>
+</table>
+
+</body>
+</html>
diff --git a/www/wiki/docs/uidesign/monospace.html b/www/wiki/docs/uidesign/monospace.html
new file mode 100644
index 00000000..f2b988e2
--- /dev/null
+++ b/www/wiki/docs/uidesign/monospace.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+ <style>
+ pre {
+ border: 1px dashed #AAA;
+ background-color: #E0E0E0;
+ color: #000000;
+ margin: 1em 10%;
+ padding: 0.5em;
+ }
+ blockquote {
+ font-style: italic;
+ }
+ </style>
+</head>
+<body>
+<p>
+This page let you test the rendering font-family declaration for monospaced fonts. TODO: add some references here :-)
+</p>
+<p>
+Erwin Dokter had the following explanation on <a href="https://bugzilla.wikimedia.org/33496">Bugzilla #33496</a>:
+</p>
+<blockquote>
+By default, a (Windows) browser has it's default font-sizes set at 16px for
+serif and sans-serif, and 13px for monospace. Except in IE, where you cannot
+set any font-sizes... it uses 16px for all fonts.
+<br/>
+Vector has a base font-size of 0.8em, and most browsers *correctly* scale down
+all fonts, including the monospace font, accordingly. So monospace is shown at
+0.8 x 13px = 10px (which is perceived as 'too small'). But when you assign any
+font besides just "monospace", those browsers will no longer treat it as
+monospace and use 0.8 x 16px = 13px instead.
+</blockquote>
+<p>
+Below are various rendering:
+</p>
+
+<pre style='
+font-family: monospace;'>
+font-family: monospace;
+</pre>
+
+<pre style='
+font-family: "Courier New";'>
+font-family: "Courier New";
+</pre>
+
+<pre style='
+font-family: Courier;'>
+font-family: Courier;
+</pre>
+
+<pre style='
+font-family: monospace, monospace;'>
+font-family: monospace, monospace;
+</pre>
+
+<pre style='
+font-family: monospace, "Courier New";'>
+font-family: monospace, "Courier New";
+</pre>
+
+<pre style='
+font-family: monospace, Courier;'>
+font-family: monospace, Courier;
+</pre>
+
+<pre style='
+font-family: monospace, Verdana;'>
+font-family: monospace, Verdana;
+</pre>
+
+<pre style='
+font-family: monospace, DOESNOTEXISTREALLY;'>
+font-family: monospace, DOESNOTEXISTREALLY;
+</pre>
diff --git a/www/wiki/docs/uidesign/table-layout.html b/www/wiki/docs/uidesign/table-layout.html
new file mode 100644
index 00000000..2c268199
--- /dev/null
+++ b/www/wiki/docs/uidesign/table-layout.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <style>
+ /** This is just for coloring: */
+ table { border: 1px solid #CC0; }
+ td { border: 1px solid #CCC; }
+
+ table {
+ width: 100%;
+ table-layout: fixed;
+ }
+
+ #first {
+ width: 300px;
+ }
+ </style>
+</head>
+<body>
+
+<p>
+This play with table-layout:fixed; and applying the width to colgroup or col element. Firefox only recongize the width if it is applied on col element!</p>
+<p>
+On a perfect browser, both tables should look the same</p>
+
+<dl>
+ <dt>colgroup</dt>
+ <dd>300 px width is applied to the first colgroup element</dd>
+</dl>
+<div style="width: 400px;">
+<table>
+ <colgroup id="first" /></colgroup>
+ <colgroup id="second"/></colgroup>
+ <colgroup id="third" /></colgroup>
+ <tr>
+ <td>Very long?</td>
+ <td>#</td>
+ <td>$</td>
+ </tr>
+</table>
+</div>
+
+<dl>
+ <dt>col</dt>
+ <dd>Each colgroup has an additional col element. The first col element is applied the 300 px width</dd>
+</dl>
+
+<div style="width: 400px;">
+<table>
+ <colgroup><col id="first" /></colgroup>
+ <colgroup><col id="second"/></colgroup>
+ <colgroup><col id="third" /></colgroup>
+ <tr>
+ <td>Very long?</td>
+ <td>#</td>
+ <td>$</td>
+ </tr>
+</table>
+</div>