diff options
author | Yaco <franco@reevo.org> | 2019-01-06 00:20:37 -0300 |
---|---|---|
committer | Yaco <franco@reevo.org> | 2019-01-06 00:20:37 -0300 |
commit | dab3fd4a501df5c3fc30b4c9fe79bfada4415958 (patch) | |
tree | 3d1971414457ff62418a69b6a95bc4b4e93ab5e9 /www/wiki/docs | |
parent | 71ddfdcf197d529e0964059ad7b796913908f2b3 (diff) |
grandes avances previos al primer deployment en reevo.wiki
Diffstat (limited to 'www/wiki/docs')
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 "§ion=$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 + "<div ...>$1</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 "§ion=$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"> </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"> </td> +</tr> +<tr> + <td class="diff-marker"> </td> + <td class="diff-context"></td> + <td class="diff-marker"> </td> + <td class="diff-context"></td> +</tr> +<tr> + <td class="diff-marker"> </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"> </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"> </td> + <td class="diff-context"></td> + <td class="diff-marker"> </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"> </td> + <td class="diff-marker">+</td> + <td class="diff-addedline"></td> +</tr> +<tr> + <td colspan="2" class="diff-empty"> </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><ins></code> or <code><del></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"> </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"> </td> +</tr> +<tr> + <td class="diff-marker"> </td> + <td class="diff-context"></td> + <td class="diff-marker"> </td> + <td class="diff-context"></td> +</tr> +<tr> + <td class="diff-marker"> </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"> </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"> </td> + <td class="diff-context"></td> + <td class="diff-marker"> </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"> </td> + <td class="diff-marker">+</td> + <td class="diff-addedline"></td> +</tr> +<tr> + <td colspan="2" class="diff-empty"> </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><ins></code> or <code><del></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> |