<exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
<exclude name="Generic.Files.OneObjectStructurePerFile.MultipleFound" />
<exclude name="MediaWiki.VariableAnalysis.ForbiddenGlobalVariables.ForbiddenGlobal$wgTitle" />
- <exclude name="MediaWiki.Usage.DeprecatedConstantUsage.NS_IMAGE" />
- <exclude name="MediaWiki.Usage.DeprecatedConstantUsage.NS_IMAGE_TALK" />
<exclude name="MediaWiki.Commenting.FunctionComment.SpacingDocStar" />
<exclude name="MediaWiki.Commenting.FunctionComment.SpacingDocTag" />
<exclude name="Squiz.Scope.MethodScope.Missing" />
can use ApiOpenSearch::getOpenSearchTemplate() instead.
* The global function wfBaseConvert, deprecated in 1.27, has been removed. Use
Wikimedia\base_convert() directly.
+* RFC 157418: Whitespace is trimmed from wikitext headings, wikitext list items,
+ wikitext table captions, wikitext table headings, wikitext table cells. HTML
+ headings, HTML list items, HTML table captions, HTML table headings, HTML table cells
+ will not have this trimming behavior.
+* Calling Database::begin() explicitly during an implicit transaction or when DBO_TRX
+ is set results in an exception. Calling Database::commit() explicitly for an implicit
+ transaction also results in an exception. Previously these were logged as errors.
+ The startAtomic() and endAtomic() methods, or AtomicSectionUpdate should be used
+ instead.
== Compatibility ==
MediaWiki 1.31 requires PHP 5.5.9 or later. Although HHVM 3.18.5 or later is supported,
'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
'Wikimedia\\Rdbms\\SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php',
'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php',
+ 'Wikimedia\\Rdbms\\Subquery' => __DIR__ . '/includes/libs/rdbms/encasing/Subquery.php',
'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
"homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
}
],
- "license": "GPL-2.0+",
+ "license": "GPL-2.0-or-later",
"support": {
"issues": "https://bugs.mediawiki.org/",
"irc": "irc://irc.freenode.net/mediawiki",
"wikimedia/ip-set": "1.2.0",
"wikimedia/object-factory": "1.0.0",
"wikimedia/php-session-serializer": "1.0.5",
- "wikimedia/purtle": "1.0.6",
+ "wikimedia/purtle": "1.0.7",
"wikimedia/relpath": "2.1.1",
"wikimedia/remex-html": "1.0.3",
"wikimedia/running-stat": "1.2.1",
* 'version' => '1.9.0',
* 'url' => 'https://example.org/example-extension/',
* 'descriptionmsg' => 'exampleextension-desc',
- * 'license-name' => 'GPL-2.0+',
+ * 'license-name' => 'GPL-2.0-or-later',
* ];
* @endcode
*
* localizable message (omit in favour of 'descriptionmsg').
*
* - license-name: Short name of the license (used as label for the link), such
- * as "GPL-2.0+" or "MIT" (https://spdx.org/licenses/ for a list of identifiers).
+ * as "GPL-2.0-or-later" or "MIT" (https://spdx.org/licenses/ for a list of identifiers).
*/
$wgExtensionCredits = [];
*/
function wfDebug( $text, $dest = 'all', array $context = [] ) {
global $wgDebugRawPage, $wgDebugLogPrefix;
- global $wgDebugTimestamps, $wgRequestTime;
+ global $wgDebugTimestamps;
if ( !$wgDebugRawPage && wfIsDebugRawPage() ) {
return;
if ( $wgDebugTimestamps ) {
$context['seconds_elapsed'] = sprintf(
'%6.4f',
- microtime( true ) - $wgRequestTime
+ microtime( true ) - $_SERVER['REQUEST_TIME_FLOAT']
);
$context['memory_used'] = sprintf(
'%5.1fM',
* @return string
*/
function wfReportTime() {
- global $wgRequestTime, $wgShowHostnames;
+ global $wgShowHostnames;
- $responseTime = round( ( microtime( true ) - $wgRequestTime ) * 1000 );
+ $elapsed = ( microtime( true ) - $_SERVER['REQUEST_TIME_FLOAT'] );
+ // seconds to milliseconds
+ $responseTime = round( $elapsed * 1000 );
$reportVars = [ 'wgBackendResponseTime' => $responseTime ];
if ( $wgShowHostnames ) {
$reportVars['wgHostname'] = wfHostname();
if ( $current ) {
$fields = [
- 'page' => $title->getArticleID(),
- 'user_text' => $user->getName(),
- 'user' => $user->getId(),
- 'actor' => $user->getActorId(),
- 'comment' => $comment,
- 'minor_edit' => $minor,
- 'text_id' => $current->rev_text_id,
- 'parent_id' => $current->page_latest,
- 'len' => $current->rev_len,
- 'sha1' => $current->rev_sha1
+ 'page' => $title->getArticleID(),
+ 'user_text' => $user->getName(),
+ 'user' => $user->getId(),
+ 'actor' => $user->getActorId(),
+ 'comment' => $comment,
+ 'minor_edit' => $minor,
+ 'text_id' => $current->rev_text_id,
+ 'parent_id' => $current->page_latest,
+ 'slot_origin' => $current->page_latest,
+ 'len' => $current->rev_len,
+ 'sha1' => $current->rev_sha1
];
if ( $this->contentHandlerUseDB ) {
$mainSlotRow->content_address = 'tt:' . $row->rev_text_id;
}
+ // This is used by null-revisions
+ $mainSlotRow->slot_origin = isset( $row->slot_origin )
+ ? intval( $row->slot_origin )
+ : null;
+
if ( isset( $row->old_text ) ) {
// this happens when the text-table gets joined directly, in the pre-1.30 schema
$blobData = isset( $row->old_text ) ? strval( $row->old_text ) : null;
$mainSlotRow->slot_content_id = isset( $row['text_id'] )
? intval( $row['text_id'] )
: null;
+ $mainSlotRow->slot_origin = isset( $row['slot_origin'] )
+ ? intval( $row['slot_origin'] )
+ : null;
$mainSlotRow->content_address = isset( $row['text_id'] )
? 'tt:' . intval( $row['text_id'] )
: null;
throw new MWException( 'Revision constructor passed invalid row format.' );
}
- // With the old schema, the content changes with every revision.
- // ...except for null-revisions. Would be nice if we could detect them.
- $mainSlotRow->slot_inherited = 0;
+ // With the old schema, the content changes with every revision,
+ // except for null-revisions.
+ if ( !isset( $mainSlotRow->slot_origin ) ) {
+ $mainSlotRow->slot_origin = $mainSlotRow->slot_revision_id;
+ }
if ( $mainSlotRow->model_name === null ) {
$mainSlotRow->model_name = function ( SlotRecord $slot ) use ( $title ) {
* @return RevisionRecord|null
*/
public function getRevisionByTimestamp( $title, $timestamp ) {
+ $db = $this->getDBConnection( DB_REPLICA );
return $this->newRevisionFromConds(
[
- 'rev_timestamp' => $timestamp,
+ 'rev_timestamp' => $db->timestamp( $timestamp ),
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey()
],
* @return SlotRecord
*/
public static function newInherited( SlotRecord $slot ) {
+ // Sanity check - we can't inherit from a Slot that's not attached to a revision.
+ $slot->getRevision();
+ $slot->getOrigin();
+ $slot->getAddress();
+
+ // NOTE: slot_origin and content_address are copied from $slot.
return self::newDerived( $slot, [
- 'slot_inherited' => true,
'slot_revision_id' => null,
] );
}
$row = [
'slot_id' => null, // not yet known
'slot_revision_id' => null, // not yet known
- 'slot_inherited' => 0, // not inherited
+ 'slot_origin' => null, // not yet known, will be set in newSaved()
'content_size' => null, // compute later
'content_sha1' => null, // compute later
'slot_content_id' => null, // not yet known, will be set in newSaved()
);
}
- if ( $protoSlot->isInherited() && !$protoSlot->hasAddress() ) {
- throw new InvalidArgumentException(
- "An inherited blob should have a content address!"
- );
+ if ( $protoSlot->isInherited() ) {
+ if ( !$protoSlot->hasAddress() ) {
+ throw new InvalidArgumentException(
+ "An inherited blob should have a content address!"
+ );
+ }
+ if ( !$protoSlot->hasField( 'slot_origin' ) ) {
+ throw new InvalidArgumentException(
+ "A saved inherited slot should have an origin set!"
+ );
+ }
+ $origin = $protoSlot->getOrigin();
+ } else {
+ $origin = $revisionId;
}
return self::newDerived( $protoSlot, [
'slot_revision_id' => $revisionId,
'slot_content_id' => $contentId,
+ 'slot_origin' => $origin,
'content_address' => $contentAddress,
] );
}
'$row->slot_revision_id',
'must exist'
);
- Assert::parameter(
- property_exists( $row, 'slot_inherited' ),
- '$row->slot_inherited',
- 'must exist'
- );
Assert::parameter(
property_exists( $row, 'slot_content_id' ),
'$row->slot_content_id',
'$row->model_name',
'must exist'
);
+ Assert::parameter(
+ property_exists( $row, 'slot_origin' ),
+ '$row->slot_origin',
+ 'must exist'
+ );
+ Assert::parameter(
+ !property_exists( $row, 'slot_inherited' ),
+ '$row->slot_inherited',
+ 'must not exist'
+ );
+ Assert::parameter(
+ !property_exists( $row, 'slot_revision' ),
+ '$row->slot_revision',
+ 'must not exist'
+ );
$this->row = $row;
$this->content = $content;
return $this->getIntField( 'slot_revision_id' );
}
+ /**
+ * Returns the revision ID of the revision that originated the slot's content.
+ *
+ * @return int
+ */
+ public function getOrigin() {
+ return $this->getIntField( 'slot_origin' );
+ }
+
/**
* Whether this slot was inherited from an older revision.
*
+ * If this SlotRecord is already attached to a revision, this returns true
+ * if the slot's revision of origin is the same as the revision it belongs to.
+ *
+ * If this SlotRecord is not yet attached to a revision, this returns true
+ * if the slot already has an address.
+ *
* @return bool
*/
public function isInherited() {
- return $this->getIntField( 'slot_inherited' ) !== 0;
+ if ( $this->hasRevision() ) {
+ return $this->getRevision() !== $this->getOrigin();
+ } else {
+ return $this->hasAddress();
+ }
}
/**
* @codeCoverageIgnore
*/
public function __construct() {
- $this->requestTime = isset( $_SERVER['REQUEST_TIME_FLOAT'] )
- ? $_SERVER['REQUEST_TIME_FLOAT'] : microtime( true );
+ $this->requestTime = $_SERVER['REQUEST_TIME_FLOAT'];
// POST overrides GET data
// We don't use $_REQUEST here to avoid interference from cookies...
realpath( __DIR__ ) ?: __DIR__ => [
'path' => $IP,
'name' => 'MediaWiki',
- 'license-name' => 'GPL-2.0+',
+ 'license-name' => 'GPL-2.0-or-later',
],
realpath( "$IP/extensions" ) ?: "$IP/extensions" => null,
realpath( $extDir ) ?: $extDir => null,
if ( $this->getIsWrappedHtml() ) {
// This is a special output mode mainly intended for ApiSandbox use
- $time = microtime( true ) - $this->getConfig()->get( 'RequestTime' );
+ $time = $this->getMain()->getRequest()->getElapsedTime();
$json = FormatJson::encode(
[
'status' => (int)( $this->mHttpStatus ?: 200 ),
'host' => $showHostnames
? $lb->getServerName( $index )
: '',
- 'lag' => intval( $lag )
+ 'lag' => $lag
];
}
"Yusuke1109"
]
},
- "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|説明文書]]\n* [[mw:Special:MyLanguage/API:FAQ|よくある質問]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api メーリングリスト]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 告知]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R バグの報告とリクエスト]\n</div>\n<strong>状態:</strong> このページに表示されている機能は全て動作するはずですが、この API は未だ活発に開発されており、変更される可能性があります。アップデートの通知を受け取るには、[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce メーリングリスト]に参加してください。\n\n<strong>誤ったリクエスト:</strong> 誤ったリクエストが API に送られた場合、\"MediaWiki-API-Error\" HTTP ヘッダーが送信され、そのヘッダーの値と送り返されるエラーコードは同じ値にセットされます。より詳しい情報は [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]] を参照してください。\n\n<p class=\"mw-apisandbox-link\"><strong>テスト:</strong> API のリクエストのテストは、[[Special:ApiSandbox]]で簡単に行えます。</p>",
+ "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|説明文書]]\n* [[mw:Special:MyLanguage/API:FAQ|よくある質問]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api メーリングリスト]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 告知]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R バグの報告とリクエスト]\n</div>\n<strong>状態:</strong> MediaWiki APIは、積極的にサポートされ、改善された成熟した安定したインターフェースです。避けようとはしていますが、時には壊れた変更が加えられるかもしれません。アップデートの通知を受け取るには、[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce メーリングリスト]に参加してください。\n\n<strong>誤ったリクエスト:</strong> 誤ったリクエストが API に送られた場合、\"MediaWiki-API-Error\" HTTP ヘッダーが送信され、そのヘッダーの値と送り返されるエラーコードは同じ値にセットされます。より詳しい情報は [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]] を参照してください。\n\n<p class=\"mw-apisandbox-link\"><strong>テスト:</strong> API のリクエストのテストは、[[Special:ApiSandbox]]で簡単に行えます。</p>",
"apihelp-main-param-action": "実行する操作です。",
"apihelp-main-param-format": "出力する形式です。",
"apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP キャッシュ コントロール ヘッダー に、この秒数を設定します。エラーがキャッシュされることはありません。",
"apihelp-main-param-requestid": "任意の値を指定でき、その値が結果に含められます。リクエストを識別するために使用できます。",
"apihelp-main-param-servedby": "リクエストを処理したホスト名を結果に含めます。",
"apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
+ "apihelp-main-param-responselanginfo": "結果に<var>uselang</var>と<var>errorlang</var>に使用される言語を含めます。",
"apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> は <kbd>siprop=languages</kbd> を付けると言語コードの一覧を返します。<kbd>user</kbd> を指定することで現在の利用者の個人設定の言語を、<kbd>content</kbd> を指定することでこのウィキの本文の言語を使用することもできます。",
+ "apihelp-main-param-errorsuselocal": "指定された場合、エラーテキストは{{ns:MediaWiki}}名前空間からローカルにカスタマイズされたメッセージを使用します。",
"apihelp-block-summary": "利用者をブロックします。",
"apihelp-block-param-user": "ブロックを解除する利用者名、IPアドレスまたはIPレンジ。<var>$1userid</var>とは同時に使用できません。",
"apihelp-block-param-userid": "ブロックする利用者のID。<var>$1user</var>とは同時に使用できません。",
"apihelp-block-param-allowusertalk": "自身のトークページの編集を許可する (<var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> に依存)。",
"apihelp-block-param-reblock": "その利用者がすでにブロックされている場合、ブロックを上書きします。",
"apihelp-block-param-watchuser": "その利用者またはIPアドレスの利用者ページとトークページをウォッチします。",
+ "apihelp-block-param-tags": "ブロック記録の項目に適用する変更タグ。",
"apihelp-block-example-ip-simple": "IPアドレス <kbd>192.0.2.5</kbd> を <kbd>First strike<kbd> という理由で3日ブロックする",
"apihelp-block-example-user-complex": "利用者 <kbd>Vandal</kbd> を <kbd>Vandalism</kbd> という理由で無期限ブロックし、新たなアカウント作成とメールの送信を禁止する。",
"apihelp-changeauthenticationdata-example-password": "現在の利用者のパスワードを <kbd>ExamplePassword</kbd> に変更する。",
"apihelp-checktoken-summary": "<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> のトークンの妥当性を確認します。",
"apihelp-checktoken-param-type": "調べるトークンの種類。",
"apihelp-checktoken-param-token": "調べるトークン。",
+ "apihelp-checktoken-param-maxtokenage": "トークンの最大有効期限 (秒)。",
"apihelp-checktoken-example-simple": "<kbd>csrf</kbd> トークンの妥当性を調べる。",
"apihelp-clearhasmsg-summary": "現在の利用者の <code>hasmsg</code> フラグを消去します。",
"apihelp-clearhasmsg-example-1": "現在の利用者の <code>hasmsg</code> フラグを消去する。",
"apihelp-opensearch-summary": "OpenSearch プロトコルを使用してWiki内を検索します。",
"apihelp-opensearch-param-search": "検索文字列。",
"apihelp-opensearch-param-limit": "返す結果の最大数。",
- "apihelp-opensearch-param-namespace": "検索する名前空間。",
+ "apihelp-opensearch-param-namespace": "検索する名前空間。<var>$1search</var>が有効な名前空間接頭辞で始まる場合は無視されます。",
"apihelp-opensearch-param-suggest": "<var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> が false の場合、何もしません。",
"apihelp-opensearch-param-redirects": "転送を処理する方法:\n;return: 転送ページそのものを返します。\n;resolve: 転送先のページを返します。$1limit より返される結果が少なくなるかもしれません。\n歴史的な理由により、$1format=json では \"return\" が、他の形式では \"resolve\" が既定です。",
"apihelp-opensearch-param-format": "出力する形式。",
"apihelp-query+prefixsearch-summary": "ページ名の先頭一致検索を行います。",
"apihelp-query+prefixsearch-extended-description": "名前が似ていますが、このモジュールは[[Special:PrefixIndex]]と等価であることを意図しません。そのような目的では<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> を <kbd>apprefix</kbd> パラメーターと共に使用してください。このモジュールの目的は <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd> と似ています: 利用者から入力を受け取り、最も適合するページ名を提供するというものです。検索エンジンのバックエンドによっては、誤入力の訂正や、転送の回避、その他のヒューリスティクスが適用されることがあります。",
"apihelp-query+prefixsearch-param-search": "検索文字列。",
- "apihelp-query+prefixsearch-param-namespace": "検索する名前空間。",
+ "apihelp-query+prefixsearch-param-namespace": "検索する名前空間。<var>$1search</var>が有効な名前空間接頭辞で始まる場合は無視されます。",
"apihelp-query+prefixsearch-param-limit": "返す結果の最大数。",
"apihelp-query+prefixsearch-example-simple": "<kbd>meaning</kbd> で始まるページ名を検索する。",
"apihelp-query+protectedtitles-summary": "作成保護が掛けられているページを一覧表示します。",
"apihelp-tokens-param-type": "リクエストするトークンの種類。",
"apihelp-tokens-example-edit": "編集トークンを取得する (既定)。",
"apihelp-unblock-summary": "利用者のブロックを解除します。",
- "apihelp-unblock-param-id": "解除するブロックのID (<kbd>list=blocks</kbd>で取得できます)。<var>$1user</var> とは同時に使用できません。",
+ "apihelp-unblock-param-id": "解é\99¤ã\81\99ã\82\8bã\83\96ã\83ã\83\83ã\82¯ã\81®ID (<kbd>list=blocks</kbd>ã\81§å\8f\96å¾\97ã\81§ã\81\8dã\81¾ã\81\99)ã\80\82<var>$1user</var> ã\81¾ã\81\9fã\81¯ <var>$1userid</var> ã\81¨ã\81¯å\90\8cæ\99\82ã\81«ä½¿ç\94¨ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
"apihelp-unblock-param-user": "ブロックを解除する利用者名、IPアドレスまたはIPレンジ。<var>$1id</var>とは同時に使用できません。",
"apihelp-unblock-param-reason": "ブロック解除の理由。",
"apihelp-unblock-param-tags": "ブロック記録の項目に適用する変更タグ。",
"apihelp-userrights-summary": "利用者の所属グループを変更します。",
"apihelp-userrights-param-user": "利用者名。",
"apihelp-userrights-param-userid": "利用者ID。",
- "apihelp-userrights-param-add": "利用者をこのグループに追加します。",
+ "apihelp-userrights-param-add": "å\88©ç\94¨è\80\85ã\82\92ã\81\93ã\81®ã\82°ã\83«ã\83¼ã\83\97ã\81«è¿½å\8a ã\81\99ã\82\8bã\81\8bã\80\81æ\97¢ã\81«ã\83¡ã\83³ã\83\90ã\83¼ã\81®å ´å\90\88ã\81¯ã\80\81ã\81\9dã\81®ã\82°ã\83«ã\83¼ã\83\97ã\81®ã\83¡ã\83³ã\83\90ã\83¼ã\82·ã\83\83ã\83\97ã\81®æ\9c\89å\8a¹æ\9c\9fé\99\90ã\82\92æ\9b´æ\96°ã\81\97ã\81¾ã\81\99ã\80\82",
"apihelp-userrights-param-reason": "変更の理由。",
"apihelp-userrights-example-expiry": "利用者 <kbd>SometimeSysop</kbd> を 1ヶ月間 <kbd>sysop</kbd> グループに追加する。",
"apihelp-watch-summary": "現在の利用者のウォッチリストにページを追加/除去します。",
return [];
}
- global $wgVersion, $wgRequestTime;
+ global $wgVersion;
$request = $context->getRequest();
// HHVM's reported memory usage from memory_get_peak_usage()
'gitRevision' => GitInfo::headSHA1(),
'gitBranch' => $branch,
'gitViewUrl' => GitInfo::headViewUrl(),
- 'time' => microtime( true ) - $wgRequestTime,
+ 'time' => $request->getElapsedTime(),
'log' => self::$log,
'debugLog' => self::$debug,
'queries' => self::$query,
}
/**
- * @static
* @param string $msg
*
* @return mixed
"NS_PROJECT_TALK" => NS_PROJECT_TALK,
"NS_FILE" => NS_FILE,
"NS_FILE_TALK" => NS_FILE_TALK,
- "NS_IMAGE" => NS_IMAGE, // NS_IMAGE is an alias for NS_FILE
- "NS_IMAGE_TALK" => NS_IMAGE_TALK,
+ "NS_IMAGE" => NS_FILE, // NS_IMAGE is an alias for NS_FILE
+ "NS_IMAGE_TALK" => NS_FILE_TALK,
"NS_MEDIAWIKI" => NS_MEDIAWIKI,
"NS_MEDIAWIKI_TALK" => NS_MEDIAWIKI_TALK,
"NS_TEMPLATE" => NS_TEMPLATE,
* many rows where updated.
*/
protected function doDBUpdates() {
+ global $wgCommentTableSchemaMigrationStage;
+
$dbw = $this->db;
// Update current image
[ 'img_name' => $this->oldName ],
__METHOD__
);
+ if ( $wgCommentTableSchemaMigrationStage > MIGRATION_OLD ) {
+ $dbw->update(
+ 'image_comment_temp',
+ [ 'imgcomment_name' => $this->newName ],
+ [ 'imgcomment_name' => $this->oldName ],
+ __METHOD__
+ );
+ }
+
// Update old images
$dbw->update(
'oldimage',
/**
* Prepare form for submission.
*
- * @attention When doing method chaining, that should be the very last
+ * @warning When doing method chaining, that should be the very last
* method call before displayForm().
*
* @throws MWException
* Display the form (sending to the context's OutputPage object), with an
* appropriate error message or stack of messages, and any validation errors, etc.
*
- * @attention You should call prepareForm() before calling this function.
+ * @warning You should call prepareForm() before calling this function.
* Moreover, when doing method chaining this should be the very last method
* call just after prepareForm().
*
return $html;
}
- // No OOUI yet
- public function getInputOOUI( $value ) {
- return false;
+ protected function getInputWidget( $params ) {
+ $this->mParent->getOutput()->addModuleStyles( 'mediawiki.widgets.SizeFilterWidget.styles' );
+
+ // negative numbers represent "max", positive numbers represent "min"
+ $value = $params['value'];
+
+ $params['value'] = $value ? abs( $value ) : '';
+
+ return new MediaWiki\Widget\SizeFilterWidget( [
+ 'selectMin' => $value >= 0,
+ 'textinput' => $params,
+ 'radioselectinput' => [
+ 'name' => $this->mName . '-mode',
+ 'disabled' => !empty( $this->mParams['disabled'] ),
+ ],
+ ] );
+ }
+
+ protected function getOOUIModules() {
+ return [ 'mediawiki.widgets.SizeFilterWidget' ];
}
/**
// 1.31
[ 'addTable', 'slots', 'patch-slots.sql' ],
+ [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
[ 'addTable', 'content', 'patch-content.sql' ],
[ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
[ 'addTable', 'content_models', 'patch-content_models.sql' ],
[ 'migrateArchiveText' ],
[ 'addTable', 'actor', 'patch-actor-table.sql' ],
[ 'migrateActors' ],
+ [ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
];
}
// 1.31
[ 'addTable', 'slots', 'patch-slots.sql' ],
+ [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
[ 'addTable', 'content', 'patch-content.sql' ],
[ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
[ 'addTable', 'content_models', 'patch-content_models.sql' ],
[ 'migrateArchiveText' ],
[ 'addTable', 'actor', 'patch-actor-table.sql' ],
[ 'migrateActors' ],
+ [ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
];
}
// 1.31
[ 'addTable', 'slots', 'patch-slots.sql' ],
+ [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
[ 'addTable', 'content', 'patch-content.sql' ],
[ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
[ 'addTable', 'content_models', 'patch-content_models.sql' ],
// 1.31
[ 'addTable', 'slots', 'patch-slots-table.sql' ],
+ [ 'dropPgIndex', 'slots', 'slot_role_inherited' ],
+ [ 'dropPgField', 'slots', 'slot_inherited' ],
+ [ 'addPgField', 'slots', 'slot_origin', 'INTEGER NOT NULL' ],
+ [
+ 'addPgIndex',
+ 'slots',
+ 'slot_revision_origin_role',
+ '( slot_revision_id, slot_origin, slot_role_id )',
+ ],
[ 'addTable', 'content', 'patch-content-table.sql' ],
[ 'addTable', 'content_models', 'patch-content_models-table.sql' ],
[ 'addTable', 'slot_roles', 'patch-slot_roles-table.sql' ],
$this->db->query( "ALTER INDEX $old RENAME TO $new" );
}
+ protected function dropPgField( $table, $field ) {
+ $fi = $this->db->fieldInfo( $table, $field );
+ if ( is_null( $fi ) ) {
+ $this->output( "...$table table does not contain $field field.\n" );
+
+ return;
+ } else {
+ $this->output( "Dropping column '$table.$field'\n" );
+ $this->db->query( "ALTER TABLE $table DROP COLUMN $field" );
+ }
+ }
+
protected function addPgField( $table, $field, $type ) {
$fi = $this->db->fieldInfo( $table, $field );
if ( !is_null( $fi ) ) {
[ 'addTable', 'content', 'patch-content.sql' ],
[ 'addTable', 'content_models', 'patch-content_models.sql' ],
[ 'addTable', 'slots', 'patch-slots.sql' ],
+ [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
[ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
[ 'migrateArchiveText' ],
[ 'addTable', 'actor', 'patch-actor-table.sql' ],
[ 'migrateActors' ],
+ [ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
];
}
if ( isset( $session['settings'] ) ) {
$this->settings = $session['settings'] + $this->settings;
+ // T187586 MediaWikiServices works with globals
+ foreach ( $this->settings as $key => $val ) {
+ $GLOBALS[$key] = $val;
+ }
}
$this->setupLanguage();
"config-no-cli-uploads-check": "<strong>Alvertencia:</strong> el to directoriu predetermináu pa cargues <code>$1</code> nun tá comprobáu contra la vulnerabilidá d'execución arbitraria de scripts mientres la instalación per llínea de comandos.",
"config-brokenlibxml": "El sistema tien una combinación de versiones de PHP y de libxml2 que ye pocu confiable y puede provocar corrupción oculta nos datos de MediaWiki y otres aplicaciones web. Actualiza a libxml2 2.7.3 o posterior ([https://bugs.php.net/bug.php?díi=45996 bug reportáu con PHP]). Instalación albortada.",
"config-suhosin-max-value-length": "Suhosin ta instaláu y llinda el parámetru <code>length</code> GET a $1 bytes.\nEl componente ResourceLoader (xestor de recursos) de MediaWiki va trabayar nesta llende, pero eso va perxudicar el rendimientu.\nSi ye posible, tendríes d'establecer <code>suhosin.get.max_value_length</code> nel valor 1024 o superior en <code>php.ini</code> y establecer <code>$wgResourceLoaderMaxQueryLength</code> nel mesmu valor en <code>LocalSettings.php</code>.",
+ "config-using-32bit": "<strong>Atención:</strong> paez que'l sistema funciona con enteros de 32 bits. Esto ta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit desaconseyáu].",
"config-db-type": "Tipu de base de datos:",
"config-db-host": "Servidor de la base de datos:",
"config-db-host-help": "Si'l to servidor de base de datos ta n'otru servidor, escribe'l nome del equipu o la so dirección IP equí.\n\nSi tas utilizando alojamiento web compartíu, el to provisor tendría de date'l nome correctu del servidor na so documentación.\n\nSi vas instalar nun servidor Windows y a utilizar MySQL, l'usu de \"localhost\" como nome del servidor puede nun #funcionar. Si ye asina, intenta poner \"127.0.0.1\" como dirección IP local.\n\nSi utilices PostgreSQL, dexa esti campu vacío pa conectase al traviés d'un socket de Unix.",
"config-db-schema-help": "Esti esquema de vezu va tar bien.\nCamúdalos solo si sabes que lo precises.",
"config-pg-test-error": "Nun puede coneutase cola base de datos <strong>$1</strong>: $2",
"config-sqlite-dir": "Direutoriu de datos SQLite:",
+ "config-sqlite-dir-help": "SQLite almacena tolos datos nun ficheru únicu.\n\nEl direutoriu que proporciones tien de poder escribise pol servidor web mientres la instalación.\n\n<strong>Nun</strong> tendría de tener accesu pela web, por eso nun se pon nel sitiu onde tán los ficheros PHP.\n\nL'instalador escribirá un ficheru <code>.htaccess</code> xunto con él, pero si esto falla dalguién podría tener accesu a la base de datos completa.\nEso incluye los datos d'usuariu completos (direcciones de corréu electrónicu, contraseñes con hash) lo mesmo que les revisiones desaniciaes y otros datos acutaos de la wiki.\n\nConsidera poner la base de datos en dalgún otru sitiu, por casu en <code>/var/lib/mediawiki/miowiki</code>.",
"config-oracle-def-ts": "Espaciu de tables predetermináu:",
"config-oracle-temp-ts": "Espaciu de tables temporal:",
"config-type-mysql": "MySQL (o compatible)",
"config-type-mssql": "Microsoft SQL Server",
"config-support-info": "MediaWiki ye compatible colos siguientes sistemes de bases de datos:\n\n$1\n\nSi nun atopes na llista el sistema de base de datos que tas intentando utilizar, sigue les instrucciones enllazaes enriba p'activar la compatibilidá.",
+ "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] ye un sistema comercial de base de datos empresariales pa Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con compatibilidá pa SQLSRV])",
"config-header-mysql": "Configuración de MySQL",
"config-header-postgres": "Configuración de PostgreSQL",
"config-header-sqlite": "Configuración de SQLite",
"config-postgres-old": "Ríquese PostgreSQL $1 o posterior. Tienes la versión $2.",
"config-mssql-old": "Ríquese Microsoft SQL Server $1 o posterior. Tienes la versión $2.",
"config-sqlite-name-help": "Escueye'l nome qu'identifica la to wiki.\nNun uses espacios o guiones.\nEsti va usase como nome del ficheru de datos pa SQLite.",
+ "config-sqlite-parent-unwritable-group": "Nun puede crease el direutoriu de datos <code><nowiki>$1</nowiki></code> porque'l servidor web nun tien permisu d'escritura nel direutoriu padre <code><nowiki>$2</nowiki></code>.\n\nL'instalador determinó l'usuariu col que s'executa'l sirvidor web.\nDa-y permisos d'escritura nel direutoriu <code><nowiki>$3</nowiki></code> pa siguir.\nNun sistema Unix/Linux fai:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+ "config-sqlite-parent-unwritable-nogroup": "Nun puede crease'l direutoriu de datos <code><nowiki>$1</nowiki></code>, porque'l sirvidor web nun tien permisu d'escritura nel direutoriu padre <code><nowiki>$2</nowiki></code>.\n\nL'instalador nun pudo determinar l'usuariu col que s'executa'l sirvidor web.\nDa permisos d'escritura universal pa él (¡y pa otros!) nel direutoriu <code><nowiki>$3</nowiki></code> pa siguir.\nNun sistema Unix/Linux fai:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+ "config-sqlite-mkdir-error": "Error al crear el direutoriu de datos «$1».\nComprueba la direición y tenta otra vuelta.",
+ "config-sqlite-dir-unwritable": "Nun puede escribise nel direutoriu «$1».\nCambia los sos permisos pa que'l sirvidor web pueda escribir nél, y tenta otra vuelta.",
+ "config-sqlite-connection-error": "$1.\n\nComprueba más abaxo'l direutoriu de datos ya'l nome de la base de datos y tenta otra vuelta.",
+ "config-sqlite-readonly": "El ficheru <code>$1</code> nun puede escribise.",
+ "config-sqlite-cant-create-db": "Nun pudo crease'l ficheru de la base de datos <code>$1</code>.",
+ "config-sqlite-fts3-downgrade": "PHP nun tien compatibilidá pa FTS3, baxando a una versión anterior les tables.",
+ "config-regenerate": "Rexenerar LocalSettings.php →",
+ "config-show-table-status": "¡Falló la consulta <code>SHOW TABLE STATUS</code>!",
+ "config-unknown-collation": "<strong>Avisu:</strong> La base de datos utiliza un orde alfabéticu ensin reconocer.",
+ "config-db-web-account": "Cuenta de la base de datos pal accesu web",
+ "config-db-web-help": "Escueye l'usuariu y contraseña que'l sirvidor web usará pa coneutase col sirvidor de la base de datos nel funcionamientu normal de la wiki.",
+ "config-db-web-account-same": "Utilizar la mesma cuenta que pa la instalación",
+ "config-db-web-create": "Crear la cuenta si nun esiste yá",
+ "config-db-web-no-create-privs": "La cuenta qu'especificasti pa la instalación nun tien permisos abondo pa crear una cuenta.\nLa cuenta qu'especifiques equí yá tien d'esistir.",
+ "config-mysql-engine": "Motor d'almacenamientu:",
"config-mysql-innodb": "InnoDB",
"config-mysql-myisam": "MyISAM",
+ "config-mysql-binary": "Binariu",
"config-mysql-utf8": "UTF-8",
"config-mssql-auth": "Triba d'autenticación:",
"config-site-name": "Nome de la wiki:",
"config-admin-password": "Contraseña:",
"config-optional-skip": "Yá toi aburríu, namái instala la wiki.",
"config-profile-private": "Wiki privada",
+ "config-license": "Derechos d'autor y llicencia:",
+ "config-license-none": "Ensin pie de llicencia",
+ "config-license-cc-by-sa": "Creative Commons Reconocimientu-CompartirIgual",
+ "config-license-cc-by": "Creative Commons Reconocimientu",
+ "config-license-cc-by-nc-sa": "Creative Commons Reconocimientu-NonComercial-CompartirIgual",
+ "config-license-cc-0": "Creative Commons Zero (Dominiu públicu)",
+ "config-license-gfdl": "Llicencia de documentación llibre de GNU 1.3 o posterior",
+ "config-license-pd": "Dominiu públicu",
+ "config-license-cc-choose": "Escoyer una llicencia Creative Commons personalizada",
+ "config-email-settings": "Configuración de corréu electrónicu",
+ "config-enable-email": "Activar el corréu electrónicu de salida",
+ "config-enable-email-help": "Si quies que'l corréu electrónicu funcione, les [http://www.php.net/manual/en/mail.configuration.php preferencies de corréu de PHP] tienen de tar configuraes correutamente.\nSi nun quies les funciones de corréu electrónicu, puedes desactivales equí.",
+ "config-email-user": "Activar el corréu electrónicu ente usuarios",
+ "config-logo": "URL del logo:",
+ "config-instantcommons": "Activar Instant Commons",
"config-extensions": "Estensiones",
+ "config-skins": "Apariencies",
+ "config-skins-help": "Deteutáronse les apariencies de la llista anterior nel direutoriu <code>./skins</code>. Tienes d'activar siquier una, y escoyer la predeterminada.",
+ "config-skins-use-as-default": "Utilizar esta apariencia como predeterminada",
+ "config-skins-missing": "Nun s'atopó nenguna apariencia; MediaWiki utilizará una apariencia de respaldu hasta qu'instales delles apariencies afayadices.",
+ "config-skins-must-enable-some": "Tienes d'escoyer polo meno una apariencia p'activar.",
+ "config-skins-must-enable-default": "L'apariencia escoyida como predeterminada tien de tar activada.",
+ "config-install-step-done": "fecho",
+ "config-install-step-failed": "falló",
+ "config-install-extensions": "Incluyendo estensiones",
+ "config-install-database": "Configurando la base de datos",
+ "config-install-schema": "Creando l'esquema",
+ "config-install-pg-schema-not-exist": "L'esquema PostgreSQL nun esiste.",
"config-download-localsettings": "Descargar <code>LocalSettings.php</code>",
"config-help": "Ayuda",
"config-nofile": "Nun pudo atopase'l ficheru \"$1\". ¿Desaniciose?",
+ "config-skins-screenshots": "$1 (imaxes de pantalla: $2)",
+ "config-screenshot": "imaxe de pantalla",
"mainpagetext": "<strong>Instalóse MediaWiki.</strong>",
"mainpagedocfooter": "Consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía del usuariu] pa saber cómo usar el software wiki.\n\n== Primeros pasos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ EMF de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de llanzamientos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Depriende como combatir la puxarra na to wiki]"
}
"Macofe",
"Sethakill",
"Peter Bowman",
- "Ankam"
+ "Ankam",
+ "Railfail536"
]
},
"config-desc": "Instalator MediaWiki",
"config-no-cli-uploads-check": "'''Ostrzeżenie:''' Katalog domyślny przesyłanych plików ( <code>$1</code> ) nie jest sprawdzona względem luki\n wykonania dowolnego skryptu podczas instalacji CLI w zabezpieczeniach.",
"config-brokenlibxml": "Twój system jest kombinacją wersji PHP i libxml2, która zawiera błędy mogące powodować ukryte uszkodzenia danych w MediaWiki i innych aplikacjach sieci web.\nWykonaj aktualizację libxml2 do wersji 2.7.3 lub późniejszej ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstalacja została przerwana.",
"config-suhosin-max-value-length": "Jest zainstalowany Suhosin i ogranicza długość parametru GET <code>length</code> do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności.\nJeśli to możliwe, należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub więcej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w <code>LocalSettings.php</code> na tę samą wartość.",
+ "config-using-32bit": "<strong>Uwaga:</strong> twój system wydaje się działać na 32 bitowej architekturze. Jest to [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit niezalecane].",
"config-db-type": "Typ bazy danych:",
"config-db-host": "Adres serwera bazy danych:",
"config-db-host-help": "Jeśli serwer bazy danych jest na innej maszynie, wprowadź jej nazwę domenową lub adres IP.\n\nJeśli korzystasz ze współdzielonego hostingu, operator serwera powinien podać Ci prawidłową nazwę serwera w swojej dokumentacji.\n\nJeśli instalujesz oprogramowanie na serwerze Windows i korzystasz z MySQL, użycie „localhost” może nie zadziałać jako nazwa hosta. Jeśli wystąpi ten problem, użyj „127.0.0.1” jako lokalnego adresu IP.\n\nJeżeli korzystasz z PostgreSQL, pozostaw to pole puste, aby połączyć się poprzez gniazdo Unixa.",
"Aktron",
"Сербијана",
"Zoranzoki21",
- "Acamicamacaraca"
+ "Acamicamacaraca",
+ "Obsuser"
]
},
"config-desc": "Инсталација за Медијавики",
"config-skins-screenshot": "$1 ($2)",
"config-screenshot": "снимак екрана",
"mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
- "mainpagedocfooter": "Ð\9fогледаÑ\98Ñ\82е [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents коÑ\80иÑ\81ниÑ\87ки водиÑ\87] за коÑ\80иÑ\88Ñ\9bеÑ\9aе пÑ\80огÑ\80ама.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Ð\9fомоÑ\9b Ñ\83 вези Ñ\81а подеÑ\88аваÑ\9aима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧеÑ\81Ñ\82о поÑ\81Ñ\82авÑ\99ена пиÑ\82аÑ\9aа]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ð\94опиÑ\81ни Ñ\81пиÑ\81ак о издаÑ\9aима Ð\9cедиÑ\98авикиÑ\98а]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Ð\9dаÑ\83Ñ\87иÑ\82е како да Ñ\81е боÑ\80иÑ\82е пÑ\80оÑ\82ив Ñ\81пама на Ð\92аÑ\88ој вики]"
+ "mainpagedocfooter": "Ð\9fогледаÑ\98Ñ\82е [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents коÑ\80иÑ\81ниÑ\87ки водиÑ\87] за коÑ\80иÑ\88Ñ\9bеÑ\9aе пÑ\80огÑ\80ама.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Ð\9fомоÑ\9b Ñ\83 вези Ñ\81а подеÑ\88аваÑ\9aима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧеÑ\81Ñ\82о поÑ\81Ñ\82авÑ\99ана пиÑ\82аÑ\9aа]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ð\94опиÑ\81ни Ñ\81пиÑ\81ак о издаÑ\9aима Ð\9cедиÑ\98авикиÑ\98а]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Ð\9dаÑ\83Ñ\87иÑ\82е како да Ñ\81е боÑ\80иÑ\82е пÑ\80оÑ\82ив Ñ\81пама на Ñ\81воÑ\98ој вики]"
}
// phpcs:ignore Generic.CodeAnalysis.ForLoopWithTestFunctionCall
for ( $i = $this->maxPartitionsTry; $i > 0 && count( $jobsLeft ); --$i ) {
try {
- $partitionRing->getLiveRing();
+ $partitionRing->getLiveLocationWeights();
} catch ( UnexpectedValueException $e ) {
break; // all servers down; nothing to insert to
}
* @param string $item
* @return string Location
*/
- public function getLocation( $item ) {
+ final public function getLocation( $item ) {
$locations = $this->getLocations( $item, 1 );
return $locations[0];
return $this->sourceMap;
}
- /**
- * Get a new hash ring with a location removed from the ring
- *
- * @param string $location
- * @return HashRing|bool Returns false if no non-zero weighted spots are left
- */
- public function newWithoutLocation( $location ) {
- $map = $this->sourceMap;
- unset( $map[$location] );
-
- return count( $map ) ? new self( $map ) : false;
- }
-
/**
* Remove a location from the "live" hash ring
*
* @return HashRing
* @throws UnexpectedValueException
*/
- public function getLiveRing() {
+ protected function getLiveRing() {
$now = time();
if ( $this->liveRing === null || $this->ejectionNextExpiry <= $now ) {
$this->ejectionExpiries = array_filter(
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @license GPL-2.0+
+ * @license GPL-2.0-or-later
* @author Kunal Mehta <legoktm@member.fsf.org>
*/
'requestStart' => [
'name' => 'requestStart',
'entryType' => 'mark',
- 'startTime' => isset( $_SERVER['REQUEST_TIME_FLOAT'] )
- ? $_SERVER['REQUEST_TIME_FLOAT']
- : $_SERVER['REQUEST_TIME'],
+ 'startTime' => $_SERVER['REQUEST_TIME_FLOAT'],
'duration' => 0,
],
];
* To use this with a request header, first parse the header value into an array of weights
* using HttpAcceptParser, then call getBestSupportedKey.
*
- * @license GPL-2.0+
+ * @license GPL-2.0-or-later
* @author Daniel Kinzler
* @author Thiemo Kreuz
*/
* Utility for parsing a HTTP Accept header value into a weight map. May also be used with
* other, similar headers like Accept-Language, Accept-Encoding, etc.
*
- * @license GPL-2.0+
+ * @license GPL-2.0-or-later
* @author Daniel Kinzler
*/
return $this->__call( __FUNCTION__, func_get_args() );
}
+ public function buildSelectSubquery(
+ $table, $vars, $conds = '', $fname = __METHOD__,
+ $options = [], $join_conds = []
+ ) {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
public function databasesAreIndependent() {
return $this->__call( __FUNCTION__, func_get_args() );
}
return $this->__call( __FUNCTION__, func_get_args() );
}
- public function wasErrorReissuable() {
+ public function wasConnectionLoss() {
return $this->__call( __FUNCTION__, func_get_args() );
}
return $this->__call( __FUNCTION__, func_get_args() );
}
+ public function wasErrorReissuable() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
public function masterPosWait( DBMasterPos $pos, $timeout ) {
return $this->__call( __FUNCTION__, func_get_args() );
}
$ret = $this->doProfiledQuery( $sql, $commentedSql, $isNonTempWrite, $fname );
# Try reconnecting if the connection was lost
- if ( false === $ret && $this->wasErrorReissuable() ) {
+ if ( false === $ret && $this->wasConnectionLoss() ) {
$recoverable = $this->canRecoverFromDisconnect( $sql, $priorWritesPending );
# Stash the last error values before anything might clear them
$lastError = $this->lastError();
}
public function estimateRowCount(
- $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
+ $table, $var = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
) {
- $rows = 0;
+ $conds = $this->normalizeConditions( $conds, $fname );
+ $column = $this->extractSingleFieldFromList( $var );
+ if ( is_string( $column ) && !in_array( $column, [ '*', '1' ] ) ) {
+ $conds[] = "$column IS NOT NULL";
+ }
+
$res = $this->select(
$table, [ 'rowcount' => 'COUNT(*)' ], $conds, $fname, $options, $join_conds
);
+ $row = $res ? $this->fetchRow( $res ) : [];
- if ( $res ) {
- $row = $this->fetchRow( $res );
- $rows = ( isset( $row['rowcount'] ) ) ? (int)$row['rowcount'] : 0;
- }
-
- return $rows;
+ return isset( $row['rowcount'] ) ? (int)$row['rowcount'] : 0;
}
public function selectRowCount(
- $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
+ $tables, $var = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
) {
- $rows = 0;
- $sql = $this->selectSQLText( $tables, '1', $conds, $fname, $options, $join_conds );
- // The identifier quotes is primarily for MSSQL.
- $rowCountCol = $this->addIdentifierQuotes( "rowcount" );
- $tableName = $this->addIdentifierQuotes( "tmp_count" );
- $res = $this->query( "SELECT COUNT(*) AS $rowCountCol FROM ($sql) $tableName", $fname );
+ $conds = $this->normalizeConditions( $conds, $fname );
+ $column = $this->extractSingleFieldFromList( $var );
+ if ( is_string( $column ) && !in_array( $column, [ '*', '1' ] ) ) {
+ $conds[] = "$column IS NOT NULL";
+ }
- if ( $res ) {
- $row = $this->fetchRow( $res );
- $rows = ( isset( $row['rowcount'] ) ) ? (int)$row['rowcount'] : 0;
+ $res = $this->select(
+ [
+ 'tmp_count' => $this->buildSelectSubquery(
+ $tables,
+ '1',
+ $conds,
+ $fname,
+ $options,
+ $join_conds
+ )
+ ],
+ [ 'rowcount' => 'COUNT(*)' ],
+ [],
+ $fname
+ );
+ $row = $res ? $this->fetchRow( $res ) : [];
+
+ return isset( $row['rowcount'] ) ? (int)$row['rowcount'] : 0;
+ }
+
+ /**
+ * @param array|string $conds
+ * @param string $fname
+ * @return array
+ */
+ final protected function normalizeConditions( $conds, $fname ) {
+ if ( $conds === null || $conds === false ) {
+ $this->queryLogger->warning(
+ __METHOD__
+ . ' called from '
+ . $fname
+ . ' with incorrect parameters: $conds must be a string or an array'
+ );
+ $conds = '';
+ }
+
+ if ( !is_array( $conds ) ) {
+ $conds = ( $conds === '' ) ? [] : [ $conds ];
}
- return $rows;
+ return $conds;
+ }
+
+ /**
+ * @param array|string $var Field parameter in the style of select()
+ * @return string|null Column name or null; ignores aliases
+ * @throws DBUnexpectedError Errors out if multiple columns are given
+ */
+ final protected function extractSingleFieldFromList( $var ) {
+ if ( is_array( $var ) ) {
+ if ( !$var ) {
+ $column = null;
+ } elseif ( count( $var ) == 1 ) {
+ $column = isset( $var[0] ) ? $var[0] : reset( $var );
+ } else {
+ throw new DBUnexpectedError( $this, __METHOD__ . ': got multiple columns.' );
+ }
+ } else {
+ $column = $var;
+ }
+
+ return $column;
}
/**
return 'CAST( ' . $field . ' AS INTEGER )';
}
+ public function buildSelectSubquery(
+ $table, $vars, $conds = '', $fname = __METHOD__,
+ $options = [], $join_conds = []
+ ) {
+ return new Subquery(
+ $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds )
+ );
+ }
+
public function databasesAreIndependent() {
return false;
}
}
public function tableName( $name, $format = 'quoted' ) {
+ if ( $name instanceof Subquery ) {
+ throw new DBUnexpectedError(
+ $this,
+ __METHOD__ . ': got Subquery instance when expecting a string.'
+ );
+ }
+
# Skip the entire process when we have a string quoted on both ends.
# Note that we check the end so that we will still quote any use of
# use of `database`.table. But won't break things if someone wants
# any remote case where a word like on may be inside of a table name
# surrounded by symbols which may be considered word breaks.
if ( preg_match( '/(^|\s)(DISTINCT|JOIN|ON|AS)(\s|$)/i', $name ) !== 0 ) {
+ $this->queryLogger->warning(
+ __METHOD__ . ": use of subqueries is not supported this way.",
+ [ 'trace' => ( new RuntimeException() )->getTraceAsString() ]
+ );
+
return $name;
}
/**
* Get an aliased table name
- * e.g. tableName AS newTableName
*
- * @param string $name Table name, see tableName()
- * @param string|bool $alias Alias (optional)
+ * This returns strings like "tableName AS newTableName" for aliased tables
+ * and "(SELECT * from tableA) newTablename" for subqueries (e.g. derived tables)
+ *
+ * @see Database::tableName()
+ * @param string|Subquery $table Table name or object with a 'sql' field
+ * @param string|bool $alias Table alias (optional)
* @return string SQL name for aliased table. Will not alias a table to its own name
*/
- protected function tableNameWithAlias( $name, $alias = false ) {
- if ( !$alias || $alias == $name ) {
- return $this->tableName( $name );
+ protected function tableNameWithAlias( $table, $alias = false ) {
+ if ( is_string( $table ) ) {
+ $quotedTable = $this->tableName( $table );
+ } elseif ( $table instanceof Subquery ) {
+ $quotedTable = (string)$table;
+ } else {
+ throw new InvalidArgumentException( "Table must be a string or Subquery." );
+ }
+
+ if ( !strlen( $alias ) || $alias === $table ) {
+ if ( $table instanceof Subquery ) {
+ throw new InvalidArgumentException( "Subquery table missing alias." );
+ }
+
+ return $quotedTable;
} else {
- return $this->tableName( $name ) . ' ' . $this->addIdentifierQuotes( $alias );
+ return $quotedTable . ' ' . $this->addIdentifierQuotes( $alias );
}
}
if ( is_array( $table ) ) {
// A parenthesized group
if ( count( $table ) > 1 ) {
- $joinedTable = '('
- . $this->tableNamesWithIndexClauseOrJOIN( $table, $use_index, $ignore_index, $join_conds )
- . ')';
+ $joinedTable = '(' .
+ $this->tableNamesWithIndexClauseOrJOIN(
+ $table, $use_index, $ignore_index, $join_conds ) . ')';
} else {
// Degenerate case
$innerTable = reset( $table );
}
}
- return ' LIKE ' . $this->addQuotes( $s ) . ' ESCAPE ' . $this->addQuotes( $escapeChar ) . ' ';
+ return ' LIKE ' .
+ $this->addQuotes( $s ) . ' ESCAPE ' . $this->addQuotes( $escapeChar ) . ' ';
}
public function anyChar() {
return false;
}
- public function wasErrorReissuable() {
- return false;
+ public function wasConnectionLoss() {
+ return $this->wasConnectionError( $this->lastErrno() );
}
public function wasReadOnlyError() {
return false;
}
+ public function wasErrorReissuable() {
+ return (
+ $this->wasDeadlock() ||
+ $this->wasLockTimeout() ||
+ $this->wasConnectionLoss()
+ );
+ }
+
/**
* Do not use this method outside of Database/DBError classes
*
$msg = "$fname: Explicit transaction already active (from {$this->trxFname}).";
throw new DBUnexpectedError( $this, $msg );
} else {
- // @TODO: make this an exception at some point
$msg = "$fname: Implicit transaction already active (from {$this->trxFname}).";
- $this->queryLogger->error( $msg );
- return; // join the main transaction set
+ throw new DBUnexpectedError( $this, $msg );
}
} elseif ( $this->getFlag( self::DBO_TRX ) && $mode !== self::TRANSACTION_INTERNAL ) {
- // @TODO: make this an exception at some point
$msg = "$fname: Implicit transaction expected (DBO_TRX set).";
- $this->queryLogger->error( $msg );
- return; // let any writes be in the main transaction
+ throw new DBUnexpectedError( $this, $msg );
}
// Avoid fatals if close() was called
"$fname: No transaction to commit, something got out of sync." );
return; // nothing to do
} elseif ( $this->trxAutomatic ) {
- // @TODO: make this an exception at some point
- $msg = "$fname: Explicit commit of implicit transaction.";
- $this->queryLogger->error( $msg );
- return; // wait for the main transaction set commit round
+ throw new DBUnexpectedError(
+ $this,
+ "$fname: Expected mass commit of all peer transactions (DBO_TRX set)."
+ );
}
}
} elseif ( $this->getFlag( self::DBO_TRX ) ) {
throw new DBUnexpectedError(
$this,
- "$fname: Expected mass rollback of all peer databases (DBO_TRX set)."
+ "$fname: Expected mass rollback of all peer transactions (DBO_TRX set)."
);
}
}
* Returns -1 if count cannot be found
* Takes same arguments as Database::select()
* @param string $table
- * @param string $vars
+ * @param string $var
* @param string $conds
* @param string $fname
* @param array $options
* @param array $join_conds
* @return int
*/
- public function estimateRowCount( $table, $vars = '*', $conds = '',
+ public function estimateRowCount( $table, $var = '*', $conds = '',
$fname = __METHOD__, $options = [], $join_conds = []
) {
+ $conds = $this->normalizeConditions( $conds, $fname );
+ $column = $this->extractSingleFieldFromList( $var );
+ if ( is_string( $column ) && !in_array( $column, [ '*', '1' ] ) ) {
+ $conds[] = "$column IS NOT NULL";
+ }
+
// http://msdn2.microsoft.com/en-us/library/aa259203.aspx
$options['EXPLAIN'] = true;
$options['FOR COUNT'] = true;
- $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds );
+ $res = $this->select( $table, $var, $conds, $fname, $options, $join_conds );
$rows = -1;
if ( $res ) {
* Takes same arguments as Database::select()
*
* @param string|array $table
- * @param string|array $vars
+ * @param string|array $var
* @param string|array $conds
* @param string $fname
* @param string|array $options
* @param array $join_conds
* @return bool|int
*/
- public function estimateRowCount( $table, $vars = '*', $conds = '',
+ public function estimateRowCount( $table, $var = '*', $conds = '',
$fname = __METHOD__, $options = [], $join_conds = []
) {
+ $conds = $this->normalizeConditions( $conds, $fname );
+ $column = $this->extractSingleFieldFromList( $var );
+ if ( is_string( $column ) && !in_array( $column, [ '*', '1' ] ) ) {
+ $conds[] = "$column IS NOT NULL";
+ }
+
$options['EXPLAIN'] = true;
- $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds );
+ $res = $this->select( $table, $var, $conds, $fname, $options, $join_conds );
if ( $res === false ) {
return false;
}
return $this->lastErrno() == 1205;
}
- public function wasErrorReissuable() {
- return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
- }
-
/**
* Determines if the last failure was due to the database being read-only.
*
* Takes same arguments as Database::select()
*
* @param string $table
- * @param string $vars
+ * @param string $var
* @param string $conds
* @param string $fname
* @param array $options
* @param array $join_conds
* @return int
*/
- public function estimateRowCount( $table, $vars = '*', $conds = '',
+ public function estimateRowCount( $table, $var = '*', $conds = '',
$fname = __METHOD__, $options = [], $join_conds = []
) {
+ $conds = $this->normalizeConditions( $conds, $fname );
+ $column = $this->extractSingleFieldFromList( $var );
+ if ( is_string( $column ) && !in_array( $column, [ '*', '1' ] ) ) {
+ $conds[] = "$column IS NOT NULL";
+ }
+
$options['EXPLAIN'] = true;
- $res = $this->select( $table, $vars, $conds, $fname, $options, $join_conds );
+ $res = $this->select( $table, $var, $conds, $fname, $options, $join_conds );
$rows = -1;
if ( $res ) {
$row = $this->fetchRow( $res );
}
public function wasDeadlock() {
- return $this->lastErrno() == '40P01';
+ // https://www.postgresql.org/docs/8.2/static/errcodes-appendix.html
+ return $this->lastErrno() === '40P01';
+ }
+
+ public function wasLockTimeout() {
+ // https://www.postgresql.org/docs/8.2/static/errcodes-appendix.html
+ return $this->lastErrno() === '55P03';
}
public function duplicateTableStructure(
return $this->lastErrno() == 5; // SQLITE_BUSY
}
- /**
- * @return bool
- */
- function wasErrorReissuable() {
- return $this->lastErrno() == 17; // SQLITE_SCHEMA;
- }
-
/**
* @return bool
*/
return $this->lastErrno() == 8; // SQLITE_READONLY;
}
+ public function wasConnectionError( $errno ) {
+ return $errno == 17; // SQLITE_SCHEMA;
+ }
+
/**
* @return string Wikitext of a link to the server software's web site
*/
* Run an SQL query and return the result. Normally throws a DBQueryError
* on failure. If errors are ignored, returns false instead.
*
+ * If a connection loss is detected, then an attempt to reconnect will be made.
+ * For queries that involve no larger transactions or locks, they will be re-issued
+ * for convenience, provided the connection was re-established.
+ *
* In new code, the query wrappers select(), insert(), update(), delete(),
* etc. should be used where possible, since they give much better DBMS
* independence and automatically quote or validate user input in a variety
* This includes the user table in the query, with the alias "a" available
* for use in field names (e.g. a.user_name).
*
+ * A derived table, defined by the result of selectSQLText(), requires an alias
+ * key and a Subquery instance value which wraps the SQL query, for example:
+ *
+ * [ 'c' => new Subquery( 'SELECT ...' ) ]
+ *
* Joins using parentheses for grouping (since MediaWiki 1.31) may be
* constructed using nested arrays. For example,
*
* doing UNION queries, where the SQL text of each query is needed. In general,
* however, callers outside of Database classes should just use select().
*
+ * @see IDatabase::select()
+ *
* @param string|array $table Table name
* @param string|array $vars Field names
* @param string|array $conds Conditions
* @param string $fname Caller function name
* @param string|array $options Query options
* @param string|array $join_conds Join conditions
- *
- * @return string SQL query string.
- * @see IDatabase::select()
+ * @return string SQL query string
*/
public function selectSQLText(
$table, $vars, $conds = '', $fname = __METHOD__,
* Takes the same arguments as IDatabase::select().
*
* @param string $table Table name
- * @param string $vars Unused
+ * @param string $var Column for which NULL values are not counted [default "*"]
* @param array|string $conds Filters on the table
* @param string $fname Function name for profiling
* @param array $options Options for select
* @throws DBError
*/
public function estimateRowCount(
- $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
+ $table, $var = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
);
/**
* @since 1.27 Added $join_conds parameter
*
* @param array|string $tables Table names
- * @param string $vars Unused
+ * @param string $var Column for which NULL values are not counted [default "*"]
* @param array|string $conds Filters on the table
* @param string $fname Function name for profiling
* @param array $options Options for select
* @throws DBError
*/
public function selectRowCount(
- $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
+ $tables, $var = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
);
/**
*/
public function buildIntegerCast( $field );
+ /**
+ * Equivalent to IDatabase::selectSQLText() except wraps the result in Subqyery
+ *
+ * @see IDatabase::selectSQLText()
+ *
+ * @param string|array $table Table name
+ * @param string|array $vars Field names
+ * @param string|array $conds Conditions
+ * @param string $fname Caller function name
+ * @param string|array $options Query options
+ * @param string|array $join_conds Join conditions
+ * @return Subquery
+ * @since 1.31
+ */
+ public function buildSelectSubquery(
+ $table, $vars, $conds = '', $fname = __METHOD__,
+ $options = [], $join_conds = []
+ );
+
/**
* Returns true if DBs are assumed to be on potentially different servers
*
/**
* Determines if the last failure was due to a deadlock
*
+ * Note that during a deadlock, the prior transaction will have been lost
+ *
* @return bool
*/
public function wasDeadlock();
/**
* Determines if the last failure was due to a lock timeout
*
+ * Note that during a lock wait timeout, the prior transaction will have been lost
+ *
* @return bool
*/
public function wasLockTimeout();
/**
- * Determines if the last query error was due to a dropped connection and should
- * be dealt with by pinging the connection and reissuing the query.
+ * Determines if the last query error was due to a dropped connection
+ *
+ * Note that during a connection loss, the prior transaction will have been lost
*
* @return bool
+ * @since 1.31
*/
- public function wasErrorReissuable();
+ public function wasConnectionLoss();
/**
* Determines if the last failure was due to the database being read-only.
*/
public function wasReadOnlyError();
+ /**
+ * Determines if the last query error was due to something outside of the query itself
+ *
+ * Note that the transaction may have been lost, discarding prior writes and results
+ *
+ * @return bool
+ */
+ public function wasErrorReissuable();
+
/**
* Wait for the replica DB to catch up to a given master position
*
--- /dev/null
+<?php
+/**
+ * This file deals with database interface functions
+ * and query specifics/optimisations.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+namespace Wikimedia\Rdbms;
+
+class Subquery {
+ /** @var string */
+ private $sql;
+
+ /**
+ * @param string $sql SQL query defining the table
+ */
+ public function __construct( $sql ) {
+ $this->sql = $sql;
+ }
+
+ /**
+ * @return string Original SQL query
+ */
+ public function __toString() {
+ return '(' . $this->sql . ')';
+ }
+}
$weight = 1.0;
if ( $this->warmCacheRatio > 0 ) {
- $res = $conn->query( 'SHOW STATUS', false );
+ $res = $conn->query( 'SHOW STATUS', __METHOD__ );
$s = $res ? $conn->fetchObject( $res ) : false;
if ( $s === false ) {
$host = $this->parent->getServerName( $index );
/**
* Example virtual rest service for OpenStack Swift
- * @TODO: caching support (APC/memcached)
+ * @todo caching support (APC/memcached)
* @since 1.23
*/
class SwiftVirtualRESTService extends VirtualRESTService {
return;
}
- if ( count( $this->mode[0] ) === 0 ) {
+ if ( count( $this->mode ) === 0 ) {
// This should never ever happen and means
// there is a pretty major bug in this class.
throw new RuntimeException( 'Encountered end element with no mode' );
$this->logger->info( __METHOD__ . " Flash structure did not have all the required components" );
$val = null;
} else {
- $val = ( "\0" | ( $val['Fired'] === 'True' )
+ $val = ( 0 | ( $val['Fired'] === 'True' )
| ( intval( $val['Return'] ) << 1 )
| ( intval( $val['Mode'] ) << 3 )
| ( ( $val['Function'] === 'True' ) << 5 )
$target->getId(),
$guser,
null,
- $tags
+ $tags,
+ $current->getId()
);
// Set patrolling and bot flag on the edits, which gets rollbacked.
$term = $t2 = '';
if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
$t = $t2;
- $output .= $term . $this->nextItem( ':' );
+ // Trim whitespace in list items
+ $output .= trim( $term ) . $this->nextItem( ':' );
}
}
} elseif ( $prefixLength || $lastPrefixLength ) {
# @todo FIXME: This is dupe of code above
if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) {
$t = $t2;
- $output .= $term . $this->nextItem( ':' );
+ // Trim whitespace in list items
+ $output .= trim( $term ) . $this->nextItem( ':' );
}
}
++$commonPrefixLength;
$this->inPre = false;
}
if ( $pendingPTag === false ) {
- $output .= $t;
if ( $prefixLength === 0 ) {
+ $output .= $t;
$output .= "\n";
+ } else {
+ // Trim whitespace in list items
+ $output .= trim( $t );
}
}
}
if ( $driver->supportsValidate() ) {
return $driver->validate( $text, $errorStr );
} else {
- throw new MWException( __METHOD__ . ": error text return from HHVM tidy is not supported" );
+ throw new MWException( __METHOD__ . ": tidy driver does not support validate()" );
}
}
$line = "</{$last_tag}>{$line}";
}
array_pop( $tr_attributes );
- $outLine = $line . str_repeat( '</dd></dl>', $indent_level );
+ if ( $indent_level > 0 ) {
+ $outLine = rtrim( $line ) . str_repeat( '</dd></dl>', $indent_level );
+ } else {
+ $outLine = $line;
+ }
} elseif ( $first_two === '|-' ) {
# Now we have a table row
$line = preg_replace( '#^\|-+#', '', $line );
# be mistaken as delimiting cell parameters
# Bug T153140: Neither should language converter markup.
if ( preg_match( '/\[\[|-\{/', $cell_data[0] ) === 1 ) {
- $cell = "{$previous}<{$last_tag}>{$cell}";
+ $cell = "{$previous}<{$last_tag}>" . trim( $cell );
} elseif ( count( $cell_data ) == 1 ) {
- $cell = "{$previous}<{$last_tag}>{$cell_data[0]}";
+ // Whitespace in cells is trimmed
+ $cell = "{$previous}<{$last_tag}>" . trim( $cell_data[0] );
} else {
$attributes = $this->mStripState->unstripBoth( $cell_data[0] );
$attributes = Sanitizer::fixTagAttributes( $attributes, $last_tag );
- $cell = "{$previous}<{$last_tag}{$attributes}>{$cell_data[1]}";
+ // Whitespace in cells is trimmed
+ $cell = "{$previous}<{$last_tag}{$attributes}>" . trim( $cell_data[1] );
}
$outLine .= $cell;
# Get all headlines for numbering them and adding funky stuff like [edit]
# links - this is for later, but we need the number of headlines right now
+ # This regexp also trims whitespace in the heading's content
$matches = [];
$numMatches = preg_match_all(
'/<H(?P<level>[1-6])(?P<attrib>.*?>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i',
/**
* Get an array of parameters to pass to ParserOutput::setLimitReportData()
*
- * @unstable Should only be called by Parser
+ * @internal Should only be called by Parser
* @return array
*/
public function getLimitReport() {
* the same moment that the function to be profiled terminates.
*
* This is typically called like:
- * @code$section = new ProfileSection( __METHOD__ );@endcode
+ * @code $section = new ProfileSection( __METHOD__ ); @endcode
*
* @param string $name Name of the function to profile
*/
// moduleName => state
],
'general' => [],
- 'styles' => [
- // moduleName
- ],
+ 'styles' => [],
'scripts' => [],
// Embedding for private modules
'embed' => [
}
// Stylesheet doesn't trigger mw.loader callback.
- // Set "ready" state to allow dependencies and avoid duplicate requests. (T87871)
+ // Set "ready" state to allow script modules to depend on this module (T87871).
+ // And to avoid duplicate requests at run-time from mw.loader.
$data['states'][$name] = 'ready';
$group = $module->getGroup();
$context = $this->getContext( $group, ResourceLoaderModule::TYPE_STYLES );
- if ( $module->isKnownEmpty( $context ) ) {
- // Avoid needless request for empty module
- $data['states'][$name] = 'ready';
- } else {
+ // Avoid needless request for empty module
+ if ( !$module->isKnownEmpty( $context ) ) {
if ( $module->shouldEmbedModule( $this->context ) ) {
// Embed via style element
$data['embed']['styles'][] = $name;
- // Avoid duplicate request from mw.loader
- $data['states'][$name] = 'ready';
} else {
// Load from load.php?only=styles via <link rel=stylesheet>
$data['styles'][] = $name;
* 'https://example.org/image.png' => [ 'as' => 'image' ],
* ];
* }
- * @encode
+ * @endcode
*
* @par Example using HiDPI image variants
* @code
* ],
* ];
* }
- * @encode
+ * @endcode
*
* @see ResourceLoaderModule::getHeaders
* @since 1.30
return null;
}
- if ( !( $flags & self::READ_LATEST ) && isset( self::$idCacheByName[$name] ) ) {
+ if ( !( $flags & self::READ_LATEST ) && array_key_exists( $name, self::$idCacheByName ) ) {
return self::$idCacheByName[$name];
}
"wrongpasswordempty": "كلمة السر المدخلة كانت فارغة.\nمن فضلك حاول مرة أخرى.",
"passwordtooshort": "يجب أن تتكون كلمة السر على الأقل من {{PLURAL:$1|حرف واحد|حرفين|$1 حروف|$1 حرفا|$1 حرف}}.",
"passwordtoolong": "كلمات السر لا يجب أن تكون أطول من {{PLURAL:$1|1 حرف|$1 حروف}}.",
- "passwordtoopopular": "Ù\83Ù\84Ù\85ات اÙ\84Ù\85رÙ\88ر اÙ\84شائعة Ù\84ا Ù\8aÙ\85Ù\83Ù\86 استخداÙ\85Ù\87ا. برجاء اختÙ\8aار Ù\83Ù\84Ù\85Ø© Ù\85رÙ\88ر Ø£Ù\83ثر Ù\81رادة.",
+ "passwordtoopopular": "Ù\84ا Ù\8aÙ\85Ù\83Ù\86 استخداÙ\85 Ù\83Ù\84Ù\85ات اÙ\84Ù\85رÙ\88ر اÙ\84Ù\85ختارة بشÙ\83Ù\84 عاÙ\85; Ù\8aÙ\8fرجÙ\8eÙ\89 اختÙ\8aار Ù\83Ù\84Ù\85Ø© Ù\85رÙ\88ر Ù\8aصعب تخÙ\85Ù\8aÙ\86Ù\87ا.",
"password-name-match": "يجب أن تكون كلمة المرور مختلفة عن اسم المستخدم.",
"password-login-forbidden": "تم منع استخدام اسم المستخدم هذا وكلمة السر.",
"mailmypassword": "أعد تعيين كلمة السر",
"rcfilters-activefilters": "چالیشقان فیلترلر",
"rcfilters-days-title": "سوْن گۆنلر",
"rcfilters-hours-title": "سوْن ساعاتلار",
+ "rcfilters-quickfilters-placeholder-title": "هلهلیک هئچ بیر فیلتر ذخیره اوْلونماییبدیر",
"rcfilters-savedqueries-defaultlabel": "ذخیره اوْلونموش فیلترلر",
+ "rcfilters-search-placeholder": "سوْن دییشیکلیکلری فیلترله (منودان سئچین یوْخسا فیلتر آدینی آختارین)",
"rcfilters-filterlist-title": "فیلترلر",
"rcfilters-filtergroup-authorship": "دییشدیرن",
"rcfilters-filtergroup-automated": "اوْتوماتیک دییشدیرمهلر",
"rcfilters-filtergroup-changetype": "دَییشیکلیک نوعو",
"rcfilters-filter-pageedits-label": "صفحه دییشدیرمهلری",
"rcfilters-filter-newpages-label": "صفحه یاراتما",
+ "rcfilters-filter-categorization-label": "بؤلمه دَییشیکلیکلری",
"rcfilters-filtergroup-lastRevision": "سوْن نوسخهلر",
+ "rcfilters-filter-lastrevision-label": "سوْن نوسخه",
"rcnotefrom": "آشاغی داکی دَییشیک لرده <strong>$3, $4</strong> (دن <strong>$1</strong> {{PLURAL:$5|چان گوستریلیب|چان گوستریلیب دیر}}).",
"rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
"rcshowhideminor": "کیچیک دَییشیکلری $1",
"wrongpasswordempty": "Быў уведзены пусты пароль. Калі ласка, паспрабуйце яшчэ раз.",
"passwordtooshort": "Паролі павінны ўтрымліваць ня менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
"passwordtoolong": "Паролі ня могуць быць даўжэй за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
- "passwordtoopopular": "Ð\9dелÑ\8cга вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c пÑ\80оÑ\81Ñ\82Ñ\8bÑ\8f паÑ\80олÑ\96. Ð\9aалÑ\96 лаÑ\81ка, абÑ\8fÑ\80Ñ\8bÑ\86е болÑ\8cÑ\88 Ñ\81кладанÑ\8b паÑ\80оль.",
+ "passwordtoopopular": "Ð\9dелÑ\8cга вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c пÑ\80оÑ\81Ñ\82Ñ\8bÑ\8f паÑ\80олÑ\96. Ð\9aалÑ\96 лаÑ\81ка, абÑ\8fÑ\80Ñ\8bÑ\86е паÑ\80олÑ\8c, Ñ\8fкÑ\96 знаÑ\87на Ñ\86Ñ\8fжÑ\8dй падабÑ\80аÑ\86ь.",
"password-name-match": "Ваш пароль павінен адрозьнівацца ад Вашага імя ўдзельніка.",
"password-login-forbidden": "Выкарыстаньне гэтага імя ўдзельніка і паролю было забароненае.",
"mailmypassword": "Скінуць пароль",
"right-editmyoptions": "Рэдагаваць уласныя налады",
"right-rollback": "Хуткі адкат правак апошняга ўдзельніка, які рэдагаваў старонку",
"right-markbotedits": "Пазначэньне адкатаў як рэдагаваньняў робатам",
- "right-noratelimit": "нÑ\8fма абмежаванÑ\8cнÑ\8fÑ\9e па хуткасьці",
- "right-import": "імпарт старонак зь іншых вікі",
- "right-importupload": "імпарт старонак праз загрузку файлаў",
- "right-patrol": "пазнаÑ\87Ñ\8dнÑ\8cне Ñ\80Ñ\8dдагаванÑ\8cнÑ\8fÑ\9e Ñ\8fк «паÑ\82Ñ\80Ñ\83лÑ\8fванÑ\8bÑ\8f»",
- "right-autopatrol": "аўтаматычнае пазначэньне рэдагаваньняў як «патруляваных»",
+ "right-noratelimit": "Ð\9dÑ\8fма абмежаванÑ\8cнÑ\8fÑ\9e хуткасьці",
+ "right-import": "Імпарт старонак зь іншых вікі",
+ "right-importupload": "Імпарт старонак праз загрузку файлаў",
+ "right-patrol": "Ð\9fазнаÑ\87Ñ\8dнÑ\8cне Ñ\80Ñ\8dдагаванÑ\8cнÑ\8fÑ\9e Ñ\8fк «паÑ\82Ñ\80Ñ\83лÑ\8fванÑ\8bÑ\85»",
+ "right-autopatrol": "Ð\90ўтаматычнае пазначэньне рэдагаваньняў як «патруляваных»",
"right-patrolmarks": "прагляд пазначэньняў пра патруляваньне ў апошніх зьменах",
"right-unwatchedpages": "прагляд сьпісу старонак, за якімі ніхто не назірае",
"right-mergehistory": "аб’яднаньне гісторыі старонак",
"undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika",
"cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''",
"cantcreateaccount-range-text": "Pravljenje računa sa IP adresa u rasponu <strong>$1</strong>, koji uključuje i vašu IP adresu (<strong>$4</strong>), je blokirao korisnik [[User:$3|$3]].\n\nNavedeni razlog korisnika $3 je <em>$2</em>",
- "viewpagelogs": "Pogledaj zapisnike ove stranice",
+ "viewpagelogs": "Prikaži zapisnike ove stranice",
"nohistory": "Ne postoji historija izmjena za ovu stranicu.",
"currentrev": "Trenutna verzija",
"currentrev-asof": "Trenutna verzija na dan $2 u $3",
"rcfilters-liveupdates-button-title-off": "Prikaži nove izmjene uživo",
"rcfilters-watchlist-markseen-button": "Označi sve izmjene viđenim",
"rcfilters-watchlist-edit-watchlist-button": "Izmijeni spisak praćenih stranica",
- "rcfilters-watchlist-showupdated": "Izmjene na stranicama koje niste posjetili otkako su izvršene prikazane su <strong>podebljano</strong>, s ispunjenim kružićima.",
+ "rcfilters-watchlist-showupdated": "Izmjene na stranicama koje niste posjetili otkako su izvršene istaknute su <strong>podebljanim slovima</strong>, s ispunjenim kružićima.",
"rcfilters-preference-label": "Sakrij poboljšanu verziju nedavnih izmjena",
"rcfilters-preference-help": "Poništava novi izgled interfejsa iz 2017. i sve alate dodane od tada.",
"rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
"recentchangeslinked-feed": "Srodne izmjene",
"recentchangeslinked-toolbox": "Srodne izmjene",
"recentchangeslinked-title": "Srodne promjene sa \"$1\"",
- "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
+ "recentchangeslinked-summary": "Upišite naziv stranice da biste vidjeli promjene koje vode na ili sa te stranice. (Da biste vidjeli članove neke kategorije, upišite Kategorija:Naziv kategorije). Promjene na stranicama na [[Special:Watchlist|spisku praćenja]] istaknute su <strong>podebljanim slovima</strong>.",
"recentchangeslinked-page": "Naslov stranice:",
"recentchangeslinked-to": "Prikaži izmjene stranica koji su povezane s datom stranicom",
"recentchanges-page-added-to-category": "Stranica [[:$1]] dodana je u kategoriju",
"emailmessage": "Poruka:",
"emailsend": "Pošalji",
"emailccme": "Pošalji mi kopiju moje poruke e-poštom.",
- "emailccsubject": "Kopija Vaše poruke za $1: $2",
+ "emailccsubject": "Kopija Vaše poruke korisniku/-ci $1: $2",
"emailsent": "Poruka poslata",
"emailsenttext": "Vaša poruka je poslata e-poštom.",
"emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s {{GRAMMAR:genitiv|{{SITENAME}}}}. Ako {{GENDER:$2|odgovorite}} na ovu e-poruku, {{GENDER:$2|Vaša}} će se poruka direktno poslati {{GENDER:$1|originalnom pošiljaocu|originalnoj pošiljatejici}} i otkrit ćete {{GENDER:$1|mu|joj}} {{GENDER:$2|svoju}} adresu e-pošte.",
"notvisiblerev": "Obrisana je posljednja izmjena drugog korisnika",
"watchlist-details": "Imate {{PLURAL:$1|$1 stranicu|$1 stranice|$1 stranica}} na spisku praćenja (plus stranice za razgovor).",
"wlheader-enotif": "Uključeno je obavještenje e-poštom.",
- "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili prikazane su <strong>podebljanim slovima</strong>.",
+ "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili istaknute su <strong>podebljanim slovima</strong>.",
"wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su <strong>$1</strong> posljednje izmjene|su <strong>$1</strong> posljednjih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
"wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
"watchlist-hide": "Sakrij",
"nstab-user": "پەڕەی بەکارھێنەر",
"nstab-media": "میدیا",
"nstab-special": "پەڕەی تایبەت",
- "nstab-project": "پەڕەی پڕۆژە",
+ "nstab-project": "پەڕەی پرۆژە",
"nstab-image": "پەڕگە",
"nstab-mediawiki": "پەیام",
"nstab-template": "داڕێژە",
"searchrelated": "پەیوەست",
"searchall": "ھەموو",
"showingresults": "لە خوارەوە {{PLURAL:$1|'''یەک''' ئەنجام|'''$1''' ئەنجام}} نیشان دراوە، بە دەست پێ کردن لە ژمارەی '''$2'''ەوە.",
+ "showingresultsinrange": "لە خوارەوە زیاتر لە <strong>$1</strong> ئەنجام لە مەودای #$2 بۆ #<strong>$3</strong> پیشان دەدرێت.",
"search-showingresults": "{{PLURAL:$4|ئاکامی <strong>$1</strong> لە <strong>$3</strong>|ئاکامەکانی <strong>$1 - $2</strong> لە <strong>$3</strong>}}",
"search-nonefound": "ھیچ ئاکامێک کە بە داواکارییەکەت بخوا نەدۆزرایەوە.",
"powersearch-legend": "گەڕانی پێشکەوتوو",
"tooltip-ca-nstab-user": "پەڕەی بەکارھێنەر تەماشا بکە",
"tooltip-ca-nstab-media": "پەڕەی میدیا چاو لێ بکە",
"tooltip-ca-nstab-special": "ئەمە پەڕەیەکی تایبەتە و دەستکاری ناکرێت",
- "tooltip-ca-nstab-project": "بینینی پەڕەی پڕۆژە",
+ "tooltip-ca-nstab-project": "بینینی پەڕەی پرۆژە",
"tooltip-ca-nstab-image": "بینینی پەڕەی پەڕگە",
"tooltip-ca-nstab-mediawiki": "بینینی پەیامی سیستەم",
"tooltip-ca-nstab-template": "بینینی قاڵبەکە",
"R12ntech",
"Joedalton",
"EeveeSylveon",
- "Kenn.jensen"
+ "Kenn.jensen",
+ "Saederup92"
]
},
"tog-underline": "Understreg henvisninger:",
"postedit-confirmation-created": "Siden er blevet oprettet.",
"postedit-confirmation-restored": "Siden er blevet genoprettet.",
"postedit-confirmation-saved": "Din redigering er gemt.",
+ "postedit-confirmation-published": "Din ændring blev udgivet.",
"edit-already-exists": "En ny side kunne ikke oprettes, fordi den allerede findes.",
"defaultmessagetext": "Standardtekst",
"content-failed-to-parse": "Kunne ikke fortolke $2-indholdet af $1-modellen: $3",
"rcfilters-watchlist-edit-watchlist-button": "Rediger din liste med overvågede sider",
"rcfilters-watchlist-showupdated": "Ændringer til sider du ikke har besøgt siden ændringerne blev gjort vises med <strong>fed</strong>, med faste markører.",
"rcfilters-preference-label": "Skjul den forbedrede verson af Seneste ændringer",
- "rcfilters-target-page-placeholder": "Indtast et sidenavn",
+ "rcfilters-target-page-placeholder": "Indtast et sidenavn (eller en kategori)",
"rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
"rclistfromreset": "Nulstil datovalg",
"rclistfrom": "Vis nye ændringer startende fra den $3 kl. $2",
"uploadstash-errclear": "Rydning af filerne mislykkedes.",
"uploadstash-refresh": "Opdatér filoversigten",
"uploadstash-thumbnail": "vis miniature",
+ "uploadstash-bad-path": "Sti findes ikke.",
+ "uploadstash-bad-path-invalid": "Stien er ugyldig.",
"uploadstash-bad-path-unknown-type": "Ukendt type »$1«.",
"uploadstash-file-not-found-no-object": "Kunne ikke oprette lokalt filobjekt for miniaturebillede.",
"uploadstash-not-logged-in": "Ingen bruger er logget ind, filer skal tilhøre brugere.",
"tags-edit-chosen-placeholder": "Vælg nogle mærker",
"tags-edit-chosen-no-results": "Ingen mærker fundet som matcher",
"tags-edit-reason": "Årsag:",
+ "tags-edit-success": "Ændringerne blev udført.",
"comparepages": "Sammenlign sider",
"compare-page1": "Side 1",
"compare-page2": "Side 2",
"pagelang-use-default": "Brug standardsprog",
"pagelang-select-lang": "Vælg sprog",
"pagelang-reason": "Begrundelse",
+ "pagelang-submit": "Indsend",
"right-pagelang": "Ændre sidesproget",
"mediastatistics": "Mediestatistik",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
"mediastatistics-header-total": "Alle filer",
"json-error-state-mismatch": "Ugyldig eller fejlbehæftet JSON",
"json-error-syntax": "Syntaksfejl",
+ "headline-anchor-title": "Link til denne sektion",
"special-characters-group-latin": "Latin",
"special-characters-group-latinextended": "Udvidet latin",
"special-characters-group-ipa": "IPA",
"mw-widgets-dateinput-no-date": "Ingen dato valgt",
"mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
"mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+ "mw-widgets-mediasearch-noresults": "Der blev ikke fundet noget resultat.",
"mw-widgets-titleinput-description-new-page": "side eksisterer ikke endnu",
"mw-widgets-titleinput-description-redirect": "omdiriger til $1",
"mw-widgets-categoryselector-add-category-placeholder": "Tilføj en kategori...",
"log-action-filter-protect-move_prot": "Flyttede beskyttelse",
"log-action-filter-upload-upload": "Ny overførsel",
"authmanager-create-from-login": "For at oprette din konto, så udfyld venligst felterne.",
+ "authmanager-authplugin-setpass-bad-domain": "Ugyldig domæne.",
+ "authmanager-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.",
"authmanager-email-label": "E-post",
"authmanager-email-help": "E-postadresse",
+ "authmanager-realname-label": "Rigtige navn",
+ "authmanager-realname-help": "Brugerens egentlige navn",
"authmanager-provider-temporarypassword": "Midlertidig adgangskode",
+ "authprovider-resetpass-skip-label": "Spring over",
"specialpage-securitylevel-not-allowed-title": "Ikke tilladt",
"cannotauth-not-allowed-title": "Adgang nægtet",
"cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side",
"removecredentials-success": "Dine akkreditiver er blevet fjernet.",
"credentialsform-provider": "Akkreditivtype:",
"credentialsform-account": "Kontonavn:",
- "edit-error-short": "Fejl: $1"
+ "edit-error-short": "Fejl: $1",
+ "edit-error-long": "Fejl:\n\n$1",
+ "pagedata-bad-title": "Ugyldig titel: $1"
}
"wrongpasswordempty": "Es wurde kein Passwort eingegeben. Bitte versuche es erneut.",
"passwordtooshort": "Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.",
"passwordtoolong": "Passwörter können nicht länger als {{PLURAL:$1|ein|$1}} Zeichen sein.",
- "passwordtoopopular": "Häufig ausgewählte Passwörter können nicht verwendet werden. Bitte wähle ein einzigartigeres Passwort aus.",
+ "passwordtoopopular": "Häufig ausgewählte Passwörter können nicht verwendet werden. Bitte wähle ein Passwort aus, das schwieriger zu erraten ist.",
"password-name-match": "Dein Passwort muss sich von deinem Benutzernamen unterscheiden.",
"password-login-forbidden": "Die Verwendung dieses Benutzernamens und Passwortes ist nicht erlaubt.",
"mailmypassword": "Passwort zurücksetzen",
"wrongpasswordempty": "Password entered was blank.\nPlease try again.",
"passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
"passwordtoolong": "Passwords cannot be longer than {{PLURAL:$1|1 character|$1 characters}}.",
- "passwordtoopopular": "Commonly chosen passwords cannot be used. Please choose a more unique password.",
+ "passwordtoopopular": "Commonly chosen passwords cannot be used. Please choose a password that is more difficult to guess.",
"password-name-match": "Your password must be different from your username.",
"password-login-forbidden": "The use of this username and password has been forbidden.",
"mailmypassword": "Reset password",
"wrongpasswordempty": "No has escrito una contraseña.\nInténtalo de nuevo.",
"passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 carácter|$1 caracteres}}.",
"passwordtoolong": "Las contraseñas no deben tener más de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
- "passwordtoopopular": "No se pueden usar las contraseñas más comunes. Elige una menos popular.",
+ "passwordtoopopular": "No es posible utilizar las contraseñas más comunes. Elige una que sea más difícil de descifrar.",
"password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
"password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
"mailmypassword": "Restablecer la contraseña",
"apisandbox-deprecated-parameters": "Parámetros desaconsejados",
"apisandbox-fetch-token": "Auto-llenar el token",
"apisandbox-submit-invalid-fields-title": "Algunos campos no son válidos",
- "apisandbox-submit-invalid-fields-message": "Por favor, corrige los campos señalados e inténtalo de nuevo.",
+ "apisandbox-submit-invalid-fields-message": "Corrige los campos señalados e inténtalo de nuevo.",
"apisandbox-results": "Resultados",
"apisandbox-sending-request": "Enviando pedido a la API...",
"apisandbox-loading-results": "Recibiendo resultados de la API...",
"whatlinkshere-hideimages": "$1 enlaces a archivos",
"whatlinkshere-filters": "Filtros",
"whatlinkshere-submit": "Ir",
- "autoblockid": "Bloqueo automático #$1",
+ "autoblockid": "Bloqueo automático n.º $1",
"block": "Bloquear usuario",
"unblock": "Desbloquear usuario",
"blockip": "Bloquear {{GENDER:$1|al usuario|a la usuaria}}",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
"limitreport-expansiondepth": "Profundidad máxima de expansión",
"limitreport-expensivefunctioncount": "Cuenta de la función expansiva del analizador",
+ "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
"expandtemplates": "Expandir plantillas",
"expand_templates_intro": "Esta página especial toma un texto wiki y expande todas sus plantillas recursivamente.\nTambién expande las funciones sintácticas como <code><nowiki>{{</nowiki>#language:…}}</code>, y variables como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. De hecho, expande casi cualquier cosa que esté entre llaves dobles.",
"expand_templates_title": "Título de la página, útil para expandir {{FULLPAGENAME}} o similares:",
"recentchangeslinked-summary": "Sartu orrialde baten izena orrialdearekin lotutako edota orrialdetik lotutako orrialdeetan aldaketak ikusteko. (Kategoria baten kideak ikusteko, idatzi Kategoria: Kategoria izena). [[Special:Watchlist|Zure jarraipen zerrendan]] dauden orrietan aldaketak <strong>letra lodian</strong> daude.",
"recentchangeslinked-page": "Orriaren izena:",
"recentchangeslinked-to": "Lotutako orrietarako aldaketak erakutsi emandako orriaren ordez",
- "recentchanges-page-added-to-category": "[[:$1]] Kategoriara gehitua",
+ "recentchanges-page-added-to-category": "«[[:$1]]» gehitu da kategoriara",
"recentchanges-page-added-to-category-bundled": "[[:$1]] kategoriara gehitua, [[Special:WhatLinksHere/$1|horri hau beste orri batzuen artean sartuta dago]]",
"recentchanges-page-removed-from-category": "[[:$1]] kategoriatik kendu da",
"recentchanges-page-removed-from-category-bundled": "[[:$1]] kategoriatik kendua, [[Special:WhatLinksHere/$1|horri hau beste orri batzuen artean sartuta dago]]",
"unblockiptext": "Erabili beheko formularioa lehenago blokeatutako IP helbide edo erabiltzaile baten idazketa baimenak leheneratzeko.",
"ipusubmit": "Blokeoa ezabatu",
"unblocked": "[[User:$1|$1]] desblokeatu egin da",
- "unblocked-range": "$1 desblokeatuta izan da.",
+ "unblocked-range": "$1 desblokeatua izan da.",
"unblocked-id": "$1 blokeaketa ezabatu da",
"unblocked-ip": "[[Special:Contributions/$1|$1]] desblokeatua izan da.",
"blocklist": "Blokeatutako erabiltzaileak",
"revdelete-restricted": "administratzaileentzako mugak ezarri dira",
"revdelete-unrestricted": "administratzaileentzako mugak kendu dira",
"logentry-block-block": "$1 {{GENDER:$2|administratzaileak}} {{GENDER:$4|$3}} blokeatu du. Iraupena: $5 $6",
- "logentry-block-unblock": "$1 {{GENDER:$2|desblokeatuta}} {{GENDER:$4|$3}}",
+ "logentry-block-unblock": "$1 {{GENDER:$2|administratzaileak}} {{GENDER:$4|$3}} wikilaria desblokeatu du",
"logentry-block-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6",
"logentry-suppress-block": "$1 {{GENDER:$2|administratzaileak}} {{GENDER:$4|$3}} blokeatu du. Iraupena: $5 $6",
"logentry-suppress-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6",
"stub-threshold-disabled": "Ei käytössä",
"recentchangesdays": "Näytettävien päivien määrä tuoreissa muutoksissa",
"recentchangesdays-max": "Enintään $1 {{PLURAL:$1|päivä|päivää}}",
- "recentchangescount": "Näytettävien muutoksien määrä oletuksena",
- "prefs-help-recentchangescount": "Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.",
+ "recentchangescount": "Näytettävien muutoksien määrä tuoreissa muutoksissa, sivujen historioissa ja logeissa oletuksena",
+ "prefs-help-recentchangescount": "Maksimiluku 1000",
"prefs-help-watchlist-token2": "Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.\nKuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.\nJos sinun täytyy, [[Special:ResetTokens|voit uudistaa sen]].",
"savedprefs": "Asetuksesi on tallennettu.",
"savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttäjäryhmät on tallennettu.",
"wrongpasswordempty": "Vous n’avez entré aucun mot de passe.\nVeuillez essayer à nouveau.",
"passwordtooshort": "Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.",
"passwordtoolong": "Les mots de passe ne peuvent pas dépasser $1 caractère{{PLURAL:$1||s}}.",
- "passwordtoopopular": "Les mots de passe trop courants ne peuvent pas être utilisés. Veuillez choisir un mot de passe plus original.",
+ "passwordtoopopular": "Les mots de passe trop courants ne peuvent pas être utilisés. Veuillez choisir un mot de passe plus difficile à deviner.",
"password-name-match": "Votre mot de passe doit être différent de votre nom d’utilisateur.",
"password-login-forbidden": "L’utilisation de ce nom d’utilisateur ou de ce mot de passe a été interdite.",
"mailmypassword": "Réinitialiser le mot de passe",
"tog-watchlisthideminor": "הסתרת עריכות משניות ברשימת המעקב",
"tog-watchlisthideliu": "הסתרת עריכות של משתמשים רשומים ברשימת המעקב",
"tog-watchlistreloadautomatically": "רענון אוטומטי של רשימת המעקב בכל פעם שמסנן משתנה (דרוש JavaScript)",
- "tog-watchlistunwatchlinks": "×\94×\95ספת ק×\99ש×\95ר×\99 ×\94פסקת/×\94פע×\9cת ×\9eעק×\91 ×\9cער×\9bים ברשימת המעקב (דרוש JavaScript כדי שהקישור יתעדכן בעת לחיצה עליו)",
+ "tog-watchlistunwatchlinks": "×\94×\95ספת ק×\99ש×\95ר×\99 ×\94פסקת/×\94פע×\9cת ×\9eעק×\91 ×\9c×\93פים ברשימת המעקב (דרוש JavaScript כדי שהקישור יתעדכן בעת לחיצה עליו)",
"tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
"tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
"tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות",
"privacy": "מדיניות הפרטיות",
"privacypage": "Project:מדיניות הפרטיות",
"badaccess": "שגיאת הרשאה",
- "badaccess-group0": "אין {{GENDER:|לך|לך|לכם}} הרשאה לבצע את הפעולה ש{{GENDER:|ביקשת|ביקשת|ביקשתם}}.",
- "badaccess-groups": "הפעולה ש{{GENDER:|ביקשת|ביקשת|ביקשתם}} לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
+ "badaccess-group0": "אין לך הרשאה לבצע את הפעולה שביקשת.",
+ "badaccess-groups": "הפעולה שביקשת לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
"versionrequired": "נדרשת גרסה $1 של מדיה־ויקי",
"versionrequiredtext": "גרסה $1 של תוכנת מדיה־ויקי נדרשת לשימוש בדף הזה.\n{{GENDER:|ראה|ראי|ראו}} [[Special:Version|מידע על הגרסה]].",
"ok": "אישור",
"sort-ascending": "מיון בסדר עולה",
"nstab-main": "דף תוכן",
"nstab-user": "דף משתמש",
- "nstab-media": "מדיה",
+ "nstab-media": "×\93×£ ×\9e×\93×\99×\94",
"nstab-special": "דף מיוחד",
"nstab-project": "דף מיזם",
"nstab-image": "קובץ",
"laggedslavemode": "<strong>אזהרה:</strong> הדף עשוי שלא להכיל עדכונים אחרונים.",
"readonly": "בסיס הנתונים נעול",
"enterlockreason": "יש להקליד סיבה לנעילה, כולל הערכה למועד שחרור הנעילה",
- "readonlytext": "×\91ס×\99ס ×\94× ×ª×\95× ×\99×\9d × ×¢×\95×\9c ×\9bר×\92×¢ ×\9c×\94×\96× ×ª × ×ª×\95× ×\99×\9d ×\95ש×\99× ×\95×\99×\99×\9d. ×\9b×\9b×\9c ×\94× ×¨×\90×\94 מדובר בתחזוקה שוטפת, שלאחריה יחזור האתר לפעולתו הרגילה.\n\nמנהל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
+ "readonlytext": "×\91ס×\99ס ×\94× ×ª×\95× ×\99×\9d × ×¢×\95×\9c ×\9bר×\92×¢ ×\9c×\94×\96× ×ª × ×ª×\95× ×\99×\9d ×\97×\93ש×\99×\9d ×\95×\9cש×\99× ×\95×\99×\99×\9d ×\90×\97ר×\99×\9d. ×\9b×\9b×\9c ×\94× ×¨×\90×\94, מדובר בתחזוקה שוטפת, שלאחריה יחזור האתר לפעולתו הרגילה.\n\nמנהל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
"missing-article": "בסיס הנתונים לא מצא את הטקסט של הדף שהוא היה אמור למצוא, בשם \"$1\" $2.\n\nזה נגרם בדרך־כלל עקב לחיצה על קישור ישן לגרסה של דף שנמחק.\n\nאם זה אינו המקרה, זהו כנראה באג בתוכנה.\nנא לדווח על כך ל[[Special:ListUsers/sysop|מפעיל מערכת]], תוך שמירת פרטי כתובת ה־URL.",
"missingarticle-rev": "(מספר גרסה: $1)",
"missingarticle-diff": "(השוואת הגרסאות: $1, $2)",
"unexpected": "ערך לא צפוי: \"$1\"=\"$2\".",
"formerror": "שגיאה: לא ניתן היה לשלוח את הטופס.",
"badarticleerror": "לא ניתן לבצע את הפעולה הזאת בדף זה.",
- "cannotdelete": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9e×\97×\95ק ×\90ת ×\94×\93×£ ×\90×\95 ×\94ק×\95×\91×¥ \"$1\".\n×\99×\99ת×\9b×\9f ש×\94×\95×\90 ×\9b×\91ר × ×\9e×\97ק ×¢×\9cÖ¾×\99×\93×\99 ×\9eשת×\9eש אחר.",
+ "cannotdelete": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9e×\97×\95ק ×\90ת ×\94×\93×£ ×\90×\95 ×\90ת ×\94ק×\95×\91×¥ \"$1\".\n×\99×\99ת×\9b×\9f ש×\94×\95×\90 ×\9b×\91ר × ×\9e×\97ק ×¢×\9cÖ¾×\99×\93×\99 ×\9e×\99ש×\94×\95 אחר.",
"cannotdelete-title": "לא ניתן למחוק את הדף \"$1\"",
"delete-hook-aborted": "המחיקה הופסקה על־ידי מבנה Hook.\nלא ניתן הסבר.",
"no-null-revision": "לא ניתן היה ליצור גרסת־דמה בדף \"$1\"",
"title-invalid-interwiki": "כותרת הדף המבוקש מכילה קישור בינוויקי, שלא ניתן להשתמש בו בכותרות.",
"title-invalid-talk-namespace": "כותרת הדף המבוקש מפנה לדף שיחה שאינו יכול להתקיים.",
"title-invalid-characters": "כותרת הדף המבוקש מכילה תווים בלתי תקינים: \"$1\".",
- "title-invalid-relative": "×\91×\9b×\95תרת ×\99ש × ×ª×\99×\91 ×\99×\97ס×\99. ×\9b×\95תרת ×\93פ×\99×\9d ×\99×\97ס×\99×\95ת (./, ../) ×\90×\99× ×\9f תק×\99× ×\95ת, ×\9eש×\95×\9d ש×\9cעת×\99×\9d קר×\95×\91×\95ת ×\94×\9f ×\99×\94×\99×\95 ×\91×\9cת×\99Ö¾× ×\99×ª× ×\95ת ×\9c×\94ש×\92×\94 ×\9bשת×\98×\95פ×\9c× ×\94 ×¢×\9cÖ¾ידי הדפדפן של המשתמש.",
+ "title-invalid-relative": "×\91×\9b×\95תרת ×\99ש × ×ª×\99×\91 ×\99×\97ס×\99. ×\9b×\95תר×\95ת ×\93פ×\99×\9d ×\99×\97ס×\99×\95ת (./, ../) ×\90×\99× ×\9f תק×\99× ×\95ת, ×\9b×\99×\95×\95×\9f ש×\9cעת×\99×\9d קר×\95×\91×\95ת ×\9c×\90 × ×\99ת×\9f ×\99×\94×\99×\94 ×\9c×\92שת ×\90×\9c×\99×\94×\9f ×\90×\9d ×\94×\9f ×\99×\98×\95פ×\9c×\95 ×\91ידי הדפדפן של המשתמש.",
"title-invalid-magic-tilde": "כותרת הדף המבוקש מכילה רצף טילדות מיוחד שאינו תקין (<nowiki>~~~</nowiki>).",
"title-invalid-too-long": "כותרת הדף המבוקש ארוכה מדי. היא צריכה להיות לכל היותר באורך של {{PLURAL:$1|בית אחד|$1 בתים}} בקידוד UTF-8.",
"title-invalid-leading-colon": "כותרת הדף המבוקש מכילה תו נקודתיים בלתי תקין בתחילתה.",
"actionthrottled": "הפעולה הוגבלה",
"actionthrottledtext": "כאמצעי נגד שימוש לרעה, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
"protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
- "viewsourcetext": "ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לצפות בטקסט המקור של הדף ולהעתיקו.",
- "viewyourtext": "ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לצפות בטקסט המקור של <strong>העריכות {{GENDER:|שלך|שלך|שלכם}}</strong> בדף הזה ולהעתיקו.",
+ "viewsourcetext": "באפשרותך לצפות בטקסט המקור של הדף ולהעתיקו.",
+ "viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
"protectedinterface": "דף זה הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}, והוא מוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
- "editinginterface": "<strong>×\90×\96×\94ר×\94:</strong> ×\94×\93×£ ש{{GENDER:|×\90ת×\94 ×¢×\95ר×\9a|×\90ת ×¢×\95ר×\9bת|×\90ת×\9d ×¢×\95ר×\9b×\99×\9d}} הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על ממשק המשתמש של משתמשים אחרים באתר.",
+ "editinginterface": "<strong>×\90×\96×\94ר×\94:</strong> ×\93×£ ×\96×\94 הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על ממשק המשתמש של משתמשים אחרים באתר.",
"translateinterface": "כדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
"cascadeprotected": "דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:\n$2",
"namespaceprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
"wrongpasswordempty": "הסיסמה שהזנת ריקה.\nנא לנסות שוב.",
"passwordtooshort": "סיסמאות חייבות להיות באורך {{PLURAL:$1|תו אחד|$1 תווים}} לפחות.",
"passwordtoolong": "סיסמאות אינן יכולות להיות ארוכות {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
- "passwordtoopopular": "×\9c×\90 × ×\99ת×\9f ×\9c×\94שת×\9eש ×\91ס×\99ס×\9e×\90×\95ת × ×¤×\95צ×\95ת. ×\99ש ×\9c×\91×\97×\95ר ס×\99ס×\9e×\94 ×\99×\99×\97×\95×\93×\99ת ×\99×\95תר.",
+ "passwordtoopopular": "×\9c×\90 × ×\99ת×\9f ×\9c×\94שת×\9eש ×\91ס×\99ס×\9e×\90×\95ת × ×¤×\95צ×\95ת. ×\99ש ×\9c×\91×\97×\95ר ס×\99ס×\9e×\94 קש×\94 ×\99×\95תר ×\9c× ×\99×\97×\95ש.",
"password-name-match": "סיסמתך חייבת להיות שונה משם המשתמש שלך.",
"password-login-forbidden": "השימוש בשם המשתמש והסיסמה האלה נאסר.",
"mailmypassword": "איפוס סיסמה",
"session_fail_preview": "מצטערים! לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.\n\nייתכן שנותקתם מהחשבון. <strong>אנא ודאו שאתם עדיין מחוברים לחשבון ונסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
"session_fail_preview_html": "מצטערים! לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.\n\n<em>כיוון שב{{grammar:תחילית|{{SITENAME}}}} אפשרות השימוש ב־HTML גולמי מופעלת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.</em>\n\n<strong>אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
"token_suffix_mismatch": "'''עריכתך נדחתה כיוון שהדפדפן שלך מחק את תווי הפיסוק באסימון העריכה.'''\nהעריכה נדחתה כדי למנוע בעיות כאלה בטקסט של הדף.\nלעתים התקלה מתרחשת עקב שימוש בשירות פרוקסי אנונימי פגום.",
- "edit_form_incomplete": "<strong>חלקים מסוימים מטופס העריכה לא הגיעו לשרת; אנא {{GENDER:|בדוק|בִדקי|בִדקו}} שהעריכה לא נפגעה ו{{GENDER:|נסה|נסי|נסו}} שוב.</strong>",
+ "edit_form_incomplete": "<strong>חלקים מסוימים מטופס העריכה לא הגיעו לשרת; אנא {{GENDER:|בדוק|בדקי|בדקו}} שהעריכה לא נפגעה ו{{GENDER:|נסה|נסי|נסו}} שוב.</strong>",
"editing": "עריכת הדף \"$1\"",
"creating": "יצירת הדף \"$1\"",
"editingsection": "עריכת הדף \"$1\" (פסקה)",
"searchprofile-advanced": "מתקדם",
"searchprofile-articles-tooltip": "חיפוש $1",
"searchprofile-images-tooltip": "חיפוש קבצים",
- "searchprofile-everything-tooltip": "×\97×\99פ×\95ש ×\91×\9b×\9c ×\94ת×\95×\9b×\9f (×\9c×\9e×¢×\98 דפי השיחה)",
+ "searchprofile-everything-tooltip": "×\97×\99פ×\95ש ×\91×\9b×\9c ×\94ת×\95×\9b×\9f (×\9b×\95×\9c×\9c דפי השיחה)",
"searchprofile-advanced-tooltip": "חיפוש במרחבי שם מותאמים אישית",
"search-result-size": "$1 ({{PLURAL:$2|מילה אחת|$2 מילים}})",
"search-result-category-size": "{{PLURAL:$1|פריט אחד|$1 פריטים}} ({{PLURAL:$2|קטגוריית משנה אחת|$2 קטגוריות משנה}}, {{PLURAL:$3|קובץ אחד|$3 קבצים}})",
"recentchanges-label-unpatrolled": "עריכה זו טרם נבדקה",
"recentchanges-label-plusminus": "גודל הדף השתנה במספר זה של בתים",
"recentchanges-legend-heading": "<strong>מקרא:</strong>",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ({{GENDER:|ראה|ראי|ראו}} גם את [[Special:NewPages|רשימת הדפים החדשים]])",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ר' גם את [[Special:NewPages|רשימת הדפים החדשים]])",
"recentchanges-legend-plusminus": "(<em>±123</em>)",
"recentchanges-submit": "הצגה",
"rcfilters-tag-remove": "הסרת \"$1\"",
"listfiles-latestversion-no": "לא",
"file-anchor-link": "קובץ",
"filehist": "היסטוריית הקובץ",
- "filehist-help": "×\9c×\97צ×\95 ×¢×\9c ת×\90ר×\99×\9a/שע×\94 ×\9b×\93×\99 ×\9cר×\90×\95ת ×\90ת ×\94ק×\95×\91×¥ ×\9bפ×\99 ×©× ×¨×\90×\94 ×\91עת ×\96×\95.",
+ "filehist-help": "× ×\99ת×\9f ×\9c×\9c×\97×\95×¥ ×¢×\9c ת×\90ר×\99×\9a/שע×\94 ×\9b×\93×\99 ×\9cר×\90×\95ת ×\90ת ×\94ק×\95×\91×¥ ×\9bפ×\99 ×©× ×¨×\90×\94 ×\91×\90×\95ת×\95 ×\96×\9e×\9f.",
"filehist-deleteall": "מחיקת כל הגרסאות",
"filehist-deleteone": "מחיקה",
"filehist-revert": "שחזור",
"filerevert-comment": "סיבה:",
"filerevert-defaultcomment": "שוחזר לגרסה מ־$2, $1 ($3)",
"filerevert-submit": "שחזור",
- "filerevert-success": "<strong>[[Media:$1|$1]]</strong> שוחזר ל[$4 גרסה מ־$3, $2].",
+ "filerevert-success": "הקובץ <strong>[[Media:$1|$1]]</strong> שוחזר ל[$4 גרסה מ־$3, $2].",
"filerevert-badversion": "אין גרסה מקומית קודמת של הקובץ שהועלתה בתאריך המבוקש.",
"filerevert-identical": "הגרסה הנוכחית של הקובץ כבר זהה לגרסה שנבחרה.",
"filedelete": "מחיקת $1",
"filedelete-intro-old": "אתם מוחקים את הגרסה של '''[[Media:$1|$1]]''' מ־[$4 $3, $2].",
"filedelete-comment": "סיבה:",
"filedelete-submit": "מחיקה",
- "filedelete-success": "'''$1''' נמחק.",
- "filedelete-success-old": "הגרסה של '''[[Media:$1|$1]]''' מ־$3, $2 נמחקה.",
- "filedelete-nofile": "'''$1''' אינו קיים.",
- "filedelete-nofile-old": "אין גרסה ישנה של '''$1''' עם התכונות המבוקשות.",
+ "filedelete-success": "הקובץ <strong>$1</strong> נמחק.",
+ "filedelete-success-old": "הגרסה של הקובץ <strong>[[Media:$1|$1]]</strong> מ־$3, $2 נמחקה.",
+ "filedelete-nofile": "הקובץ <strong>$1</strong> אינו קיים.",
+ "filedelete-nofile-old": "אין גרסה ישנה של הקובץ <strong>$1</strong> עם התכונות המבוקשות.",
"filedelete-otherreason": "סיבה נוספת/אחרת:",
"filedelete-reason-otherlist": "סיבה אחרת",
"filedelete-reason-dropdown": "* סיבות מחיקה נפוצות\n** הפרת זכויות יוצרים\n** קובץ כפול",
"deletereasonotherlist": "סיבה אחרת",
"deletereason-dropdown": "* סיבות מחיקה נפוצות\n** ספאם\n** השחתה\n** הפרת זכויות יוצרים\n** לבקשת הכותב\n** הפניה שבורה",
"delete-edit-reasonlist": "עריכת סיבות המחיקה",
- "delete-toobig": "×\93×£ ×\96×\94 ×\9b×\95×\9c×\9c ×\9e×¢×\9c {{PLURAL:$1|×\92רס×\94 ×\90×\97ת|$1 ×\92רס×\90×\95ת}} ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94ער×\99×\9b×\95ת ש×\9c×\95. ×\9e×\97×\99קת ×\93פ×\99×\9d ×\9b×\90×\9c×\94 ×\94×\95×\92×\91×\9c×\94 ×\9b×\93×\99 ×\9c×\9e× ×\95×¢ פ×\92×\99×¢×\94 ×\91×\91×\99צ×\95×¢×\99 ×\94×\90תר.",
+ "delete-toobig": "×\9c×\93×£ ×\96×\94 ×\99ש ×\94×\99ס×\98×\95ר×\99×\99ת ער×\99×\9b×\95ת ×\92×\93×\95×\9c×\94, ש×\9e×\9b×\99×\9c×\94 ×\99×\95תר {{PLURAL:$1|×\9e×\92רס×\94 ×\90×\97ת|×\9eÖ¾$1 ×\92רס×\90×\95ת}}.\n×\9e×\97×\99קת ×\93פ×\99×\9d ×\9b×\90×\9c×\94 ×\94×\95×\92×\91×\9c×\94 ×\9b×\93×\99 ×\9c×\9e× ×\95×¢ ×\91×¢×\99×\95ת ×\91תפק×\95×\93 ש×\9c {{SITENAME}}.",
"delete-warning-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.",
"deleteprotected": "אין {{GENDER:|באפשרותך|באפשרותך|באפשרותכם}} למחוק את הדף כי הוא מוגן.",
"deleting-backlinks-warning": "<strong>אזהרה:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף ש{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} למחוק או מכלילים אותו.",
"ipb-blocklist-contribs": "תרומות של {{GENDER:$1|$1}}",
"ipb-blocklist-duration-left": "נותרו $1",
"unblockip": "שחרור חסימה של משתמש",
- "unblockiptext": "השתמשו בטופס שלהלן כדי להחזיר את הרשאות הכתיבה למשתמש או כתובת IP חסומים.",
+ "unblockiptext": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי להחזיר את הרשאות הכתיבה לכתובת IP חסומה או למשתמש חסום.",
"ipusubmit": "הסרת חסימה זו",
"unblocked": "[[User:$1|$1]] {{GENDER:$1|שוחרר מחסימתו|שוחררה מחסימתה}}.",
"unblocked-range": "$1 שוחרר מחסימתו.",
"lockedbyandtime": "(על־ידי $1 ב־$3, $2)",
"move-page": "העברת הדף \"$1\"",
"move-page-legend": "העברת דף",
- "movepagetext": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\n{{GENDER:|באפשרותך|באפשרותך|באפשרותכם}} לעדכן באופן אוטומטי דפי הפניה שכרגע מפנים לשם הנוכחי של הדף.\nאם {{GENDER:|תבחר|תבחרי|תבחרו}} לא לעשות זאת, אנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
- "movepagetext-noredirectfixer": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\nאנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
+ "movepagetext": "ניתן להשתמש בטופס שלהלן כדי לשנות את השם של הדף הזה ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\nבאפשרותך לעדכן באופן אוטומטי דפי הפניה שכרגע מפנים לשם הנוכחי של הדף.\nנא לוודא לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]] (אלא אם כן בחרת לבצע את העדכון האוטומטי הנ\"ל).\nכמו כן, באחריותך לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\nיש לשים לב לכך שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר שניתן יהיה להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת לבך:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nיש לקחת בחשבון את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
+ "movepagetext-noredirectfixer": "ניתן להשתמש בטופס שלהלן כדי לשנות את השם של הדף הזה ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\nנא לוודא לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nכמו כן, באחריותך לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\nיש לשים לב לכך שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר שניתן יהיה להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת לבך:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nיש לקחת בחשבון את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
"movepagetalktext": "אם האפשרות הזאת מסומנת, דף השיחה של הדף הזה יועבר אוטומטית לשם החדש, אלא אם קיים דף שיחה שאינו ריק תחת השם החדש. במקרה כזה, יש להעביר או למזג את הדפים באופן ידני, במידת הצורך.",
"moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
"movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
"thumbnail_image-failure-limit": "היו לאחרונה ניסיונות רבים מדי ($1 או יותר) ליצור את התמונה הממוזערת הזאת. נא לנסות שוב מאוחר יותר.",
"import": "ייבוא דפים",
"importinterwiki": "ייבוא מאתר ויקי אחר",
- "import-interwiki-text": "×\90× ×\90 ×\91×\97ר×\95 אתר ויקי וכותרת דף לייבוא.\nתאריכי העריכות ושמות העורכים יישמרו.\nכל פעולות הייבוא מאתרי ויקי אחרים נשמרות ב[[Special:Log/import|יומן הייבוא]].",
+ "import-interwiki-text": "× ×\90 ×\9c×\91×\97×\95ר אתר ויקי וכותרת דף לייבוא.\nתאריכי העריכות ושמות העורכים יישמרו.\nכל פעולות הייבוא מאתרי ויקי אחרים נשמרות ב[[Special:Log/import|יומן הייבוא]].",
"import-interwiki-sourcewiki": "אתר המקור:",
"import-interwiki-sourcepage": "דף המקור:",
"import-interwiki-history": "העתקת כל היסטוריית העריכות של דף זה",
"tooltip-pt-login-private": "יש להיכנס לחשבון כדי להשתמש באתר הוויקי הזה",
"tooltip-pt-logout": "יציאה מהחשבון",
"tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו, אך אין חובה לעשות זאת",
- "tooltip-ca-talk": "ש×\99×\97×\94 ×¢×\9c ×\93×£ ×\96×\94",
+ "tooltip-ca-talk": "ש×\99×\97×\94 ×¢×\9c ×\93×£ ×\94ת×\95×\9b×\9f",
"tooltip-ca-edit": "עריכת דף זה",
"tooltip-ca-addsection": "הוספת פסקה חדשה",
"tooltip-ca-viewsource": "דף זה מוגן.\nבאפשרותך לצפות בקוד המקור שלו",
"tooltip-n-currentevents": "מציאת מידע רקע על האירועים האחרונים",
"tooltip-n-recentchanges": "רשימת השינויים האחרונים באתר",
"tooltip-n-randompage": "טעינת דף אקראי",
- "tooltip-n-help": "×¢×\96ר×\94 ×\91ש×\99×\9e×\95ש ×\91×\90תר",
- "tooltip-t-whatlinkshere": "רש×\99×\9e×\94 ש×\9c ×\9b×\9c ×\94×\93פ×\99×\9d ש×\9e×\9b×\99×\9c×\99×\9d ק×\99ש×\95ר×\99×\9d ×\9c×\93×£ ×\94×\96ה",
+ "tooltip-n-help": "×\94×\9eק×\95×\9d ×\9c×\9eצ×\95×\90 ×\9e×\99×\93×¢",
+ "tooltip-t-whatlinkshere": "רש×\99×\9e×\94 ש×\9c ×\9b×\9c ×\93פ×\99 ×\94×\95×\95×\99ק×\99 ש×\9eקשר×\99×\9d ×\94× ה",
"tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מדף זה",
"tooltip-feed-rss": "הזנת RSS עבור דף זה",
"tooltip-feed-atom": "הזנת Atom עבור דף זה",
"monthsall": "הכול",
"confirmemail": "אימות כתובת דוא\"ל",
"confirmemail_noemail": "אין לך כתובת דוא\"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלך.",
- "confirmemail_text": "{{GENDER:|עליך|עלייך|עליכם}} לאמת את כתובת הדוא\"ל {{GENDER:|שלך|שלך|שלכם}} לפני ש{{GENDER:|תוכל|תוכלי|תוכלו}} להשתמש בשירותי הדוא\"ל של {{SITENAME}}.\n{{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה כדי לשלוח קוד אימות לכתובת הדוא\"ל ש{{GENDER:|הזנת|הזנת|הזנתם}}.\n{{GENDER:|פתח|פִתחי|פִתחו}} את הקישור בדפדפן {{GENDER:|שלך|שלך|שלכם}} כדי לאשר שכתובת הדוא\"ל תקפה.",
+ "confirmemail_text": "{{GENDER:|עליך|עלייך|עליכם}} לאמת את כתובת הדוא\"ל {{GENDER:|שלך|שלך|שלכם}} לפני ש{{GENDER:|תוכל|תוכלי|תוכלו}} להשתמש בשירותי הדוא\"ל של {{SITENAME}}.\n{{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה כדי לשלוח קוד אימות לכתובת הדוא\"ל ש{{GENDER:|הזנת|הזנת|הזנתם}}.\nההודעה {{GENDER:|שתקבל|שתקבלי|שתקבלו}} תכלול קישור שמכיל קוד;\n{{GENDER:|פתח|פתחי|פתחו}} את הקישור בדפדפן {{GENDER:|שלך|שלך|שלכם}} כדי לאשר שכתובת הדוא\"ל תקפה.",
"confirmemail_pending": "קוד האימות כבר נשלח לדואר האלקטרוני {{GENDER:|שלך|שלך|שלכם}};\nאם {{GENDER:|יצרת|יצרת|יצרתם}} את החשבון לאחרונה, כדאי להמתין מספר דקות עד שהדוא\"ל יגיע לפני בקשת קוד חדש.",
"confirmemail_send": "לשלוח קוד אימות",
"confirmemail_sent": "הדוא\"ל עם קוד האימות נשלח.",
"logentry-import-upload": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 באמצעות העלאת קובץ",
"logentry-import-upload-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
"logentry-import-interwiki": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 מאתר ויקי אחר",
- "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 מ־$5‏ ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
+ "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 מתוך $5‏ ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
"logentry-merge-merge": "$1 {{GENDER:$2|מיזג|מיזגה}} את הדף $3 לתוך הדף $4 (גרסאות עד $5)",
"logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4",
"logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 בלי להשאיר הפניה",
"category-subcat-count-limited": "Ova kategorija ima {{PLURAL:$1|podkategoriju|$1 podkategorije|$1 podkategorija}}.",
"category-article-count": "{{PLURAL:$2|1=Ova kategorija sadržava samo sljedeću stranicu.|{{PLURAL:$1|Prikazana je $1 stranica|Prikazane su $1 stranice|Prikazano je $1 stranica}} u ovoj kategoriji, od ukupno $2.}}",
"category-article-count-limited": "{{PLURAL:$1|stranica je|$1 stranice su|$1 stranica je}} u ovoj kategoriji.",
- "category-file-count": "Ova kategorija sadrži $2 {{PLURAL:$2|datoteku|datoteke|datoteka}}. {{PLURAL:$1|Slijedi $1 datoteka|Slijede $1 datoteke|Slijedi $1 datoteka}}.",
+ "category-file-count": "{{PLURAL:$2|1=Ova kategorija sadržava samo sljedeću datoteku.|{{PLURAL:$1|Prikazana je $1 datoteka|Prikazane su $1 datoteke|Prikazano je $1 datoteka}} u ovoj kategoriji, od njih ukupno $2.}}",
"category-file-count-limited": "{{PLURAL:$1|datoteka je|$1 datoteke su|$1 datoteka su}} u ovoj kategoriji.",
"listingcontinuesabbrev": "nast.",
"index-category": "Indeksirane stranice",
"readonlywarning": "<strong>Upozorenje: Baza podataka je zaključana zbog održavanja, stoga trenutačno niste u mogućnosti spremiti svoja uređivanja.</strong>\nMožda biste željeli preslikati i zaljepite tekst u tekstualnu datoteku, te ju snimiti za kasnije upotrebe.'''\n\nAdministrator sustava koji je zaključao bazu ponudio je ovo objašnjenje: $1",
"protectedpagewarning": "'''UPOZORENJE: Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima.'''\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
"semiprotectedpagewarning": "'''Napomena:''' Ova stranica je zaključana tako da je mogu uređivati samo prijavljeni suradnici.\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
- "cascadeprotectedwarning": "'''UPOZORENJE:''' Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima, jer je uključena u {{PLURAL:$1|slijedeću stranicu|slijedeće stranice}} koje su zaštićene \"prenosivom\" zaštitom:",
+ "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana i mogu je uređivati samo suradnici s [[Special:ListGroupRights|posebnim pravima]], jer je uključena u {{PLURAL:$1|sljedeću stranicu koja je|sljedeće stranice koje su}} zaštićene \"prenosivom\" zaštitom:",
"titleprotectedwarning": "<strong>Upozorenje: Ova je stranica zaključana i samo ju suradnici s [[Special:ListGroupRights|određenim pravima]] mogu stvoriti.</strong>\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
"templatesused": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} na ovoj stranici:",
"templatesusedpreview": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} u ovom pretpregledu:",
"emailmessage": "Poruka:",
"emailsend": "Pošalji",
"emailccme": "Pošalji mi presliku moje poruke e-poštom.",
- "emailccsubject": "Kopija Vaše poruke za $1: $2",
+ "emailccsubject": "Kopija Vaše poruke za: $1: $2",
"emailsent": "E-poruka je poslana!",
"emailsenttext": "Vaša poruka je poslana.",
"emailuserfooter": "Ovu je e-poruku {{GENDER:$1|poslao suradnik|poslala suradnica}} $1 {{GENDER:$2|suradniku $2|suradnici $2}} uporabom mogućnosti \"{{int:emailuser}}\" s projekta {{SITENAME}}. Ukoliko {{GENDER:$2|odgovorite}} na tu e-poruku, {{GENDER:$2|Vaša}} će poruka biti izravno poslana {{GENDER:$1|izvornom pošiljatelju}}, otkrivajući pritom {{GENDER:$2|Vašu}} adresu e-pošte {{GENDER:$1|pošiljatelju|pošiljateljici}}.",
"tog-watchlisthideminor": "Apró változtatások elrejtése",
"tog-watchlisthideliu": "Bejelentkezett szerkesztők módosításainak elrejtése a figyelőlistáról",
"tog-watchlistreloadautomatically": "A figyelőlista automatikus újratöltése bármelyik szűrő megváltoztatása esetén (JavaScript szükséges)",
- "tog-watchlistunwatchlinks": "Közvetlen olvasottnak/olvasatlannak jelölő link hozzáadása a figyelőlista elemeihez (JavaScript szükséges)",
+ "tog-watchlistunwatchlinks": "Figyelőlista elemeinek eltávolítására szolgáló közvetlen link hozzáadása (JavaScript szükséges)",
"tog-watchlisthideanons": "Névtelen szerkesztések elrejtése",
"tog-watchlisthidepatrolled": "Az ellenőrzött szerkesztések elrejtése",
"tog-watchlisthidecategorization": "Lapok kategorizálásának elrejtése",
"cantrollback": "Nem lehet visszaállítani: az utolsó szerkesztést végző felhasználó az egyetlen, aki a lapot szerkesztette.",
"alreadyrolled": "[[:$1]] utolsó, [[User:$2|$2]] ([[User talk:$2|vita]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) általi szerkesztését nem lehet visszavonni:\nidőközben valaki már visszavonta vagy szerkesztette a lapot.\n\nAz utolsó szerkesztést [[User:$3|$3]] ([[User talk:$3|vita]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) végezte.",
"editcomment": "A szerkesztési összefoglaló <em>$1</em> volt.",
- "revertpage": "Visszaállítottam a lap korábbi változatát: [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]]) szerkesztéséről [[User:$1|$1]] szerkesztésére",
+ "revertpage": "Visszaállítottam a lap korábbi változatát [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]]) szerkesztéséről [[User:$1|$1]] szerkesztésére",
"revertpage-nouser": "Visszaállítottam a lap korábbi változatát (szerkesztőnév eltávolítva) szerkesztéséről [[User:$1|$1]] szerkesztésére",
"rollback-success": "{{GENDER:$3|$1}} szerkesztéseit visszaállítottam {{GENDER:$4|$2}} utolsó változatára.",
"rollback-success-notify": "$1 szerkesztései visszaállítva;\nhelyreállítva $2 utolsó változata. [$3 Változtatások megtekintése]",
"tog-newpageshidepatrolled": "Celez patroliita pagini en la listo di nova pagino",
"tog-hidecategorization": "Celar kategorizeso di la pagini",
"tog-extendwatchlist": "Expansez surveyo-listo por montrar omna chanji, vice nur la maxim recenta",
- "tog-usenewrc": "Chanji al grupo po pagino en recenta chanji e \"watchlist\"",
+ "tog-usenewrc": "Grupigar la modifiki por pagino en recenta chanji e \"watchlist\"",
"tog-numberheadings": "Autonumerez tituli",
"tog-showtoolbar": "Montrez redaktilo (JavaScript bezonesas)",
"tog-editondblclick": "Redaktez pagini kande on klikus dufoye (JavaScript bezonesas)",
"nstab-media": "Media pagino",
"nstab-special": "Specala pagino",
"nstab-project": "Projeto pagino",
- "nstab-image": "Failo",
+ "nstab-image": "Arkivo",
"nstab-mediawiki": "Mesajo",
"nstab-template": "Shablono",
"nstab-help": "Helpo",
"recreate-moveddeleted-warn": "<strong>Atencez: Vu rikreos pagino qua antee efacesis.</strong>\n\nVu mustas konsiderar se esos konvenanta o ne riskribor ol.\nPor vua konoco, la motivo dil antea efaco montresas hike:",
"moveddeleted-notice": "Ica pagino efacesis.\nL'efaco-registraro e la movo-registraro di la pagino povas videsar sequante, por konsulto.",
"edit-conflict": "Konflikto di editi.",
+ "postedit-confirmation-created": "La pagino kreesis.",
"postedit-confirmation-saved": "Vua redakto konservesis",
"content-model-wikitext": "texto Wiki",
"content-model-javascript": "JavaScript",
"content-json-empty-object": "vakua objekto",
"content-json-empty-array": "vakua tabelo",
"deprecated-self-close-category": "Pagini qui uzas nevalida etiketi HTML por klozajo",
+ "duplicate-args-category": "Pagini kun argumenti duopligita che shabloni",
+ "parser-unstrip-loop-warning": "Renkontresis nefinita procedo ('loop') en la funciono \"Unstrip\"",
"undo-failure": "Ne povis nuligar la redakto pro konflikti kun intermeza redakti.",
"viewpagelogs": "Videz registrari por ca pagino",
"nohistory": "Ne esas redakto-historio por ica pagino.",
"rev-deleted-comment": "(rezumo di redakti forigesis)",
"rev-deleted-user": "(uzantonomo forigita)",
"rev-deleted-event": "(detali dil registro forigesis)",
+ "rev-deleted-user-contribs": "[Uzero od IP-adreso eliminita - la redakto celesis de la kontributaji]",
"rev-delundel": "montrar/celar",
"rev-showdeleted": "montrar",
"revdelete-show-file-submit": "Yes",
"search-section": "(seciono $1)",
"search-file-match": "(kongruanta kun la kontenajo)",
"search-suggest": "Ka vu volis dicar: $1",
+ "search-rewritten": "Yen la rezulti por \"$1\". Serchez vice por \"$2\".",
"search-interwiki-caption": "Altra projekti",
"search-interwiki-default": "Rezultaji de $1:",
"search-interwiki-more": "(plusa)",
"prefs-personal": "Personala informo",
"prefs-rc": "Recenta chanji",
"prefs-watchlist": "Surveyo-listo",
+ "prefs-editwatchlist-edit": "Vidar e removar tituli de vua surveyo-listo",
"prefs-watchlist-days": "Dii montrata en surveyaji:",
"prefs-watchlist-days-max": "Maxime $1 {{PLURAL:$1|dio|dii}}",
"prefs-watchlist-edits-max": "Maxima nombro: 1000",
"prefs-misc": "Mixaji",
"prefs-resetpass": "Chanjar pasovorto",
+ "prefs-changeemail": "Chanjar od efacar e-postal adreso",
"prefs-email": "Selekti pri e-posto (e-mail)",
"prefs-rendering": "Aspekto",
"saveprefs": "Registragar",
"restoreprefs": "Restaurar omna preferaji 'default' (en omna secioni)",
"prefs-editing": "Grandeso dil areo por texto",
"searchresultshead": "Preferaji di la rezultaji dil sercho",
+ "stub-threshold": "Limito por ligilar ad esbosuri ($1):",
+ "stub-threshold-disabled": "Sen efekto",
"recentchangesdays": "Dii montrota en la recenta chanji:",
"recentchangesdays-max": "Maximo $1 {{PLURAL:$1|dio|dii}}",
"recentchangescount": "Quanto de redakti montrota kustume:",
"savedprefs": "Vua preferaji registragesis.",
"timezonelegend": "Tempala zono:",
"localtime": "Lokala tempo:",
+ "timezoneuseoffset": "Altra (definez precize)",
"servertime": "Kloko en la servanto:",
"guesstimezone": "Obtenar la kloko dil \"browser\"",
"timezoneregion-africa": "Afrika",
"timezoneregion-pacific": "Pacifico",
"allowemail": "Permisez e-posti de altra uzanti",
"email-allow-new-users-label": "Permisez e-posti de la nova uzeri",
+ "email-blacklist-label": "Impedez la sequanta uzeri sendar e-posto a me:",
"prefs-namespaces": "Nomari",
+ "default": "Ordinara ('default')",
"prefs-files": "Arkivi",
"prefs-emailconfirm-label": "Konfirmado dil e-posto (e-mail):",
"youremail": "Vua e-adreso:",
"yournick": "Signaturo:",
"prefs-help-signature": "Komenti en la diskuto-pagini mustas signatesar, skribante 4 tildi (<nowiki>~~~~</nowiki>), qui transformesos en vua signaturo ed en l'indiko di la horo e dio quan vu signatis ol.",
"badsiglength": "Vua signaturo es tro longa.\nOl mustas ne havar plu kam $1 {{PLURAL:$1|litero|literi}}.",
- "yourgender": "Quale vu preferas esar priskribata?",
+ "yourgender": "Quale vu preferas esar mencionata?",
"gender-unknown": "Lor mencionar vu, la programaro uzos sexuo-neutrala vorti tam ofte kam posibla",
"gender-male": "Ilu redaktas wikiopagini",
"gender-female": "Elu redaktas wikiopagini",
"prefs-help-email-others": "Vu povas anke selektar se permisos altri skribar a vu per e-posto, per ligilo en vua uzanto-pagino o diskuto-pagino.\nVua e-posto adreso ne revelesos, kande l'altri skribos a vu.",
"prefs-help-email-required": "E-postala adreso es bezonata.",
"prefs-info": "Bazala informeso",
+ "prefs-i18n": "Internacioniigo",
"prefs-signature": "Signaturo",
+ "prefs-timeoffset": "Registro dil tempo",
"prefs-editor": "Redaktilo",
"prefs-preview": "Previdar",
+ "prefs-advancedrc": "Progresiva selektaji (advanced options)",
+ "prefs-advancedrendering": "Progresiva selektaji (advanced options)",
+ "prefs-advancedsearchoptions": "Progresiva selektaji (advanced options)",
+ "prefs-advancedwatchlist": "Progresiva selektaji (advanced options)",
"prefs-diffs": "Diferi",
"userrights-user-editname": "Skribez uzantonomo:",
+ "editusergroup": "Charjez grupi dil uzero",
"userrights-groupsmember": "Membro di:",
"group": "Grupo:",
"group-user": "Uzanti",
"rcfilters-filter-logactions-label": "Agadi enrejistrata",
"rcnotefrom": "Infre {{PLURAL:$5|esas la chanjo|esas la chanji}} de <strong>$3, $4</strong> (montrata til <strong>$1</strong>).",
"rclistfrom": "Montrar nova chanji startante de $3 $2",
- "rcshowhideminor": "$1 mikra redakti",
+ "rcshowhideminor": "$1 mikra redakturi",
"rcshowhideminor-show": "Montrar",
"rcshowhideminor-hide": "Celar",
"rcshowhidebots": "$1 roboti",
"recentchangeslinked-summary": "Skribez la nomo di ula pagino por vidar la modifiki en pagini ligita ad ol. (Por vidar la membri di ula kategoriio, skribez Kategorio:Nomo di la kategorio). Chanji en la pagini qui esas en [[Special:Watchlist|vua surveryo-listo]] aparas en <strong>dika literi</strong>.",
"recentchangeslinked-page": "Nomo di la pagino:",
"recentchangeslinked-to": "Montrez chanji a pagini ligita a la specigita pagino vice",
+ "autochange-username": "Automatala chanjo di MediaWiki",
"upload": "Adkargar arkivo",
"uploadbtn": "Adkargar arkivo",
"reuploaddesc": "Retrovenar al adkargo-formularo.",
"ignorewarning": "Ignorar la averto e gardar la arkivo irgakaze.",
"badfilename": "La imajo-nomo chanjesis a \"$1\".",
"fileexists": "Arkivo kun ta nomo ja existas.\nVolutez kontrolar <strong>[[:$1]]</strong> se {{GENDER:|vu}} ne esas certa pri chanjar olu.\n[[$1|thumb]]",
+ "filepageexists": "La pagino kun deskripto pri ica arkivo ja kreesis en <strong>[[:$1]]</strong>, tamen nul arkivo kun ica nomo existas ankore.\nLa rezumo pri ol quon vu skriptis ne aparos en la deskripto-pagino.\nPor ke la rezumo aparos ibe, vu mustos <strong>skribor ol manuale.</strong>\n[[$1|thumb]]",
"uploadwarning": "Averto pri la adkargo di arkivo",
"savefile": "Registragar arkivo",
"uploaddisabled": "Pardonez, la adkargo esas desaktiva.",
"unwatchthispage": "Ne plus surveyar",
"notanarticle": "Ne esas artiklo",
"watchlist-details": "{{PLURAL:$1|$1 pagino esas|$1 pagini esas }} en vua surveyo-listo (inkluzite diskuto-pagini).",
+ "wlheader-enotif": "L'informo per e-posto esas funcionanta.",
"wlheader-showupdated": "Pagini qui modifikesis pos vua lasta vizito montresas en <strong>dika literi</strong>.",
- "wlnote": "Yen la maxim recenta {{PLURAL:$1|chanjo|<strong>$1</strong> chanji}} dum la lasta {{PLURAL:$2|horo|<strong>$2</strong> hori}}, desde $3,$4.",
+ "wlnote": "Yen la maxim recenta {{PLURAL:$1|chanjo|<strong>$1</strong> chanji}} dum la lasta {{PLURAL:$2|horo|<strong>$2</strong> hori}}, de $3,$4.",
"wlshowlast": "Montrez la lasta $1 hori $2 dii",
+ "wlshowhideminor": "mikra redakturi",
+ "wlshowhidebots": "Roboti (bots)",
+ "wlshowhideliu": "Uzeri enrejistrita",
+ "wlshowhideanons": "anonima uzeri",
+ "wlshowhidemine": "Mea redakturi",
"watchlist-options": "Surveryo-listo selekti",
"watching": "Surveyanta…",
"unwatching": "Cesanta surveyar…",
"undeletepage": "Vidar e restaurar efacita pagini",
"undeletepagetext": "La sequanta {{PLURAL:$1|pagino|pagini}} efacesis ma {{PLURAL:$1|ol|li}} ankore esas en la arkivo ed esas restaurebla. La arkivo povas netigesar periodale.",
"undeleterevisions": "$1 {{PLURAL:$1|revizo|revizi}} efacita",
+ "undeletehistory": "Se vu restauros la pagino, omna antea revizi restauresos en la korespondanta historiala pagino.\nSe nova pagino kun la sama titulo kreesis pos l'efaco, la restaurita revizuri aparos en lua historiala pagino.",
"undeletebtn": "Restaurar",
"undeletelink": "vidar/restaurar",
"undeleteviewlink": "videz",
"move-page-legend": "Rinomizar pagino",
"movepagetext": "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.\nLa antea titulo konvertesos a ridirektilo a la nova titulo.\nLa ligili a la antea titulo dil pagino ne chanjesos.\nVoluntez certigar ke ne esas [[Special:DoubleRedirects|duopla]] o [[Special:BrokenRedirects|ruptota ridirektili]].\nVu responsas ke la ligili duros direktante a la pagino korespondanta.\n\nMemorez ke la pagino '''ne''' rinomizesos se ja existus pagino kun la nova titulo, eceptuante ke la pagino esas vakua o ridirektilo sen versionaro.\nIco signifikas ke vu povos rinomizar pagino a olua originala titulo se eroras skribante la nova titulo, ma ne povos riskribar existanta pagino.\n\n'''EGARDEZ!'''\nIca povas esar drastika chanjo e ne-esperinda por populara pagino;\nvoluntez certigar ke vu komprenas la konsequi qui eventos ante durar adavane.",
"movepagetext-noredirectfixer": "Uzar la formulario infre rinomizos la pagino, e tota lua historio-listo a la nova nomo.\nL'anciena titulo ridirektesos a la nova titulo.\nVerifikez la [[Special:DoubleRedirects|duopla]] e/o la [[Special:BrokenRedirects|krevita ridirekti]].\n<strong>Esas vua responso verifikar se omna ligili esas korekta.</strong>\n\nVidez ke la pagino <strong>ne rinomizesos se existar pagino kun la sama titulo</strong>, ecepte se ol ridirektesas a la prezenta pagino e ne havas pasinta historio pri redaktado.\nTo signifikas ke vu povas retroe rinomizar pagino a lua antea nomo se ol rinomizesis erore, e ke vu ne povas supresar existanta pagino per ridirektado di altra pagino.\n\n<strong>Atencez:</strong>\nLa rinomizo povas esar drastika chanjo por pagini qui esas populara;\nhavez klara certezo pri la konsequi di la posibla rinomizo di la pagino, ante facar ol!",
+ "movecategorypage-warning": "<strong>Atencez:</strong> Vu balde rinomizos pagino di \"KATEGORIO\". Nur la titulo di la kategorio chanjesos, ma <em>nula pagino kategoriizita segun l'anciena kategorio</em> modifikesos automatale por la nova kategorio.",
"movenologintext": "Vu mustas esar registragita uzero ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
"newtitle": "Nova titulo:",
"move-watch": "Surveyar ca pagino",
"movelogpage": "Movo-registraro",
"movereason": "Motivo:",
"revertmove": "rekuperar",
+ "delete_and_move_text": "Pagino kun la titulo \"[[:$1]]\" ja existas.\nKa vu dezirus efacar ol, por movor ica pagino ad ita titulo?",
"delete_and_move_confirm": "Yes, efacez la pagino",
"delete_and_move_reason": "Efacita por permisar la chanjo di la nomo di la pagino \"[[$1]]\"",
"move-leave-redirect": "Mantenez ridirektilo inter la du",
"export-addcat": "Adjuntar",
"allmessages": "Omna sistemo-mesaji",
"allmessagesname": "Nomo",
+ "allmessagescurrent": "Nuna texti di mesajo",
"allmessagestext": "Ico esas listo di omna sistemo-mesaji disponebla en la MediaWiki nomaro.\nVoluntez vizitar [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Lokizado] e [https://translatewiki.net translatewiki.net] se vu volus kontributar ad generala MediaWiki lokizado.",
"allmessages-language": "Linguo:",
"thumbnail-more": "Grandigar",
"tooltip-diff": "Montrez la chanji a la texto quin vu facis",
"tooltip-compareselectedversions": "Vidar la diferaji inter la du selektita versioni di ca pagino.",
"tooltip-watch": "Adjuntar ica pagino a vua listo di surveyaji",
+ "tooltip-watchlistedit-normal-submit": "Removar tituli",
+ "tooltip-watchlistedit-raw-submit": "Aktualigar surveyo-listo",
"tooltip-recreate": "Rekrear pagino malgre ol efacesis",
"tooltip-upload": "Adkargar imaji od altra arkivi",
"tooltip-rollback": "\"Retrorular\" desfacas omna chanji ad ca pagino da la lasta kontributanto per un kliko",
"autosumm-replace": "Kontenajo remplasigesis kun '$1'",
"autoredircomment": "Ridirektas a [[$1]]",
"autosumm-new": "Pagino kreesis kun '$1'",
+ "watchlistedit-normal-legend": "Removar tituli de surveyo-listo",
+ "watchlistedit-normal-explain": "La tituli de vua surveyo-listo montresas adinfre.\nPor removar ula titulo, markizez la buxo proxim ol, e kliktez \"{{int:Watchlistedit-normal-submit}}\".\nVu anke povas [[Special:EditWatchlist/raw|redaktar direkte la 'kruda' listo]].",
+ "watchlistedit-normal-submit": "Removar tituli",
+ "watchlistedit-normal-done": "{{PLURAL:$1|Singla titulo|$1 tituli}} removesis de vua surveyo-listo:",
"watchlistedit-raw-title": "Redaktar texto di surveyo-listo",
"watchlistedit-raw-legend": "Redaktar texto di surveyo-listo",
+ "watchlistedit-raw-explain": "Tituli en vua surveyo-listo montresas adinfre, e povas modifikesar per adjuntado od eskarto de la listo; nur un titulo per lineo.\nKande vu finos, kliktez \"{{int:Watchlistedit-raw-submit}}\".\nVu anke povas [[Special:EditWatchlist|uzar la redaktero ordinara ('standard')]].",
"watchlistedit-raw-titles": "Tituli:",
+ "watchlistedit-raw-submit": "Aktualigar surveyo-listo",
+ "watchlistedit-too-many": "Esas multa pagini por montrar hike.",
"watchlisttools-clear": "Vakuigar la surveyo-listo",
"watchlisttools-view": "Vidar relatanta chanji",
"watchlisttools-edit": "Vidar e redaktar surveyo-listo",
"version": "Versiono",
"version-specialpages": "Specala pagini",
"version-other": "Altra",
+ "version-parser-function-hooks": "Funcioni \"hooks\" dil sintaxal analizilo (parser)",
"version-version": "($1)",
"version-license": "MediaWiki Licenco",
"version-software-product": "Produkturo",
"duration-days": "($1 {{PLURAL:$1|dio|dii}})",
"duration-years": "$1 {{PLURAL:$1|yaro|yari}}",
"limitreport-title": "Analizo di dati pri profilo:",
+ "limitreport-ppvisitednodes": "Quanto di nodi vizitita dal preprocesoro",
+ "limitreport-postexpandincludesize": "Grandeso dil inkluzo pos expanso",
+ "limitreport-expansiondepth": "Maxima profundeso di expanso",
+ "limitreport-expensivefunctioncount": "Kontado di funcioni kustoza di analizo sintaxala",
"expand_templates_output": "Rezulto",
"expand_templates_ok": "O.K.",
"expand_templates_preview": "Previdar",
"special-characters-group-persian": "Persiana",
"mw-widgets-dateinput-no-date": "Nula dato selektita",
"mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD",
+ "mw-widgets-titleinput-description-redirect": "Ridirektar ad $1",
"sessionprovider-nocookies": "''Bisquiti'' forsan esas desacendita. Certigez ke vu acendar ''bisquiti'' e riprobez.",
"randomrootpage": "Hazarda radikopagino",
"log-action-filter-delete": "Tipo di efacado:"
"wrongpasswordempty": "Non è stata inserita alcuna password. Riprovare.",
"passwordtooshort": "Le password devono contenere almeno {{PLURAL:$1|1 carattere|$1 caratteri}}.",
"passwordtoolong": "La password non può contenere più di {{PLURAL:$1|1 carattere|$1 caratteri}}.",
- "passwordtoopopular": "Password comuni non possono essere usate. Scegli una password più originale.",
+ "passwordtoopopular": "Password comuni non possono essere usate. Scegli una password più difficile da indovinare.",
"password-name-match": "La password deve essere diversa dal nome utente.",
"password-login-forbidden": "L'uso di questo nome utente e password è stato proibito.",
"mailmypassword": "Reimposta password",
"recentchanges-label-minor": "사소한 편집",
"recentchanges-label-bot": "봇이 수행한 편집",
"recentchanges-label-unpatrolled": "아직 점검하지 않은 편집",
- "recentchanges-label-plusminus": "ë°\94ì\9d´í\8a¸ ì\88\98ë³\84 문서 크기의 차이",
+ "recentchanges-label-plusminus": "ë°\94ì\9d´í\8a¸ ì\88\98ë¡\9c í\91\9cí\98\84í\95\9c 문서 크기의 차이",
"recentchanges-legend-heading": "<strong>범례:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
"recentchanges-legend-plusminus": "(<em>±123</em>)",
"prefixindex-namespace": "접두어가 있는 모든 문서 ($1 이름공간)",
"prefixindex-submit": "보이기",
"prefixindex-strip": "목록에서 접두어 생략",
- "shortpages": "짧은 문서 목록",
- "longpages": "긴 문서 목록",
+ "shortpages": "내용이 적은 문서 목록",
+ "longpages": "내용이 많은 문서 목록",
"deadendpages": "막다른 문서 목록",
"deadendpagestext": "{{SITENAME}} 내의 다른 문서로 나가는 링크가 없는 문서의 목록입니다.",
"protectedpages": "보호된 문서 목록",
"ancientpages": "오래된 문서 목록",
"move": "이동",
"movethispage": "이 문서 이동하기",
- "unusedimagestext": "다음은 어떠한 문서도 사용하지 않는 파일의 목록입니다.\n다른 사이트에서 URL 접근을 통해 파일을 사용할 수 있기 때문에, 아래 목록에 있는 파일도 실제로 사용 중일 가능성이 있다는 점을 주의해주세요.",
+ "unusedimagestext": "다음은 어떠한 문서에서도 사용하지 않는 파일의 목록입니다.\n다른 사이트에서 URL 접근을 통해 파일을 사용할 수 있기 때문에, 아래 목록에 있는 파일도 실제로 사용 중일 가능성이 있다는 점을 주의해주세요.",
"unusedcategoriestext": "사용하지 않는 분류 문서의 목록입니다.",
"notargettitle": "해당하는 문서 없음",
"notargettext": "기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.",
"allpagesbadtitle": "주어진 문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키가 있습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
"allpages-bad-ns": "{{SITENAME}}에서는 \"$1\" 이름공간을 사용하지 않습니다.",
"allpages-hide-redirects": "넘겨주기 숨기기",
- "cachedspecial-viewing-cached-ttl": "ì\9d´ 문ì\84\9cì\9d\98 ìº\90ì\8b\9cë\90\9c í\8c\90ì\9d\84 ë³´ê³ ì\9e\88ì\9c¼ë©°, ìµ\9cë\8c\80 $1ë§\8cí\81¼ ì§\80ë\82\9c í\8c\90ì\9d¼ ì\88\98 ì\9d¼ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.",
+ "cachedspecial-viewing-cached-ttl": "이 문서의 캐시된 판을 보고 있으며, 최대 $1만큼 지난 판일 수 있습니다.",
"cachedspecial-viewing-cached-ts": "현재 이 문서는 캐시 처리된 버전으로 현재 문서 상태를 반영하지 않을 수도 있습니다.",
"cachedspecial-refresh-now": "최신판을 봅니다.",
"categories": "분류 목록",
"listusers-submit": "보기",
"listusers-noresult": "사용자를 찾을 수 없습니다.",
"listusers-blocked": "(차단됨)",
- "activeusers": "활동하는 사용자 목록",
+ "activeusers": "활동 중인 사용자 목록",
"activeusers-intro": "다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.",
- "activeusers-count": "마지막 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회",
+ "activeusers-count": "최근 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회",
"activeusers-from": "다음으로 시작하는 사용자 표시:",
"activeusers-groups": "그룹에 속한 사용자 표시:",
"activeusers-excludegroups": "그룹에 속한 사용자 제외:",
"nextrevision": "Guhertoya nûtir →",
"currentrevisionlink": "Guhertoya niha nîşan bide",
"cur": "cudahî",
- "next": "pêş",
+ "next": "pêşve",
"last": "berê",
"page_first": "ya pêşîn",
"page_last": "ya paşîn",
"textmatches": "Dîtinên di nivîsara rûpelan de",
"notextmatches": "Di nav sernivîsan de nehat dîtin.",
"prevn": "{{PLURAL:$1|$1}} paş",
- "nextn": "{{PLURAL:$1|$1}} pêş",
+ "nextn": "{{PLURAL:$1|$1}} pêşve",
"prev-page": "rûpela berî vê",
"next-page": "rûpela pêş",
"prevn-title": "{{PLURAL:$1|result|Encamên}} pêştir $1",
"tag-filter": "Parzûna [[Special:Tags|nîşankirinê]]:",
"tag-filter-submit": "Parzûn",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etîket}}]]: $2)",
+ "tag-mw-undo": "Betal bike",
"tags-title": "Nîşankirin",
"tags-tag": "Navê etîketê",
"tags-active-header": "Çalak?",
"moredotdotdot": "بیشتئر",
"morenotlisted": "ئی نومگە کامئل بییە.",
"mypage": "بألگە",
- "mytalk": "چأک چئنە",
+ "mytalk": "چٱک چنٱ",
"anontalk": "دئبارە تیرنئشوٙن ئی آی پی قئسە بأکیت",
"navigation": "ناڤجۊری",
"and": " و",
"poolcounter-usage-error": "خأطا ڤئ کار گئرئتئن:$1",
"aboutsite": "داٛبارٱ {{SITENAME}}",
"aboutpage": "Project:دبارٱ",
- "copyright": "مینوٙنە یا هان د دأسرئس $1 مأر یە کئ ڤئ یئ گئل شیڤە هأنی نیسأنە بوٙە.",
+ "copyright": "مینۊنٱیا هان د دٱسرس $1 مٱر یٱ کاٛ ڤ یاٛ گاٛل شیڤاٛ هٱنی نیسٱنٱ بۊٱ.",
"copyrightpage": "{{ns:project}}:کوپی رایت",
"currentevents": "روخ ڤنیا ایساٛنی",
"currentevents-url": "Project:روخ ڤٱنیا ایساٛنی",
"backlinksubtitle": "← $1",
"retrievedfrom": "د نۏ زنٱ بیٱ د\"$1\"",
"youhavenewmessages": "{{PLURAL:$3|شوما داریت}} $1 ($2).",
- "youhavenewmessagesfromusers": "{{PLURAL:$4|شوما}} $1 د {{PLURAL:$3|کاریار هأنی|$3 کاریاریا}}داریت($2).",
+ "youhavenewmessagesfromusers": "{{PLURAL:$4|شوما}} $1 د {{PLURAL:$3|کاریار هٱنی|$3 کاریاریا}}داریت($2).",
"youhavenewmessagesmanyusers": "شوما د $1 فئرە کاریار داریت($2).",
"newmessageslinkplural": "{{PLURAL:$1|یئ گئل پئیغوم تازە|999=پئیغومیا تازە}}",
"newmessagesdifflinkplural": "آخئر {{PLURAL:$1|آلئشت|آلئشتیا}}",
"createacct-yourpassword-ph": "رازینە گوڤاردئن نە بأزە",
"yourpasswordagain": "یئ گئل هأنی رازینە گوڤاردئن نە بأزە",
"createacct-yourpasswordagain": "رازینە گوڤاردئن نە پوشت راس کو",
- "createacct-yourpasswordagain-ph": "Û\8cئ گئÙ\84 Ù\87Ø£Ù\86Û\8c رازÛ\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\86Û\95 بأزÛ\95",
+ "createacct-yourpasswordagain-ph": "Û\8cاÙ\9b گاÙ\9bÙ\84 Ù\87Ù±Ù\86Û\8c رازÛ\8cÙ\86Ù± Ú¯Ù\88ڤاردÙ\86 بٱزٱ",
"userlogin-remembermypassword": "مئنە د ساموٙنە ڤادار",
"userlogin-signwithsecure": "ڤأصل بییئن أمن نە ڤئ کار بئیر",
"yourdomainname": "پوشگئر شوما:",
"pt-login": "ڤامین اۊمائن",
"pt-login-button": "ڤامین ئوٙمائن",
"pt-createaccount": "هساڤ راست بکیت",
- "pt-userlogout": "د ساموٙنە دئرئوٙمائن",
+ "pt-userlogout": "د سامۊنٱ دراۊمائن",
"php-mail-error-unknown": "خأطا نادیار د آلئشتگئر PHP's mail()",
"user-mail-no-addy": "سی کئل کئردئن أنجومانامە د یئ گئل أنجومانامە بی تیرنئشوٙن أنجومانامه تئلاش بییە.",
"user-mail-no-body": "سی کئل کئردئن أنجومانامە ڤا مینوٙنە حالی یا کوچئک بییئن سی دألیل یا غئر مأنطئقی بییئن ڤئ تئلاش بأکیت.",
"showpreview": "نشۊ دٱئن پیش ساٛیل",
"showdiff": "نشۊ دٱئن آلشتکاریا",
"blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"$1\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
- "anoneditwarning": "<strong>زئÙ\86ار:</strong> Ø´Ù\88Ù\85ا Ù\87Ø£Ù\86Û\8c Ù\86Û\8cÙ\88Ù\99Ù\85اÛ\8cتÛ\95 ڤاÙ\85Û\8cÙ\86. تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\88Ù\85ا سÛ\8c Ù\87أر گاتÛ\8c کئ Ø¢Ù\84ئشتکارÛ\8c بأکÛ\8cت سÛ\8c Ú©Ù\88Ù\84 خأÙ\84Ú© دÛ\8cارÛ\8c Ù\85Û\8c Ú©Û\95. أر <strong>[$1 رÙ\88ئÛ\8cت ڤاÙ\85Û\8cÙ\86]</strong> Û\8cا <strong>[$2 Û\8cئ گئÙ\84 Øئساڤ کارÛ\8cارÛ\8c راس بأکÛ\8cت]</strong>Ø\8c Ú¤Û\8cراÛ\8cئشتÛ\8cا Ø´Ù\88Ù\85ا ڤئ Ù\86Ù\88Ù\85 کارÛ\8cارÛ\8c Ø®Ù\88تÙ\88Ù\99 دÛ\8cارÛ\8c Ù\85Û\8c Ú©Û\95 Ù\88 سÛ\8c Ø´Ù\88Ù\85ا بÛ\8cتأرÛ\95.",
+ "anoneditwarning": "<strong>زاÙ\9bÙ\86ار:</strong> Ø´Ù\88Ù\85ا Ù\87Ù±Ù\86Û\8c Ù\86Û\8cÛ\8aÙ\85اÛ\8cتٱ ڤاÙ\85Û\8cÙ\86. تÛ\8cرÙ\86Ø´Û\8aÙ\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\88Ù\85ا سÛ\8c Ù\87ر گاتÛ\8c کاÙ\9b Ø¢Ù\84شتکارÛ\8c بٱکÛ\8cت سÛ\8c Ú©Ù\88Ù\84 خٱÙ\84Ú© دÛ\8cارÛ\8c Ù\85Û\8c Ú©Ù±. ٱر <strong>[$1 رÙ\88ئÛ\8cت ڤاÙ\85Û\8cÙ\86]</strong> Û\8cا <strong>[$2 Û\8cاÙ\9b گاÙ\9bÙ\84 Ù\87ساڤ کارÛ\8cارÛ\8c راس بٱکÛ\8cت]</strong>Ø\8c Ú¤Û\8cراÛ\8cشتÛ\8cا Ø´Ù\88Ù\85ا Ú¤ Ù\86Ù\88Ù\85 کارÛ\8cارÛ\8c Ø®Ù\88تÛ\8a دÛ\8cارÛ\8c Ù\85Û\8c Ú©Ù± Ù\88 سÛ\8c Ø´Ù\88Ù\85ا بÛ\8cترٱ.",
"anonpreviewwarning": "<em>شوما نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما د ڤیرگار ڤیرایئشت ئی بألگە ئمایە بوٙە.</em>",
"missingsummary": "<strong>ڤیر دیارکو:</strong> شوما هأنی یئ گئل چئکئسە ڤیرایئشتی نە نئها ئمایە کاری نأکئردیتە.\nأر شوما د نۊ د ری \"$1\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
"selfredirect": "<strong>هوشدار:</strong> شوما د حال و بال ڤاگأردوٙنی ئی بألگە د خوش هیین.\nگاسی دال ئشتئڤایی سی ڤاگأردوٙنی ئنتئخاڤ کئردیتە، یا گاسی بألگە نە ئشتئڤایی ڤیرایئشت کاری می کیت.\nأر ری \"$1\" دۊ گئل بأپوٙرنیت، ڤاگأردوٙنی راس موٙە.",
"subject-preview": "داسوٙن/پیش سئیل سأرخأط:",
"previewerrortext": "یئ گئل خأطا د گاتی کئ شوما میهاستیت یئ گئل پیش سئل د آلئشتیاتوٙ داشتوٙین پیش ئوٙماە.",
"blockedtitle": "کاریار نئهاگئری بی",
- "blockedtext": "<strong>Ù\86Ù\88Ù\85 کارÛ\8cارÛ\8c Ø´Ù\88Ù\85ا Û\8cا تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\88Ù\85ا Ù\86ئÙ\87اگئرÛ\8c بÛ\8cÛ\8cÛ\95.</strong>\n\n\n$1 ڤئÙ\86Û\95 Ù\86ئÙ\87اگئرÛ\8c کئردÛ\95.\nدأÙ\84Û\8cÙ\84ئش Ù\87ا د ئÛ\8cÚ\86ئ<em>$2</em>.\n\nØ´Ù\88رÙ\88Ù\99 د Ù\86ئÙ\87اگئرÛ\8c:$8\nآخئر Ù\86ئÙ\87اگئرÛ\8c:$6\nکارÛ\8cارÛ\8c کئ Ù\87ا ڤأرتÛ\8cÛ\95 Ù\88 Ù\86ئÙ\87اگئرÛ\8c بÛ\8cÛ\8cÛ\95:$7\n\nØ´Ù\88Ù\85ا Ù\85Û\8c تÙ\88Ù\99Ù\86Û\8cت ڤا $1 Û\8cا [[{{MediaWiki:Grouppage-sysop}}|سأردÛ\8cÚ¤Ù\88Ù\99Ù\86کار]] Ù\87Ø£Ù\86Û\8c پئÛ\8cڤأÙ\86د بئÛ\8cرÛ\8cت Ù\88 سÛ\8c Ù\86ئÙ\87اگئرÛ\8c ڤا ڤئ Ú\86Ø£Ú© Ú\86ئÙ\86Û\95 کارÛ\8c بأکÛ\8cت.\nØ£Ù\84ڤأت د Ú¤Û\8cر داشتÙ\88Ù\99ئÛ\8cت کئ Ø´Ù\88Ù\85ا Ù\86ئÙ\85Û\8c تÙ\88Ù\99Ù\86Û\8cت Ø®Ù\88صÛ\89صÛ\8cأت Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 کئÙ\84 کئردئÙ\86 سÛ\8c ئÛ\8c کارÛ\8cار Ù\86Û\95 ڤئ کار بئÛ\8cرÛ\8cتØ\8c Ù\85أر Û\8cÛ\95 کئ Û\8cئ گئÙ\84 تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\86ازار Ù\86Û\95 [[Special:Preferences|تأرجÛ\8cØات کارÛ\8cارÛ\8c]] Ø®Ù\88تÙ\88Ù\99 دÛ\8cارÛ\8c کئردئÙ\88Ù\99Û\8cت Ù\88 تÙ\88Ù\99Ù\86ئستÙ\88Ù\99Û\8cت ڤئ Ù\86Û\95 ڤئ کار بئÛ\8cرÛ\8cت .\nتÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø¢Û\8c Ù¾Û\8c ئÛ\8cسئÙ\86Û\8c Ø´Ù\88Ù\85ا $3Û\95Ø\8c Ù\88 Ù\86Ù\88Ù\85 دÛ\8cارکÙ\88Ù\86 Ù\86ئÙ\87اگئرÛ\8c #$5 Û\95.\nÙ\84Ù\88Ø·Ù\81 بأکÛ\8cت Ù\87Ø£Ù\85Û\95 Ú\86Û\8cاÙ\86Û\95 د Ù\87أر ØاستÛ\95 Û\8cÛ\8c کئ دارÛ\8cت بÙ\88Ù\99ئیت.",
+ "blockedtext": "<strong>Ù\86Ù\88Ù\85 کارÛ\8cارÛ\8c Ø´Ù\88Ù\85ا Û\8cا تÛ\8cرÙ\86Ø´Û\8aÙ\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\88Ù\85ا Ù\86اÙ\9bÙ\87اگرÛ\8c بÛ\8cÙ±.</strong>\n\n\n$1 Ú¤Ù\86Ù± Ù\86اÙ\9bÙ\87اگرÛ\8c کردٱ.\nدÙ\84Û\8cÙ\84Ø´ Ù\87ا د اÛ\8cÚ\86اÙ\9b<em>$2</em>.\n\nØ´Ù\88رÛ\8a د Ù\86اÙ\9bÙ\87اگرÛ\8c:$8\nآخر Ù\86اÙ\9bÙ\87اگرÛ\8c:$6\nکارÛ\8cارÛ\8c کاÙ\9b Ù\87ا ڤٱرتÛ\8cÙ± Ù\88 Ù\86اÙ\9bÙ\87اگرÛ\8c بÛ\8cÙ±:$7\n\nØ´Ù\88Ù\85ا Ù\85Û\8c تÛ\8aÙ\86Û\8cت ڤا $1 Û\8cا [[{{MediaWiki:Grouppage-sysop}}|سردÛ\8cÚ¤Û\8aÙ\86کار]] Ù\87Ù±Ù\86Û\8c Ù¾Û\8cÚ¤Ù\86د باÙ\9bÛ\8cرÛ\8cت Ù\88 سÛ\8c Ù\86اÙ\9bÙ\87اگرÛ\8c ڤا Ú¤ Ú\86Ù±Ú© Ú\86Ù\86Ù± کارÛ\8c بٱکÛ\8cت.\nÙ±Ù\84ڤت د Ú¤Û\8cر داشتÛ\8aئÛ\8cت کاÙ\9b Ø´Ù\88Ù\85ا Ù\86Ù\85Û\8c تÛ\8aÙ\86Û\8cت Ú\86Û\8cا Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± کاÙ\9bÙ\84 کردÙ\86 سÛ\8c اÛ\8c کارÛ\8cار Ù\86Ù± Ú¤ کار باÙ\9bÛ\8cرÛ\8cتØ\8c Ù\85ٱر Û\8cÙ± کاÙ\9b Û\8cاÙ\9b Ú¯Ù±Ù\84 تÛ\8cرÙ\86Ø´Û\8aÙ\86 Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ù\86ازار Ù\86Ù± [[Special:Preferences|تٱرجÛ\8cئات کارÛ\8cارÛ\8c]] Ø®Ù\88تÛ\8a دÛ\8cارÛ\8c کردÛ\8aئÛ\8cت Ù\88 تÛ\8aÙ\86ستÛ\8aÛ\8cت Ú¤ Ù\86Ù± Ú¤ کار باÙ\9bÛ\8cرÛ\8cت .\nتÛ\8cرÙ\86Ø´Û\8aÙ\86 Ø¢Û\8c Ù¾Û\8c اÛ\8cساÙ\9bÙ\86Û\8c Ø´Ù\88Ù\85ا $3 Ù±Ø\8c Ù\88 Ù\86Ù\88Ù\85 دÛ\8cارکÙ\88Ù\86 Ù\86اÙ\9bÙ\87اگرÛ\8c #$5 Ù±.\nÙ\84Ù\88تÙ\81 بٱکÛ\8cت Ù\87Ù\85Ù± Ú\86Û\8cاÙ\86Ù± د Ù\87ر Ù\87استٱÛ\8cÛ\8c کاÙ\9b دارÛ\8cت بÛ\8aئیت.",
"autoblockedtext": "<strong>نوم کاریاری شوما یا تیرنئشوٙن آی پی شوما سی یە کئ یئ گئل کاریاری هأنی ڤئ نە ڤئ کار گئرئتە خودأنجومأن ڤئ دأس $1 نئهاگئری بییە.</strong>\n\n\n$1 ڤئنە نئهاگئری کئردە.\nدألیلئش ها د ئیچئ\n<em>$2</em>.\n\nشوروٙ د نئهاگئری:$8\nآخئر نئهاگئری:$6\nکاریاری کئ ها ڤأرتیە و نئهاگئری بییە:$7\n\nشوما می توٙنیت ڤا $1 یا [[{{MediaWiki:Grouppage-sysop}}|سأردیڤوٙنکار]] هأنی پئیڤأند بئیریت و سی نئهاگئری ڤا ڤئ چأک چئنە کاری بأکیت.\nألڤأت د ڤیر داشتوٙئیت کئ شوما نئمی توٙنیت خوصۉصیأت أنجومانامە کئل کئردئن سی ئی کاریار نە ڤئ کار بئیریت، مأر یە کئ یئ گئل تیرنئشوٙن أنجومانامە نازار نە [[Special:Preferences|تأرجیحات کاریاری]] خوتوٙ دیاری کئردئوٙیت و توٙنئستوٙیت ڤئ نە ڤئ کار بئیریت .\nتیرنئشوٙن آی پی ئیسئنی شوما $3ە، و نوم دیارکون نئهاگئری #$5 ە.\nلوطف بأکیت هأمە چیانە د هأر حاستە یی کئ داریت بوٙئیت.",
"blockednoreason": "هیچ دألیلی گوتە نأبییە",
"whitelistedittext": "$1 لوطف بأکیت بألگە یا نە ڤیرایئشت کاری بأکیت.",
"histlast": "تازه تري",
"historysize": "({{PLURAL:$1|1 بایت|$1 بایتیا}})",
"historyempty": "(حالی)",
- "history-feed-title": "ویرگار دوواره دیئن",
- "history-feed-description": "دوواره دیئن ویرگار سی بلگه د ویکی",
+ "history-feed-title": "ڤیرگار دوڤارٱ دیاٛن",
+ "history-feed-description": "دوڤارٱ دیاٛن ڤیرگار سی بلگٱ د ڤیکی",
"history-feed-item-nocomment": "$1 د\n$2",
"history-feed-empty": "بلگه حاسته بیه وجود ناره.\nشایت وه د ویکی پاکسا بیه، یا نومش آلشت بیه.\nسی بلگیا مرتوط تازه [[ویجه:پی جوری|پی جوری د ویکی]] کوششت بکید.",
"history-edit-tags": "ڤیرایئشت کاری ڤانئیأریا گولئ ڤورچی بییە",
"mergelog": "سریک سازی پهرستنومه",
"revertmerge": "بی لوئه",
"mergelogpagetext": "شما د هار نوم گه آخرین چیا وه یک شیوسن ویرگار یه بلگه نه د بلگه تر میئنیت.",
- "history-title": "دوواره دیئن ویرگار$1",
+ "history-title": "دوڤارٱ دیاٛن ڤیرگار $1",
"difference-title": "فرخ مینجا وانیریا \"$1\"",
"difference-title-multipage": "فرخ مینجا بلگه یا \"$1\" و \"$2\"",
"difference-multipage": "(فرخ مینجا بلگه یا)",
"searchdisabled": "مئن جوری د {{SITENAME}} کنشتگر نئ.\nموقتاً می تونیت مئن جوری Google نه بونیت وه کار.\nد ویرتو با که نتیجه یایی که د مئن جوری وا او روشت وه دست میان شایت وه روز نبان.",
"search-error": "یه گل خطا سی اوسنی که پی جوری می کردیت اتفاق افتائه:$1",
"preferences": "خوصوٙیات هأنی",
- "mypreferences": "خوصوٙیات هأنی",
+ "mypreferences": "چیا هٱنی",
"prefs-edits": "شومارە ڤیرایئشتیا:",
"prefsnologintext2": "لطف بکیت بیایت وامین و ترجیحات خوتونه آلشت بئیت.",
"prefs-skin": "پوس",
"usermessage-summary": "رئتن د سامونه پیغوم",
"usermessage-editor": "پیغوم فرسن سیستم",
"usermessage-template": "ویکی وارسگر:پیغوم کاریار",
- "watchlist": "سئÛ\8cÙ\84 بأرگ",
- "mywatchlist": "سئÛ\8cÙ\84 بأرگ",
+ "watchlist": "ساÙ\9bÛ\8cÙ\84 برگ",
+ "mywatchlist": "ساÙ\9bÛ\8cÙ\84 برگ",
"watchlistfor2": "سي $1 $2",
"nowatchlist": "شما هیچی د سیل برگ خوتو ناریت",
"watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
"notvisiblerev": "آخری وانئری که د دس یه کاریار هنی انجوم بیه پاکسا بیه.",
"watchlist-details": "{{PLURAL:$1|$1 بلگٱ|$1 بلگٱیا}} د ساٛیل برگتۊ هیچ بلگٱ قساٛ کردنی نی.",
"wlheader-enotif": "ڤارئسیاری أنجومانامە کونئشتکار بییە.",
- "wlheader-showupdated": "بÙ\84Ú¯Ù\87 Û\8cاÛ\8cÛ\8c Ú©Ù\87 د آخرÛ\8cÙ\86 کرتÛ\8c Ú©Ù\87 Ø´Ù\85ا دشÙ\88 دÛ\8cئÙ\86 کردÛ\8cتÙ\87 Ø¢Ù\84شت بÛ\8cÙ\86Ù\87 د <strong>تÙ\88پر</strong>Ù\86Ø´Ù\88Ù\86 دئÙ\87 بÛ\8cÙ\86Ù\87",
+ "wlheader-showupdated": "بÙ\84Ú¯Ù± Û\8cاÛ\8cÛ\8c کاÙ\9b د آخرÛ\8cÙ\86 بارÛ\8c کاÙ\9b Ú©Ù\87 Ø´Ù\85ا ساÙ\9bÛ\8cÙ\84Ø´Û\8a کردÛ\8cتٱ د <strong>تÛ\8aÙ¾Ù\88ر</strong>Ù\86Ø´Û\8aÙ\86 دئٱ بÛ\8aاÙ\9bÙ\86",
"wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتی}} که د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} دماتر انجوم بیه هیئش، ویرگار آخرین واجوری انجام شده موجود است، ویرگار آخری واجوری: $3، $4",
"wlshowlast": "آخرین$1 ساعتیا $2و روزیا نشو بیئه",
"wlshowtime": "نئشوٙ دأئن د آخأر",
"wlshowhideanons": "کاریار نادیار",
"wlshowhidepatr": "تیە پایی د ڤیرایئشتیا",
"wlshowhidemine": "ڤیرایئشتیا مئ",
- "watchlist-options": "Ú\86Û\8cا سئÛ\8cÙ\84 بأرگ",
+ "watchlist-options": "Ú\86Û\8cا ساÙ\9bÛ\8cÙ\84 برگ",
"watching": "د حال و بال دیئن...",
"unwatching": "د حال ندیئن...",
"watcherrortext": "یه گل اشگال د گات آلشت کردن میزونکاری نومگه سیل برگتو سی «$1» پیش اوما.",
"sp-contributions-deleted": "هومیاریا پاکسا بیه کاریار",
"sp-contributions-uploads": "سواركرديا",
"sp-contributions-logs": "نیسنن رخ ونیا",
- "sp-contributions-talk": "چأک چئنە",
+ "sp-contributions-talk": "چٱک چنٱ",
"sp-contributions-userrights": "دیوونداری حقوق کاریار",
"sp-contributions-blocked-notice": "د دسرسی ای کاریا د ایسنی نهاگری بیه.\nآخری برشت د پهرستنومه نهاگری ها د سرچشمه هاری:",
"sp-contributions-blocked-notice-anon": "ای آی پی ایسنی دسرسی ناره.\nآخری برشت د پهرستنومه ها د سرچشمه هاری:",
"tooltip-ca-nstab-special": "یٱ یاٛ گاٛل بلگٱ ڤیجٱ یٱ؛ نبۊٱ ڤیرایشتش بٱکیت",
"tooltip-ca-nstab-project": "ديئن بلگه پروجه",
"tooltip-ca-nstab-image": "ديئن بلگه جانیا",
- "tooltip-ca-nstab-mediawiki": "دÛ\8cئÙ\86 Ù¾Û\8cغÙ\88Ù\85 ساÙ\85Ù\88Ù\86Ù\87",
+ "tooltip-ca-nstab-mediawiki": "دÛ\8cاÙ\9bÙ\86 Ù¾Û\8cغÙ\88Ù\85 ساÙ\85Û\8aÙ\86Ù±",
"tooltip-ca-nstab-template": "ديئن قالو",
"tooltip-ca-nstab-help": "ديئن بلگه هومیاری",
"tooltip-ca-nstab-category": "ديئن بلگه دسه بنی",
"tooltip-save": "آلشتیاتۊنٱ اٛمایٱ بٱکیت",
"tooltip-preview": "پیش سیل آلشتیاتو،لطف بکیت وه نونه دما د اماییه کاریشو وه کار بیئریت!",
"tooltip-diff": "آلشتیا نه که شما د ای متن راس کردیته نشو بیئه",
- "tooltip-compareselectedversions": "فرخیا مینجا دو تا د دو بار دیئن ای بلگه نه بوینیت",
+ "tooltip-compareselectedversions": "فرخیا مینجا د تا د دو بار دیاٛن ای بلگٱ نٱ بۉنیت",
"tooltip-watch": "ای بلگه نه د سیل برگتو اضاف بکید",
"tooltip-watchlistedit-normal-submit": "ؤرداشتن سرونیا",
"tooltip-watchlistedit-raw-submit": "وه هنگوم سازی سیل برگ",
"createaccount": "Sukurti paskyrą",
"userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
"userlogin-helplink2": "Padėti prisijungti",
- "userlogin-loggedin": "Jūs jau prisijungęs kaip {{GENDER:$1|$1}}.\nNaudokite žemiau pateiktą pavidalą, kad prisijungtumėte kaip kitas naudotojas.",
+ "userlogin-loggedin": "Jūs jau prisijungęs kaip {{GENDER:$1|$1}}.\nĮveskite prisijungimo duomenis į žemiau esančius laukelius, kad prisijungtumėte kaip kitas naudotojas.",
"userlogin-reauth": "Turite vėl prisijungti patvirtinimui, kad esate {{GENDER:$1|$1}}.",
"userlogin-createanother": "Sukurti kitą paskyrą",
"createacct-emailrequired": "Elektroninio pašto adresas",
"createacct-another-submit": "Sukurti paskyrą",
"createacct-continue-submit": "Tęsti paskyros kūrimą",
"createacct-another-continue-submit": "Tęsti paskyros kūrimą",
- "createacct-benefit-heading": "{{SITENAME}} sukurtas žmonių kaip jūs.",
+ "createacct-benefit-heading": "{{SITENAME}} kuria tokie žmonės kaip Jūs.",
"createacct-benefit-body1": "{{PLURAL:$1|keitimas|keitimai|keitimų}}",
"createacct-benefit-body2": "{{PLURAL:$1|puslapis|puslapiai|puslapių}}",
"createacct-benefit-body3": "Neseni {{PLURAL:$1|autorius|autoriai|autorių}}",
"edithelp": "Hulpe mit bewarken",
"helppage-top-gethelp": "Hulpe",
"mainpage": "Vöärblad",
- "mainpage-description": "Veurblad",
+ "mainpage-description": "Vöärblad",
"policy-url": "Project:Beleid",
"portal": "Gebrukersportål",
"portal-url": "Project:Gebrukersportaol",
"confirmrecreate": "Gebruker [[User:$1|$1]] ([[User talk:$1|Overleg]]) hef disse zied vortedaon naoda'j begunnen bin mit joew wieziging, mit opgave van de volgende reden: ''$2''. Bevestig da'j t artikel herschrieven willen.",
"confirmrecreate-noreason": "Gebruker [[User:$1|$1]] ([[User talk:$1|overleg]]) hef disse zied vortedaon naoda'j begunnen bin mit joew wieziging. Bevestig da'j t artikel herschrieven willen.",
"recreate": "Herschrieven",
+ "confirm-purge-title": "Herny disse syde",
"confirm_purge_button": "Bevestig",
- "confirm-purge-top": "Klik op 'bevestig' um t tussengeheugen van disse zied te legen.",
- "confirm-purge-bottom": "t Leegmaken van t tussengeheugen zörgt derveur da'j de leste versie van n zied zien.",
+ "confirm-purge-top": "Klik up 'bevestig' üm et tüskengehöägen van disse syde te leagen.",
+ "confirm-purge-bottom": "Et leagmaken van et tüskengehöägen sörgt dervöär dat jy de lätste versy van een syde te syn krygen.",
"confirm-watch-button": "Oké",
"confirm-watch-top": "Disse zied op joew volglieste zetten?",
"confirm-unwatch-button": "Oké",
"laggedslavemode": "Åtvaring: Det er mogleg at sida ikkje er heilt oppdatert.",
"readonly": "Databasen er skriveverna",
"enterlockreason": "Skriv ein grunn for vernet, inkludert eit overslag for kva tid det vil bli oppheva",
- "readonlytext": "Databasen er akkurat no skriveverna, truleg for rutinemessig vedlikehald. Administratoren som verna han har gjeve denne forklaringa:\n\n$1",
+ "readonlytext": "Databasen er nett no skriveverna for nye oppslag og andre endringar, truleg for rutinemessig vedlikehald. Etterpå vil han opnast att. Administratoren som verna han gav denne forklaringa:\n\n$1",
"missing-article": "Databasen burde ha funne sida «$1» $2, men det gjorde han ikkje.\n\nDei vanlegaste årsakene til denne feilen er ei lenkje til ein skilnad mellom forskjellige versjonar eller lenkjer til ein gammal versjon av ei side som har vorte sletta.\n\nOm det ikkje er tilfellet kan du ha funne ein feil i programvara.\nMeld gjerne problemet til ein [[Special:ListUsers/sysop|administrator]] og oppgje då adressa til sida.",
"missingarticle-rev": "(versjon $1)",
"missingarticle-diff": "(jamføring av versjon $1 og $2)",
"createacct-realname": "Sant namn (valfritt)",
"createacct-reason": "Årsak",
"createacct-reason-ph": "Kvifor du lagar ein ny konto",
+ "createacct-reason-help": "Melding vist i kontoopprettingsloggen",
"createacct-submit": "Opprett kontoen din",
"createacct-another-submit": "Opprett konto",
"createacct-continue-submit": "Hald fram med kontooppretting",
"wrongpasswordempty": "Du oppgav ikkje noko passord. Ver venleg og prøv igjen.",
"passwordtooshort": "Passord må innehalda minst {{PLURAL:$1|eitt teikn|$1 teikn}}.",
"passwordtoolong": "Passord kan ikkje vera lengre enn {{PLURAL:$1|eitt|$1}} teikn.",
- "passwordtoopopular": "Alminneleg valde passord kan ikkje nyttast. Vel eit meir unikt passord.",
+ "passwordtoopopular": "Alminneleg valde passord kan ikkje nyttast. Ver god å velja eit passord som er vanskelegare å gissa.",
"password-name-match": "Passordet ditt lyt vera noko anna enn brukarnamnet ditt.",
"password-login-forbidden": "Bruk av dette brukarnamnet og passordet er vorte forbode.",
"mailmypassword": "Attendestill passord",
"noemail": "Det er ikkje registrert noka e-postadresse åt brukaren «$1».",
"noemailcreate": "Du må oppgje ei gyldig e-postadresse",
"passwordsent": "Eit nytt passord er sendt åt e-postadressa registrert på brukaren «$1».",
- "blocked-mailpassword": "IP-adressa di er blokkert frå å endre sider, og du kan difor heller ikkje få nytt passord. Dette er for å hindre misbruk.",
- "eauthentsent": "Ein stadfestings-e-post er sendt til den oppgjevne e-postadressa. For at adressa skal kunna brukast, må du følgje instruksjonane i e-posten for å stadfeste at ho faktisk tilhøyrer deg.",
- "throttled-mailpassword": "Ei passordpåminning er allereie sendt {{PLURAL:$1|den siste timen|dei siste $1 timane}}. For å hindre misbruk vert det berre sendt ut nytt passord ein gong kvar {{PLURAL:$1|time|$1. time}}.",
+ "blocked-mailpassword": "IP-adressa di er blokkert frå å endre sider. For å hindre misbruk kan ein heller ikkje ikkje få nytt passord frå denne adressa.",
+ "eauthentsent": "Det er blitt send ein stadfestings-e-post til den oppgjevne e-postadressa. \n\nFør det blir send fleire e-postar til adressa, må du følgje instruksjonane i e-posten for å stadfeste at ho faktisk tilhøyrer deg.",
+ "throttled-mailpassword": "Ei passordpåminning er allereie sendt {{PLURAL:$1|den siste timen|dei siste $1 timane}}. \nFor å hindre misbruk vert det berre sendt ut nytt passord ein gong kvar {{PLURAL:$1|time|$1. timar}}.",
"mailerror": "Ein feil oppstod ved sending av e-post: $1",
- "acct_creation_throttle_hit": "Vitjande på denne wikien som nytta IP-adressa di har alt oppretta {{PLURAL:$1|éin konto|$1 kontoar}} den siste dagen, noko som er det høgaste tillate talet i denne tidsperioden.\nGrunna dette vil ikkje vitjande som nyttar denne IP-adressa kunna oppretta nye kontoar nett no.",
+ "acct_creation_throttle_hit": "Vitjande på denne wikien som nytta IP-adressa di har alt oppretta {{PLURAL:$1|éin konto|$1 kontoar}} den siste $2, noko som er det høgaste tillatne talet i denne tidsperioden.\nGrunna dette vil ikkje vitjande som nyttar denne IP-adressa kunna oppretta nye kontoar nett no.",
"emailauthenticated": "E-postadressa di vart stadfest $2 klokka $3.",
"emailnotauthenticated": "E-postadressa di er ikkje stadfest enno. Ingen e-post vil verta send ut for desse funksjonane.",
"noemailprefs": "Oppgje ei e-postadresse i innstillingane dine for at desse funksjonane skal verke.",
"createaccount-title": "Oppretting av brukarkonto på {{SITENAME}}",
"createaccount-text": "Nokon oppretta ein brukarkonto for $2 på {{SITENAME}} ($4). Passordet til «$2» er «$3». Du bør logge inn og endre passordet ditt med ein gong.\n\nDu kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.",
"login-throttled": "Du har prøvd å logge inn for mange gonger. Vent $1 vent før du prøver igjen.",
- "login-abort-generic": "Innlogginga er avbroten.",
+ "login-abort-generic": "Innlogginga di feila - avbroten.",
+ "login-migrated-generic": "Kontoen din er blitt globalisert, og brukarnamnet ditt finst ikkje lenger på denne wikien.",
"loginlanguagelabel": "Språk: $1",
"suspicious-userlogout": "Førespurnaden din om å logge ut vart nekta fordi han såg ut til å vere sendt av ein øydelagt nettlesar eller mellomtenar.",
"pt-login": "Logg inn",
"user-mail-no-addy": "↓Prøvde å senda e-post utan e-postadresse",
"user-mail-no-body": "Freista å senda e-post med tom eller urimeleg stutt brødtekst.",
"changepassword": "Skift passord",
- "resetpass_announce": "Du logga inn med eit mellombels passord du fekk på e-post. For å fullføre innlogginga må du lage eit nytt passord her:",
+ "resetpass_announce": "For å fullføra innloggingen må du velja eit nytt passord.",
"resetpass_text": "<!-- Legg til tekst her -->",
"resetpass_header": "Endra passord",
"oldpassword": "Gammalt passord",
"retypenew": "Nytt passord om att",
"resetpass_submit": "Oppgje passord og logg inn",
"changepassword-success": "Passordet ditt er no endra!",
+ "changepassword-throttled": "Du har gjort for mange nylege innloggingsforsøk.\nVer god å venta $1 før du prøver igjen.",
"botpasswords": "Botpassord",
"resetpass_forbidden": "Passord kan ikkje endrast",
"resetpass-no-info": "Du må vera innlogga for å få direktetilgang til denne sida.",
"resetpass-submit-loggedin": "Endra passord",
"resetpass-submit-cancel": "Avbryt",
"resetpass-wrong-oldpass": "Ugyldig mellombels eller gjeldande passord.\nDu kan ha bytt passordet allereie, eller bede om å få eit nytt mellombels passord.",
+ "resetpass-recycled": "Ver god og endra passordet til noko anna enn det gjeldande passordet ditt.",
"resetpass-temp-emailed": "Du logga inn med ein mellombels kode send med e-post.\nFor å fullføra innlogginga lyt du oppgje eit nytt passord her:",
"resetpass-temp-password": "Mellombels passord:",
"resetpass-abort-generic": "Passordbytet vart stogga av ei utviding.",
"passwordreset-emailtext-ip": "Nokon (sannsynlegvis deg, frå IP-adressa $1) bad om ei nullstilling av passordet ditt for {{SITENAME}} ($4). {{PLURAL:$3|Denne brukarkontoen|Desse brukarkontoane}} er knytte til denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} går ut om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne nullstillinga eller du no hugsar det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
"passwordreset-emailtext-user": "Brukaren $1 på {{SITENAME}} bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
"passwordreset-emailelement": "↓Brukarnamn: \n$1\n\nMellombels passord: \n$2",
- "passwordreset-emailsentemail": "Ein e-post for attendestilling av passord er vorten send",
+ "passwordreset-emailsentemail": "Om denne e-postadressa er knytt til din konto, vil det verte send ein e-post for attendestilling av passordet.",
+ "passwordreset-emailsentusername": "Om ei e-postadresse er knytt til denne kontoen, vil det verte send ein e-post for attendestilling av passordet.",
+ "passwordreset-nocaller": "Du må oppgje ein brukar",
+ "passwordreset-nosuchcaller": "Brukaren finst ikkje: $1",
+ "passwordreset-ignored": "Passordtilbakestillinga vart ikkje handsama. Kanskje ingen leverandør er vorten konfigurert?",
+ "passwordreset-invalidemail": "Ugyldig e-postadresse",
+ "passwordreset-nodata": "Verken eit brukarnamn eller ei e-postadresse vart oppgjeve",
"changeemail": "Endre eller fjern e-postadresse",
"changeemail-header": "Fyll ut dette skjemaet for å endre e-postadressa di. Ynskjer du å fjerne tilknytinga ei e-postadresse har til kontoen din, lat feltet for ny e-postadresse stå tomt når du sender inn skjemaet.",
"changeemail-no-info": "↓Du må vera pålogga for å få tilgang direkte til denne sida.",
"changeemail-password": "{{SITENAME}}-passordet ditt:",
"changeemail-submit": "Endre e-post",
"changeemail-throttled": "Du har freista for mange gonger å logga inn. Du lyt venta $1 før du kan freista på nytt.",
+ "changeemail-nochange": "Ver god å oppgje ei ny e-postadresse.",
"bold_sample": "Halvfeit skrift",
"bold_tip": "Halvfeit skrift",
"italic_sample": "Kursivskrift",
"permissionserrorstext": "Du har ikkje tilgang til å gjere dette, {{PLURAL:$1|grunnen|grunnane}} til det finn du her:",
"permissionserrorstext-withaction": "Du har ikkje løyve til å $2 {{PLURAL:$1|av di|av desse grunnane}}:",
"recreate-moveddeleted-warn": "'''Åtvaring: Du attopprettar ei side som tidlegare har vorte sletta.'''\n\nDu bør tenkje over om det er høveleg å halde fram med å endre denne sida.\nSletteloggen for sida finn du her:",
- "moveddeleted-notice": "Sida er vorten sletta. Sletteloggen og flytteloggen er viste nedanfor for referanse.",
+ "moveddeleted-notice": "Denne sida er vorten sletta. \n\nSletteloggen og flytteloggen er viste nedanfor for referanse.",
"log-fulllog": "Sjå full loggføring",
"edit-hook-aborted": "Endring avbroten av ein funksjon, utan forklaring.",
"edit-gone-missing": "Kunne ikkje oppdatere sida.\nDet ser ut til at ho er sletta.",
"recentchangeslinked-feed": "Relaterte endringar",
"recentchangeslinked-toolbox": "Relaterte endringar",
"recentchangeslinked-title": "Endringar relaterte til «$1»",
- "recentchangeslinked-summary": "Dette er ei liste over nylege endringar som er gjorde på sider som vert lenkja til frå ei oppgjeven side (eller på medlemer av ein oppgjeven kategori). Sider på [[Special:Watchlist|overvakingslista di]] er '''utheva'''.",
+ "recentchangeslinked-summary": "Skriv inn eit sidenamn for å sjå endringar på sider som lenkjer til eller vert lenkja til frå den sida. (For å sjå medlemmar av ein kategori skriv inn Kategori:Kategorinamn). Endringar av sider på [[Spesial:Watchlist|overvakingslista di]] er i <strong>feit skrift</strong>.",
"recentchangeslinked-page": "Sidenamn:",
"recentchangeslinked-to": "Vis endringar på sider som lenkjar til den gitte sida i staden",
"recentchanges-page-added-to-category": "[[:$1]] vart lagd til kategorien",
"Cholewka",
"Ankam",
"Anwar2",
- "Acamicamacaraca"
+ "Acamicamacaraca",
+ "DeRudySoulStorm",
+ "Railfail536"
]
},
"tog-underline": "Podkreślenie linków:",
"stub-threshold-disabled": "Wyłączone",
"recentchangesdays": "Liczba dni prezentowanych w ostatnich zmianach:",
"recentchangesdays-max": "(maksymalnie $1 {{PLURAL:$1|dzień|dni}})",
- "recentchangescount": "Domyślna liczba wyświetlanych edycji:",
- "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
+ "recentchangescount": "Domyślna liczba wyświetlanych edycji w ostatnich zmianach, historii i rejestrach:",
+ "prefs-help-recentchangescount": "Maksymalna liczba: 1000",
"prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli chcesz go zresetować]].",
"savedprefs": "Twoje preferencje zostały zapisane.",
"savedrights": "Zapisano grupy {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
"expand_templates_preview": "Podgląd",
"expand_templates_preview_fail_html": "<em>Ponieważ {{SITENAME}} ma włączony surowy kod HTML i zaistniała strata danych z sesji, podgląd jest ukryty jako zabezpieczenie przed atakiem JavaScript.</em>\n\n<strong>Jeśli to jest próba słusznego podglądu, proszę spróbować ponownie.</strong>\nJeśli to nie pomoże – spróbuj [[Special:UserLogout|wylogować się]] i zalogować ponownie, a także upewnij się, że twoja przeglądarka akceptuje ciasteczka z tej witryny.",
"expand_templates_preview_fail_html_anon": "<em>Ponieważ {{SITENAME}} ma włączoną możliwość korzystania z surowego HTML a jesteś niezalogowany, podgląd został ukryty - jest to środek zapobiegawczy przeciwko atakom JavaScript.</em>\n\n<strong>Jeżeli jest to spodziewana próba podglądu, [[Special:UserLogin|zaloguj się]] i spróbuj ponownie.</strong>",
- "expand_templates_input_missing": "Trzeba wpisać jakiś tekst.",
+ "expand_templates_input_missing": "Musisz podać jakiś wikitekst.",
"pagelanguage": "Zmiana języka strony",
"pagelang-name": "Strona",
"pagelang-language": "Język",
"MaksimPinigin",
"Smigles",
"OlegCinema",
- "Movses"
+ "Movses",
+ "Patrick Star"
]
},
"tog-underline": "Подчёркивание ссылок:",
"versionrequiredtext": "Для работы с этой страницей требуется MediaWiki версии $1. См. [[Special:Version|информацию об программном обеспечении]].",
"ok": "OK",
"pagetitle": "$1 — {{SITENAME}}",
+ "pagetitle-view-mainpage": "{{SITENAME}}",
"backlinksubtitle": "← $1",
"retrievedfrom": "Источник — «$1»",
"youhavenewmessages": "Вы получили $1 ($2).",
"page-rss-feed": "«$1» — RSS-лента",
"page-atom-feed": "«$1» — Atom-лента",
"feed-atom": "Atom",
+ "feed-rss": "Каналы RSS",
"red-link-title": "$1 (страница не существует)",
"sort-descending": "Упорядочить по убыванию",
"sort-ascending": "Упорядочить по возрастанию",
"nocookiesnew": "Участник зарегистрирован, но не представлен. {{SITENAME}} использует «cookies» для представления участников. У вас «cookies» запрещены. Пожалуйста, разрешите их, а затем представьтесь со своиим новым именем участника и паролем.",
"nocookieslogin": "{{SITENAME}} использует «cookies» для представления участников. Вы их отключили. Пожалуйста, включите их и попробуйте снова.",
"nocookiesfornew": "Учётная запись участника не была создана из-за невозможности проверить её источник. \nУбедитесь, что включены «cookies», обновите страницу и попробуйте ещё раз.",
+ "nocookiesforlogin": "{{int:nocookieslogin}}",
"createacct-loginerror": "Учётная запись была успешно создана, но вы не смогли войти в систему автоматически. Пожалуйста, [[Special:UserLogin|авторизуйтесь вручную]].",
"noname": "Вы не указали допустимого имени участника.",
"loginsuccesstitle": "Вход произведён",
"expansion-depth-exceeded-warning": "На странице превышен предел вложенности",
"parser-unstrip-loop-warning": "Обнаружен незакрытый pre",
"unstrip-depth-warning": "Превышен предел рекурсии ($1)",
+ "unstrip-depth-category": "Страницы где незаметная глубина превышена",
+ "unstrip-size-warning": "Unstrip превышен предел рекурсии ($1)",
+ "unstrip-size-category": "Страницы где незаметная разметка превышена",
"converter-manual-rule-error": "Ошибка в ручном правиле преобразования языка",
"undo-success": "Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.",
"undo-failure": "Правка не может быть отменена из-за несовместимости промежуточных изменений.",
"mergehistory-comment": "Перенос [[:$1]] в [[:$2]]: $3",
"mergehistory-same-destination": "Исходная и целевая страницы должны различаться",
"mergehistory-reason": "Причина:",
+ "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
"mergelog": "Журнал объединений",
"revertmerge": "Разделить",
"mergelogpagetext": "Ниже приведён список последних объединений историй страниц.",
"stub-threshold-disabled": "Отключён",
"recentchangesdays": "Количество дней, за которые показывать свежие правки:",
"recentchangesdays-max": "(не более $1 {{PLURAL:$1|дня|дней}})",
- "recentchangescount": "Ð\9aолиÑ\87еÑ\81Ñ\82во пÑ\80авок, оÑ\82обÑ\80ажаемое по Ñ\83молÑ\87аниÑ\8e:",
- "prefs-help-recentchangescount": "Ð\92клÑ\8eÑ\87аеÑ\82 Ñ\81вежие пÑ\80авки, иÑ\81Ñ\82оÑ\80ии Ñ\81Ñ\82Ñ\80аниÑ\86, жÑ\83Ñ\80налÑ\8b.",
+ "recentchangescount": "Ð\9aолиÑ\87еÑ\81Ñ\82во пÑ\80авок, по Ñ\83молÑ\87аниÑ\8e оÑ\82обÑ\80ажаемое в Ñ\81пиÑ\81ке Ñ\81вежиÑ\85 пÑ\80авок, иÑ\81Ñ\82оÑ\80ии Ñ\81Ñ\82Ñ\80аниÑ\86 и в жÑ\83Ñ\80налаÑ\85:",
+ "prefs-help-recentchangescount": "Ð\9dаиболÑ\8cÑ\88ее знаÑ\87ение: 1000",
"prefs-help-watchlist-token2": "Это секретный ключ для веб-канала вашего списка наблюдений.\nЛюбой, кто знает его, сможет читать ваш список наблюдения, поэтому не сообщайте его другим.\nЕсли необходимо, [[Special:ResetTokens|вы можете сбросить его]].",
"savedprefs": "Настройки сохранены.",
"savedrights": "Группы {{GENDER:$1|участника|участницы}} $1 были сохранены.",
"youremail": "Электронная почта:",
"username": "{{GENDER:$1|Имя участника|Имя участницы}}:",
"prefs-memberingroups": "{{GENDER:$2|Член|Член}} {{PLURAL:$1|1=группы|групп}}:",
+ "prefs-memberingroups-type": "$1",
"group-membership-link-with-expiry": "$1 (до $2)",
"prefs-registration": "Время регистрации:",
+ "prefs-registration-date-time": "$1",
"yourrealname": "Настоящее имя:",
"yourlanguage": "Язык интерфейса:",
"yourvariant": "Вариант языка содержания:",
"saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}",
"userrights-groupsmember": "Состоит в группах:",
"userrights-groupsmember-auto": "Неявно состоит в группах:",
+ "userrights-groupsmember-type": "$1",
"userrights-groups-help": "Вы можете изменить группы, в которые входит {{GENDER:$1|этот участник|эта участница}}.\n* Если около названия группы стоит отметка — {{GENDER:$1|участник|участница}} входит в эту группу.\n* Если отметка не стоит — {{GENDER:$1|участник|участница}} не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить {{GENDER:$1|участника|участницу}} из группы, если добавите {{GENDER:$1|его|её}} в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения членства в этой группы, вы не можете перенести его на более ранний срок.",
"userrights-reason": "Причина:",
"userrights-no-interwiki": "У вас нет разрешения изменять права участников в других вики.",
"userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
"userrights-changeable-col": "Группы, которые вы можете изменять",
"userrights-unchangeable-col": "Группы, которые вы не можете изменять",
+ "userrights-irreversible-marker": "$1*",
+ "userrights-no-shorten-expiry-marker": "$1#",
"userrights-expiry-current": "Истекает $1",
"userrights-expiry-none": "Никогда",
"userrights-expiry": "Права истекают:",
"action-deletechangetags": "удаление меток из базы данных",
"action-purge": "очистку кэша этой страницы",
"nchanges": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
+ "ntimes": "$1×",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|с последнего посещения}}",
"enhancedrc-history": "история",
"recentchanges": "Свежие правки",
"rcfilters-view-namespaces-tooltip": "Результаты фильтра по пространствам имён",
"rcfilters-view-tags-tooltip": "Фильтровать результаты, используя метки правок",
"rcfilters-view-return-to-default-tooltip": "Вернуться в главное меню фильтров",
- "rcfilters-view-tags-help-icon-tooltip": "",
+ "rcfilters-view-tags-help-icon-tooltip": "Узнать больше о редакторе тегов",
"rcfilters-liveupdates-button": "Обновлять автоматически",
"rcfilters-liveupdates-button-title-on": "Отключить автоматические обновления",
"rcfilters-liveupdates-button-title-off": "Показывать новые изменения сразу после их появления",
"boteditletter": "б",
"unpatrolledletter": "!",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдающий участник|наблюдающих участника|наблюдающих участников}}]",
+ "rc-change-size": "$1",
"rc-change-size-new": "Размер после изменения: $1 {{PLURAL:$1|байт|байта|байт}}",
"newsectionsummary": "/* $1 */ новая тема",
"rc-enhanced-expand": "Показать подробности",
"apisandbox-request-selectformat-label": "Показать данные запроса, как:",
"apisandbox-request-format-url-label": "Строка URL-запроса",
"apisandbox-request-url-label": "URL-адрес запроса:",
+ "apisandbox-request-format-json-label": "JSON",
"apisandbox-request-json-label": "Запросить JSON:",
"apisandbox-request-time": "Время запроса: {{PLURAL:$1|$1 мс}}",
"apisandbox-results-fixtoken": "Исправьте токен и повторите отправку",
"listgrants-summary": "Ниже приведён список разрешений с указанием на то, к каким связанным пользовательским правам они дают доступ. Участники могут разрешить приложениям использовать свою учётную запись, но с ограниченными правами на основе разрешений, которые участник предоставляет приложению. Однако, приложение, действующее от имени участника, на самом деле не сможет воспользоваться правами, отсутствующими у учётной записи.\nОб отдельных правах можно получить [[{{MediaWiki:Listgrouprights-helppage}}|дополнительную информацию]].",
"listgrants-grant": "Разрешение",
"listgrants-rights": "Права",
+ "listgrants-grant-display": "$1 <code>($2)</code>",
"trackingcategories": "Отслеживающие категории",
"trackingcategories-summary": "На этой странице перечислены категории, заполняемые автоматически. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
"trackingcategories-msg": "Отслеживаемая категория",
"emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailuser}}» проекта {{SITENAME}}. Если {{GENDER:$2|вы}} ответите на это письмо, оно будет отослано напрямую {{GENDER:$1|отправителю}}, так что {{GENDER:$2|ваш}} адрес электронной почты станет известен {{GENDER:$1|ему|ей}}.",
"usermessage-summary": "Оставить системное сообщение.",
"usermessage-editor": "Системная доставка",
+ "usermessage-template": "MediaWiki:UserMessage",
"watchlist": "Список наблюдения",
"mywatchlist": "Список наблюдения",
"watchlistfor2": "Для $1 $2",
"editcomment": "Было дано описание изменения: <em>$1</em>.",
"revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
"revertpage-nouser": "Откат правок (имя участника скрыто) к версии {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Ð\9eÑ\82каÑ\87енÑ\8b пÑ\80авки {{GENDER:$3|$1}}; возврат к версии {{GENDER:$4|$2}}.",
- "rollback-success-notify": "Ð\9eÑ\82каÑ\87енÑ\8b пÑ\80авки $1; возвÑ\80аÑ\82 к поÑ\81ледней версии $2. [$3 Показать изменения]",
+ "rollback-success": "Ð\9eÑ\82каÑ\82 пÑ\80авок {{GENDER:$3|$1}}; возврат к версии {{GENDER:$4|$2}}.",
+ "rollback-success-notify": "Ð\9eÑ\82каÑ\82 пÑ\80авок $1; возвÑ\80аÑ\82 к версии $2. [$3 Показать изменения]",
"sessionfailure-title": "Ошибка сеанса",
"sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\nПожалуйста, переотправьте форму.",
"changecontentmodel": "Редактирование контентной модели страницы",
"protect-fallback": "Разрешено только участникам с правами «$1»",
"protect-level-autoconfirmed": "Разрешено только автоподтверждённым участникам",
"protect-level-sysop": "Разрешено только администраторам",
+ "protect-summary-desc": "[$1=$2] ($3)",
"protect-summary-cascade": "каскадная",
"protect-expiring": "истекает $1 (UTC)",
"protect-expiring-local": "истекает $1",
"undelete-error-long": "Во время восстановления файла возникли ошибки:\n\n$1",
"undelete-show-file-confirm": "Вы уверены, что желаете просмотреть удалённую версию файла <nowiki>$1</nowiki> от $2 $3?",
"undelete-show-file-submit": "Да",
+ "undelete-revision-row2": "$1 ($2) $3 . . $4 $5 $6 $7 $8",
"namespace": "Пространство имён:",
"invert": "Обратить выбранное",
"tooltip-invert": "Установите эту отметку, чтобы скрыть изменения на страницах, в пределах выбранного пространства имён (и связанных пространств имён, если указано)",
"ip_range_invalid": "Недопустимый диапазон IP-адресов.",
"ip_range_toolarge": "Блокировки диапазонов свыше /$1 запрещены.",
"ip_range_exceeded": "IP-диапазон превышает максимальный диапазон. Допустимый диапазон: /$1.",
- "ip_range_toolow": "",
+ "ip_range_toolow": "Диапазоны IP не разрешены.",
"proxyblocker": "Блокировка прокси",
"proxyblockreason": "Ваш IP-адрес заблокирован потому, что это открытый прокси-сервер. Пожалуйста, свяжитесь со своиим интернет-провайдером или службой поддержки, и сообщите им об этой серьёзной проблеме безопасности.",
+ "sorbs": "DNSBL",
"sorbsreason": "Ваш IP-адрес числится как открытый прокси в DNSBL.",
"sorbs_create_account_reason": "Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.",
"softblockrangesreason": "Анонимные правки не разрешены с вашего IP-адреса ($1). Пожалуйста, войдите в систему.",
"tooltip-preferences-save": "Сохранить настройки",
"tooltip-summary": "Введите краткое описание",
"interlanguage-link-title": "$1 — $2",
+ "interlanguage-link-title-nonlang": "$1 – $2",
"common.css": "/* Размещённый здесь CSS будет применяться ко всем темам оформления */",
"print.css": "/* Размещённый здесь CSS будет применяться к версии для печати */",
"noscript.css": "/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript */",
"yesterday-at": "Вчера в $1",
"bad_image_list": "Формат должен быть следующим:\n\nБудут учитываться только элементы списка (строки, начинающиеся на символ *).\nПервая ссылка строки должна быть ссылкой на запрещённое для вставки изображение.\nПоследующие ссылки в той же строке будут рассматриваться как исключения, то есть статьи, куда изображение может быть включено.",
"variantname-zh-hans": "hans",
+ "variantname-zh-hant": "hant",
+ "variantname-zh-cn": "cn",
+ "variantname-zh-tw": "tw",
+ "variantname-zh-hk": "hk",
+ "variantname-zh-mo": "mo",
+ "variantname-zh-sg": "sg",
+ "variantname-zh-my": "my",
+ "variantname-zh": "zh",
+ "variantname-gan-hans": "hans",
+ "variantname-gan-hant": "hant",
+ "variantname-gan": "gan",
+ "variantname-sr-ec": "sr-ec",
+ "variantname-sr-el": "sr-el",
+ "variantname-sr": "sr",
+ "variantname-kk-kz": "kk-kz",
+ "variantname-kk-tr": "kk-tr",
+ "variantname-kk-cn": "kk-cn",
+ "variantname-kk-cyrl": "kk-cyrl",
+ "variantname-kk-latn": "kk-latn",
+ "variantname-kk-arab": "kk-arab",
+ "variantname-kk": "kk",
+ "variantname-ku-arab": "ku-Arab",
+ "variantname-ku-latn": "ku-Latn",
+ "variantname-ku": "ku",
+ "variantname-tg-cyrl": "tg-Cyrl",
+ "variantname-tg-latn": "tg-Latn",
+ "variantname-tg": "tg",
+ "variantname-ike-cans": "ike-Cans",
+ "variantname-ike-latn": "ike-Latn",
+ "variantname-iu": "iu",
+ "variantname-shi-tfng": "shi-Tfng",
+ "variantname-shi-latn": "shi-Latn",
+ "variantname-shi": "shi",
+ "variantname-uz": "uz",
+ "variantname-uz-latn": "uz-Latn",
+ "variantname-uz-cyrl": "uz-Cyrl",
+ "variantname-crh": "crh",
+ "variantname-crh-latn": "crh-Latn",
+ "variantname-crh-cyrl": "crh-Cyrl",
"metadata": "Метаданные",
"metadata-help": "Файл содержит дополнительные данные, обычно добавляемые цифровыми камерами или сканерами. Если файл после создания редактировался, то некоторые параметры могут не соответствовать текущему изображению.",
"metadata-expand": "Показать дополнительные данные",
"metadata-collapse": "Скрыть дополнительные данные",
"metadata-fields": "Поля метаданных изображения, перечисленные в этом списке, будут показаны на странице изображения при свёрнутой таблице метаданных. Остальные поля будут по умолчанию скрыты.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+ "metadata-langitem": "<strong>$2:</strong> $1",
+ "metadata-langitem-default": "$1",
"exif-imagewidth": "Ширина",
"exif-imagelength": "Высота",
"exif-bitspersample": "Глубина цвета",
"exif-exposuretime": "Время экспозиции",
"exif-exposuretime-format": "$1 с ($2)",
"exif-fnumber": "Число диафрагмы",
+ "exif-fnumber-format": "f/$1",
"exif-exposureprogram": "Программа экспозиции",
"exif-spectralsensitivity": "Спектральная чувствительность",
"exif-isospeedratings": "Светочувствительность ISO",
"exif-gpsareainformation": "Название области GPS",
"exif-gpsdatestamp": "Дата",
"exif-gpsdifferential": "Дифференциальная поправка",
+ "exif-coordinate-format": "$1° $2′ $3″ $4",
"exif-jpegfilecomment": "Примечание JPEG-файла",
"exif-keywords": "Ключевые слова",
"exif-worldregioncreated": "Регион мира, где была сделана фотография",
"exif-personinimage": "Изображённый человек",
"exif-originalimageheight": "Высота изображения до кадрирования",
"exif-originalimagewidth": "Ширина изображения до кадрирования",
+ "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+ "exif-subjectnewscode-value": "$2 ($1)",
"exif-compression-1": "Несжатый",
"exif-compression-2": "CCITT Group 3, 1-мерная модификация кодирования длин серий Хаффмана",
"exif-compression-3": "CCITT Group 3, факсовое кодирование",
"exif-compression-5": "LZW",
"exif-compression-6": "JPEG (старый)",
"exif-compression-7": "JPEG",
+ "exif-compression-8": "Deflate (Adobe)",
+ "exif-compression-32773": "PackBits (Macintosh RLE)",
+ "exif-compression-32946": "Deflate (PKZIP)",
+ "exif-compression-34712": "JPEG2000",
"exif-copyrighted-true": "Охраняется авторским правом",
"exif-copyrighted-false": "Авторско-правовой статус не задан",
"exif-photometricinterpretation-0": "Чёрный и белый (белый — 0)",
"exif-photometricinterpretation-1": "Чёрный и белый (чёрный — 0)",
+ "exif-photometricinterpretation-2": "RGB",
+ "exif-photometricinterpretation-3": "Palette",
"exif-photometricinterpretation-4": "Маска прозрачности",
"exif-photometricinterpretation-5": "Разделены (вероятно CMYK)",
+ "exif-photometricinterpretation-6": "YCbCr",
+ "exif-photometricinterpretation-8": "CIE L*a*b*",
+ "exif-photometricinterpretation-9": "CIE L*a*b* (ICC encoding)",
+ "exif-photometricinterpretation-10": "CIE L*a*b* (ITU encoding)",
+ "exif-photometricinterpretation-32803": "Color Filter Array",
+ "exif-photometricinterpretation-34892": "Linear raw",
"exif-unknowndate": "Неизвестная дата",
"exif-orientation-1": "Нормальная",
"exif-orientation-2": "Отражено по горизонтали",
"exif-planarconfiguration-2": "формат «planar»",
"exif-xyresolution-i": "$1 точек на дюйм",
"exif-xyresolution-c": "$1 точек на сантиметр",
+ "exif-colorspace-1": "sRGB",
"exif-colorspace-65535": "Некалиброванное",
"exif-componentsconfiguration-0": "не существует",
+ "exif-componentsconfiguration-1": "Y",
+ "exif-componentsconfiguration-2": "Cb",
+ "exif-componentsconfiguration-3": "Cr",
+ "exif-componentsconfiguration-4": "R",
+ "exif-componentsconfiguration-5": "G",
+ "exif-componentsconfiguration-6": "B",
"exif-exposureprogram-0": "Неизвестно",
"exif-exposureprogram-1": "Ручной режим",
"exif-exposureprogram-2": "Программный режим (нормальный)",
"exif-lightsource-17": "Стандартный источник света типа A",
"exif-lightsource-18": "Стандартный источник света типа B",
"exif-lightsource-19": "Стандартный источник света типа C",
+ "exif-lightsource-20": "D55",
+ "exif-lightsource-21": "D65",
+ "exif-lightsource-22": "D75",
+ "exif-lightsource-23": "D50",
"exif-lightsource-24": "Студийная лампа стандарта ISO",
"exif-lightsource-255": "Другой источник света",
"exif-flash-fired-0": "Вспышка не срабатывала",
"exif-dc-type": "Тип медиафайла",
"exif-rating-rejected": "Отклонено",
"exif-isospeedratings-overflow": "Более 65535",
+ "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
"exif-iimcategory-ace": "Искусство, культура и развлечения",
"exif-iimcategory-clj": "Преступность и закон",
"exif-iimcategory-dis": "Катастрофы и аварии",
"confirm-unwatch-top": "Удалить эту страницу из вашего списка наблюдения?",
"confirm-rollback-button": "ОК",
"confirm-rollback-top": "Откатить правки на этой странице?",
+ "semicolon-separator": "; ",
+ "comma-separator": ", ",
+ "colon-separator": ": ",
"pipe-separator": " | ",
"word-separator": " ",
"ellipsis": "…",
+ "percent": "$1%",
"parentheses": "($1)",
+ "brackets": "[$1]",
"quotation-marks": "«$1»",
"imgmultipageprev": "← предыдущая страница",
"imgmultipagenext": "следующая страница →",
"imgmultigo": "Перейти!",
"imgmultigoto": "Перейти на страницу $1",
+ "img-lang-opt": "$2 ($1)",
"img-lang-default": "(язык по умолчанию)",
"img-lang-info": "Показать это изображение на языке $1 $2",
"img-lang-go": "Применить",
"size-zetabytes": "$1 ЗБ",
"size-yottabytes": "$1 ИБ",
"size-pixel": "$1 {{PLURAL:$1|пиксель|пикселя|пикселей}}",
+ "size-kilopixel": "$1 KP",
+ "size-megapixel": "$1 MP",
+ "size-gigapixel": "$1 GP",
+ "size-terapixel": "$1 TP",
+ "size-petapixel": "$1 PP",
+ "size-exapixel": "$1 EP",
+ "size-zetapixel": "$1 ZP",
+ "size-yottapixel": "$1 YP",
"bitrate-bits": "$1 б/с",
"bitrate-kilobits": "$1 Кб/с",
"bitrate-megabits": "$1 Мб/с",
"limitreport-expansiondepth-value": "$1/$2",
"limitreport-expensivefunctioncount": "Количество «дорогих» функций анализатора",
"limitreport-expensivefunctioncount-value": "$1/$2",
+ "limitreport-unstrip-depth": "Глубинная рекурсия Unstrip",
+ "limitreport-unstrip-depth-value": "$1/$2",
+ "limitreport-unstrip-size": "После расширения размер Unstrip",
"limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|байт|байта|байт}}",
"expandtemplates": "Развёртка шаблонов",
"expand_templates_intro": "Эта служебная страница преобразует текст, рекурсивно разворачивая все шаблоны в нём.\nТакже развёртке подвергаются функции парсера\n<code><nowiki>{{#language:…}}</nowiki></code> и переменные вида\n<code><nowiki>{{CURRENTDAY}}</nowiki></code> — в общем, всё внутри двойных фигурных скобок.",
"mediastatistics-header-text": "Текстовые",
"mediastatistics-header-executable": "Исполняемые",
"mediastatistics-header-archive": "Сжатые форматы",
+ "mediastatistics-header-3d": "3D",
"mediastatistics-header-total": "Все файлы",
"json-warn-trailing-comma": "$1 {{PLURAL:$1|лишняя запятая в конце была удалена|лишние запятые в конце были удалены|лишних запятых в конце были удалены}} из JSON",
"json-error-unknown": "Имеется проблема с JSON. Ошибка: $1",
"tog-watchuploads": "Додај датотеке које отпремим у мој списак надгледања",
"tog-watchrollback": "Додај странице на којима сам вратио измене у мој списак надгледања",
"tog-minordefault": "Означавај све измене као мање",
- "tog-previewontop": "Ð\9fÑ\80икажи пÑ\80еÑ\82пÑ\80еглед изнад оквира за уређивање",
+ "tog-previewontop": "Ð\9fÑ\80икажи пÑ\80еÑ\82пÑ\80еглед пÑ\80е оквира за уређивање",
"tog-previewonfirst": "Прикажи претпреглед при првој измени",
"tog-enotifwatchlistpages": "Пошаљи ми имејл када се промени страница или датотека са мог списка надгледања",
"tog-enotifusertalkpages": "Пошаљи ми имејл кад се промени моја страница за разговор",
"july-date": "$1. јул",
"august-date": "$1. август",
"september-date": "$1. септембар",
- "october-date": "$1. окотобар",
+ "october-date": "$1. октобар",
"november-date": "$1. новембар",
"december-date": "$1. децембар",
"period-am": "преподне",
"index-category": "Пописане странице",
"noindex-category": "Непописане странице",
"broken-file-category": "Странице с неисправним везама до датотека",
+ "categoryviewer-pagedlinks": "$1 ($2)",
+ "category-header-numerals": "$1–$2",
"about": "О нама",
"article": "Чланак",
"newwindow": "(отвара се у новом прозору)",
"welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].",
"yourname": "Корисничко име:",
"userlogin-yourname": "Корисничко име",
- "userlogin-yourname-ph": "Унесите ваше корисничко име",
+ "userlogin-yourname-ph": "Унесите своје корисничко име",
"createacct-another-username-ph": "Унесите корисничко име",
"yourpassword": "Лозинка:",
"userlogin-yourpassword": "Лозинка",
- "userlogin-yourpassword-ph": "Унесите вашу лозинку",
+ "userlogin-yourpassword-ph": "Унесите своју лозинку",
"createacct-yourpassword-ph": "Унесите лозинку",
"yourpasswordagain": "Поново унеси лозинку:",
"createacct-yourpasswordagain": "Потврди лозинку",
"viewpagelogs": "Дневници ове странице",
"nohistory": "Не постоји историја измена ове странице.",
"currentrev": "Тренутна измена",
- "currentrev-asof": "ТÑ\80енÑ\83Ñ\82на измена од $2 у $3",
+ "currentrev-asof": "Ð\9fоÑ\81ледÑ\9aа веÑ\80зиÑ\98а на даÑ\82Ñ\83м $2 у $3",
"revisionasof": "Измена од $2 у $3",
"revision-info": "Измена од $1 коју је {{GENDER:$6|уредио $2|уредила $2}}$7",
"previousrevision": "← Старија измена",
"recentchanges-label-unpatrolled": "Непатролирана измена",
"recentchanges-label-plusminus": "Промена величине странице у бајтовима",
"recentchanges-legend-heading": "<strong>Легенда:</strong>",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
+ "recentchanges-legend-newpage": "[[w:sr:Посебно:НовеСтране|<u>Н</u>ова страница]]",
"recentchanges-submit": "Прикажи",
"rcfilters-tag-remove": "Уклоните филтер „$1”",
- "rcfilters-legend-heading": "<strong>Списак скраћеница:</strong>",
+ "rcfilters-legend-heading": "\n<strong>Списак скраћеница ([[w:sr:Помоћ:Надгледање страница|помоћ]]):</strong>",
"rcfilters-other-review-tools": "Остале алатке за преглед",
"rcfilters-group-results-by-page": "Групиши резултате по страницама",
"rcfilters-activefilters": "Активни филтери",
"rcfilters-advancedfilters": "Напредни филтери",
- "rcfilters-limit-title": "Ð\98змена за приказ",
+ "rcfilters-limit-title": "Ð\91Ñ\80оÑ\98 измена за приказ",
"rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измене|измена}}, $2",
"rcfilters-date-popup-title": "Временски период",
"rcfilters-days-title": "Скорашњи дани",
- "rcfilters-hours-title": "СкоÑ\80аÑ\88Ñ\9aе сати",
+ "rcfilters-hours-title": "СкоÑ\80аÑ\88Ñ\9aи сати",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}",
"rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}",
"rcfilters-highlighted-filters-list": "Истакнуто: $1",
"rcfilters-liveupdates-button": "Ажурирај уживо",
"rcfilters-liveupdates-button-title-on": "Искључите ажурирања уживо",
"rcfilters-liveupdates-button-title-off": "Прикажи нове измене уживо",
- "rcfilters-watchlist-markseen-button": "Ð\9eзнаÑ\87и Ñ\81ве измене као виÑ\92ене",
+ "rcfilters-watchlist-markseen-button": "Ð\9eзнаÑ\87и Ñ\81ве измене као погледане",
"rcfilters-watchlist-edit-watchlist-button": "Промените Ваш списак надгледаних страница",
"rcfilters-watchlist-showupdated": "Измене на страницама које нисте посетили од када је измена извршена су <strong>подебљане</strong>, са испуњеним ознакама.",
"rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена",
"apisandbox-alert-field": "Вредност овог поља је неисправна.",
"apisandbox-continue": "Настави",
"apisandbox-continue-clear": "Очисти",
+ "apisandbox-param-limit": "Унесите <kbd>max</kbd> да би сте користили највеће ограничење.",
"apisandbox-multivalue-all-namespaces": "$1 (сви именски простори)",
"apisandbox-multivalue-all-values": "$1 (све вредности)",
"booksources": "Штампани извори",
"thumbnail-more": "Повећај",
"filemissing": "Недостаје датотека",
"thumbnail_error": "Грешка при стварању минијатуре: $1",
+ "thumbnail_error_remote": "Порука о грешци из $1:\n$2",
"djvu_page_error": "DjVu страница је недоступна",
"djvu_no_xml": "Не могу да преузмем XML за DjVu датотеку.",
"thumbnail-temp-create": "Не могу да направим привремену датотеку минијатуре",
"thumbnail-dest-create": "Не могу да сачувам минијатуру у одредишту",
"thumbnail_invalid_params": "Неисправни параметри за минијатуру",
+ "thumbnail_toobigimagearea": "Датотека са величинама већим од $1",
"thumbnail_dest_directory": "Не могу да направим одредишну фасциклу",
"thumbnail_image-type": "Врста слике није подржана",
"thumbnail_gd-library": "Недовршена подешавања графичке библиотеке: недостаје функција $1",
+ "thumbnail_image-size-zero": "Изгледа да је величина датотеке нула.",
"thumbnail_image-missing": "Датотека недостаје: $1",
+ "thumbnail_image-failure-limit": "Било је превише скорашњих неуспешних покушаја ($1 или више) рендеровања ове минијатуре. Покушајте поново касније.",
"import": "Увоз страница",
"importinterwiki": "Увоз са другог викија",
"import-interwiki-text": "Изаберите вики и наслов странице за увоз.\nДатуми и имена уредника ће бити сачувани.\nСве радње при увозу с других викија су забележене у [[Special:Log/import|дневнику увоза]].",
"tooltip-minoredit": "Означите ову измену као мању",
"tooltip-save": "Сачувајте своје измене",
"tooltip-publish": "Објавите Ваше измене",
- "tooltip-preview": "Прегледајте Ваше измене. Користите ово дугме пре чувања.",
+ "tooltip-preview": "Прегледајте своје измене. Користите ово дугме пре чувања.",
"tooltip-diff": "Погледајте које измене сте направили на тексту",
"tooltip-compareselectedversions": "Погледаjте разлике између две изабране измене ове странице.",
- "tooltip-watch": "Додајте ову страницу на списак надгледања",
+ "tooltip-watch": "Ð\94одаÑ\98Ñ\82е овÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 на Ñ\81воÑ\98 Ñ\81пиÑ\81ак надгледаÑ\9aа",
"tooltip-watchlistedit-normal-submit": "Уклони наслове",
"tooltip-watchlistedit-raw-submit": "Ажурирај списак",
"tooltip-recreate": "Поново направите страницу иако је обрисана",
"pageinfo-visiting-watchers": "Број надгледача странице који су посетили скорашње измене",
"pageinfo-few-watchers": "Мање од $1 {{PLURAL:$1|пратиоца|пратиоца|пратилаца}}",
"pageinfo-redirects-name": "Број преусмерења на ову страницу",
+ "pageinfo-redirects-value": "$1",
"pageinfo-subpages-name": "Подстранице ове странице",
"pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|преусмерење|преусмерења|преусмерења}}; $3 {{PLURAL:$3|непреусмерење|непреусмерења|непреусмерења}})",
"pageinfo-firstuser": "Аутор странице",
"exif-compression-34712": "JPEG2000",
"exif-copyrighted-true": "Заштићено ауторским правом",
"exif-copyrighted-false": "Није дефинисан",
+ "exif-photometricinterpretation-0": "Црно-бело (бела је 0)",
"exif-photometricinterpretation-1": "Црно-бело (црна је 0)",
"exif-photometricinterpretation-2": "RGB",
+ "exif-photometricinterpretation-3": "Палета",
"exif-photometricinterpretation-6": "YCbCr",
"exif-unknowndate": "Непознат датум",
"exif-orientation-1": "Нормално",
"unit-pixel": "п",
"confirm-purge-title": "Освежи ову страницу",
"confirm_purge_button": "У реду",
- "confirm-purge-top": "Очистити привремену меморију ове стране?",
+ "confirm-purge-top": "Ð\9eÑ\87иÑ\81Ñ\82иÑ\82и пÑ\80ивÑ\80еменÑ\83 мемоÑ\80иÑ\98Ñ\83 ове Ñ\81Ñ\82Ñ\80аниÑ\86е?",
"confirm-purge-bottom": "Ова радња чисти привремену меморију и приказује најновију измену.",
"confirm-watch-button": "У реду",
"confirm-watch-top": "Додати ову страницу у списак надгледања?",
"version-license-title": "Лиценца за $1",
"version-license-not-found": "За ову екстензију није нађена информација о лиценци.",
"version-credits-title": "Заслуге за $1",
+ "version-credits-not-found": "За ову екстензију није нађена информација о заслугама.",
"version-poweredby-credits": "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
"version-poweredby-others": "остали",
"version-poweredby-translators": "translatewiki.net преводиоци",
"tags-delete-reason": "Разлог:",
"tags-delete-submit": "Неповратно обриши ову ознаку",
"tags-delete-not-found": "Ознака „$1“ не постоји.",
+ "tags-delete-no-permission": "Немате дозволу да бришете ознаке за измену.",
"tags-activate-title": "Активирање ознака",
"tags-activate-question": "Активирате ознаку „$1“.",
"tags-activate-reason": "Разлог:",
"tags-edit-chosen-no-results": "Одговарајуће ознаке нису пронађене",
"tags-edit-reason": "Разлог:",
"tags-edit-success": "Измене су примењене.",
+ "tags-edit-failure": "Не могу да применим измене:\n$1",
"tags-edit-nooldid-title": "Неисправна одредишна измена",
"tags-edit-none-selected": "Изаберите бар једну ознаку коју треба додати или уклонити.",
"comparepages": "Упоређивање страница",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
"limitreport-expansiondepth": "Највећа дубина проширења",
"limitreport-expensivefunctioncount": "Број „скупих” функција анализатора",
+ "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
"expandtemplates": "Замена шаблона",
"expand_templates_intro": "Ова посебна страница узима викитекст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је <code><nowiki>{{</nowiki>#language:…}}</code> и променљиве као што је <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nЗаправо практично све што се налази између витичастих заграда.",
"expand_templates_title": "Назив контекста; за {{СТРАНИЦА}} итд.:",
"right-pagelang": "мењање језика странице",
"action-pagelang": "промену језика странице",
"log-name-pagelang": "Дневник промене језика",
+ "log-description-pagelang": "Ово је дневник измена у језицима страница.",
"logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.",
"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (омогућена)",
"mediastatistics": "Статистика датотека",
"mediastatistics-header-executable": "Извршне",
"mediastatistics-header-archive": "Компресоване",
"mediastatistics-header-total": "Све датотеке",
+ "json-warn-trailing-comma": "$1 {{PLURAL:$1|пратећа тачка је уклоњена|пратеће тачке су уклоњене|пратећих тачки је уклоњено}} из JSON-a",
+ "json-error-unknown": "Догодио се проблем с JSON-ом. Грешка: $1",
+ "json-error-depth": "Прекорачена је највећа дубина",
+ "json-error-state-mismatch": "Невалидан или покварени JSON",
+ "json-error-ctrl-char": "Грешка контролног симбола, могуће је да је неисправно енкодиран",
"json-error-syntax": "Грешка у синтакси",
+ "json-error-unsupported-type": "Дата је вреднос врсте која се не може енкодирати",
"headline-anchor-title": "Веза до овог одељка",
"special-characters-group-latin": "Латиница",
"special-characters-group-latinextended": "Проширена латиница",
"date-range-from": "Од датума:",
"date-range-to": "До датума:",
"sessionprovider-generic": "$1 сесије",
+ "sessionprovider-mediawiki-session-cookiesessionprovider": "сесије са колачићима",
"randomrootpage": "Случајна коренска страница",
"log-action-filter-block": "Тип блокирања:",
"log-action-filter-contentmodel": "Тип промене модела садржаја:",
"log-action-filter-delete-event": "брисање уноса у дневницима",
"log-action-filter-delete-revision": "брисање измене",
"log-action-filter-import-interwiki": "Међувики увоз",
+ "log-action-filter-import-upload": "Увоз постављањем XML-а",
"log-action-filter-managetags-create": "нова ознака",
"log-action-filter-managetags-delete": "брисање ознаке",
"log-action-filter-managetags-activate": "активирање ознаке",
"authmanager-change-not-supported": "Не могу да променим пружене акредитиве јер их ништа не би користило.",
"authmanager-create-disabled": "Онемогућено прављење налога.",
"authmanager-create-from-login": "Попуните поља да бисте направили налог.",
+ "authmanager-create-not-in-progress": "Прављење налога није у току или су подаци о сесији изгубљени. Почните испочетка.",
"authmanager-create-no-primary": "Не могу да искористим пружене акредитиве за прављење налога.",
+ "authmanager-link-no-primary": "Не могу да искористим пружене акредитиве за спајање налога.",
+ "authmanager-link-not-in-progress": "Спајање налога није у току или је дошло до губитка података о сесији. Почните испочетка.",
"authmanager-authplugin-setpass-failed-title": "Неуспешна промена лозинке",
+ "authmanager-authplugin-setpass-failed-message": "Додатак за аутентификацију је одбио промену лозинке.",
+ "authmanager-authplugin-create-fail": "Додатак за аутентификацију је одбио прављење налога.",
+ "authmanager-authplugin-setpass-denied": "Додатак за аутентификацију не дозвољава мењање лозику.",
"authmanager-authplugin-setpass-bad-domain": "Неисправан домен.",
"authmanager-autocreate-noperm": "Аутоматско прављење налога није дозвољено.",
"authmanager-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
"may-date": "$1. maj",
"june-date": "$1. jun",
"july-date": "$1. jul",
- "august-date": "$1. august",
+ "august-date": "$1. avgust",
"september-date": "$1. septembar",
"october-date": "$1. oktobar",
"november-date": "$1. novembar",
"welcomecreation-msg": "Vaš nalog je otvoren.\nNe zaboravite da promenite svoja [[Special:Preferences|podešavanja]].",
"yourname": "Korisničko ime:",
"userlogin-yourname": "Korisničko ime",
- "userlogin-yourname-ph": "Unesite vaše korisničko ime",
+ "userlogin-yourname-ph": "Unesite svoje korisničko ime",
"createacct-another-username-ph": "Unesite korisničko ime",
"yourpassword": "Lozinka:",
"userlogin-yourpassword": "Lozinka",
- "userlogin-yourpassword-ph": "Unesite vašu lozinku",
+ "userlogin-yourpassword-ph": "Unesite svoju lozinku",
"createacct-yourpassword-ph": "Unesite lozinku",
"yourpasswordagain": "Potvrda lozinke:",
"createacct-yourpasswordagain": "Potvrdite lozinku",
"password-change-forbidden": "Ne možete da promenite lozinku na ovom vikiju.",
"externaldberror": "Došlo je do greške pri prepoznavanju baze podataka ili nemate ovlašćenja da ažurirate svoj spoljni nalog.",
"login": "Prijavi me",
+ "login-security": "Verifikacija vašeg identiteta",
"nav-login-createaccount": "Prijava/registracija",
"logout": "Odjava",
"userlogout": "Odjava",
"createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rada.",
"pt-login": "Prijavi me",
"pt-login-button": "Prijavi me",
+ "pt-login-continue-button": "Nastavi prijavljivanje",
"pt-createaccount": "Otvori nalog",
"pt-userlogout": "Odjavi me",
"php-mail-error-unknown": "Nepoznata greška u funkciji PHP mail().",
"newpassword": "Nova lozinka:",
"retypenew": "Potvrda lozinke:",
"resetpass_submit": "Postavi lozinku i prijavi me",
- "changepassword-success": "Vaša lozinka je uspešno promenjena.",
+ "changepassword-success": "Vaša lozinka je promenjena.",
"changepassword-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
"botpasswords": "Lozinke botova",
+ "botpasswords-label-appid": "Ime bota:",
+ "botpasswords-label-create": "Napravi",
+ "botpasswords-label-update": "Ažuriraj",
"botpasswords-label-cancel": "Otkaži",
"botpasswords-label-delete": "Obriši",
+ "botpasswords-label-grants-column": "Odobreno",
"resetpass_forbidden": "Lozinka ne može biti promenjena",
"resetpass-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici.",
"resetpass-submit-loggedin": "Promeni lozinku",
"viewpagelogs": "Pogledaj dnevnike ove stranice",
"nohistory": "Ne postoji istorija izmena ove stranice.",
"currentrev": "Tekuća izmena",
- "currentrev-asof": "Tekuća izmena od $2 u $3",
+ "currentrev-asof": "Poslednja verzija na datum $2 u $3",
"revisionasof": "Izmena od $2 u $3",
"revision-info": "Izmena od $1 koju je {{GENDER:$6|uredio $2|uredila $2}}$7",
"previousrevision": "← Starija izmena",
"rcfilters-other-review-tools": "Ostali alati za pregled:",
"rcfilters-activefilters": "Aktivni filteri",
"rcfilters-advancedfilters": "Napredni filteri",
- "rcfilters-limit-title": "Prikazati izmena",
+ "rcfilters-limit-title": "Broj izmena za prikaz",
+ "rcfilters-hours-title": "Skorašnji sati",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|dana|dana}}",
"rcfilters-days-show-hours": "$1 {{PLURAL:$1|sat|sata}}",
"rcfilters-quickfilters-placeholder-description": "Da biste sačuvali svoja podešavanja filtera i upotrebljavali ih kasnije, kliknite na ikonu za oznaku u području aktivnih filtera, ispod.",
"recreate": "Ponovo napravi",
"unit-pixel": "px",
"confirm_purge_button": "U redu",
- "confirm-purge-top": "Očistiti privremenu memoriju ove strane?",
+ "confirm-purge-top": "Očistiti privremenu memoriju ove stranice?",
"confirm-purge-bottom": "Ova radnja čisti privremenu memoriju i prikazuje najnoviju izmenu.",
"confirm-watch-button": "U redu",
"confirm-watch-top": "Dodati ovu stranicu u spisak nadgledanja?",
"hr_tip": "Horisontell linje (använd sparsamt)",
"summary": "Sammanfattning:",
"subject": "Ämne:",
- "minoredit": "Mindre ändring",
+ "minoredit": "Detta är en mindre ändring",
"watchthis": "Bevaka denna sida",
"savearticle": "Spara sidan",
"savechanges": "Spara ändringar",
"recentchangesdays-max": "Maximalt $1 {{PLURAL:$1|dygn}}",
"recentchangescount": "Antal redigeringar som visas i senaste ändringar, sidhistoriker och loggar som standard:",
"prefs-help-recentchangescount": "Maximalt antal: 1 000",
- "prefs-help-watchlist-token2": "Detta är den hemliga nyckeln till webbflödet i din bevakningslista.\nNågon som vet den kommer att kunna läsa din bevakningslista, så dela inte ut den.\nOm du behöver [[Special:ResetTokens|kan du återställa den]].",
+ "prefs-help-watchlist-token2": "Detta är den hemliga nyckeln till webbflödet i din bevakningslista.\nAlla som har den kommer att kunna läsa din bevakningslista, så dela inte ut den.\nOm du behöver [[Special:ResetTokens|kan du återställa den]].",
"savedprefs": "Dina inställningar har sparats",
"savedrights": "Användargrupperna för {{GENDER:$1|$1}} har sparats.",
"timezonelegend": "Tidszon:",
"talkpagelinktext": "คุย",
"specialpage": "หน้าพิเศษ",
"personaltools": "เครื่องมือส่วนตัว",
- "talk": "à¸\84ุย",
+ "talk": "à¸à¸ ิà¸\9bราย",
"views": "ดู",
"toolbox": "เครื่องมือ",
"tool-link-userrights": "เปลี่ยนกลุ่ม{{GENDER:$1|ผู้ใช้}}",
"blanknamespace": "(หลัก)",
"contributions": "เรื่องที่{{GENDER:$1|ผู้ใช้}}นี้เขียน",
"contributions-title": "เรื่องที่เขียนโดย $1",
- "mycontris": "มีส่วนร่วม",
+ "mycontris": "à¹\80รืà¹\88à¸à¸\87à¸\97ีà¹\88มีสà¹\88วà¸\99รà¹\88วม",
"anoncontribs": "เรื่องที่เขียน",
"contribsub2": "สำหรับ {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "บัญชีผู้ใช้ \"$1\" ยังไม่ได้ลงทะเบียน",
"pageinfo-header-edits": "ประวัติการแก้ไข",
"pageinfo-header-restrictions": "การล็อกหน้า",
"pageinfo-header-properties": "คุณสมบัติหน้า",
- "pageinfo-display-title": "หัวà¹\80รืà¹\88à¸à¸\87à¸\82à¸à¸\87หà¸\99à¹\89าà¹\80มืà¹\88à¸à¹\81สà¸\94à¸\87à¸\9cล",
+ "pageinfo-display-title": "à¹\81สà¸\94à¸\87à¸\9cลà¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87",
"pageinfo-default-sort": "ค่าปริยายของคำหลักในการเรียงลำดับ",
"pageinfo-length": "ความยาวหน้า (ไบต์)",
"pageinfo-article-id": "เลขหน้า",
]
},
"tog-hideminor": "ⵙⵙⵏⵜⵍ ⵜⵉⵙⵏⴼⵉⵍⵉⵏ ⵜⵉⵎⵥⵥⴰⵏⵉⵏ ⵙⴳ ⵉⵙⵏⴼⵍⵏ ⵉⵏⴳⴳⵓⵔⴰ",
+ "tog-minordefault": "ⵕⵛⵎ ⵎⴰⵕⵕⴰ ⵉⵙⵏⴼⵍⵏ ⵎⵥⵥⵉⵢⵏⵉⵏ ⵙ ⵓⵡⵏⵓⵍ",
+ "tog-ccmeonemails": "ⴰⵣⵏ ⵉⵢⵉ ⴷ ⵜⵓⵏⵖⵉⵍⵉⵏ ⵏ ⵉⵎⴰⵢⵍⵏ ⵏⵏⴰ ⵓⵣⵏⵖ ⵉ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵢⴰⴹⵏ",
+ "tog-diffonly": "ⴰⴷ ⵓⵔ ⵜⵙⵙⴽⴷ ⵜⵓⵎⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ ⴷⴷⵓ ⵉⵎⵣⴰⵔⴰⵢⵏ",
+ "tog-showhiddencats": "ⵙⴽⵏ ⵜⴰⴳⴳⴰⵢⵉⵏ ⵉⵜⵜⵓⵃⴹⴰⵏ",
"sunday": "ⴰⵙⴰⵎⴰⵙ",
"monday": "ⴰⵢⵏⴰⵙ",
"tuesday": "ⴰⵙⵉⵏⴰⵙ",
"july-date": "$1 ⵢⵓⵍⵢⵓⵣ",
"august-date": "$1 ⵖⵓⵛⵜ",
"september-date": "$1 ⵛⵓⵜⴰⵏⴱⵉⵔ",
+ "october-date": "ⴽⵟⵓⴱⵔ $1",
"november-date": "$1 ⵏⵓⵡⴰⵏⴱⵉⵔ",
"december-date": "$1 ⴷⵓⵊⴰⵏⴱⵉⵔ",
"period-am": "ⴼⵡ",
"category_header": "Tasniwin g usmil \"$1\"",
"subcategories": "ⵉⴷⵓⵙⵎⵉⵍⵏ",
"category-media-header": "ⵎⵉⴷⵢⴰ ⴳ ⵓⵙⵎⵉⵍ \"$1\"",
+ "category-empty": "<em>ⵜⴰⴳⴳⴰⵢⵜ ⴰⴷ ⵓⵔ ⴷⵉⴳⵙ ⴰⵡⴷ ⴽⵔⴰ ⵏ ⵎⵉⴷⵢⴰ ⵏⵖ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵖⵉⵍⴰⴷ.</em>",
"hidden-categories": "{{PLURAL:$1|ⴰⵙⵎⵉⵍ ⵉⵎⵎⵏⵜⵍⵏ|ⵉⵙⵎⵉⵍⵏ ⵎⵎⵏⵜⵍⵏⵉⵏ}}",
+ "hidden-category-category": "ⵜⴰⴳⴳⴰⵢⵉⵏ ⵉⵜⵜⵓⵏⵜⴰⵍⵏ",
+ "category-subcat-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ ⵖⴰⵙ ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ.|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ {{PLURAL:$1|ⴰⴷⵓⵙⵎⵉⵍ ⴰⴷ |$1 ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ}}, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}",
+ "category-article-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⵢⵓⵎⴰ ⵖⴰⵙ ⵜⴰⵙⵏⴰ ⴰⴷ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⵍⵍⴰ|$1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵍⵍⴰⵏⵜ}} ⴳ ⵓⵙⵎⵉⵍ ⴰⴷ, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}",
"about": "ⵅⴼ",
"article": "ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵎⴰⵢⵜ",
"newwindow": "(ⴰⴷ ⵉⵏⵏⵓⵔⵥⵎ ⴳ ⵓⵙⴽⵙⵍ ⴰⵎⴰⵢⵏⵓ)",
"cancel": "ⵙⵔ",
"moredotdotdot": "ⵓⴳⴳⴰⵔ...",
+ "morenotlisted": "ⵓⵎⵓⵖ ⴰⴷ ⵉⵔⵡⴰⵙ ⵓⵔ ⵉⵙⵎⴷ.",
"mypage": "ⵜⴰⵙⵏⴰ",
"mytalk": "ⵎⵙⴳⴷⴰⵍ",
"anontalk": "ⵎⵙⴰⵡⴰⵍ",
"navigation": "ⴰⵙⵜⴰⵔⴰ",
"and": " ⴷ",
+ "faq": "FAQ",
"namespaces": "ⵜⵉⵔⵉⵡⵉⵏ ⵏ ⵉⵙⵎⴰⵡⵏ",
"variants": "ⵜⵉⵎⵣⴰⵔⴰⵢⵉⵏ",
"navigation-heading": "ⵓⵎⵓⵖ ⵏ ⵓⵙⵙⴰⵔⴰ",
"view": "ⵙⴽⵏ",
"view-foreign": "ⵙⴽⵏ ⴳ $1",
"edit": "ⵙⵏⴼⵍ",
+ "edit-local": "ⵙⵏⴼⵍ ⴰⴳⵍⴰⵎ ⴰⴷⵖⴰⵔⴰⵏ",
"create": "ⵙⵏⵓⵍⴼⵓ",
+ "create-local": "ⵔⵏⵓ ⴰⴳⵍⴰⵎ ⴰⴷⵖⴰⵔⴰⵏ",
"delete": "ⴽⴽⵙ",
+ "protect": "ⴼⵔⴳ",
"protect_change": "ⵙⵏⴼⵍ",
+ "unprotect": "ⵙⵏⴼⵍ ⴰⴼⵔⴰⴳ",
"newpage": "ⵜⴰⵙⵏⴰ ⵜⴰⵎⴰⵢⵏⵓⵜ",
"talkpagelinktext": "ⵎⵙⴰⵡⴰⵍ",
"specialpage": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵥⵍⵉⵏⵉⵏ",
"toolbox": "ⵉⵎⴰⵙⵙⵏ",
"imagepage": "ⵥⵕ ⵜⴰⵙⵏⴰ ⵏ ⵓⴼⴰⵢⵍⵓ",
"mediawikipage": "ⵥⵕ ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵣⵓⵏⵜ",
+ "templatepage": "ⵥⵔ ⵜⴰⵙⵏⴰ ⵏ ⵡⴰⵍⴱⵓⴹ",
"viewhelppage": "ⵥⵕ ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ",
+ "categorypage": "ⵥⵔ ⵜⴰⵙⵏⴰ ⵏ ⵜⴰⴳⴳⴰⵢⵜ",
+ "viewtalkpage": "ⵥⵔ ⴰⵎⵙⴳⴷⴰⵍ",
"otherlanguages": "ⵙ ⵜⵓⵜⵍⴰⵢⵉⵏ ⵢⴰⴹⵏⵉⵏ",
"redirectedfrom": "(ⵓⵖⵓⵍ ⵙⴳ $1)",
"redirectto": "ⵙⵏⵉⵍ ⵖⵔ:",
"jumpto": "ⵏⴹⵓ ⵖⵔ:",
"jumptonavigation": "ⴰⵙⵜⴰⵔⴰ",
"jumptosearch": "ⵔⵣⵓ",
+ "pool-errorunknown": "ⵜⴰⵣⴳⴰⵍⵜ ⵜⴰⵔⵓⵙⵙⵉⵏⵜ",
"aboutsite": "ⵖⴼ {{SITENAME}}",
"aboutpage": "Project:ⵅⴼ",
"copyrightpage": "{{ns:project}}:ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵙⵏⵖⵍ",
"privacypage": "Project:ⵜⴰⵙⵔⵜⵉⵜ ⵏ ⵜⵉⵏⵏⵓⵜⵍⴰ",
"ok": "ⵡⴰⵅⵅⴰ",
"retrievedfrom": "ⵉⵜⵜⵓⵙⴰⵖⵓⵍ ⵙⴳ $1",
+ "youhavenewmessagesmanyusers": "ⴷⴰⵔⴽ $1 ⵙⴳ ⵎⵏⵏⴰⵡ ⵉⵎⵙⵙⵎⵔⵙⵏ ($2)",
"newmessageslinkplural": "{{PLURAL:$1|ⵜⵓⵣⵉⵏⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ|999=ⵜⵓⵣⵉⵏⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ}}",
"youhavenewmessagesmulti": "ⵍⵍⴰⵏ ⵖⵓⵔⴽ ⵜⵓⵣⵉⵏⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ ⴳ $1",
"editsection": "ⵙⵏⴼⵍ",
"confirmable-no": "ⵓⵀⵓ",
"viewdeleted": "ⵥⵕ $1?",
"site-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1",
+ "page-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1",
"red-link-title": "$1 (ⵜⴰⵙⵏⴰ ⵓⵔ ⵜⵍⵍⵉ)",
"nstab-main": "ⵜⴰⵙⵏⴰ",
"nstab-user": "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵎⵔⴰⵙ",
"mainpage-nstab": "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵓⴱⴳ",
"error": "ⵜⴰⵣⴳⵍⵜ",
"databaseerror-error": "ⵜⴰⵣⴳⵍⵜ: $1",
+ "badtitle": "ⴳⴰⵔ ⴰⵣⵡⵍ",
"viewsource": "ⵙⴽⵏ ⴰⵙⴰⴳⵎ",
"viewsource-title": "ⵥⵕ ⴰⵖⴱⴰⵍⵓ ⵉ $1",
+ "viewsourcetext": "ⵜⵣⵎⵔⴷ ⴰⴷ ⵜⵥⵔⴷ ⴷ ⴰⴷ ⵜⵙⵙⵏⵖⵍⴷ ⴰⵙⴰⴳⵎ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
"userlogin-yourname": "ⵉⵙⵎ ⵏ ⵓⵙⵎⵔⴰⵙ",
"userlogin-yourname-ph": "ⵙⵙⴽⵛⵎ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⵏⵎ/ⴽ",
"yourpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
"logout": "ⴼⴼⵖ",
"userlogout": "ⴼⴼⵖ",
"userlogin-noaccount": "ⵓⵔ ⵖⵓⵔⴽ ⵉⵍⵍⵉ ⵓⵎⵉⴹⴰⵏ?",
+ "userlogin-joinproject": "ⵍⴽⵎ {{SITENAME}}",
"createaccount": "ⵔⵥⵎ ⴽⵔⴰ ⵏ ⵓⵎⵉⴹⴰⵏ",
"userlogin-resetpassword-link": "ⵜⴻⵜⵜⵓⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⵎ/ⴽ?",
"createacct-emailoptional": "ⵉⵎⴰⵢⵍ (ⴰⵔⵓⵛⵛⵉⵍ)",
"minoredit": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
"watchthis": "ⵎⵎⴰⵜⵔ ⵜⴰⵙⵏⴰ ⴰⴷ",
"savearticle": "ⵃⴹⵓ ⵜⴰⵙⵏⴰ",
+ "showpreview": "ⵙⴽⵏ ⴰⴱⵔⵉⴼⵢⵓ",
"showdiff": "ⵙⵎⴰⵍ ⵉⵙⵏⴼⵍⵏ",
"loginreqlink": "ⴽⵛⵎ",
"newarticle": "(ⴰⵎⴰⵢⵏⵓ)",
"newarticletext": "ⵜⴹⴼⴰⵔⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵖⵔ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵓⵔ ⵜⴰ ⵉⵍⵍⵉⵏ. \nⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ, ⵙⵙⵏⵜⵉ ⵜⵉⵔⵔⴰ ⴳ ⵓⴼⵏⵉⵇ ⴳ ⵉⵣⴷⴷⴰⵔ (ⵥⵔ [$1 ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ] ⵉ ⵡⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ). \nⵎⴽ ⵜⵍⵍⵉⴷ ⴷⴰ ⵙ ⵓⵣⴳⴰⵍ, ⴰⴽⵍ ⵖⴼ <strong>ⴰⵖⵓⵍ</strong> ⴳ ⵓⵙⴰⵔⴰ ⵏⵏⴽ.",
+ "noarticletext": "ⵓⵔ ⵉⵍⵍⵉ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵙ ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ ⵖⵉⵍⴰ. \nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ logs ⵖⵔⵙ ⵉⵇⵇⵏⴻⵏ],\nⵏⵖ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ]</span>.",
+ "userpage-userdoesnotexist-view": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵎⵙⵙⵎⵔⵙ $1 ⵓⵔ ⵉⵜⵜⵓⵣⵎⵎⴻⵎ.",
"continue-editing": "ⴷⴷⵓ ⵙ ⴰⵏⵙⴰ ⵏ ⵓⵙⵏⴼⵍ",
"editing": "ⴰⵙⵏⴼⵍ ⵏ $1",
"creating": "ⴰⵙⵏⵓⵍⴼⵓ ⵏ $1",
"editingsection": "ⵙⵏⴼⵍ ⴰⴳⵣⵣⵓⵎ $1",
"templatesused": "{{PLURAL:$1|ⵜⴰⵙⴽⴽⴰ|ⵜⴰⵙⴽⴽⵉⵡⵉⵏ}} {{PLURAL:$1|ⵉⵜⵜⵓⵙⵎⵔⵙⵏ|ⵜⵜⵓⵙⵎⵔⵙⵏⵉⵏ}} ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ:",
"template-protected": "(ⵉⵜⵜⵢⴰⵔⴰⵢ)",
+ "template-semiprotected": "(ⵜⵎⵃⴹⴰ ⵙ ⵓⴳⵣⵎⴰⵏ)",
"hiddencategories": "ⵜⴰⵙⵏⴰ ⴰ ⴷ ⴰⴳⵎⴰⵎ ⵏ {{PLURAL:$1|1 ⵏⵜⵍ ⴰⵙⵎⵉⵍ|$1 ⵏⵜⵍ ⵉⵙⵎⵉⵍⵏ}}:",
"content-model-wikitext": "wikitext",
+ "currentrev-asof": "ⴰⵣⵣⵔⴰⵢ ⴰⵎⴳⴳⴰⵔⵓ ⴳ $1",
"revisionasof": "ⵜⵓⵏⵖⵉⵍⵜ ⵏ $1",
"previousrevision": "ⵜⵓⵏⵖⵉⵍⵜ ⵜⴰⵇⴱⵓⵔⵜ",
+ "nextrevision": "ⴰⵣⵣⵔⴰⵢ ⴰⵎⴰⵢⵏⵓ",
+ "currentrevisionlink": "ⴰⵣⵣⵔⴰⵢ ⴰⵎⴳⴳⴰⵔⵓ",
"cur": "ⵎⵔⵏ",
+ "last": "ⵓⵣⵡⵔ",
+ "history-fieldset-title": "ⵔⵣⵓ ⵖⴼ ⵉⵣⵣⵔⴰⵢⵏ",
"histfirst": "ⴰⵇⴱⵓⵔ",
"histlast": "ⴰⵎⴰⵢⵏⵓ",
+ "history-feed-title": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵣⵣⵔⴰⵢ",
+ "history-feed-description": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵣⵣⵔⴰⵢ ⵉ ⵜⴰⵙⵏⴰ ⴰⴷ ⴳ ⵡⵉⴽⵉ",
"history-feed-item-nocomment": "$1 ⵖⵔ $2",
"revdelete-show-file-submit": "ⵢⴰⵀ",
"revdelete-log": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
"mergehistory-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
+ "history-title": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵣⵣⵔⴰⵢ ⵏ \"$1\"",
+ "difference-title": "ⴰⵎⵣⴰⵔⴰⵢ ⴳⵔ ⵉⵣⵣⵔⴰⵢⵏ ⵏ $1",
"lineno": "ⵉⵣⵔⵉⵔⵉ $1:",
+ "compareselectedversions": "ⵙⵎⵣⴰⵣⴰⵍ ⵉⵣⵣⵔⴰⵢⵏ ⵉⵜⵜⵓⵙⵜⴰⵢⵏ",
"editundo": "ⵙⵔ",
"searchresults": "ⵜⵉⵢⴰⴼⵓⵜⵉⵏ ⵏ ⵓⵔⵣⵣⵓ",
"searchresults-title": "ⵜⵉⵢⴰⴼⵓⵜⵉⵏ ⵏ ⵓⵔⵣⵣⵓ ⵖⴼ \"$1\"",
+ "prevn": "{{PLURAL:$1|$1}} ⵉⵎⵣⵡⵓⵔⴰ",
"nextn": "{{PLURAL:$1|$1}} ⴰⵎⴹⴼⵉⵔ",
"shown-title": "ⵙⵎⴰⵍ $1 {{PLURAL:$1|ⵜⵢⴰⴼⵓⵜ|ⵜⵢⴰⴼⵓⵜⵉⵏ}} ⵉ ⵜⴰⵙⵏⴰ",
"viewprevnext": "ⵥⵕ ($1 {{int:pipe-separator}} $2) ($3)",
"search-suggest": "ⵉⵙ ⵜⵅⵙⴷ ⴰⴷ ⵜⵉⵏⵉⴷ: $1",
"search-interwiki-more": "(ⵓⴳⴳⴰⵔ)",
"searchall": "ⴰⴽⴽ",
+ "search-nonefound": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⵢⴰⴼⵓⵜⵉⵏ ⵉⵎⵙⴰⵙⴰⵏ ⴷ ⵓⵙⵓⵜⵔ.",
"mypreferences": "ⵉⵙⵎⵏⵢⵉⴼⵏ",
"prefs-files": "ⵉⴼⴰⵢⵍⵓⵜⵏ",
"youremail": "ⵉⵎⴰⵢⵍ:",
"recentchanges-label-newpage": "ⵉⵙⵏⴼⵍⵓⵍ ⵓⵙⵏⴼⵍ ⴰ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵜⴰⵎⴰⵢⵏⵓⵜ",
"recentchanges-label-minor": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
"recentchanges-label-bot": "ⴰⵙⵏⴼⵍ ⴰⴷ ⵉⵜⵡⴰⵙⴽⴰⵔ ⵙ ⵓⴱⵓⵜ",
+ "recentchanges-label-plusminus": "ⵜⴰⵙⵎⴽⵜⴰ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⵙⵙⵏⴼⵍ ⵙ ⵓⵎⴹⴰⵏ ⴰⴷ ⵏ ⵉⴱⴰⵢⵜⵏ",
+ "recentchanges-legend-heading": "<strong>ⴰⵙⵙⴼⵔⵓ:</strong>",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ⵥⵔ ⴰⵍⵜⵓ [[Special:NewPages|ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ]])",
"rclistfrom": "ⵙⴽⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ ⵙⴳ $2,$3",
"rcshowhideminor": "$1 ⵉⵙⵏⴼⴰⵍ ⵓⵎⵥⵉⵢⵏ",
"rcshowhideminor-show": "ⵙⴽⵏ",
"rcshowhidebots": "$1 {{PLURAL:$1|ⴱⵓⵜ|ⵉⴷ ⴱⵓⵜ}}",
"rcshowhidebots-show": "ⵙⵎⴰⵍ",
"rcshowhidebots-hide": "ⵙⵙⵏⵜⵍ",
+ "rcshowhideliu": "$1 ⵉⵎⵙⵙⵎⵔⵙⵏ ⵉⵜⵜⵓⵣⵎⴻⵎⵏ",
"rcshowhideliu-show": "ⵙⴽⵏ",
"rcshowhideliu-hide": "ⵙⵙⵏⵜⵍ",
"rcshowhideanons": "$1 ⵉⵏⵙⵙⵎⵔⵙⵏ ⵉⵔⵓⵙⵙⵉⵏⵏ",
"filehist-comment": "ⴰⵖⴼⴰⵡⴰⵍ",
"imagelinks": "ⴰⵙⵎⵔⵙ ⵏ ⵓⴼⴰⵢⵍⵓ",
"linkstoimage": "{{PLURAL:$1|ⵉⵣⴷⴰⵢⵏ ⵏ ⵜⵙⵏⴰ|$1 ⴰⵣⴷⴰⵢ ⵏ ⵜⵙⵏⴰ}} ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⴰⴷ:",
+ "nolinkstoimage": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⴰ.",
"sharedupload-desc-here": "ⴰⵙⴷⴰⵡ ⴰⴷ ⵙⴳ $1 ⵉⵥⴹⴰⵔ ⴰ ⵉⵜⵜⵡⴰⵙⵎⵔⵙ ⴳ ⵉⵙⵏⵜⴰⵢⵏ ⵢⴰⴹⵏ.\nⴰⵙⵏⵓⵎⵎⵍ ⵏⵙ ⴳ [$2 ⵜⴰⵙⵏⴰ ⵏⵙ ⵏ ⵓⵙⵏⵓⵎⵎⵍ] ⵜⵡⴰⵙⵎⴰⵍ ⵙⴰⴷⵓ.",
"filepage-nofile": "ⵓⵔ ⵓⴼⴰⵢⵍⵓ ⵙ ⵢⵉⵙⵎ ⴰ.",
"filerevert-comment": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
"changecontentmodel-reason-label": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
"protectedarticle": "ⵉⵎⵃⴹⵉ \"[[$1]]\"",
"protectcomment": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
+ "protect-default": "ⴰⵊⵊ ⵉⵎⵙⵙⵎⵔⵙⵏ ⴰⴽⴽⵯ",
"restriction-edit": "ⵙⵏⴼⵍ",
"restriction-move": "ⵙⵎⵓⵜⵜⵉ",
"undeletecomment": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
"undelete-show-file-submit": "ⵢⴰⵀ",
"namespace": "ⵜⵉⵔⵉⵡⵉⵏ ⵏ ⵉⵙⵎⴰⵡⵏ:",
"invert": "ⵙⵏⵅⴰⵍⴼ ⴰⵙⵜⵉ",
+ "tooltip-invert": "ⵙⵎⴰⵜⵔ ⵜⴰⴼⵏⵉⵇⵜ ⴰⴷ ⵃⵎⴰ ⴰⴷ ⵏⵜⵍⵏ ⵉⵙⵏⴼⵍⵏ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵍⵍⴰⵏ ⴳ ⵜⵔⵉⵡⵜ ⵏ ⵉⵙⵎ ⵏⵏⴰ ⵜⵙⵜⵉⴷ (ⴷ ⵜⵔⵉⵡⵜ ⵏ ⵉⵙⵎ ⴷⵉⴳⵙ ⵉⵣⴷⵉⵏ ⵉⴳ ⵜⵡⴰⵙⵜⴰⵢ)",
+ "namespace_association": "ⵜⵉⵔⵉⵡⵜ ⵏ ⵢⵉⵙ ⵎⵉⵣⴷⵉⵏ",
+ "tooltip-namespace_association": "ⵙⵎⴰⵜⵔ ⵜⴰⴼⵏⵉⵇⵜ ⴰⴷ ⵃⵎⴰ ⴰⴷ ⵜⵙⵎⵓⵏⴷ ⴰⵍⵜⵓ ⵜⵉⵔⵉⵡⵜ ⵏ ⵉⵙⵎ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵏⵖ ⵜⵉⵏ ⵜⵖⴰⵡⵙⴰ ⵉⵣⴷⵉⵏ ⴷ ⵜⵔⵉⵡⵜ ⵏ ⵉⵙⵎ ⵏⵏⴰ ⵜⵙⵜⵉⴷ",
"blanknamespace": "(ⴰⴷⵙⵍⴰⵏ)",
"contributions": "ⵜⵓⵎⵓⵜⵉⵏ ⵏ {{GENDER:$1|ⵓⵏⵙⵙⵎⵔⵙ}}",
+ "contributions-title": "ⵜⵓⵎⵓⵜⵉⵏ ⵏ ⵓⵎⵙⵙⵎⵔⵙ $1",
"mycontris": "ⵜⵓⵎⵓⵜⵉⵏ",
"anoncontribs": "ⵜⵓⵎⵓⵜⵉⵏ",
"contribsub2": "ⵉ {{GENDER:$3|$1}} ($2)",
+ "month": "ⵙⴳ ⵡⴰⵢⵢⵓⵔ (and earlier):",
+ "year": "ⵙⴳ ⵓⵙⴳⴳⵯⴰⵙ (and earlier):",
+ "sp-contributions-newbies": "ⵙⴽⵏ ⵜⵓⵎⵓⵜⵉⵏ ⵏ ⵉⵎⵉⴹⴰⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ ⴽⴰⵏ",
+ "sp-contributions-uploads": "ⵉⵙⴽⵜⴰⵔⵏ",
"sp-contributions-talk": "ⵎⵙⴰⵡⴰⵍ",
+ "sp-contributions-search": "ⵔⵣⵓ ⵖⴼ ⵜⵓⵎⵓⵜⵉⵏ",
+ "sp-contributions-newonly": "ⵙⴽⵏ ⵖⴰⵙ ⵉⵙⵏⵍⵏ ⵏⵏⴰ ⵉⴳⴰⵏ ⵉⵙⵏⵓⵍⴼⵓⵜⵏ ⵏ ⵜⴰⵙⵏⴰ",
"sp-contributions-submit": "ⵔⵣⵓ",
"whatlinkshere": "ⵎⴰ ⴰⵢⴷ ⵉⵇⵇⵏⵏ ⵙ ⴷⴰ",
"whatlinkshere-title": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ $1",
"whatlinkshere-hideimages": "$1 ⵉⵣⴷⴰⵢⵏ ⵖⵔ ⵓⴼⵉⵍⵢⵓ",
"whatlinkshere-filters": "ⵜⵉⵙⵜⵜⴰⵢⵉⵏ",
"ipbreason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
+ "ipboptions": "2 ⵏ ⵜⵙⵔⴰⴳⵉⵏ:2 ⵏ ⵜⵙⵔⴰⴳⵉⵏ,1 ⵏ ⵡⴰⵙⵙ:1 ⵏ ⵡⴰⵙⵙ,3 ⵏ ⵡⵓⵙⵙⴰⵏ:3 ⵏ ⵡⵓⵙⵙⴰⵏ,1 ⵏ ⵉⵎⴰⵍⴰⵙⵙ:1 ⵏ ⵉⵎⴰⵍⴰⵙⵙk,2 ⵏ ⵉⵎⴰⵍⴰⵙⵙⵏ:2 ⵏ ⵉⵎⴰⵍⴰⵙⵙⵏ,1 ⵏ ⵡⴰⵢⵢⵓⵔ:1 ⵏ ⵡⴰⵢⵢⵓⵔ,3 ⵏ ⵡⴰⵢⵢⵓⵔⵏ:3 ⵏ ⵡⴰⵢⵢⵓⵔⵏ,6 ⵏ ⵡⴰⵢⵢⵓⵔⵏ:6 ⵏ ⵡⴰⵢⵢⵓⵔⵏ,1 ⵏ ⵓⵙⴳⴳⴰⵙ:1 ⵏ ⵓⵙⴳⴳⴰⵙ,indefinite:infinite",
"blocklist-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ",
"blocklink": "ⴳⴷⵍ",
"contribslink": "ⵜⵓⵎⵓⵜⵉⵏ",
"tooltip-n-help": "The place to find out",
"tooltip-t-whatlinkshere": "ⵓⵎⵓⵖ ⵏ ⵎⴰⵕⵕ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵡⵉⴽⵉ ⵉⵣⴷⵉⵏ ⵉ ⴷⴰ",
"tooltip-t-recentchangeslinked": "ⵉⵙⵏⴼⵍⵏ ⵉⵏⴳⴳⵓⵔⴰ ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ ⵜⴰⵙⵏⴰ ⴰ",
+ "tooltip-feed-atom": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
"tooltip-t-contributions": "ⵢⴰⵜ ⵜⵍⴳⴰⵎⵜ ⵏ ⵜⵓⵎⵓⵜⵉⵏ ⵏ {{GENDER:$1|ⵓⵙⵎⵔⴰⵙ ⴰ}}",
"tooltip-t-emailuser": "ⴰⵣⵏ ⵢⴰⵏ ⵉⵎⴰⵢⵍ ⵉ {{GENDER:$1|ⴰⵏⵙⵙⵎⵔⵙ ⴰ|ⵜⴰⵏⵙⵙⵎⵔⵙⵜ ⴰ}}",
"tooltip-t-upload": "ⵙⴽⵜⵔ ⵉⴼⵓⵢⵍⴰ",
"tooltip-ca-nstab-special": "ⵜⴰⴷ ⵜⴳⴰ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵉⵣⵍⵉⵏ, ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⴰⴷ ⵜⴻⵜⵜⵓⵙⵏⴼⵍ",
"tooltip-ca-nstab-project": "ⵥⵕ ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵜⵉ",
"tooltip-ca-nstab-image": "ⵙⴽⵏ ⵜⴰⵙⵏⴰ ⵏ ⵓⴼⴰⵢⵍⵓ",
+ "tooltip-ca-nstab-mediawiki": "ⵥⵔ ⵜⵓⵣⵉⵏⵜ ⵏ ⵓⵏⴳⵔⴰⵡ",
"tooltip-ca-nstab-template": "ⵥⵔ ⵜⴰⵙⴽⴽⴰ",
"tooltip-ca-nstab-category": "ⵙⴽⵏ ⴰⵏⴰⵡ ⵏ ⵜⴰⵙⵏⴰ",
+ "tooltip-minoredit": "ⵕⵛⵎ ⵓⵢⴰ ⴰⵎ ⴰⵙⵏⴼⵍ ⵎⵥⵥⵉⵢⵏ",
"tooltip-save": "ⵃⴹⵓ ⵉⵙⵏⴼⴰⵍ ⵏⵏⴽ",
"tooltip-diff": "ⵙⴽⵏ ⵎⴰⵏ ⵉⵙⵏⴼⴰⵍ ⵜⴳⴳⵉⴷ ⵉ ⵓⴹⵔⵉⵙ",
"tooltip-watch": "ⵔⵏⵓ ⵜⴰⵙⵏⴰ ⴰ ⵉ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
"tooltip-rollback": "\"ⵔⴰⵔ\" ⵙⵙⵔ ⴰⵙⵏⴼⵍ ⵏⵖ ⵉⵙⵏⴼⴰⵍⵏ ⵏ ⵓⵎⴰⴷⵔⴰⵡ ⴰⵎⴳⴳⴰⵔⵓ ⴳ ⵜⴰⵙⵏⴰ ⴷ ⵙ ⵢⴰⵏ ⵓⴽⵍⵉⴽ",
+ "tooltip-summary": "ⴰⵔⴰ ⴽⵔⴰ ⵏ ⵓⵙⴳⵣⵍ ⵎⵥⵥⵉⵢⵏ",
+ "pageinfo-title": "ⵉⵏⵖⵎⵉⵙⵏ ⵖⴼ $1",
"pageinfo-header-edits": "ⵙⵏⴼⵍ ⴰⵎⵣⵔⵓⵢ",
+ "pageinfo-header-restrictions": "ⴰⴼⵔⴰⴳ ⵏ ⵜⴰⵙⵏⴰ",
"pageinfo-display-title": "ⵙⴽⵏ ⴰⵣⵡⵍ",
+ "pageinfo-article-id": "ID ⵏ ⵜⴰⵙⵏⴰ",
"pageinfo-language": "ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵜⵙⵏⴰ",
"pageinfo-watchers": "ⵓⵟⵟⵓⵏ ⵏ ⵉⵎⵥⵕⴰⵢⵏ ⵏ ⵜⴰⵙⵏⴰ",
+ "pageinfo-firstuser": "ⴰⵎⵙⵏⵓⵍⴼⵓ ⵏ ⵜⴰⵙⵏⴰ",
"pageinfo-firsttime": "ⴰⵙⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍⵓⵍ ⵏ ⵜⴰⵙⵏⴰ",
"pageinfo-lastuser": "ⴰⵎⵙⵏⴼⵍ ⴰⵎⴳⴳⴰⵔⵓ",
"pageinfo-lasttime": "ⴰⵙⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍ ⴰⵎⴳⴳⴰⵔⵓ",
"pageinfo-edits": "ⵎⴰⵕⵕⴰ ⵓⵟⵟⵓⵏ ⵏ ⵉⵙⵏⴼⴰⵍⵏ",
"pageinfo-hidden-categories": "ⵏⵜⵍ {{PLURAL:$1|ⴰⵙⵎⵉⵍ|ⵉⵙⵎⵉⵍⵏ}}($1)",
"pageinfo-toolboxlink": "ⴰⵏⵖⵎⵉⵙ ⵖⴼ ⵜⴰⵙⵏⴰ",
+ "pageinfo-contentpage": "ⵉⵜⵜⵓⵙⵉⴹⵏ ⴰⵎ ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵎⴰⵢⵜ",
"pageinfo-contentpage-yes": "ⵢⴰⵀ",
"pageinfo-protect-cascading-yes": "ⵢⴰⵀ",
"previousdiff": "ⴰⵙⵏⴼⵍ ⴰⵎⴳⴳⴰⵔⵓ",
"show-big-image-other": "{{PLURAL:$2|ⵜⴰⴼⵙⴰⵢⵜ|ⵜⵉⴼⵙⴰⵢⵉⵏ}}: ⵢⴰⴹⵏ $1.",
"show-big-image-size": "$1 × $2 ⵉⴷ ⴱⵉⴽⵙⵍ",
"metadata": "ⵎⵉⵜⴰⴷⴰⵜⴰ",
+ "metadata-help": "ⴰⵙⴷⴰⵡ ⴰ ⵢⵓⵎⴰ ⵉⵏⵖⵎⵉⵙⵏ ⵉⵎⵔⵏⴰⵏⵉⵏ, ⵉⵔⵡⴰⵙ ⵉⵙ ⴰⵙ ⵜⵜⵡⴰⵔⵏⵉⵏ ⵙ ⵍⴽⴰⵎⵉⵔⴰ ⵜⴰⵎⵓⵟⵟⵓⵏⵜ ⵏⵖ ⴰⵙⵏⴼⴰⵍ ⴰⵎⵓⵟⵟⵓⵏ ⵉⵜⵜⴰⵡⵙⵎⵔⵙⵏ ⴳ ⵓⵙⵏⴼⵍⵓⵍ ⵏ ⵓⵙⴷⴰⵡ ⴰ.\nⵉⵖ ⵉⵜⵜⵙⵏⴼⵍ ⵓⵙⴷⴰⵡ ⴰ ⵙⴳ ⵡⴰⴷⴷⴰⴷ ⵏⵙ ⴰⵎⵓⴷⴰⵏ, ⴽⵔⴰ ⵏ ⵉⴼⵔⵓⵔⵉⵜⵏ ⵓⵔ ⵔⴰⵏ ⵙⵓⵍ ⴳⵔⵏ ⴳ ⵓⵙⴷⴰⵡ ⵉⵜⵜⵙⵏⴼⵍⵏ.",
"metadata-fields": "ⵉⴳⵔⴰⵏ ⵏ ⵎⵉⵜⴰⵉⵙⴼⴽⴰ ⵏ ⵜⵉⵡⵍⴰⴼⵉⵏ ⵏⵏⴰ ⵉⴼⵙⵔⵏ ⴳ ⵜⴱⵔⴰⵜ ⴰⴷ ⵔⴰⴷ ⵉⵍⵉⵏ ⴳ ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵓⵎⵎⵍ ⵏ ⵜⴰⵡⵍⴰⴼⵜ ⴰⴽⵓⴷ ⵏⵏⴰ ⵉⵎⵓⵏ ⵓⵙⴽⵜⵓⵔ. ⵉⴳⵔⴰⵏ ⵢⴰⴹⵏ ⵔⴰⴷ ⴼⴼⵔⵏ ⵙ ⵓⵎⵕⴰⴹ.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"exif-orientation": "ⴰⵙⵡⴰⵍⴰ",
"exif-datetime": "ⴰⵙⴰⴽⵓⴷ ⴷ ⵡⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍ ⵏ ⵓⴼⴰⵢⵍⵓ",
+ "exif-colorspace": "ⵜⵉⵔⵉⵡⵜ ⵏ ⵓⴽⵍⵓ",
"exif-languagecode": "ⵜⵓⵜⵍⴰⵢⵜ",
"exif-dc-contributor": "ⵉⵏⴰⵎⵓⵜⵏ",
"exif-iimcategory-edu": "ⴰⵙⴳⵎⵉ",
"watchlisttools-clear": "ⵙⴼⴹ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
"watchlisttools-edit": "ⵥⵕ ⴷ ⵜⵙⵏⴼⵍⴷ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
"redirect-submit": "ⴷⴷⵓ",
+ "redirect-user": "ID ⵏ ⵓⵎⵙⵙⵎⵔⵙ",
+ "redirect-page": "ID ⵏ ⵜⴰⵙⵏⴰ",
+ "redirect-revision": "ⴰⵣⵣⵔⴰⵢ ⵏ ⵜⴰⵙⵏⴰ",
"redirect-file": "ⵉⵙⵎ ⵏ ⵓⴼⴰⵍⵢⵓ",
"specialpages": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵥⵍⵉⵏⵉⵏ",
"specialpages-group-pagetools": "ⵉⵎⴰⵙⵙⵏ ⵏ ⵜⴰⵙⵏⴰ",
"htmlform-yes": "ⵢⴰⵀ",
"logentry-delete-delete": "$1 {{GENDER:$2|ⵉⴽⴽⵙ|ⵜⴽⴽⵙ}} ⵜⴰⵙⵏⴰ $3",
"logentry-move-move": "$1 {{GENDER:$2|ⵉⵙⵎⵓⵜⵜⵉ|ⵜⵙⵎⵓⵜⵜⵉ}} ⵜⴰⵙⵏⴰ ⵙⴳ $3 ⵖⵔ $4",
+ "logentry-move-move-noredirect": "{{GENDER:$2|ⵉⵙⵎⵓⵜⵜⵉ}} $1 ⵜⴰⵙⵏⴰ $3 ⵖⵔ $4 ⵎⵉⵏ ⴰⴷ ⵉⴼⵍ redirect",
"logentry-newusers-create": "{{GENDER:$2|ⵉⵙⵏⴼⵍ ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵙⵏⴼⵍ ⵜⵏⵙⵙⵎⵔⵙⵜ}} $1 ⴰⵎⵉⴹⴰⵏ ⵏⵙ",
"logentry-upload-upload": "{{GENDER:$2|ⵉⵙⴽⵜⵔ|ⵜⵙⴽⵜⵔ}} $1 $3",
"feedback-thanks-title": "ⵜⴰⵏⵎⵎⵉⵔⵜ!",
"searchsuggest-search": "ⵔⵣⵓ ⴳ {{SITENAME}}",
+ "duration-days": "$1 ⵏ {{PLURAL:$1|ⵡⴰⵙⵙ|ⵡⵓⵙⵙⴰⵏ}}",
"expand_templates_ok": "ⵡⴰⵅⵅⴰ",
"pagelanguage": "ⵙⵏⴼⵍ ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ",
"pagelang-name": "ⵜⴰⵙⵏⴰ",
"createacct-another-continue-submit": "繼續帳號建立",
"createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
"createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
- "createacct-benefit-body2": "$1 頁",
- "createacct-benefit-body3": " 位最近的{{PLURAL:$1|貢獻者}}",
+ "createacct-benefit-body2": "{{PLURAL:$1|個頁面}}",
+ "createacct-benefit-body3": "位最近的{{PLURAL:$1|貢獻者}}",
"badretype": "兩次輸入的密碼並不相同。",
"usernameinprogress": "已正在進行此使用者名稱的帳號建立作業。\n請稍候。",
"userexists": "您所輸入的使用者名稱已存在,請另選一個名稱。",
* Do some sanity checking and basic setup
*/
public function setup() {
- global $IP, $wgCommandLineMode, $wgRequestTime;
+ global $IP, $wgCommandLineMode;
# Abort if called from a web server
# wfIsCLI() is not available yet
# But sometimes this doesn't seem to be the case.
ini_set( 'max_execution_time', 0 );
- $wgRequestTime = microtime( true );
-
# Define us as being in MediaWiki
define( 'MEDIAWIKI', true );
--- /dev/null
+--
+-- Adds a default value to the rev_text_id field in the revision table.
+-- This is to allow the Multi Content Revisions migration to happen where
+-- rows will have to be added to the revision table with no rev_text_id.
+--
+-- 2018-03-12
+--
+
+ALTER TABLE /*$wgDBprefix*/revision
+ ALTER COLUMN rev_text_id SET DEFAULT 0;
\ No newline at end of file
--- /dev/null
+--
+-- Replace slot_inherited with slot_origin.
+--
+-- NOTE: There is no release that has slot_inherited. This is only needed to transition between
+-- snapshot versions of 1.30.
+--
+-- NOTE: No code that writes to the slots table was merged yet, the table is assumed to be empty.
+--
+DROP INDEX /*i*/slot_role_inherited ON /*_*/slots;
+
+ALTER TABLE /*_*/slots
+ DROP COLUMN slot_inherited,
+ ADD COLUMN slot_origin bigint unsigned NOT NULL;
+
+CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
-- reference to content_id
slot_content_id bigint unsigned NOT NULL,
- -- whether the content is inherited (1) or new in this revision (0)
- slot_inherited tinyint unsigned NOT NULL DEFAULT 0,
+ -- The revision ID of the revision that originated the slot's content.
+ -- To find revisions that changed slots, look for slot_origin = slot_revision_id.
+ slot_origin bigint unsigned NOT NULL,
PRIMARY KEY ( slot_revision_id, slot_role_id )
) /*$wgDBTableOptions*/;
-- Index for finding revisions that modified a specific slot
-CREATE INDEX /*i*/slot_role_inherited ON /*_*/slots (slot_revision_id, slot_role_id, slot_inherited);
\ No newline at end of file
+CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
--- /dev/null
+--
+-- Adds a default value to the rev_text_id field in the revision table.
+-- This is to allow the Multi Content Revisions migration to happen where
+-- rows will have to be added to the revision table with no rev_text_id.
+--
+-- 2018-03-12
+--
+
+ALTER TABLE /*_*/revision
+ ADD CONSTRAINT DF_rev_text_id DEFAULT 0 FOR rev_text_id;
\ No newline at end of file
--- /dev/null
+--
+-- Replace slot_inherited with slot_origin.
+--
+-- NOTE: There is no release that has slot_inherited. This is only needed to transition between
+-- snapshot versions of 1.30.
+--
+-- NOTE: No code that writes to the slots table was merge yet, the table is assumed to be empty.
+--
+DROP INDEX /*i*/slot_role_inherited ON /*_*/slots;
+
+ALTER TABLE /*_*/slots DROP CONSTRAINT DF_slot_inherited, COLUMN slot_inherited;
+ALTER TABLE /*_*/slots ADD COLUMN slot_origin bigint NOT NULL;
+
+CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
-- reference to content_id
slot_content_id bigint unsigned NOT NULL CONSTRAINT FK_slots_content_id FOREIGN KEY REFERENCES content(content_id),
- -- whether the content is inherited (1) or new in this revision (0)
- slot_inherited tinyint unsigned NOT NULL CONSTRAINT DF_slot_inherited DEFAULT 0,
+ -- The revision ID of the revision that originated the slot's content.
+ -- To find revisions that changed slots, look for slot_origin = slot_revision_id.
+ slot_origin bigint unsigned NOT NULL,
CONSTRAINT PK_slots PRIMARY KEY (slot_revision_id, slot_role_id)
);
-- Index for finding revisions that modified a specific slot
-CREATE INDEX /*i*/slot_role_inherited ON /*_*/slots (slot_revision_id, slot_role_id, slot_inherited);
\ No newline at end of file
+CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
CREATE TABLE /*_*/revision (
rev_id INT NOT NULL UNIQUE IDENTITY(0,1),
rev_page INT NOT NULL REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
- rev_text_id INT NOT NULL, -- FK added later
+ rev_text_id INT NOT NULL CONSTRAINT DF_rev_text_id DEFAULT 0, -- FK added later
rev_comment NVARCHAR(255) NOT NULL CONSTRAINT DF_rev_comment DEFAULT '',
rev_user INT REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
rev_user_text NVARCHAR(255) NOT NULL DEFAULT '',
-- reference to content_id
slot_content_id bigint unsigned NOT NULL CONSTRAINT FK_slots_content_id FOREIGN KEY REFERENCES content(content_id),
- -- whether the content is inherited (1) or new in this revision (0)
- slot_inherited tinyint unsigned NOT NULL CONSTRAINT DF_slot_inherited DEFAULT 0,
+ -- The revision ID of the revision that originated the slot's content.
+ -- To find revisions that changed slots, look for slot_origin = slot_revision_id.
+ slot_origin bigint NOT NULL,
CONSTRAINT PK_slots PRIMARY KEY (slot_revision_id, slot_role_id)
);
-- Index for finding revisions that modified a specific slot
-CREATE INDEX /*i*/slot_role_inherited ON /*_*/slots (slot_revision_id, slot_role_id, slot_inherited);
+CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
--
-- The content table represents content objects. It's primary purpose is to provide the necessary
--- /dev/null
+--
+-- Replace slot_inherited with slot_origin.
+--
+-- NOTE: There is no release that has slot_inherited. This is only needed to transition between
+-- snapshot versions of 1.30.
+--
+-- NOTE: No code that writes to the slots table was merge yet, the table is assumed to be empty.
+--
+DROP INDEX &mw_prefix.slot_role_inherited;
+
+ALTER TABLE &mw_prefix.slots DROP COLUMN slot_inherited;
+ALTER TABLE &mw_prefix.slots ADD ( slot_origin NUMBER NOT NULL );
+
+CREATE INDEX &mw_prefix.slot_revision_origin_role ON &mw_prefix.slots (slot_revision_id, slot_origin, slot_role_id);
slot_revision_id NUMBER NOT NULL,
slot_role_id NUMBER NOT NULL,
slot_content_id NUMBER NOT NULL,
- slot_inherited CHAR(1) DEFAULT '0' NOT NULL
+ slot_origin NUMBER NOT NULL
);
ALTER TABLE &mw_prefix.slots ADD CONSTRAINT &mw_prefix.slots_pk PRIMARY KEY (slot_revision_id, slot_role_id);
-CREATE INDEX &mw_prefix.slot_role_inherited ON &mw_prefix.slots (slot_revision_id, slot_role_id, slot_inherited);
\ No newline at end of file
+CREATE INDEX &mw_prefix.slot_revision_origin_role ON &mw_prefix.slots (slot_revision_id, slot_origin, slot_role_id);
slot_revision_id NUMBER NOT NULL,
slot_role_id NUMBER NOT NULL,
slot_content_id NUMBER NOT NULL,
- slot_inherited CHAR(1) DEFAULT '0' NOT NULL
+ slot_origin NUMBER NOT NULL
);
ALTER TABLE &mw_prefix.slots ADD CONSTRAINT &mw_prefix.slots_pk PRIMARY KEY (slot_revision_id, slot_role_id);
-CREATE INDEX &mw_prefix.slot_role_inherited ON &mw_prefix.slots (slot_revision_id, slot_role_id, slot_inherited);
+CREATE INDEX &mw_prefix.slot_revision_origin_role ON &mw_prefix.slots (slot_revision_id, slot_origin, slot_role_id);
CREATE SEQUENCE content_content_id_seq;
slot_revision_id INTEGER NOT NULL,
slot_role_id SMALLINT NOT NULL,
slot_content_id INTEGER NOT NULL,
- slot_inherited SMALLINT NOT NULL DEFAULT 0,
+ slot_origin INTEGER NOT NULL,
PRIMARY KEY (slot_revision_id, slot_role_id)
);
-CREATE INDEX slot_role_inherited ON slots (slot_revision_id, slot_role_id, slot_inherited);
\ No newline at end of file
+CREATE INDEX slot_revision_origin_role ON slots (slot_revision_id, slot_origin, slot_role_id);
slot_revision_id INTEGER NOT NULL,
slot_role_id SMALLINT NOT NULL,
slot_content_id INTEGER NOT NULL,
- slot_inherited SMALLINT NOT NULL DEFAULT 0,
+ slot_origin INTEGER NOT NULL,
PRIMARY KEY (slot_revision_id, slot_role_id)
);
-CREATE INDEX slot_role_inherited ON slots (slot_revision_id, slot_role_id, slot_inherited);
+CREATE INDEX slot_revision_origin_role ON slots (slot_revision_id, slot_origin, slot_role_id);
CREATE SEQUENCE content_content_id_seq;
}
public function execute() {
- global $wgRequestTime;
-
if ( !$this->enabled ) {
$this->fatalError( "Nothing to do -- \$wgUseFileCache is disabled." );
}
$this->fatalError( "Nothing to do." );
}
- $_SERVER['HTTP_ACCEPT_ENCODING'] = 'bgzip'; // hack, no real client
+ // Mock request (hack, no real client)
+ $_SERVER['HTTP_ACCEPT_ENCODING'] = 'bgzip';
# Do remaining chunk
$end += $batchSize - 1;
}
Wikimedia\suppressWarnings(); // header notices
- // Cache ?action=view
- $wgRequestTime = microtime( true ); # T24852
+
+ // 1. Cache ?action=view
+ // Be sure to reset the mocked request time (T24852)
+ $_SERVER['REQUEST_TIME_FLOAT'] = microtime( true );
ob_start();
$article->view();
$context->getOutput()->output();
$context->getOutput()->clearHTML();
$viewHtml = ob_get_clean();
$viewCache->saveToFileCache( $viewHtml );
- // Cache ?action=history
- $wgRequestTime = microtime( true ); # T24852
+
+ // 2. Cache ?action=history
+ // Be sure to reset the mocked request time (T24852)
+ $_SERVER['REQUEST_TIME_FLOAT'] = microtime( true );
ob_start();
Action::factory( 'history', $article, $context )->show();
$context->getOutput()->output();
$context->getOutput()->clearHTML();
$historyHtml = ob_get_clean();
$historyCache->saveToFileCache( $historyHtml );
+
Wikimedia\restoreWarnings();
if ( $rebuilt ) {
--- /dev/null
+--
+-- Adds a default value to the rev_text_id field in the revision table.
+-- This is to allow the Multi Content Revisions migration to happen where
+-- rows will have to be added to the revision table with no rev_text_id.
+--
+-- 2018-03-12
+--
+
+BEGIN TRANSACTION;
+
+DROP TABLE IF EXISTS /*_*/revision_tmp;
+
+CREATE TABLE /*_*/revision_tmp (
+ rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ rev_page int unsigned NOT NULL,
+ rev_text_id int unsigned NOT NULL default 0,
+ rev_comment varbinary(767) NOT NULL default '',
+ rev_user int unsigned NOT NULL default 0,
+ rev_user_text varchar(255) binary NOT NULL default '',
+ rev_timestamp binary(14) NOT NULL default '',
+ rev_minor_edit tinyint unsigned NOT NULL default 0,
+ rev_deleted tinyint unsigned NOT NULL default 0,
+ rev_len int unsigned,
+ rev_parent_id int unsigned default NULL,
+ rev_sha1 varbinary(32) NOT NULL default '',
+ rev_content_model varbinary(32) DEFAULT NULL,
+ rev_content_format varbinary(64) DEFAULT NULL
+
+) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
+
+INSERT OR IGNORE INTO /*_*/revision_tmp (
+ rev_id, rev_page, rev_text_id, rev_comment, rev_user, rev_user_text,
+ rev_timestamp, rev_minor_edit, rev_deleted, rev_len, rev_parent_id,
+ rev_sha1, rev_content_model, rev_content_format
+ )
+ SELECT
+ rev_id, rev_page, rev_text_id, rev_comment, rev_user, rev_user_text,
+ rev_timestamp, rev_minor_edit, rev_deleted, rev_len, rev_parent_id,
+ rev_sha1, rev_content_model, rev_content_format
+ FROM /*_*/revision;
+
+DROP TABLE /*_*/revision;
+
+ALTER TABLE /*_*/revision_tmp RENAME TO /*_*/revision;
+
+CREATE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
+CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
+CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
+CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
+CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
+CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp);
+
+COMMIT;
--- /dev/null
+--
+-- Replace slot_inherited with slot_origin.
+--
+-- NOTE: There is no release that has slot_inherited. This is only needed to transition between
+-- snapshot versions of 1.30.
+--
+-- NOTE: No code that writes to the slots table was merge yet, the table is assumed to be empty.
+--
+BEGIN TRANSACTION;
+
+DROP TABLE /*_*/slots;
+
+CREATE TABLE /*_*/slots (
+
+ -- reference to rev_id
+ slot_revision_id bigint unsigned NOT NULL,
+
+ -- reference to role_id
+ slot_role_id smallint unsigned NOT NULL,
+
+ -- reference to content_id
+ slot_content_id bigint unsigned NOT NULL,
+
+ -- The revision ID of the revision that originated the slot's content.
+ -- To find revisions that changed slots, look for slot_origin = slot_revision_id.
+ slot_origin bigint unsigned NOT NULL,
+
+ PRIMARY KEY ( slot_revision_id, slot_role_id )
+) /*$wgDBTableOptions*/;
+
+-- Index for finding revisions that modified a specific slot
+CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
+
+COMMIT TRANSACTION;
\ No newline at end of file
-- It's possible for multiple revisions to use the same text,
-- for instance revisions where only metadata is altered
-- or a rollback to a previous version.
- rev_text_id int unsigned NOT NULL,
+ rev_text_id int unsigned NOT NULL default 0,
-- Text comment summarizing the change. Deprecated in favor of
-- revision_comment_temp.revcomment_comment_id.
-- reference to content_id
slot_content_id bigint unsigned NOT NULL,
- -- whether the content is inherited (1) or new in this revision (0)
- slot_inherited tinyint unsigned NOT NULL DEFAULT 0,
+ -- The revision ID of the revision that originated the slot's content.
+ -- To find revisions that changed slots, look for slot_origin = slot_revision_id.
+ slot_origin bigint unsigned NOT NULL,
PRIMARY KEY ( slot_revision_id, slot_role_id )
) /*$wgDBTableOptions*/;
-- Index for finding revisions that modified a specific slot
-CREATE INDEX /*i*/slot_role_inherited ON /*_*/slots (slot_revision_id, slot_role_id, slot_inherited);
+CREATE INDEX /*i*/slot_revision_origin_role ON /*_*/slots (slot_revision_id, slot_origin, slot_role_id);
--
-- The content table represents content objects. It's primary purpose is to provide the necessary
"karma-firefox-launcher": "1.0.1",
"karma-mocha-reporter": "2.2.5",
"karma-qunit": "1.2.1",
- "nodemw": "0.11.0",
+ "mwbot": "1.0.10",
+ "postcss-less": "1.1.3",
"qunitjs": "2.4.1",
"stylelint": "8.2.0",
"stylelint-config-wikimedia": "0.4.2",
"wdio-junit-reporter": "0.2.0",
"wdio-mocha-framework": "0.5.8",
- "wdio-sauce-service": "^0.3.1",
+ "wdio-sauce-service": "0.3.1",
"wdio-spec-reporter": "0.0.5",
- "webdriverio": "4.6.2"
+ "webdriverio": "4.12.0"
}
}
margin: 0 !important; /* stylelint-disable-line declaration-no-important */
}
-#toc,
.toc {
background-color: #f9f9f9;
border: 1pt solid #aaa;
border: 0;
}
-#toc,
.toc {
border: 1px solid #bba;
background-color: #f7f8ff;
}
/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
-table#toc,
table.toc {
border-collapse: collapse;
}
/* Remove additional paddings inside table-cells that are not present in <div>s */
-table#toc td,
table.toc td {
padding: 0;
}
-#toc h2,
.toc h2 {
display: inline;
border: 0;
font-weight: bold;
}
-#toc ul,
.toc ul {
list-style-type: none;
list-style-image: none;
text-align: left;
}
-#toc ul ul,
.toc ul ul {
margin: 0 0 0 2em;
}
font-size: 100%;
}
-/* use this instead of #toc for page content */
+/* use this instead of .toc for page content */
.toccolours {
border: 1px solid #aaa;
background-color: #f9f9f9;
list-style-type: oriya;
}
-#toc ul,
.toc ul {
margin: 0.3em 0;
}
/* Correct directionality when page dir is different from site/user dir */
/* @noflip */ .mw-content-ltr .toc ul,
-.mw-content-ltr #toc ul,
-.mw-content-rtl .mw-content-ltr .toc ul,
-.mw-content-rtl .mw-content-ltr #toc ul {
+.mw-content-rtl .mw-content-ltr .toc ul {
text-align: left;
}
/* @noflip */ .mw-content-rtl .toc ul,
-.mw-content-rtl #toc ul,
-.mw-content-ltr .mw-content-rtl .toc ul,
-.mw-content-ltr .mw-content-rtl #toc ul {
+.mw-content-ltr .mw-content-rtl .toc ul {
text-align: right;
}
/* @noflip */ .mw-content-ltr .toc ul ul,
-.mw-content-ltr #toc ul ul,
-.mw-content-rtl .mw-content-ltr .toc ul ul,
-.mw-content-rtl .mw-content-ltr #toc ul ul {
+.mw-content-rtl .mw-content-ltr .toc ul ul {
margin: 0 0 0 2em;
}
/* @noflip */ .mw-content-rtl .toc ul ul,
-.mw-content-rtl #toc ul ul,
-.mw-content-ltr .mw-content-rtl .toc ul ul,
-.mw-content-ltr .mw-content-rtl #toc ul ul {
+.mw-content-ltr .mw-content-rtl .toc ul ul {
margin: 0 2em 0 0;
}
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
.toc .toctitle {
direction: ltr;
}
*/
/* Table of Contents */
-#toc,
.toc,
.mw-warning,
.toccolours {
* inline elements. In practice inline elements surrounding the TOC are uncommon enough that
* this is an acceptable sacrifice.
*/
-#toc,
.toc {
display: inline-block;
display: table;
}
/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
-table#toc,
table.toc {
border-collapse: collapse;
}
/* Remove additional paddings inside table-cells that are not present in <div>s */
-table#toc td,
table.toc td {
padding: 0;
}
-#toc h2,
.toc h2 {
display: inline;
border: 0;
font-weight: bold;
}
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
.toc .toctitle {
text-align: center;
}
-#toc ul,
.toc ul {
list-style-type: none;
list-style-image: none;
text-align: left;
}
-#toc ul ul,
.toc ul ul {
margin: 0 0 0 2em;
}
-#toc.tochidden,
.toc.tochidden,
.toctoggle {
display: none;
* Note: borrows from IP::isIPv4
*
* @param {string} address
- * @param {boolean} allowBlock
+ * @param {boolean} [allowBlock=false]
* @return {boolean}
*/
isIPv4Address: function ( address, allowBlock ) {
* Note: borrows from IP::isIPv6
*
* @param {string} address
- * @param {boolean} allowBlock
+ * @param {boolean} [allowBlock=false]
* @return {boolean}
*/
isIPv6Address: function ( address, allowBlock ) {
*
* @since 1.25
* @param {string} address String to check
- * @param {boolean} allowBlock True if a block of IPs should be allowed
+ * @param {boolean} [allowBlock=false] If a block of IPs should be allowed
* @return {boolean}
*/
isIPAddress: function ( address, allowBlock ) {
'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
'ApiTestCaseUpload' => "$testDir/phpunit/includes/api/ApiTestCaseUpload.php",
'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestContext.php",
+ 'ApiUploadTestCase' => "$testDir/phpunit/includes/api/ApiUploadTestCase.php",
'MockApi' => "$testDir/phpunit/includes/api/MockApi.php",
'MockApiQueryBase' => "$testDir/phpunit/includes/api/MockApiQueryBase.php",
'UserWrapper' => "$testDir/phpunit/includes/api/UserWrapper.php",
<?php
+/**
+ * @large
+ * @covers CurlHttpRequest
+ */
class CurlHttpRequestTest extends MWHttpRequestTestCase {
protected static $httpEngine = 'curl';
}
<?php
+/**
+ * @large
+ * @covers PhpHttpRequest
+ */
class PhpHttpRequestTest extends MWHttpRequestTestCase {
protected static $httpEngine = 'php';
}
* Integration tests to ensure that firejail actually prevents execution.
* Meant to run on vagrant, although will probably work on other setups
* as long as firejail and sudo has similar config.
+ *
+ * @large
* @group Shell
+ * @covers FirejailCommand
*/
class FirejailCommandIntegrationTest extends PHPUnit\Framework\TestCase {
/**
* Remove last character if it is a newline
- * @group utility
* @param string $s
* @return string
*/
!! config
wgFragmentMode=[ 'html5', 'legacy' ]
!! wikitext
-== A <nowiki>B
-C</nowiki> ==
+==A <nowiki>B
+C</nowiki>==
!! html/php
<h2><span id="A_B.0AC"></span><span class="mw-headline" id="A_B
C">A B
!! html/parsoid
<h2 id="A_B
-C"><span id="A_B.0AC" typeof="mw:FallbackId"></span> A <span typeof="mw:Nowiki">B
-C</span> </h2>
+C"><span id="A_B.0AC" typeof="mw:FallbackId"></span>A <span typeof="mw:Nowiki">B
+C</span></h2>
!! end
!! test
!! test
Simple list
!! wikitext
-* Item 1
-* Item 2
+*Item 1
+*Item 2
!! html
-<ul><li> Item 1</li>
-<li> Item 2</li></ul>
+<ul><li>Item 1</li>
+<li>Item 2</li></ul>
!! end
!! test
Italics and bold
!! wikitext
-* plain
-* plain''italic''plain
-* plain''italic''plain''italic''plain
-* plain'''bold'''plain
-* plain'''bold'''plain'''bold'''plain
-* plain''italic''plain'''bold'''plain
-* plain'''bold'''plain''italic''plain
-* plain''italic'''bold-italic'''italic''plain
-* plain'''bold''bold-italic''bold'''plain
-* plain'''''bold-italic'''italic''plain
-* plain'''''bold-italic''bold'''plain
-* plain''italic'''bold-italic'''''plain
-* plain'''bold''bold-italic'''''plain
-* plain l'''italic''plain
-* plain l''''bold''' plain
-!! html
-<ul><li> plain</li>
-<li> plain<i>italic</i>plain</li>
-<li> plain<i>italic</i>plain<i>italic</i>plain</li>
-<li> plain<b>bold</b>plain</li>
-<li> plain<b>bold</b>plain<b>bold</b>plain</li>
-<li> plain<i>italic</i>plain<b>bold</b>plain</li>
-<li> plain<b>bold</b>plain<i>italic</i>plain</li>
-<li> plain<i>italic<b>bold-italic</b>italic</i>plain</li>
-<li> plain<b>bold<i>bold-italic</i>bold</b>plain</li>
-<li> plain<i><b>bold-italic</b>italic</i>plain</li>
-<li> plain<b><i>bold-italic</i>bold</b>plain</li>
-<li> plain<i>italic<b>bold-italic</b></i>plain</li>
-<li> plain<b>bold<i>bold-italic</i></b>plain</li>
-<li> plain l'<i>italic</i>plain</li>
-<li> plain l'<b>bold</b> plain</li></ul>
+*plain
+*plain''italic''plain
+*plain''italic''plain''italic''plain
+*plain'''bold'''plain
+*plain'''bold'''plain'''bold'''plain
+*plain''italic''plain'''bold'''plain
+*plain'''bold'''plain''italic''plain
+*plain''italic'''bold-italic'''italic''plain
+*plain'''bold''bold-italic''bold'''plain
+*plain'''''bold-italic'''italic''plain
+*plain'''''bold-italic''bold'''plain
+*plain''italic'''bold-italic'''''plain
+*plain'''bold''bold-italic'''''plain
+*plain l'''italic''plain
+*plain l''''bold''' plain
+!! html
+<ul><li>plain</li>
+<li>plain<i>italic</i>plain</li>
+<li>plain<i>italic</i>plain<i>italic</i>plain</li>
+<li>plain<b>bold</b>plain</li>
+<li>plain<b>bold</b>plain<b>bold</b>plain</li>
+<li>plain<i>italic</i>plain<b>bold</b>plain</li>
+<li>plain<b>bold</b>plain<i>italic</i>plain</li>
+<li>plain<i>italic<b>bold-italic</b>italic</i>plain</li>
+<li>plain<b>bold<i>bold-italic</i>bold</b>plain</li>
+<li>plain<i><b>bold-italic</b>italic</i>plain</li>
+<li>plain<b><i>bold-italic</i>bold</b>plain</li>
+<li>plain<i>italic<b>bold-italic</b></i>plain</li>
+<li>plain<b>bold<i>bold-italic</i></b>plain</li>
+<li>plain l'<i>italic</i>plain</li>
+<li>plain l'<b>bold</b> plain</li></ul>
!! end
!! test
Ruby markup (W3C-style)
!! wikitext
-; Mono-ruby for individual base characters
-: <ruby>日<rt>に</rt>本<rt>ほん</rt>語<rt>ご</rt></ruby>
-; Group ruby
-: <ruby>今日<rt>きょう</rt></ruby>
-; Jukugo ruby
-: <ruby>法<rb>華</rb><rb>経</rb><rt>ほ</rt><rt>け</rt><rt>きょう</rt></ruby>
-; Inline ruby
-: <ruby>東<rb>京</rb><rp>(</rp><rt>とう</rt><rt>きょう</rt><rp>)</rp></ruby>
-; Double-sided ruby
-: <ruby><rb>旧</rb><rb>金</rb><rb>山</rb><rt>jiù</rt><rt>jīn</rt><rt>shān</rt><rtc>San Francisco</rtc></ruby>
+;Mono-ruby for individual base characters
+:<ruby>日<rt>に</rt>本<rt>ほん</rt>語<rt>ご</rt></ruby>
+;Group ruby
+:<ruby>今日<rt>きょう</rt></ruby>
+;Jukugo ruby
+:<ruby>法<rb>華</rb><rb>経</rb><rt>ほ</rt><rt>け</rt><rt>きょう</rt></ruby>
+;Inline ruby
+:<ruby>東<rb>京</rb><rp>(</rp><rt>とう</rt><rt>きょう</rt><rp>)</rp></ruby>
+;Double-sided ruby
+:<ruby><rb>旧</rb><rb>金</rb><rb>山</rb><rt>jiù</rt><rt>jīn</rt><rt>shān</rt><rtc>San Francisco</rtc></ruby>
<ruby>
<rb>♥</rb><rtc><rt>Heart</rt></rtc><rtc lang="fr"><rt>Cœur</rt></rtc>
<rb>☘</rb><rtc><rt>Shamrock</rt></rtc><rtc lang="fr"><rt>Trèfle</rt></rtc>
<rb>✶</rb><rtc><rt>Star</rt></rtc><rtc lang="fr"><rt>Étoile</rt></rtc>
</ruby>
!! html
-<dl><dt> Mono-ruby for individual base characters</dt>
-<dd> <ruby>日<rt>に</rt>本<rt>ほん</rt>語<rt>ご</rt></ruby></dd>
-<dt> Group ruby</dt>
-<dd> <ruby>今日<rt>きょう</rt></ruby></dd>
-<dt> Jukugo ruby</dt>
-<dd> <ruby>法<rb>華</rb><rb>経</rb><rt>ほ</rt><rt>け</rt><rt>きょう</rt></ruby></dd>
-<dt> Inline ruby</dt>
-<dd> <ruby>東<rb>京</rb><rp>(</rp><rt>とう</rt><rt>きょう</rt><rp>)</rp></ruby></dd>
-<dt> Double-sided ruby</dt>
-<dd> <ruby><rb>旧</rb><rb>金</rb><rb>山</rb><rt>jiù</rt><rt>jīn</rt><rt>shān</rt><rtc>San Francisco</rtc></ruby></dd></dl>
+<dl><dt>Mono-ruby for individual base characters</dt>
+<dd><ruby>日<rt>に</rt>本<rt>ほん</rt>語<rt>ご</rt></ruby></dd>
+<dt>Group ruby</dt>
+<dd><ruby>今日<rt>きょう</rt></ruby></dd>
+<dt>Jukugo ruby</dt>
+<dd><ruby>法<rb>華</rb><rb>経</rb><rt>ほ</rt><rt>け</rt><rt>きょう</rt></ruby></dd>
+<dt>Inline ruby</dt>
+<dd><ruby>東<rb>京</rb><rp>(</rp><rt>とう</rt><rt>きょう</rt><rp>)</rp></ruby></dd>
+<dt>Double-sided ruby</dt>
+<dd><ruby><rb>旧</rb><rb>金</rb><rb>山</rb><rt>jiù</rt><rt>jīn</rt><rt>shān</rt><rtc>San Francisco</rtc></ruby></dd></dl>
<p><ruby>
<rb>♥</rb><rtc><rt>Heart</rt></rtc><rtc lang="fr"><rt>Cœur</rt></rtc>
<rb>☘</rb><rtc><rt>Shamrock</rt></rtc><rtc lang="fr"><rt>Trèfle</rt></rtc>
</p><p>b
</p><p>c
</p>
-<ul><li> d</li></ul>
+<ul><li>d</li></ul>
!! end
e}}
{{echo|
-* f}}
+*f}}
{{echo|
}}g
</pre>
<p><br />
</p>
-<ul><li> f</li></ul>
+<ul><li>f</li></ul>
<p><br />
</p>
<pre>g
2c. Indent-Pre and tables (T44252)
!! wikitext
{|
- |+ foo
- ! | bar
+ |+foo
+ ! |bar
|}
!! html
<table>
-<caption> foo
+<caption>foo
</caption>
<tr>
-<th> bar
+<th>bar
</th></tr></table>
!!end
!! wikitext
a
{|
- | b
+ |b
|}
!! html/php
<pre>a
</pre>
<table>
<tr>
-<td> b
+<td>b
</td></tr></table>
!! html/parsoid
!! test
Simple definition
!! wikitext
-; name : Definition
+;name :Definition
!! html
-<dl><dt> name </dt>
-<dd> Definition</dd></dl>
+<dl><dt>name </dt>
+<dd>Definition</dd></dl>
!! end
!! test
Definition list for indentation only
!! wikitext
-: Indented text
+:Indented text
!! html
-<dl><dd> Indented text</dd></dl>
+<dl><dd>Indented text</dd></dl>
!! end
!! test
Definition list with URL link
!! wikitext
-; http://example.com/ : definition
+;http://example.com/ :definition
!! html
-<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> </dt>
-<dd> definition</dd></dl>
+<dl><dt><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> </dt>
+<dd>definition</dd></dl>
!! end
!! test
Definition list with wikilink containing colon
!! wikitext
-; [[Help:FAQ]]: The least-read page on Wikipedia
+; [[Help:FAQ]]:The least-read page on Wikipedia
!! html
-<dl><dt> <a href="/index.php?title=Help:FAQ&action=edit&redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
-<dd> The least-read page on Wikipedia</dd></dl>
+<dl><dt><a href="/index.php?title=Help:FAQ&action=edit&redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
+<dd>The least-read page on Wikipedia</dd></dl>
!! end
!! test
Definition list with news link containing colon
!! wikitext
-; news:alt.wikipedia.rox: This isn't even a real newsgroup!
+;news:alt.wikipedia.rox: This isn't even a real newsgroup!
!! html/php
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
-<dd> This isn't even a real newsgroup!</dd></dl>
+<dl><dt><a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
+<dd>This isn't even a real newsgroup!</dd></dl>
!! html/parsoid
-<dl><dt> <a rel="mw:ExtLink" class="external free" href="news:alt.wikipedia.rox" data-parsoid='{"stx":"url"}'>news:alt.wikipedia.rox</a></dt><dd data-parsoid='{"stx":"row"}'> This isn't even a real newsgroup!</dd></dl>
+<dl><dt> <a rel="mw:ExtLink" class="external free" href="news:alt.wikipedia.rox" data-parsoid='{"stx":"url"}'>news:alt.wikipedia.rox</a></dt><dd data-parsoid='{"stx":"row"}'>This isn't even a real newsgroup!</dd></dl>
!! end
!! test
!! wikitext
; news:alt.wikipedia.rox -- don't crash or enter an infinite loop
!! html
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop</dt></dl>
+<dl><dt><a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop</dt></dl>
!! end
!! test
Definition lists: colon in external link text
!! wikitext
-; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
+;[http://www.wikipedia2.org/ Wikipedia :The Next Generation] :OK, I made that up
!! html
-<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia : The Next Generation</a></dt>
-<dd> OK, I made that up</dd></dl>
+<dl><dt><a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia :The Next Generation</a> </dt>
+<dd>OK, I made that up</dd></dl>
!! end
!! test
Definition lists: self-closed tag
!! wikitext
-;one<br/>two : two-line fun
+;one<br/>two :two-line fun
!! html
<dl><dt>one<br />two </dt>
-<dd> two-line fun</dd></dl>
+<dd>two-line fun</dd></dl>
!! end
!! test
Definition lists: ignore colons inside tags
!! wikitext
-;one <b>two : tag <i>fun:</i>:</b>: def
+;one <b>two : tag <i>fun:</i>:</b>:def
!! html
<dl><dt>one <b>two : tag <i>fun:</i>:</b></dt>
-<dd> def</dd></dl>
+<dd>def</dd></dl>
!! end
!! test
Definition lists: excess closed tags
!! wikitext
-;one</b>two : bad tag fun
+;one</b>two :bad tag fun
!! html/php+tidy
<dl><dt>onetwo </dt>
-<dd> bad tag fun</dd></dl>
+<dd>bad tag fun</dd></dl>
!! html/parsoid
<dl>
<dt>onetwo</dt>
Definition and unordered list using wiki syntax nested in unordered list using html tags.
!! wikitext
<ul><li>
-; term : description
-* unordered
+;term :description
+*unordered
</li></ul>
!! html
<ul><li>
-<dl><dt> term </dt>
-<dd> description</dd></dl>
-<ul><li> unordered</li></ul>
+<dl><dt>term </dt>
+<dd>description</dd></dl>
+<ul><li>unordered</li></ul>
</li></ul>
!! end
!! test
Definition list with empty definition and following paragraph
!! wikitext
-; term:
+;term:
Paragraph text
!! html
-<dl><dt> term</dt>
+<dl><dt>term</dt>
<dd></dd></dl>
<p>Paragraph text
</p>
!! wikitext
:{|
|-
-| a
-* b
+|a
+*b
|-
-| c
-* d
+|c
+*d
|}
!! html
<dl><dd><table>
<tr>
-<td> a
-<ul><li> b</li></ul>
+<td>a
+<ul><li>b</li></ul>
</td></tr>
<tr>
-<td> c
-<ul><li> d</li></ul>
+<td>c
+<ul><li>d</li></ul>
</td></tr></table></dd></dl>
!! end
!! test
Definition Lists: Mixed Lists: Test 1
!! wikitext
-:;* foo
-::* bar
-:; baz
+:;*foo
+::*bar
+:;baz
!! html/php
-<dl><dd><dl><dt><ul><li> foo</li>
-<li> bar</li></ul></dt></dl>
-<dl><dt> baz</dt></dl></dd></dl>
+<dl><dd><dl><dt><ul><li>foo</li>
+<li>bar</li></ul></dt></dl>
+<dl><dt>baz</dt></dl></dd></dl>
!! html/php+tidy
-<dl><dd><dl><dt><ul><li> foo</li>
-<li> bar</li></ul></dt></dl>
-<dl><dt> baz</dt></dl></dd></dl>
+<dl><dd><dl><dt><ul><li>foo</li>
+<li>bar</li></ul></dt></dl>
+<dl><dt>baz</dt></dl></dd></dl>
!! html/parsoid
<dl>
<dd><dl>
<dt><ul>
-<li> foo
+<li>foo
</li>
</ul></dt>
<dd><ul>
-<li> bar
+<li>bar
</li>
</ul></dd>
-<dt> baz</dt>
+<dt>baz</dt>
</dl></dd>
</dl>
!! end
!! test
Definition Lists: Mixed Lists: Test 2
!! wikitext
-*: d1
-*: d2
+*:d1
+*:d2
!! html
-<ul><li><dl><dd> d1</dd>
-<dd> d2</dd></dl></li></ul>
+<ul><li><dl><dd>d1</dd>
+<dd>d2</dd></dl></li></ul>
!! end
!! test
Definition Lists: Mixed Lists: Test 3
!! wikitext
-*::: d1
-*::: d2
+*:::d1
+*:::d2
!! html
-<ul><li><dl><dd><dl><dd><dl><dd> d1</dd>
-<dd> d2</dd></dl></dd></dl></dd></dl></li></ul>
+<ul><li><dl><dd><dl><dd><dl><dd>d1</dd>
+<dd>d2</dd></dl></dd></dl></dd></dl></li></ul>
!! end
Definition Lists: Mixed Lists: Test 5
!! wikitext
*:d1
-*:: d2
+*::d2
!! html
<ul><li><dl><dd>d1
-<dl><dd> d2</dd></dl></dd></dl></li></ul>
+<dl><dd>d2</dd></dl></dd></dl></li></ul>
!! end
Definition Lists: Mixed Lists: Test 6
!! wikitext
#*:d1
-#*::: d3
+#*:::d3
!! html
<ol><li><ul><li><dl><dd>d1
-<dl><dd><dl><dd> d3</dd></dl></dd></dl></dd></dl></li></ul></li></ol>
+<dl><dd><dl><dd>d3</dd></dl></dd></dl></dd></dl></li></ul></li></ol>
!! end
!! test
Definition Lists: Mixed Lists: Test 7
!! wikitext
-:* d1
-:* d2
+:*d1
+:*d2
!! html
-<dl><dd><ul><li> d1</li>
-<li> d2</li></ul></dd></dl>
+<dl><dd><ul><li>d1</li>
+<li>d2</li></ul></dd></dl>
!! end
!! test
Definition Lists: Mixed Lists: Test 8
!! wikitext
-:* d1
-::* d2
+:*d1
+::*d2
!! html
-<dl><dd><ul><li> d1</li></ul>
-<dl><dd><ul><li> d2</li></ul></dd></dl></dd></dl>
+<dl><dd><ul><li>d1</li></ul>
+<dl><dd><ul><li>d2</li></ul></dd></dl></dd></dl>
!! end
!! test
Definition Lists: Weird Ones: Test 1
!! wikitext
-*#;*::;; foo : bar (who uses this?)
+*#;*::;;foo :bar (who uses this?)
!! html/php+tidy
-<ul><li><ol><li><dl><dt> foo </dt>
-<dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)</dt></dl></dt></dl></dd></dl></dd></dl></li></ul></dd></dl></li></ol></li></ul>
+<ul><li><ol><li><dl><dt>foo </dt>
+<dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt>bar (who uses this?)</dt></dl></dt></dl></dd></dl></dd></dl></li></ul></dd></dl></li></ol></li></ul>
!! html/parsoid
<ul>
<li>
<dl>
<dt>
<dl>
-<dt> foo<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"src":" ","isDisplayHack":true}'> </span></dt>
-<dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd>
+<dt>foo<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"src":" ","isDisplayHack":true}'> </span></dt>
+<dd data-parsoid='{"stx":"row"}'>bar (who uses this?)</dd>
</dl></dt>
</dl></dd>
</dl></dd>
Definition Lists: colons and tables 1
!! wikitext
:{|
-| x
+|x
|}
:{|
-| y
+|y
|}
!! html/php
<dl><dd><table>
<tr>
-<td> x
+<td>x
</td></tr></table></dd></dl>
<dl><dd><table>
<tr>
-<td> y
+<td>y
</td></tr></table></dd></dl>
!! html/parsoid
<dl><dd><table>
<tr>
-<td> x
+<td>x
</td></tr></table></dd>
<dd><table>
<tr>
-<td> y
+<td>y
</td></tr></table></dd></dl>
!! end
http://[2404:130:0:1000::187:2]/index.php
Examples from RFC 2373, section 2.2:
-* http://[1080::8:800:200C:417A]/unicast
-* http://[FF01::101]/multicast
-* http://[::1]/loopback
-* http://[::]/unspecified
-* http://[::13.1.68.3]/ipv4compat
-* http://[::FFFF:129.144.52.38]/ipv4compat
+*http://[1080::8:800:200C:417A]/unicast
+*http://[FF01::101]/multicast
+*http://[::1]/loopback
+*http://[::]/unspecified
+*http://[::13.1.68.3]/ipv4compat
+*http://[::FFFF:129.144.52.38]/ipv4compat
Examples from RFC 2732, section 2:
-* http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html
-* http://[1080:0:0:0:8:800:200C:417A]/index.html
-* http://[3ffe:2a00:100:7031::1]
-* http://[1080::8:800:200C:417A]/foo
-* http://[::192.9.5.5]/ipng
-* http://[::FFFF:129.144.52.38]:80/index.html
-* http://[2010:836B:4179::836B:4179]
+*http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html
+*http://[1080:0:0:0:8:800:200C:417A]/index.html
+*http://[3ffe:2a00:100:7031::1]
+*http://[1080::8:800:200C:417A]/foo
+*http://[::192.9.5.5]/ipng
+*http://[::FFFF:129.144.52.38]:80/index.html
+*http://[2010:836B:4179::836B:4179]
!! html/php
<p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
</p><p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc2373">RFC 2373</a>, section 2.2:
</p>
-<ul><li> <a rel="nofollow" class="external free" href="http://[1080::8:800:200C:417A]/unicast">http://[1080::8:800:200C:417A]/unicast</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[FF01::101]/multicast">http://[FF01::101]/multicast</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[::1]/loopback">http://[::1]/loopback</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[::]/unspecified">http://[::]/unspecified</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[::13.1.68.3]/ipv4compat">http://[::13.1.68.3]/ipv4compat</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[::FFFF:129.144.52.38]/ipv4compat">http://[::FFFF:129.144.52.38]/ipv4compat</a></li></ul>
+<ul><li><a rel="nofollow" class="external free" href="http://[1080::8:800:200C:417A]/unicast">http://[1080::8:800:200C:417A]/unicast</a></li>
+<li><a rel="nofollow" class="external free" href="http://[FF01::101]/multicast">http://[FF01::101]/multicast</a></li>
+<li><a rel="nofollow" class="external free" href="http://[::1]/loopback">http://[::1]/loopback</a></li>
+<li><a rel="nofollow" class="external free" href="http://[::]/unspecified">http://[::]/unspecified</a></li>
+<li><a rel="nofollow" class="external free" href="http://[::13.1.68.3]/ipv4compat">http://[::13.1.68.3]/ipv4compat</a></li>
+<li><a rel="nofollow" class="external free" href="http://[::FFFF:129.144.52.38]/ipv4compat">http://[::FFFF:129.144.52.38]/ipv4compat</a></li></ul>
<p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc2732">RFC 2732</a>, section 2:
</p>
-<ul><li> <a rel="nofollow" class="external free" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">http://[1080:0:0:0:8:800:200C:417A]/index.html</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[3ffe:2a00:100:7031::1]">http://[3ffe:2a00:100:7031::1]</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[1080::8:800:200C:417A]/foo">http://[1080::8:800:200C:417A]/foo</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[::192.9.5.5]/ipng">http://[::192.9.5.5]/ipng</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[::FFFF:129.144.52.38]:80/index.html">http://[::FFFF:129.144.52.38]:80/index.html</a></li>
-<li> <a rel="nofollow" class="external free" href="http://[2010:836B:4179::836B:4179]">http://[2010:836B:4179::836B:4179]</a></li></ul>
+<ul><li><a rel="nofollow" class="external free" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html</a></li>
+<li><a rel="nofollow" class="external free" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">http://[1080:0:0:0:8:800:200C:417A]/index.html</a></li>
+<li><a rel="nofollow" class="external free" href="http://[3ffe:2a00:100:7031::1]">http://[3ffe:2a00:100:7031::1]</a></li>
+<li><a rel="nofollow" class="external free" href="http://[1080::8:800:200C:417A]/foo">http://[1080::8:800:200C:417A]/foo</a></li>
+<li><a rel="nofollow" class="external free" href="http://[::192.9.5.5]/ipng">http://[::192.9.5.5]/ipng</a></li>
+<li><a rel="nofollow" class="external free" href="http://[::FFFF:129.144.52.38]:80/index.html">http://[::FFFF:129.144.52.38]:80/index.html</a></li>
+<li><a rel="nofollow" class="external free" href="http://[2010:836B:4179::836B:4179]">http://[2010:836B:4179::836B:4179]</a></li></ul>
!! html/parsoid
<p><a rel="mw:ExtLink" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a></p>
<p>Examples from <a href="https://tools.ietf.org/html/rfc2373" rel="mw:ExtLink" class="external text">RFC 2373</a>, section 2.2:</p>
-<ul><li> <a rel="mw:ExtLink" class="external free" href="http://[1080::8:800:200C:417A]/unicast">http://[1080::8:800:200C:417A]/unicast</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[FF01::101]/multicast">http://[FF01::101]/multicast</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[::1]/loopback">http://[::1]/loopback</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[::]/unspecified">http://[::]/unspecified</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[::13.1.68.3]/ipv4compat">http://[::13.1.68.3]/ipv4compat</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[::FFFF:129.144.52.38]/ipv4compat">http://[::FFFF:129.144.52.38]/ipv4compat</a></li></ul>
+<ul><li><a rel="mw:ExtLink" class="external free" href="http://[1080::8:800:200C:417A]/unicast">http://[1080::8:800:200C:417A]/unicast</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[FF01::101]/multicast">http://[FF01::101]/multicast</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[::1]/loopback">http://[::1]/loopback</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[::]/unspecified">http://[::]/unspecified</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[::13.1.68.3]/ipv4compat">http://[::13.1.68.3]/ipv4compat</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[::FFFF:129.144.52.38]/ipv4compat">http://[::FFFF:129.144.52.38]/ipv4compat</a></li></ul>
<p>Examples from <a href="https://tools.ietf.org/html/rfc2732" rel="mw:ExtLink" class="external text">RFC 2732</a>, section 2:</p>
-<ul><li> <a rel="mw:ExtLink" class="external free" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">http://[1080:0:0:0:8:800:200C:417A]/index.html</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[3ffe:2a00:100:7031::1]">http://[3ffe:2a00:100:7031::1]</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[1080::8:800:200C:417A]/foo">http://[1080::8:800:200C:417A]/foo</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[::192.9.5.5]/ipng">http://[::192.9.5.5]/ipng</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[::FFFF:129.144.52.38]:80/index.html">http://[::FFFF:129.144.52.38]:80/index.html</a></li>
-<li> <a rel="mw:ExtLink" class="external free" href="http://[2010:836B:4179::836B:4179]">http://[2010:836B:4179::836B:4179]</a></li></ul>
+<ul><li><a rel="mw:ExtLink" class="external free" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">http://[1080:0:0:0:8:800:200C:417A]/index.html</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[3ffe:2a00:100:7031::1]">http://[3ffe:2a00:100:7031::1]</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[1080::8:800:200C:417A]/foo">http://[1080::8:800:200C:417A]/foo</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[::192.9.5.5]/ipng">http://[::192.9.5.5]/ipng</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[::FFFF:129.144.52.38]:80/index.html">http://[::FFFF:129.144.52.38]:80/index.html</a></li>
+<li><a rel="mw:ExtLink" class="external free" href="http://[2010:836B:4179::836B:4179]">http://[2010:836B:4179::836B:4179]</a></li></ul>
!! end
!! test
[http://[2404:130:0:1000::187:2]/index.php test]
Examples from RFC 2373, section 2.2:
-* [http://[1080::8:800:200C:417A] unicast]
-* [http://[FF01::101] multicast]
-* [http://[::1]/ loopback]
-* [http://[::] unspecified]
-* [http://[::13.1.68.3] ipv4compat]
-* [http://[::FFFF:129.144.52.38] ipv4compat]
+*[http://[1080::8:800:200C:417A] unicast]
+*[http://[FF01::101] multicast]
+*[http://[::1]/ loopback]
+*[http://[::] unspecified]
+*[http://[::13.1.68.3] ipv4compat]
+*[http://[::FFFF:129.144.52.38] ipv4compat]
Examples from RFC 2732, section 2:
-* [http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html 1]
-* [http://[1080:0:0:0:8:800:200C:417A]/index.html 2]
-* [http://[3ffe:2a00:100:7031::1] 3]
-* [http://[1080::8:800:200C:417A]/foo 4]
-* [http://[::192.9.5.5]/ipng 5]
-* [http://[::FFFF:129.144.52.38]:80/index.html 6]
-* [http://[2010:836B:4179::836B:4179] 7]
+*[http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html 1]
+*[http://[1080:0:0:0:8:800:200C:417A]/index.html 2]
+*[http://[3ffe:2a00:100:7031::1] 3]
+*[http://[1080::8:800:200C:417A]/foo 4]
+*[http://[::192.9.5.5]/ipng 5]
+*[http://[::FFFF:129.144.52.38]:80/index.html 6]
+*[http://[2010:836B:4179::836B:4179] 7]
!! html/php
<p><a rel="nofollow" class="external text" href="http://[2404:130:0:1000::187:2]/index.php">test</a>
</p><p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc2373">RFC 2373</a>, section 2.2:
</p>
-<ul><li> <a rel="nofollow" class="external text" href="http://[1080::8:800:200C:417A]">unicast</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[FF01::101]">multicast</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[::1]/">loopback</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[::]">unspecified</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[::13.1.68.3]">ipv4compat</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[::FFFF:129.144.52.38]">ipv4compat</a></li></ul>
+<ul><li><a rel="nofollow" class="external text" href="http://[1080::8:800:200C:417A]">unicast</a></li>
+<li><a rel="nofollow" class="external text" href="http://[FF01::101]">multicast</a></li>
+<li><a rel="nofollow" class="external text" href="http://[::1]/">loopback</a></li>
+<li><a rel="nofollow" class="external text" href="http://[::]">unspecified</a></li>
+<li><a rel="nofollow" class="external text" href="http://[::13.1.68.3]">ipv4compat</a></li>
+<li><a rel="nofollow" class="external text" href="http://[::FFFF:129.144.52.38]">ipv4compat</a></li></ul>
<p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc2732">RFC 2732</a>, section 2:
</p>
-<ul><li> <a rel="nofollow" class="external text" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">1</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">2</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[3ffe:2a00:100:7031::1]">3</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[1080::8:800:200C:417A]/foo">4</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[::192.9.5.5]/ipng">5</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[::FFFF:129.144.52.38]:80/index.html">6</a></li>
-<li> <a rel="nofollow" class="external text" href="http://[2010:836B:4179::836B:4179]">7</a></li></ul>
+<ul><li><a rel="nofollow" class="external text" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">1</a></li>
+<li><a rel="nofollow" class="external text" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">2</a></li>
+<li><a rel="nofollow" class="external text" href="http://[3ffe:2a00:100:7031::1]">3</a></li>
+<li><a rel="nofollow" class="external text" href="http://[1080::8:800:200C:417A]/foo">4</a></li>
+<li><a rel="nofollow" class="external text" href="http://[::192.9.5.5]/ipng">5</a></li>
+<li><a rel="nofollow" class="external text" href="http://[::FFFF:129.144.52.38]:80/index.html">6</a></li>
+<li><a rel="nofollow" class="external text" href="http://[2010:836B:4179::836B:4179]">7</a></li></ul>
!! html/parsoid
<p><a rel="mw:ExtLink" class="external text" href="http://[2404:130:0:1000::187:2]/index.php">test</a></p>
<p>Examples from <a href="https://tools.ietf.org/html/rfc2373" rel="mw:ExtLink" class="external text">RFC 2373</a>, section 2.2:</p>
-<ul><li> <a rel="mw:ExtLink" class="external text" href="http://[1080::8:800:200C:417A]">unicast</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[FF01::101]">multicast</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[::1]/">loopback</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[::]">unspecified</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[::13.1.68.3]">ipv4compat</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[::FFFF:129.144.52.38]">ipv4compat</a></li></ul>
+<ul><li><a rel="mw:ExtLink" class="external text" href="http://[1080::8:800:200C:417A]">unicast</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[FF01::101]">multicast</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[::1]/">loopback</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[::]">unspecified</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[::13.1.68.3]">ipv4compat</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[::FFFF:129.144.52.38]">ipv4compat</a></li></ul>
<p>Examples from <a href="https://tools.ietf.org/html/rfc2732" rel="mw:ExtLink" class="external text">RFC 2732</a>, section 2:</p>
-<ul><li> <a rel="mw:ExtLink" class="external text" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">1</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">2</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[3ffe:2a00:100:7031::1]">3</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[1080::8:800:200C:417A]/foo">4</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[::192.9.5.5]/ipng">5</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[::FFFF:129.144.52.38]:80/index.html">6</a></li>
-<li> <a rel="mw:ExtLink" class="external text" href="http://[2010:836B:4179::836B:4179]">7</a></li></ul>
+<ul><li><a rel="mw:ExtLink" class="external text" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">1</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">2</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[3ffe:2a00:100:7031::1]">3</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[1080::8:800:200C:417A]/foo">4</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[::192.9.5.5]/ipng">5</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[::FFFF:129.144.52.38]:80/index.html">6</a></li>
+<li><a rel="mw:ExtLink" class="external text" href="http://[2010:836B:4179::836B:4179]">7</a></li></ul>
!! end
!! test
A table with nothing but a caption
!! wikitext
{|
-|+ caption
+|+caption
|}
!! html/php
<table>
-<caption> caption
+<caption>caption
</caption><tr><td></td></tr></table>
!! html/parsoid
-<table><caption> caption</caption></table>
+<table><caption>caption</caption></table>
!! end
!! test
{|
|+ style="color: red;" | caption1
|-
-| foo
+|foo
|}
!! html
<table>
-<caption style="color: red;"> caption1
+<caption style="color: red;">caption1
</caption>
<tr>
-<td> foo
+<td>foo
</td></tr></table>
!! end
!! wikitext
{|
|+style="color: red;"|caption2
-|+ style="color: red;"| caption3
+|+ style="color: red;"|caption3
|-
-| foo
+|foo
|}
!! html
<table>
<caption style="color: red;">caption2
</caption>
-<caption style="color: red;"> caption3
+<caption style="color: red;">caption3
</caption>
<tr>
-<td> foo
+<td>foo
</td></tr></table>
!! end
Table td-cell syntax variations
!! wikitext
{|
-| foo bar foo | baz
-| foo bar foo || baz
-| style='color:red;' | baz
-| style='color:red;' || baz
+|foo bar foo|baz
+|foo bar foo||baz
+|style='color:red;'|baz
+|style='color:red;'||baz
|}
!! html
<table>
<tr>
-<td> baz
+<td>baz
</td>
-<td> foo bar foo </td>
-<td> baz
+<td>foo bar foo</td>
+<td>baz
</td>
-<td style="color:red;"> baz
+<td style="color:red;">baz
</td>
-<td> style='color:red;' </td>
-<td> baz
+<td>style='color:red;'</td>
+<td>baz
</td></tr></table>
!! end
Simple table
!! wikitext
{|
-| 1 || 2
+|1||2
|-
-| 3 || 4
+|3||4
|}
!! html
<table>
<tr>
-<td> 1 </td>
-<td> 2
+<td>1</td>
+<td>2
</td></tr>
<tr>
-<td> 3 </td>
-<td> 4
+<td>3</td>
+<td>4
</td></tr></table>
!! end
Simple table but with multiple dashes for row wikitext
!! wikitext
{|
-| foo
+|foo
|-----
-| bar
+|bar
|}
!! html
<table>
<tr>
-<td> foo
+<td>foo
</td></tr>
<tr>
-<td> bar
+<td>bar
</td></tr></table>
!! end
{| border="1" cellpadding="2"
|+Multiplication table
|-
-! × !! 1 !! 2 !! 3
+!×!!1!!2!!3
|-
-! 1
-| 1 || 2 || 3
+!1
+|1||2||3
|-
-! 2
-| 2 || 4 || 6
+!2
+|2||4||6
|-
-! 3
-| 3 || 6 || 9
+!3
+|3||6||9
|-
-! 4
-| 4 || 8 || 12
+!4
+|4||8||12
|-
-! 5
-| 5 || 10 || 15
+!5
+|5||10||15
|}
!! html
<table border="1" cellpadding="2">
<caption>Multiplication table
</caption>
<tr>
-<th> × </th>
-<th> 1 </th>
-<th> 2 </th>
-<th> 3
+<th>×</th>
+<th>1</th>
+<th>2</th>
+<th>3
</th></tr>
<tr>
-<th> 1
+<th>1
</th>
-<td> 1 </td>
-<td> 2 </td>
-<td> 3
+<td>1</td>
+<td>2</td>
+<td>3
</td></tr>
<tr>
-<th> 2
+<th>2
</th>
-<td> 2 </td>
-<td> 4 </td>
-<td> 6
+<td>2</td>
+<td>4</td>
+<td>6
</td></tr>
<tr>
-<th> 3
+<th>3
</th>
-<td> 3 </td>
-<td> 6 </td>
-<td> 9
+<td>3</td>
+<td>6</td>
+<td>9
</td></tr>
<tr>
-<th> 4
+<th>4
</th>
-<td> 4 </td>
-<td> 8 </td>
-<td> 12
+<td>4</td>
+<td>8</td>
+<td>12
</td></tr>
<tr>
-<th> 5
+<th>5
</th>
-<td> 5 </td>
-<td> 10 </td>
-<td> 15
+<td>5</td>
+<td>10</td>
+<td>15
</td></tr></table>
!! end
Accept "||" in table headings
!! wikitext
{|
-!h1 || h2
+!h1||h2
|}
!! html
<table>
<tr>
-<th>h1 </th>
-<th> h2
+<th>h1</th>
+<th>h2
</th></tr></table>
!! end
Accept "!!" in table data
!! wikitext
{|
-| Foo!! ||
+|Foo!!||
|}
!! html
<table>
<tr>
-<td> Foo!! </td>
+<td>Foo!!</td>
<td>
</td></tr></table>
Accept "||" in indented table headings
!! wikitext
:{|
-!h1 || h2
+!h1||h2
|}
!! html
<dl><dd><table>
<tr>
-<th>h1 </th>
-<th> h2
+<th>h1</th>
+<th>h2
</th></tr></table></dd></dl>
!! end
!! html
<table>
<tr>
-<th> h1
+<th>h1
</th>
-<td> a
+<td>a
</td></tr></table>
!! end
!! wikitext
{|
|-
-| !style="color:red" | bar
+|!style="color:red"|bar
|}
!! html
<table>
<tr>
-<td> bar
+<td>bar
</td></tr></table>
!!end
|style='color:red;'|+1
|style='color:blue;'|-1
|-
-| 1 || 2 || 3
-| 1 ||+2 ||-3
+|1||2||3
+|1||+2||-3
|-
| +1
| -1
<td style="color:blue;">-1
</td></tr>
<tr>
-<td> 1 </td>
-<td> 2 </td>
-<td> 3
+<td>1</td>
+<td>2</td>
+<td>3
</td>
-<td> 1 </td>
-<td>+2 </td>
+<td>1</td>
+<td>+2</td>
<td>-3
</td></tr>
<tr>
-<td> +1
+<td>+1
</td>
-<td> -1
+<td>-1
</td></tr></table>
!!end
Table rowspan
!! wikitext
{| border=1
-| Cell 1, row 1
-|rowspan=2| Cell 2, row 1 (and 2)
-| Cell 3, row 1
+|Cell 1, row 1
+|rowspan=2|Cell 2, row 1 (and 2)
+|Cell 3, row 1
|-
-| Cell 1, row 2
-| Cell 3, row 2
+|Cell 1, row 2
+|Cell 3, row 2
|}
!! html
<table border="1">
<tr>
-<td> Cell 1, row 1
+<td>Cell 1, row 1
</td>
-<td rowspan="2"> Cell 2, row 1 (and 2)
+<td rowspan="2">Cell 2, row 1 (and 2)
</td>
-<td> Cell 3, row 1
+<td>Cell 3, row 1
</td></tr>
<tr>
-<td> Cell 1, row 2
+<td>Cell 1, row 2
</td>
-<td> Cell 3, row 2
+<td>Cell 3, row 2
</td></tr></table>
!! end
!! html
<table border="1">
<tr>
-<td> α
+<td>α
</td>
<td>
<table bgcolor="#ABCDEF" border="2">
</td>
<td title="foo|">bar
</td>
-<td> title="foo|" bar
+<td>title="foo|" bar
</td></tr></table>
!! html/parsoid
Element attributes with double ! should not be broken up by <th>
!! wikitext
{|
-! hi <div class="!!">ha</div> ho
+!hi <div class="!!">ha</div> ho
|}
!! html/php
<table>
<tr>
-<th> hi <div class="!!">ha</div> ho
+<th>hi <div class="!!">ha</div> ho
</th></tr></table>
!! html/parsoid
<table>
-<tbody><tr><th> hi <div class="!!" data-parsoid='{"stx":"html"}'>ha</div> ho</th></tr>
+<tbody><tr><th>hi <div class="!!" data-parsoid='{"stx":"html"}'>ha</div> ho</th></tr>
</tbody></table>
!! end
! and || in element attributes should not be parsed as <th>/<td>
!! wikitext
{|
-| <div style="color: red !important;" data-contrived="put this here ||">hi</div>
+|<div style="color: red !important;" data-contrived="put this here ||">hi</div>
|}
!! html/php
<table>
<tr>
-<td> <div style="color: red !important;" data-contrived="put this here ||">hi</div>
+<td><div style="color: red !important;" data-contrived="put this here ||">hi</div>
</td></tr></table>
!! html/parsoid
<table>
-<tbody><tr><td> <div style="color: red !important;" data-contrived="put this here ||" data-parsoid='{"stx":"html"}'>hi</div></td></tr>
+<tbody><tr><td><div style="color: red !important;" data-contrived="put this here ||" data-parsoid='{"stx":"html"}'>hi</div></td></tr>
</tbody></table>
!! end
parsoid=wt2html
!! wikitext
{|
-| style="color: red !important;" data-contrived="put this here ||" | foo
+|style="color: red !important;" data-contrived="put this here ||"|foo
|}
!! html/php
<table>
<tr>
-<td> style="color: red !important;" data-contrived="put this here </td>
-<td> foo
+<td>style="color: red !important;" data-contrived="put this here</td>
+<td>foo
</td></tr></table>
!! html/parsoid
<table>
-<tbody><tr><td> style="color: red !important;" data-contrived="put this here </td><td data-parsoid='{"stx":"row","a":{"\"":null},"sa":{"\"":""},"autoInsertedEnd":true}'> foo</td></tr>
+<tbody><tr><td>style="color: red !important;" data-contrived="put this here</td><td data-parsoid='{"stx":"row","a":{"\"":null},"sa":{"\"":""},"autoInsertedEnd":true}'>foo</td></tr>
</tbody></table>
!! end
parsoid=wt2html
!! wikitext
{| <span>boo</span> style='border:1px solid black'
-| <span>boo</span> style='color:blue' | 1
-|<span>boo</span> style='color:blue'| 2
+| <span>boo</span> style='color:blue' |1
+|<span>boo</span> style='color:blue'|2
|}
!! html/php
<table style="border:1px solid black">
<tr>
-<td style="color:blue"> 1
+<td style="color:blue">1
</td>
-<td style="color:blue"> 2
+<td style="color:blue">2
</td></tr></table>
!! html/parsoid
<table style="border:1px solid black">
<tr>
-<td style="color:blue"> 1</td>
-<td style="color:blue"> 2</td>
+<td style="color:blue">1</td>
+<td style="color:blue">2</td>
</tr>
</table>
!! end
</td>
<td style="color:red;">Foo
</td>
-<td> style="color:red;"</td>
+<td>style="color:red;"</td>
<td>Bar
</td>
<td style="color:red;">Foo
{|
|-
-! foo
+!foo
|}
!! html/*
<table>
<tr>
-<th> foo
+<th>foo
</th></tr></table>
!! end
{|
|-
-| foo
+|foo
|}
!! html/*
<table>
<tr>
-<td> foo
+<td>foo
</td></tr></table>
!! end
parsoid=wt2html,html2html
!! wikitext
{|
-| style=| hello
+| style=|hello
|}
!! html/php
<table>
<tr>
-<td style=""> hello
+<td style="">hello
</td></tr></table>
!! html/parsoid
<table>
-<tbody><tr><td style=""> hello</td></tr>
+<tbody><tr><td style="">hello</td></tr>
</tbody></table>
!! end
!! wikitext
{|
<!-- c0 -->
-| foo
+|foo
<!-- c1 -->
|-<!-- c2 -->
<!-- c3 -->
!! html
<table>
<tr>
-<td> foo
+<td>foo
</td></tr>
<tr>
<td>
!! wikitext
{|<!--c1--><!--c2-->
|-<!--c3-->
-| x
+|x
|}
!! html/php+tidy
<table>
<tbody><tr>
-<td> x
+<td>x
</td></tr></tbody></table>
!! html/parsoid
<table><!--c1--><!--c2-->
<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'><!--c3-->
-<td data-parsoid='{"autoInsertedEnd":true}'> x</td></tr>
+<td data-parsoid='{"autoInsertedEnd":true}'>x</td></tr>
</tbody></table>
!! end
!! wikitext
{|
| <!-- c1 -->
-| a
+|a
|}
!! html
<table>
<tr>
<td>
</td>
-<td> a
+<td>a
</td></tr></table>
!! end
{|
|a
<!--c1-->
-<!--c2-->| b
+<!--c2-->|b
|}
!! html
<table>
<tr>
<td>a
</td>
-<td> b
+<td>b
</td></tr></table>
!! html/parsoid
<table>
<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'>a</td>
<!--c1-->
-<!--c2--><td data-parsoid='{"autoInsertedEnd":true}'> b</td></tr>
+<!--c2--><td data-parsoid='{"autoInsertedEnd":true}'>b</td></tr>
</tbody></table>
!! end
Build table with {{!}}
!! wikitext
{{{!}} class="wikitable"
-! header
-! second header
+!header
+!second header
{{!}}- style="color:red;"
-{{!}} data {{!}}{{!}} style="color:red;" {{!}} second data
+{{!}}data{{!}}{{!}} style="color:red;" {{!}}second data
{{!}}}
!! html
<table class="wikitable">
<tr>
-<th> header
+<th>header
</th>
-<th> second header
+<th>second header
</th></tr>
<tr style="color:red;">
-<td> data </td>
-<td style="color:red;"> second data
+<td>data</td>
+<td style="color:red;">second data
</td></tr></table>
!! end
Build table with pipe as data
!! wikitext
{| class="wikitable"
-! header
-! second header
+!header
+!second header
|- style="color:red;"
-| data || style="color:red;" | second data
+|data|| style="color:red;" |second data
|-
-| style="color:red;" | data with | || style="color:red;" | second data with |
+| style="color:red;" |data with | || style="color:red;" | second data with |
|-
-|| data with | ||| second data with |
+||data with | |||second data with |
|}
!! html
<table class="wikitable">
<tr>
-<th> header
+<th>header
</th>
-<th> second header
+<th>second header
</th></tr>
<tr style="color:red;">
-<td> data </td>
-<td style="color:red;"> second data
+<td>data</td>
+<td style="color:red;">second data
</td></tr>
<tr>
-<td style="color:red;"> data with | </td>
-<td style="color:red;"> second data with |
+<td style="color:red;">data with |</td>
+<td style="color:red;">second data with |
</td></tr>
<tr>
-<td> data with | </td>
-<td> second data with |
+<td>data with |</td>
+<td>second data with |
</td></tr></table>
!! end
Build table with wikilink
!! wikitext
{| class="wikitable"
-! header || second header
+!header||second header
|- style="color:red;"
-| data [[Main Page|linktext]] || second data [[Main Page|linktext]]
+|data [[Main Page|linktext]]||second data [[Main Page|linktext]]
|-
-| data || second data [[Main Page|link|text with pipe]]
+|data||second data [[Main Page|link|text with pipe]]
|}
!! html
<table class="wikitable">
<tr>
-<th> header </th>
-<th> second header
+<th>header</th>
+<th>second header
</th></tr>
<tr style="color:red;">
-<td> data <a href="/wiki/Main_Page" title="Main Page">linktext</a> </td>
-<td> second data <a href="/wiki/Main_Page" title="Main Page">linktext</a>
+<td>data <a href="/wiki/Main_Page" title="Main Page">linktext</a></td>
+<td>second data <a href="/wiki/Main_Page" title="Main Page">linktext</a>
</td></tr>
<tr>
-<td> data </td>
-<td> second data <a href="/wiki/Main_Page" title="Main Page">link|text with pipe</a>
+<td>data</td>
+<td>second data <a href="/wiki/Main_Page" title="Main Page">link|text with pipe</a>
</td></tr></table>
!! end
!! wikitext
{|
|-
-{{table_attribs_4}} || a || b
+{{table_attribs_4}} ||a||b
|}
!! html/php+tidy
<table>
<tbody><tr>
-<td style="background-color:#DC241f;" width="10px"> </td>
-<td> a </td>
-<td> b
+<td style="background-color:#DC241f;" width="10px"></td>
+<td>a</td>
+<td>b
</td></tr></tbody></table>
!! html/parsoid
<table>
<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
-<td style="background-color:#DC241f;" width="10px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"table_attribs_4","href":"./Template:Table_attribs_4"},"params":{},"i":0}}," || a || b"]}'> </td><td about="#mwt1"> a </td><td about="#mwt1"> b</td></tr>
+<td style="background-color:#DC241f;" width="10px" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"table_attribs_4","href":"./Template:Table_attribs_4"},"params":{},"i":0}}," ||a||b"]}'></td><td about="#mwt1">a</td><td about="#mwt1">b</td></tr>
!! end
!! test
parsoid=wt2html,wt2wt
!! wikitext
{|
-! foo || bar
-<!-- foo --> || baz || quux
+!foo||bar
+<!-- foo --> ||baz||quux
|}
!! html/php
<table>
<tr>
-<th> foo </th>
-<th> bar
+<th>foo</th>
+<th>bar
</th>
-<td> baz </td>
-<td> quux
+<td>baz</td>
+<td>quux
</td></tr></table>
!! html/parsoid
!! options
parsoid=wt2html
!! wikitext
-#REDIRECT [[Main Page]]<!-- haha -->== hi ==
+#REDIRECT [[Main Page]]<!-- haha -->==hi==
!! html/parsoid
-<link rel="mw:PageProp/redirect" href="./Main_Page"/><!-- haha --><h2 id="hi"> hi </h2>
+<link rel="mw:PageProp/redirect" href="./Main_Page"/><!-- haha --><h2 id="hi">hi</h2>
!! end
!! test
Common list
!! wikitext
*Common list
-* item 2
+*item 2
*item 3
!! html
<ul><li>Common list</li>
-<li> item 2</li>
+<li>item 2</li>
<li>item 3</li></ul>
!! end
!! wikitext
#Numbered list
#item 2
-# item 3
+#item 3
!! html
<ol><li>Numbered list</li>
<li>item 2</li>
-<li> item 3</li></ol>
+<li>item 3</li></ol>
!! end
Mixed list
!! wikitext
*Mixed list
-*# with numbers
-** and bullets
-*# and numbers
+*#with numbers
+**and bullets
+*#and numbers
*bullets again
**bullet level 2
***bullet level 3
**#Number on level 3
*#number level 2
*Level 1
-*** Level 3
-#** Level 3, but ordered
+***Level 3
+#**Level 3, but ordered
!! html
<ul><li>Mixed list
-<ol><li> with numbers</li></ol>
-<ul><li> and bullets</li></ul>
-<ol><li> and numbers</li></ol></li>
+<ol><li>with numbers</li></ol>
+<ul><li>and bullets</li></ul>
+<ol><li>and numbers</li></ol></li>
<li>bullets again
<ul><li>bullet level 2
<ul><li>bullet level 3
<li>Number on level 3</li></ol></li></ul>
<ol><li>number level 2</li></ol></li>
<li>Level 1
-<ul><li><ul><li> Level 3</li></ul></li></ul></li></ul>
-<ol><li><ul><li><ul><li> Level 3, but ordered</li></ul></li></ul></li></ol>
+<ul><li><ul><li>Level 3</li></ul></li></ul></li></ul>
+<ol><li><ul><li><ul><li>Level 3, but ordered</li></ul></li></ul></li></ol>
!! end
!! test
1. Nested mixed wikitext and html list
!! wikitext
-* hi
-* <ul><li>ho</li></ul>
-* hi
-** ho
+*hi
+*<ul><li>ho</li></ul>
+*hi
+**ho
!! html/php
-<ul><li> hi</li>
-<li> <ul><li>ho</li></ul></li>
-<li> hi
-<ul><li> ho</li></ul></li></ul>
+<ul><li>hi</li>
+<li><ul><li>ho</li></ul></li>
+<li>hi
+<ul><li>ho</li></ul></li></ul>
!! html/parsoid
-<ul><li> hi</li>
-<li> <ul data-parsoid='{"stx":"html"}'><li data-parsoid='{"stx":"html"}'>ho</li></ul></li>
-<li> hi
-<ul><li> ho</li></ul></li></ul>
+<ul><li>hi</li>
+<li><ul data-parsoid='{"stx":"html"}'><li data-parsoid='{"stx":"html"}'>ho</li></ul></li>
+<li>hi
+<ul><li>ho</li></ul></li></ul>
!! end
!! test
2. Nested mixed wikitext and html list (incompatible)
!! wikitext
-; hi
-: {{echo|<li>ho</li>}}
+;hi
+:{{echo|<li>ho</li>}}
!! html/php
-<dl><dt> hi</dt>
-<dd> <li>ho</li></dd></dl>
+<dl><dt>hi</dt>
+<dd><li>ho</li></dd></dl>
!! html/parsoid
-<dl><dt> hi</dt>
-<dd> <li about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>ho</li>"}},"i":0}}]}'>ho</li></dd></dl>
+<dl><dt>hi</dt>
+<dd><li about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>ho</li>"}},"i":0}}]}'>ho</li></dd></dl>
!! end
!! test
!! test
Nested lists 7 (skip initial nesting levels)
!! wikitext
-*** foo
+***foo
!! html
-<ul><li><ul><li><ul><li> foo</li></ul></li></ul></li></ul>
+<ul><li><ul><li><ul><li>foo</li></ul></li></ul></li></ul>
!! end
!! test
Nested lists 8 (multiple nesting transitions)
!! wikitext
-* foo
-*** bar
-** baz
-* boo
+*foo
+***bar
+**baz
+*boo
!! html
-<ul><li> foo
-<ul><li><ul><li> bar</li></ul></li>
-<li> baz</li></ul></li>
-<li> boo</li></ul>
+<ul><li>foo
+<ul><li><ul><li>bar</li></ul></li>
+<li>baz</li></ul></li>
+<li>boo</li></ul>
!! end
!! test
List items are not parsed correctly following a <pre> block (T2785)
!! wikitext
-* <pre>foo</pre>
-* <pre>bar</pre>
-* zar
+*<pre>foo</pre>
+*<pre>bar</pre>
+*zar
!! html/php
-<ul><li> <pre>foo</pre></li>
-<li> <pre>bar</pre></li>
-<li> zar</li></ul>
+<ul><li><pre>foo</pre></li>
+<li><pre>bar</pre></li>
+<li>zar</li></ul>
!! html/parsoid
-<ul><li> <pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre></li>
-<li> <pre typeof="mw:Extension/pre" about="#mwt4" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"bar"}}'>bar</pre></li>
-<li> zar</li></ul>
+<ul><li><pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre></li>
+<li><pre typeof="mw:Extension/pre" about="#mwt4" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"bar"}}'>bar</pre></li>
+<li>zar</li></ul>
!! end
+# FIXME: Might benefit from a html/parsoid since this has a template
!! test
List items from template
!! wikitext
{{inner list}}
-* item 2
+*item 2
-* item 0
+*item 0
{{inner list}}
-* item 2
+*item 2
-* item 0
-* notSOL{{inner list}}
-* item 2
+*item 0
+*notSOL{{inner list}}
+*item 2
!! html
-<ul><li> item 1</li>
-<li> item 2</li></ul>
-<ul><li> item 0</li>
-<li> item 1</li>
-<li> item 2</li></ul>
-<ul><li> item 0</li>
-<li> notSOL</li>
-<li> item 1</li>
-<li> item 2</li></ul>
+<ul><li>item 1</li>
+<li>item 2</li></ul>
+<ul><li>item 0</li>
+<li>item 1</li>
+<li>item 2</li></ul>
+<ul><li>item 0</li>
+<li>notSOL</li>
+<li>item 1</li>
+<li>item 2</li></ul>
!! end
!! test
List interrupted by empty line or heading
!! wikitext
-* foo
+*foo
-** bar
-== A heading ==
-* Another list item
+**bar
+==A heading==
+*Another list item
!! html
-<ul><li> foo</li></ul>
-<ul><li><ul><li> bar</li></ul></li></ul>
+<ul><li>foo</li></ul>
+<ul><li><ul><li>bar</li></ul></li></ul>
<h2><span class="mw-headline" id="A_heading">A heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<ul><li> Another list item</li></ul>
+<ul><li>Another list item</li></ul>
!!end
</li><li>b
</li><li>c
</li>
+!! html/parsoid
+<li about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[0,44,null,null],"pi":[[{"k":"1"}],[{"k":"1"}],[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>"}},"i":0}},"a\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>"}},"i":1}},"b\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>"}},"i":2}},"c"]}'>a
+</li><li about="#mwt1">b
+</li><li about="#mwt1" data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[null,44,null,0]}'>c</li>
!!end
!!test
!!options
parsoid=wt2html,wt2wt
!! wikitext
-* foo
-* <li>li-hack
-* {{echo|<li>templated li-hack}}
-* <!--foo--> <li> unsupported li-hack with preceding comments
+*foo
+*<li>li-hack
+*{{echo|<li>templated li-hack}}
+*<!--foo--><li> unsupported li-hack with preceding comments
<ul>
<li><li>not a li-hack
</li>
</ul>
!! html+tidy
-<ul><li> foo</li>
-<li class="mw-empty-elt"> </li><li>li-hack</li>
-<li class="mw-empty-elt"> </li><li>templated li-hack</li>
-<li class="mw-empty-elt"> </li><li> unsupported li-hack with preceding comments</li></ul>
+<ul><li>foo</li>
+<li class="mw-empty-elt"></li><li>li-hack</li>
+<li class="mw-empty-elt"></li><li>templated li-hack</li>
+<li class="mw-empty-elt"></li><li> unsupported li-hack with preceding comments</li></ul>
<ul>
<li class="mw-empty-elt"></li><li>not a li-hack
</li>
</ul>
!! html/parsoid
<ul><li> foo</li>
-<li data-parsoid='{"stx":"html","autoInsertedEnd":true,"liHackSrc":"* "}'>li-hack</li>
-<li about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","autoInsertedEnd":true,,"pi":[[{"k":"1"}]]}' data-mw='{"parts":["* ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}},"i":0}}]}'>templated li-hack</li>
-<li data-parsoid='{"autoInsertedEnd":true}'> <!--foo--> </li><li data-parsoid='{"stx":"html","autoInsertedEnd":true}'> unsupported li-hack with preceding comments</li></ul>
+<li data-parsoid='{"stx":"html","autoInsertedEnd":true,"liHackSrc":"*"}'>li-hack</li>
+<li about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","autoInsertedEnd":true,,"pi":[[{"k":"1"}]]}' data-mw='{"parts":["*",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}},"i":0}}]}'>templated li-hack</li>
+<li data-parsoid='{"autoInsertedEnd":true}'><!--foo--></li><li data-parsoid='{"stx":"html","autoInsertedEnd":true}'>unsupported li-hack with preceding comments</li></ul>
<ul data-parsoid='{"stx":"html"}'>
<li class="mw-empty-elt" data-parsoid='{"stx":"html","autoInsertedEnd":true}'></li><li data-parsoid='{"stx":"html"}'>not a li-hack
!! options
parsoid
!! wikitext
-# foo
-## bar
-* foo
-** bar
-: foo
-:: bar
+#foo
+##bar
+*foo
+**bar
+:foo
+::bar
!! html
<ol>
-<li> foo<ol>
-<li> bar</li>
+<li>foo<ol>
+<li>bar</li>
</ol></li>
</ol><ul>
-<li> foo<ul>
-<li> bar</li>
+<li>foo<ul>
+<li>bar</li>
</ul></li>
</ul><dl>
-<dd> foo<dl>
-<dd> bar</dd>
+<dd>foo<dl>
+<dd>bar</dd>
</dl></dd>
</dl>
!! end
<div>
<ul><li>a</li></ul></div><div>
<li>b</li></div>
-!! html+parsoid
+!! html/parsoid
<div><ul>
<li>a</li>
</ul></div>
!! options
parsoid=wt2html,wt2wt,html2html
!! wikitext
-# <s> a
-# b </s>
+#<s> a
+#b </s>
!! html/php+tidy
-<ol><li> <s> a</s></li><s>
-</s><li><s> b </s></li></ol>
+<ol><li><s> a</s></li><s>
+</s><li><s>b </s></li></ol>
!! html/parsoid
-<ol><li> <s> a</s><s></s></li>
-<li><s> b </s></li></ol>
+<ol><li><s> a</s></li>
+<li><s>b </s></li></ol>
!! end
# Output is ugly because of all the misnested tag fixups.
1. List embedded in a formatting tag
!! wikitext
<small>
-* foo
+*foo
</small>
!! html/php+tidy
<p><small>
-</small></p><small><ul><li> foo</li></ul></small><small></small><p><small></small>
+</small></p><small><ul><li>foo</li></ul></small><small></small><p><small></small>
</p>
!! html/parsoid
<small>
<ul>
-<li> foo</li>
+<li>foo</li>
</ul>
</small>
!!end
!! test
Magic Words LOCAL (UTC)
!! wikitext
-* {{LOCALMONTH}}
-* {{LOCALMONTH1}}
-* {{LOCALMONTHNAME}}
-* {{LOCALMONTHNAMEGEN}}
-* {{LOCALMONTHABBREV}}
-* {{LOCALDAY}}
-* {{LOCALDAY2}}
-* {{LOCALDAYNAME}}
-* {{LOCALYEAR}}
-* {{LOCALTIME}}
-* {{LOCALHOUR}}
-* {{LOCALWEEK}}
-* {{LOCALDOW}}
-* {{LOCALTIMESTAMP}}
-!! html
-<ul><li> 01</li>
-<li> 1</li>
-<li> January</li>
-<li> January</li>
-<li> Jan</li>
-<li> 1</li>
-<li> 01</li>
-<li> Thursday</li>
-<li> 1970</li>
-<li> 00:02</li>
-<li> 00</li>
-<li> 1</li>
-<li> 4</li>
-<li> 19700101000203</li></ul>
+*{{LOCALMONTH}}
+*{{LOCALMONTH1}}
+*{{LOCALMONTHNAME}}
+*{{LOCALMONTHNAMEGEN}}
+*{{LOCALMONTHABBREV}}
+*{{LOCALDAY}}
+*{{LOCALDAY2}}
+*{{LOCALDAYNAME}}
+*{{LOCALYEAR}}
+*{{LOCALTIME}}
+*{{LOCALHOUR}}
+*{{LOCALWEEK}}
+*{{LOCALDOW}}
+*{{LOCALTIMESTAMP}}
+!! html
+<ul><li>01</li>
+<li>1</li>
+<li>January</li>
+<li>January</li>
+<li>Jan</li>
+<li>1</li>
+<li>01</li>
+<li>Thursday</li>
+<li>1970</li>
+<li>00:02</li>
+<li>00</li>
+<li>1</li>
+<li>4</li>
+<li>19700101000203</li></ul>
!! end
!! html
<p>foo
</p>
-<ul><li> item 1</li></ul>
+<ul><li>item 1</li></ul>
!! html/parsoid
<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|echo}}","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
-<ul about="#mwt4" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|inner list}} ","href":"./Template:Inner_list"},"params":{},"i":0}}]}'><li> item 1</li></ul>
+<ul about="#mwt4" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|inner list}} ","href":"./Template:Inner_list"},"params":{},"i":0}}]}'><li>item 1</li></ul>
!! end
## Regression test; the output here isn't really that interesting.
Abort table cell attribute parsing on wikilink
!! wikitext
{|
-| testing [[one|two]] | three || four
-| testing one two | three || four
-| testing="[[one|two]]" | three || four
+|testing [[one|two]] |three||four
+|testing one two |three||four
+|testing="[[one|two]]" |three||four
|}
!! html/php
<table>
<tr>
-<td> testing <a href="/index.php?title=One&action=edit&redlink=1" class="new" title="One (page does not exist)">two</a> | three </td>
-<td> four
+<td>testing <a href="/index.php?title=One&action=edit&redlink=1" class="new" title="One (page does not exist)">two</a> |three</td>
+<td>four
</td>
-<td> three </td>
-<td> four
+<td>three</td>
+<td>four
</td>
-<td> testing="<a href="/index.php?title=One&action=edit&redlink=1" class="new" title="One (page does not exist)">two</a>" | three </td>
-<td> four
+<td>testing="<a href="/index.php?title=One&action=edit&redlink=1" class="new" title="One (page does not exist)">two</a>" |three</td>
+<td>four
</td></tr></table>
!! html/parsoid
<table>
-<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'> testing <a rel="mw:WikiLink" href="./One" title="One" data-parsoid='{"stx":"piped","a":{"href":"./One"},"sa":{"href":"one"}}'>two</a> | three </td><td data-parsoid='{"stx":"row","autoInsertedEnd":true}'> four</td>
-<td data-parsoid='{"a":{"testing":null,"one":null,"two":null},"sa":{"testing":"","one":"","two":""},"autoInsertedEnd":true}'> three </td><td data-parsoid='{"stx":"row","autoInsertedEnd":true}'> four</td>
-<td> testing="<a rel="mw:WikiLink" href="./One" title="One" data-parsoid='{"stx":"piped","a":{"href":"./One"},"sa":{"href":"one"}}'>two</a>" | three </td><td data-parsoid='{"stx":"row","autoInsertedEnd":true}'> four</td></tr>
+<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'>testing <a rel="mw:WikiLink" href="./One" title="One" data-parsoid='{"stx":"piped","a":{"href":"./One"},"sa":{"href":"one"}}'>two</a> |three</td><td data-parsoid='{"stx":"row","autoInsertedEnd":true}'>four</td>
+<td data-parsoid='{"a":{"testing":null,"one":null,"two":null},"sa":{"testing":"","one":"","two":""},"autoInsertedEnd":true}'>three</td><td data-parsoid='{"stx":"row","autoInsertedEnd":true}'>four</td>
+<td>testing="<a rel="mw:WikiLink" href="./One" title="One" data-parsoid='{"stx":"piped","a":{"href":"./One"},"sa":{"href":"one"}}'>two</a>" |three</td><td data-parsoid='{"stx":"row","autoInsertedEnd":true}'>four</td></tr>
</tbody></table>
!! end
Don't abort table cell attribute parsing if wikilink is found in template arg
!! wikitext
{|
-| Test {{#tag:ref|One two "[[three]]" four}}
+|Test {{#tag:ref|One two "[[three]]" four}}
|}
!! html/parsoid
<table>
-<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
+<tbody><tr><td>Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
</tbody></table>
!! end
</p>
<table>
<tr>
-<td> 1 </td>
-<td> 2
+<td>1</td>
+<td>2
</td></tr>
<tr>
-<td> 3 </td>
-<td> 4
+<td>3</td>
+<td>4
</td></tr></table>
!! end
</p>
<table>
<tr>
-<td> 1 </td>
-<td> 2
+<td>1</td>
+<td>2
</td></tr>
<tr>
-<td> 3 </td>
-<td> 4
+<td>3</td>
+<td>4
</td></tr></table>
!! end
!! options
parsoid=wt2html,html2html
!! wikitext
-<!-- comment --><noinclude><!-- comment --></noinclude><!-- comment -->== hu ==
+<!-- comment --><noinclude><!-- comment --></noinclude><!-- comment -->==hu==
<noinclude>
some
-</noinclude>* stuff
-* here
+</noinclude>*stuff
+*here
-<includeonly>can have stuff</includeonly>=== here ===
+<includeonly>can have stuff</includeonly>===here===
!! html/php
<h2><span class="mw-headline" id="hu">hu</span></h2>
<p>some
</p>
-<ul><li> stuff</li>
-<li> here</li></ul>
+<ul><li>stuff</li>
+<li>here</li></ul>
<h3><span class="mw-headline" id="here">here</span></h3>
!! html/parsoid
-<!-- comment --><meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"<noinclude>"}'/><!-- comment --><meta typeof="mw:Includes/NoInclude/End" data-parsoid='{"src":"</noinclude>"}'/><!-- comment --><h2 id="hu"> hu </h2>
+<!-- comment --><meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"<noinclude>"}'/><!-- comment --><meta typeof="mw:Includes/NoInclude/End" data-parsoid='{"src":"</noinclude>"}'/><!-- comment --><h2 id="hu">hu</h2>
<meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"<noinclude>"}'/>
<p>some</p>
-<meta typeof="mw:Includes/NoInclude/End" data-parsoid='{"src":"</noinclude>"}'/><ul><li> stuff</li>
-<li> here</li></ul>
+<meta typeof="mw:Includes/NoInclude/End" data-parsoid='{"src":"</noinclude>"}'/><ul><li>stuff</li>
+<li>here</li></ul>
-<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"<includeonly>can have stuff</includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><h3 id="here"> here </h3>
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"<includeonly>can have stuff</includeonly>"}'/><meta typeof="mw:Includes/IncludeOnly/End" data-parsoid='{"src":""}'/><h3 id="here">here</h3>
!! end
!! wikitext
{{Precedence5|Bullet}}
!! html/php
-<ul><li> Bar</li></ul>
+<ul><li>Bar</li></ul>
!! html/parsoid
-<ul typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Precedence5","href":"./Template:Precedence5"},"params":{"1":{"wt":"Bullet"}},"i":0}}]}'><li> Bar</li></ul>
+<ul typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Precedence5","href":"./Template:Precedence5"},"params":{"1":{"wt":"Bullet"}},"i":0}}]}'><li>Bar</li></ul>
!! end
!! test
{{Preprocessor precedence 9|Four|Bullet|1|2}}
!! html/php
<dl><dt>4</dt>
-<dd> {Four}</dd>
+<dd>{Four}</dd>
<dt>5</dt>
-<dd> </dd></dl>
-<ul><li> Bar</li></ul>
+<dd></dd></dl>
+<ul><li>Bar</li></ul>
<dl><dt>6</dt>
-<dd> Four</dd>
+<dd>Four</dd>
<dt>7</dt>
-<dd> {Bullet}</dd></dl>
+<dd>{Bullet}</dd></dl>
!! html/parsoid
<dl about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Preprocessor precedence 9","href":"./Template:Preprocessor_precedence_9"},"params":{"1":{"wt":"Four"},"2":{"wt":"Bullet"},"3":{"wt":"1"},"4":{"wt":"2"}},"i":0}}]}'>
{{Preprocessor precedence 10|Three|raw2|Bullet|1|2}}
!! html/php
<dl><dt>1</dt>
-<dd> raw</dd>
+<dd>raw</dd>
<dt>2</dt>
-<dd> -</dd></dl>
-<ul><li> Bar-</li></ul>
+<dd>-</dd></dl>
+<ul><li>Bar-</li></ul>
<dl><dt>3</dt>
-<dd> -Three-</dd>
+<dd>-Three-</dd>
<dt>4</dt>
-<dd> raw2</dd>
+<dd>raw2</dd>
<dt>5</dt>
-<dd> -</dd></dl>
-<ul><li> Bar-</li></ul>
+<dd>-</dd></dl>
+<ul><li>Bar-</li></ul>
<dl><dt>6</dt>
-<dd> -Three-</dd>
+<dd>-Three-</dd>
<dt>7</dt>
-<dd> raw2</dd></dl>
+<dd>raw2</dd></dl>
!! html/parsoid
<dl about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Preprocessor precedence 10","href":"./Template:Preprocessor_precedence_10"},"params":{"1":{"wt":"Three"},"2":{"wt":"raw2"},"3":{"wt":"Bullet"},"4":{"wt":"1"},"5":{"wt":"2"}},"i":0}}]}'>
parsoid=wt2html
!! wikitext
This form breaks the template, which is unfortunate:
-* {{echo|foo-{bar}bat}}
+*{{echo|foo-{bar}bat}}
But if the broken language converter markup is inside an extension
tag, nothing bad happens:
-* <nowiki>foo-{bar}bat</nowiki>
-* {{echo|<nowiki>foo-{bar}bat</nowiki>}}
-* <pre>foo-{bar}bat</pre>
-* {{echo|<pre>foo-{bar}bat</pre>}}
+*<nowiki>foo-{bar}bat</nowiki>
+*{{echo|<nowiki>foo-{bar}bat</nowiki>}}
+*<pre>foo-{bar}bat</pre>
+*{{echo|<pre>foo-{bar}bat</pre>}}
<tag>foo-{bar}bat</tag>
{{echo|<tag>foo-{bar}bat</tag>}}
!! html/php+tidy
<p>This form breaks the template, which is unfortunate:
</p>
-<ul><li> {{echo|foo-{bar}bat}}</li></ul>
+<ul><li>{{echo|foo-{bar}bat}}</li></ul>
<p>But if the broken language converter markup is inside an extension
tag, nothing bad happens:
</p>
-<ul><li> foo-{bar}bat</li>
-<li> foo-{bar}bat</li>
-<li> <pre>foo-{bar}bat</pre></li>
-<li> <pre>foo-{bar}bat</pre></li></ul>
+<ul><li>foo-{bar}bat</li>
+<li>foo-{bar}bat</li>
+<li><pre>foo-{bar}bat</pre></li>
+<li><pre>foo-{bar}bat</pre></li></ul>
<pre>'foo-{bar}bat'
array (
)
!! options
parsoid=wt2html
!! wikitext
-* [http://example.com/-{foo Example in URL]
-* [http://example.com Example in -{link} description]
-* {{echo|[http://example.com/-{foo Breaks template, however]}}
+*[http://example.com/-{foo Example in URL]
+*[http://example.com Example in -{link} description]
+*{{echo|[http://example.com/-{foo Breaks template, however]}}
!! html/php+tidy
-<ul><li> <a rel="nofollow" class="external text" href="http://example.com/-{foo">Example in URL</a></li>
-<li> <a rel="nofollow" class="external text" href="http://example.com">Example in -{link} description</a></li>
-<li> {{echo|<a rel="nofollow" class="external text" href="http://example.com/-{foo">Breaks template, however</a>}}</li></ul>
+<ul><li><a rel="nofollow" class="external text" href="http://example.com/-{foo">Example in URL</a></li>
+<li><a rel="nofollow" class="external text" href="http://example.com">Example in -{link} description</a></li>
+<li>{{echo|<a rel="nofollow" class="external text" href="http://example.com/-{foo">Breaks template, however</a>}}</li></ul>
!! html/parsoid
<ul>
<li><a rel="mw:ExtLink" class="external text" href="http://example.com/-{foo">Example in URL</a></li>
!! test
Preprocessor precedence 14: broken language converter in comment
!! wikitext
-* <!--{{foo}}--> ...should be ok
-* <!---{{foo}}--> ...extra dashes
-* {{echo|foo<!-- -{bar} -->bat}} ...should be ok
+*<!--{{foo}}-->...should be ok
+*<!---{{foo}}-->...extra dashes
+*{{echo|foo<!-- -{bar} -->bat}}...should be ok
!! html/php+tidy
-<ul><li> ...should be ok</li>
-<li> ...extra dashes</li>
-<li> foobat ...should be ok</li></ul>
+<ul><li>...should be ok</li>
+<li>...extra dashes</li>
+<li>foobat...should be ok</li></ul>
!! html/parsoid
<ul>
-<li><!--{{foo}}--> ...should be ok</li>
-<li><!---{{foo}}--> ...extra dashes</li>
-<li><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<!-- -{bar} -->bat"}},"i":0}}]}'>foo</span><span about="#mwt1"><!-- -{bar} --></span><span about="#mwt1">bat</span> ...should be ok</li>
+<li><!--{{foo}}-->...should be ok</li>
+<li><!---{{foo}}-->...extra dashes</li>
+<li><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<!-- -{bar} -->bat"}},"i":0}}]}'>foo</span><span about="#mwt1"><!-- -{bar} --></span><span about="#mwt1">bat</span>...should be ok</li>
</ul>
!! end
4. Entities and nowikis inside templated attributes should be handled correctly inside templated tables
!! wikitext
{|
-| {{table_attribs_6}} hi
+|{{table_attribs_6}} hi
|}
!! html/php
<table>
<tr>
-<td style="background: red;"> hi
+<td style="background: red;">hi
</td></tr></table>
!! html/parsoid
<table>
-<tbody><tr><td style="background: red;" typeof="mw:Transclusion" about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":["| ",{"template":{"target":{"wt":"table_attribs_6","href":"./Template:Table_attribs_6"},"params":{},"i":0}}," hi"]}'> hi</td></tr>
+<tbody><tr><td style="background: red;" typeof="mw:Transclusion" about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"pi":[[]]}' data-mw='{"parts":["|",{"template":{"target":{"wt":"table_attribs_6","href":"./Template:Table_attribs_6"},"params":{},"i":0}}," hi"]}'> hi</td></tr>
</tbody></table>
!! end
a
<tr><td></td></tr></table>
-!! html+tidy
+!! html/php+tidy
a
<table><tbody><tr><td></td></tr></tbody></table>
+!! html/parsoid
+<p about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"firstWikitextNode":"TABLE","pi":[[{"k":"1"}]]}' data-mw='{"parts":["{|\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}},"\n|}"]}'>a</p><table about="#mwt2">
+
+</table>
!! end
!!test
<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption> bar</figcaption></figure>
!!end
+# html/php output not have newlines after table, td, th, etc. because
+# Linker::makeThumbLink2() replaces the newlines with spaces since
+# the table is inside a caption.
+# FIXME: Verify if that circa 2004 fix is still required.
!! test
Image: caption containing a table
!! options
!! wikitext
[[Image:Foobar.jpg|thumb|200px|This is an example image thumbnail caption with a table
{|
-! Foo !! Bar
+!Foo!!Bar
|-
-| Foo1 || Bar1
+|Foo1||Bar1
|}
and some more text.]]
!! html/php
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is an example image thumbnail caption with a table <table> <tr> <th> Foo </th> <th> Bar </th></tr> <tr> <td> Foo1 </td> <td> Bar1 </td></tr></table> and some more text.</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is an example image thumbnail caption with a table <table> <tr> <th>Foo</th> <th>Bar </th></tr> <tr> <td>Foo1</td> <td>Bar1 </td></tr></table> and some more text.</div></div></div>
!! html/parsoid
<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption>This is an example image thumbnail caption with a table
<table>
<tbody>
-<tr><th>Foo </th><th>Bar</th></tr>
+<tr><th>Foo</th><th>Bar</th></tr>
<tr>
-<td>Foo1 </td>
+<td>Foo1</td>
<td>Bar1</td></tr></tbody></table>and some more text.</figcaption></figure>
!! end
!! test
Basic section headings
!! wikitext
-== Headline 1 ==
+==Headline 1==
Some text
==Headline 2==
!! test
Section headings with TOC
!! wikitext
-== Headline 1 ==
-=== Subheadline 1 ===
-===== Skipping a level =====
-====== Skipping a level ======
+==Headline 1==
+===Subheadline 1===
+=====Skipping a level=====
+======Skipping a level======
-== Headline 2 ==
+==Headline 2==
Some text
===Another headline===
!! html
TOC anchors don't collide
!! wikitext
__FORCETOC__
-== Headline 2 ==
-== Headline ==
-== Headline 2 ==
-== Headline ==
+==Headline 2==
+==Headline==
+==Headline 2==
+==Headline==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! options
parsoid=wt2html
!! wikitext
-= Level 1 Heading=
-== Level 2 Heading==
-=== Level 3 Heading===
-==== Level 4 Heading====
-===== Level 5 Heading=====
-====== Level 6 Heading======
-======= Level 7 Heading=======
-======== Level 8 Heading========
-========= Level 9 Heading=========
-========== Level 10 Heading==========
+=Level 1 Heading=
+==Level 2 Heading==
+===Level 3 Heading===
+====Level 4 Heading====
+=====Level 5 Heading=====
+======Level 6 Heading======
+=======Level 7 Heading=======
+========Level 8 Heading========
+=========Level 9 Heading=========
+==========Level 10 Heading==========
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
<li class="toclevel-5 tocsection-5"><a href="#Level_5_Heading"><span class="tocnumber">1.1.1.1.1</span> <span class="toctext">Level 5 Heading</span></a>
<ul>
<li class="toclevel-6 tocsection-6"><a href="#Level_6_Heading"><span class="tocnumber">1.1.1.1.1.1</span> <span class="toctext">Level 6 Heading</span></a></li>
-<li class="toclevel-6 tocsection-7"><a href="#.3D_Level_7_Heading.3D"><span class="tocnumber">1.1.1.1.1.2</span> <span class="toctext">= Level 7 Heading=</span></a></li>
-<li class="toclevel-6 tocsection-8"><a href="#.3D.3D_Level_8_Heading.3D.3D"><span class="tocnumber">1.1.1.1.1.3</span> <span class="toctext">== Level 8 Heading==</span></a></li>
-<li class="toclevel-6 tocsection-9"><a href="#.3D.3D.3D_Level_9_Heading.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.4</span> <span class="toctext">=== Level 9 Heading===</span></a></li>
-<li class="toclevel-6 tocsection-10"><a href="#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.5</span> <span class="toctext">==== Level 10 Heading====</span></a></li>
+<li class="toclevel-6 tocsection-7"><a href="#.3DLevel_7_Heading.3D"><span class="tocnumber">1.1.1.1.1.2</span> <span class="toctext">=Level 7 Heading=</span></a></li>
+<li class="toclevel-6 tocsection-8"><a href="#.3D.3DLevel_8_Heading.3D.3D"><span class="tocnumber">1.1.1.1.1.3</span> <span class="toctext">==Level 8 Heading==</span></a></li>
+<li class="toclevel-6 tocsection-9"><a href="#.3D.3D.3DLevel_9_Heading.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.4</span> <span class="toctext">===Level 9 Heading===</span></a></li>
+<li class="toclevel-6 tocsection-10"><a href="#.3D.3D.3D.3DLevel_10_Heading.3D.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.5</span> <span class="toctext">====Level 10 Heading====</span></a></li>
</ul>
</li>
</ul>
<h4><span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Level 4 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
<h5><span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Level 5 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
<h6><span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: Level 6 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=7" title="Edit section: = Level 7 Heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=8" title="Edit section: == Level 8 Heading==">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=9" title="Edit section: === Level 9 Heading===">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
-<h6><span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=10" title="Edit section: ==== Level 10 Heading====">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3DLevel_7_Heading.3D">=Level 7 Heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=7" title="Edit section: =Level 7 Heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3DLevel_8_Heading.3D.3D">==Level 8 Heading==</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=8" title="Edit section: ==Level 8 Heading==">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3DLevel_9_Heading.3D.3D.3D">===Level 9 Heading===</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=9" title="Edit section: ===Level 9 Heading===">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3D.3DLevel_10_Heading.3D.3D.3D.3D">====Level 10 Heading====</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=10" title="Edit section: ====Level 10 Heading====">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
!! html/parsoid
-<h1 id="Level_1_Heading" data-parsoid='{}'> Level 1 Heading</h1>
-<h2 id="Level_2_Heading" data-parsoid='{}'> Level 2 Heading</h2>
-<h3 id="Level_3_Heading" data-parsoid='{}'> Level 3 Heading</h3>
-<h4 id="Level_4_Heading" data-parsoid='{}'> Level 4 Heading</h4>
-<h5 id="Level_5_Heading" data-parsoid='{}'> Level 5 Heading</h5>
-<h6 id="Level_6_Heading" data-parsoid='{}'> Level 6 Heading</h6>
-<h6 id="=_Level_7_Heading=" data-parsoid='{}'><span id=".3D_Level_7_Heading.3D" typeof="mw:FallbackId"></span>= Level 7 Heading=</h6>
-<h6 id="==_Level_8_Heading==" data-parsoid='{}'><span id=".3D.3D_Level_8_Heading.3D.3D" typeof="mw:FallbackId"></span>== Level 8 Heading==</h6>
-<h6 id="===_Level_9_Heading===" data-parsoid='{}'><span id=".3D.3D.3D_Level_9_Heading.3D.3D.3D" typeof="mw:FallbackId"></span>=== Level 9 Heading===</h6>
-<h6 id="====_Level_10_Heading====" data-parsoid='{}'><span id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D" typeof="mw:FallbackId"></span>==== Level 10 Heading====</h6>
+<h1 id="Level_1_Heading" data-parsoid='{}'>Level 1 Heading</h1>
+<h2 id="Level_2_Heading" data-parsoid='{}'>Level 2 Heading</h2>
+<h3 id="Level_3_Heading" data-parsoid='{}'>Level 3 Heading</h3>
+<h4 id="Level_4_Heading" data-parsoid='{}'>Level 4 Heading</h4>
+<h5 id="Level_5_Heading" data-parsoid='{}'>Level 5 Heading</h5>
+<h6 id="Level_6_Heading" data-parsoid='{}'>Level 6 Heading</h6>
+<h6 id="=Level_7_Heading=" data-parsoid='{}'><span id=".3D_Level_7_Heading.3D" typeof="mw:FallbackId"></span>=Level 7 Heading=</h6>
+<h6 id="==Level_8_Heading==" data-parsoid='{}'><span id=".3D.3D_Level_8_Heading.3D.3D" typeof="mw:FallbackId"></span>==Level 8 Heading==</h6>
+<h6 id="===Level_9_Heading===" data-parsoid='{}'><span id=".3D.3D.3D_Level_9_Heading.3D.3D.3D" typeof="mw:FallbackId"></span>===Level 9 Heading===</h6>
+<h6 id="====Level_10_Heading====" data-parsoid='{}'><span id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D" typeof="mw:FallbackId"></span>====Level 10 Heading====</h6>
!! end
!! test
TOC regression (T11764)
!! wikitext
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
+==title 1==
+===title 1.1===
+====title 1.1.1====
+===title 1.2===
+==title 2==
+===title 2.1===
!! html
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! options
wgMaxTocLevel=3
!! wikitext
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
+==title 1==
+===title 1.1===
+====title 1.1.1====
+===title 1.2===
+==title 2==
+===title 2.1===
!! html
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! test
Resolving duplicate section names
!! wikitext
-== Foo bar ==
-== Foo bar ==
+==Foo bar==
+==Foo bar==
!! html
<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! test
Resolving duplicate section names with differing case (T12721)
!! wikitext
-== Foo bar ==
-== Foo Bar ==
+==Foo bar==
+==Foo Bar==
!! html
<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
TOC regression (T14077)
!! wikitext
__TOC__
-== title 1 ==
-=== title 1.1 ===
-== title 2 ==
+==title 1==
+===title 1.1===
+==title 2==
!! html
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! wikitext
The tooltips shall not show entities to the user (ie. be double escaped)
-== text > text ==
+==text > text==
section 1
-== text < text ==
+==text < text==
section 2
-== text & text ==
+==text & text==
section 3
-== text ' text ==
+==text ' text==
section 4
-== text " text ==
+==text " text==
section 5
!! html/php
<p>The tooltips shall not show entities to the user (ie. be double escaped)
!! html/parsoid
<p>The tooltips shall not show entities to the user (ie. be double escaped)</p>
-<h2 id="text_>_text"><span id="text_.3E_text" typeof="mw:FallbackId"></span> text > text </h2>
+<h2 id="text_>_text"><span id="text_.3E_text" typeof="mw:FallbackId"></span>text > text</h2>
<p>section 1</p>
-<h2 id="text_<_text"><span id="text_.3C_text" typeof="mw:FallbackId"></span> text < text </h2>
+<h2 id="text_<_text"><span id="text_.3C_text" typeof="mw:FallbackId"></span>text < text</h2>
<p>section 2</p>
-<h2 id="text_&_text"><span id="text_.26_text" typeof="mw:FallbackId"></span> text & text </h2>
+<h2 id="text_&_text"><span id="text_.26_text" typeof="mw:FallbackId"></span>text & text</h2>
<p>section 3</p>
-<h2 id="text_'_text"><span id="text_.27_text" typeof="mw:FallbackId"></span> text ' text </h2>
+<h2 id="text_'_text"><span id="text_.27_text" typeof="mw:FallbackId"></span>text ' text</h2>
<p>section 4</p>
-<h2 id='text_"_text'><span id="text_.22_text" typeof="mw:FallbackId"></span> text " text </h2>
+<h2 id='text_"_text'><span id="text_.22_text" typeof="mw:FallbackId"></span>text " text</h2>
<p>section 5</p>
!! end
!! wikitext
Id should not contain + for spaces
-== Space between Text ==
+==Space between Text==
section 1
-== Space-Entity between Text ==
+==Space-Entity between Text==
section 2
-== Plus+between+Text ==
+==Plus+between+Text==
section 3
-== Plus-Entity+between+Text ==
+==Plus-Entity+between+Text==
section 4
-== Underscore_between_Text ==
+==Underscore_between_Text==
section 5
-== Underscore-Entity_between_Text ==
+==Underscore-Entity_between_Text==
section 6
[[#Space between Text]]
!! html/parsoid
<p>Id should not contain + for spaces</p>
-<h2 id="Space_between_Text"> Space between Text </h2>
+<h2 id="Space_between_Text">Space between Text</h2>
<p>section 1</p>
-<h2 id="Space-Entity_between_Text"> Space-Entity<span typeof="mw:Entity" data-parsoid='{"src":"&#32;","srcContent":" "}'> </span>between<span typeof="mw:Entity" data-parsoid='{"src":"&#32;","srcContent":" "}'> </span>Text </h2>
+<h2 id="Space-Entity_between_Text">Space-Entity<span typeof="mw:Entity" data-parsoid='{"src":"&#32;","srcContent":" "}'> </span>between<span typeof="mw:Entity" data-parsoid='{"src":"&#32;","srcContent":" "}'> </span>Text</h2>
<p>section 2</p>
-<h2 id="Plus+between+Text"><span id="Plus.2Bbetween.2BText" typeof="mw:FallbackId"></span> Plus+between+Text </h2>
+<h2 id="Plus+between+Text"><span id="Plus.2Bbetween.2BText" typeof="mw:FallbackId"></span>Plus+between+Text</h2>
<p>section 3</p>
-<h2 id="Plus-Entity+between+Text"><span id="Plus-Entity.2Bbetween.2BText" typeof="mw:FallbackId"></span> Plus-Entity<span typeof="mw:Entity" data-parsoid='{"src":"&#43;","srcContent":"+"}'>+</span>between<span typeof="mw:Entity" data-parsoid='{"src":"&#43;","srcContent":"+"}'>+</span>Text </h2>
+<h2 id="Plus-Entity+between+Text"><span id="Plus-Entity.2Bbetween.2BText" typeof="mw:FallbackId"></span>Plus-Entity<span typeof="mw:Entity" data-parsoid='{"src":"&#43;","srcContent":"+"}'>+</span>between<span typeof="mw:Entity" data-parsoid='{"src":"&#43;","srcContent":"+"}'>+</span>Text</h2>
<p>section 4</p>
-<h2 id="Underscore_between_Text"> Underscore_between_Text </h2>
+<h2 id="Underscore_between_Text">Underscore_between_Text</h2>
<p>section 5</p>
-<h2 id="Underscore-Entity_between_Text"> Underscore-Entity<span typeof="mw:Entity" data-parsoid='{"src":"&#95;","srcContent":"_"}'>_</span>between<span typeof="mw:Entity" data-parsoid='{"src":"&#95;","srcContent":"_"}'>_</span>Text </h2>
+<h2 id="Underscore-Entity_between_Text">Underscore-Entity<span typeof="mw:Entity" data-parsoid='{"src":"&#95;","srcContent":"_"}'>_</span>between<span typeof="mw:Entity" data-parsoid='{"src":"&#95;","srcContent":"_"}'>_</span>Text</h2>
<p>section 6</p>
<p><a rel="mw:WikiLink" href="./Main_Page#Space_between_Text" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#Space_between_Text"},"sa":{"href":"#Space between Text"}}'>#Space between Text</a>
(__NOEDITSECTION__ for clearer output, doesn't matter here)
!! wikitext
<h1>Header 1</h1>
-== Header 1.1 ==
-== Header 1.2 ==
+==Header 1.1==
+==Header 1.2==
<h1>Header 2
</h1>
-== Header 2.1 ==
-== Header 2.2 ==
+==Header 2.1==
+==Header 2.2==
__NOEDITSECTION__
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
!! html/parsoid
<h1 id="Header_1" data-parsoid='{"stx":"html"}'>Header 1</h1>
-<h2 id="Header_1.1" data-parsoid='{}'> Header 1.1 </h2>
-<h2 id="Header_1.2" data-parsoid='{}'> Header 1.2 </h2>
+<h2 id="Header_1.1" data-parsoid='{}'>Header 1.1</h2>
+<h2 id="Header_1.2" data-parsoid='{}'>Header 1.2</h2>
<h1 id="Header_2" data-parsoid='{"stx":"html"}'>Header 2
</h1>
-<h2 id="Header_2.1" data-parsoid='{}'> Header 2.1 </h2>
-<h2 id="Header_2.2" data-parsoid='{}'> Header 2.2 </h2>
+<h2 id="Header_2.1" data-parsoid='{}'>Header 2.1</h2>
+<h2 id="Header_2.2" data-parsoid='{}'>Header 2.2</h2>
<meta property="mw:PageProp/noeditsection"/>
!! end
parsoid=wt2html,html2html
!! wikitext
{| title= id=
-| hi
+|hi
|}
!! html/php
<table title="id=">
<tr>
-<td> hi
+<td>hi
</td></tr></table>
!! html/parsoid
<table title="id=">
-<tbody><tr><td> hi</td></tr>
+<tbody><tr><td>hi</td></tr>
</tbody></table>
!! end
Table multiple attributes correction
!! wikitext
{|
-!+ class="error" class="awesome"| status
+!+ class="error" class="awesome"|status
|}
!! html
<table>
<tr>
-<th class="awesome"> status
+<th class="awesome">status
</th></tr></table>
!!end
!! html/php
<a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link<div style="display:none">" onmouseover="alert(document.cookie)" onfoo="</div></a>
-!! html+php/tidy
-<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link</a></p>
-<div style="display:none">" onmouseover="alert(document.cookie)" onfoo="</div>
+!! html/php+tidy
+<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link</a></p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg"><div style="display:none">" onmouseover="alert(document.cookie)" onfoo="</div></a>
!! html/parsoid
<p><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg" data-parsoid='{"autoInsertedEnd":true}'>Safe Link</a></p><div style="display:none" data-parsoid='{"stx":"html"}'><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg" data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'>" onmouseover="alert(document.cookie)" onfoo="</a></div>
Table attribute legitimate extension
!! wikitext
{|
-!+ style="<nowiki>color:blue</nowiki>"| status
+!+ style="<nowiki>color:blue</nowiki>"|status
|}
!! html
<table>
<tr>
-<th style="color:blue"> status
+<th style="color:blue">status
</th></tr></table>
!!end
Table attribute safety
!! wikitext
{|
-!+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"| status
+!+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"|status
|}
!! html
<table>
<tr>
-<th style="/* insecure input */"> status
+<th style="/* insecure input */">status
</th></tr></table>
!! end
!! test
Fuzz testing: Parser14
!! wikitext
-== onmouseover= ==
+==onmouseover===
http://__TOC__
!! html/php
<h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
</ul>
</div>
!! html/parsoid
-<h2 id="onmouseover="><span id="onmouseover.3D" typeof="mw:FallbackId"></span> onmouseover= </h2>
+<h2 id="onmouseover="><span id="onmouseover.3D" typeof="mw:FallbackId"></span>onmouseover=</h2>
<p><a rel="mw:ExtLink" class="external free" href="http://__TOC__" data-parsoid='{"stx":"url"}'>http://__TOC__</a></p>
!! end
Fuzz testing: Parser21
!! wikitext
{|
-! irc://{{ftp://a" onmouseover="alert('hello world');"
+!irc://{{ftp://a" onmouseover="alert('hello world');"
|
!! html
<table>
<tr>
-<th> <a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
+<th><a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
</th>
<td>
</td>
!! test
Handling of 
 in URLs
!! wikitext
-** irc://
a
+*irc://
a
!! html/php
-<ul><li><ul><li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
+<ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul>
!! html/parsoid
-<ul><li><ul><li> <a rel="mw:ExtLink" class="external free" href="irc://%0Aa" data-parsoid='{"stx":"url","a":{"href":"irc://%0Aa"},"sa":{"href":"irc://&#x0A;a"}}'>irc://%0Aa</a></li></ul></li></ul>
+<ul><li><a rel="mw:ExtLink" class="external free" href="irc://%0Aa" data-parsoid='{"stx":"url","a":{"href":"irc://%0Aa"},"sa":{"href":"irc://&#x0A;a"}}'>irc://%0Aa</a></li></ul>
!! end
!! test
Handling of %0A in URLs
!! wikitext
-** irc://%0Aa
+*irc://%0Aa
!! html/php
-<ul><li><ul><li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
+<ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul>
!! html/parsoid
-<ul><li><ul><li> <a rel="mw:ExtLink" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
+<ul><li><a rel="mw:ExtLink" class="external free" href="irc://%0Aa">irc://%0Aa</a></li></ul>
!! end
# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
!! options
title=[[Parser test]]
!! wikitext
-* {{PAGENAME}}
-* {{PAGENAMEE}}
-* {{FULLPAGENAME}}
-* {{FULLPAGENAMEE}}
-* {{BASEPAGENAME}}
-* {{BASEPAGENAMEE}}
-* {{SUBPAGENAME}}
-* {{SUBPAGENAMEE}}
-* {{ROOTPAGENAME}}
-* {{ROOTPAGENAMEE}}
-* {{TALKPAGENAME}}
-* {{TALKPAGENAMEE}}
-* {{SUBJECTPAGENAME}}
-* {{SUBJECTPAGENAMEE}}
-* {{NAMESPACEE}}
-* {{NAMESPACE}}
-* {{NAMESPACENUMBER}}
-* {{TALKSPACE}}
-* {{TALKSPACEE}}
-* {{SUBJECTSPACE}}
-* {{SUBJECTSPACEE}}
-* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
-!! html
-<ul><li> Parser test</li>
-<li> Parser_test</li>
-<li> Parser test</li>
-<li> Parser_test</li>
-<li> Parser test</li>
-<li> Parser_test</li>
-<li> Parser test</li>
-<li> Parser_test</li>
-<li> Parser test</li>
-<li> Parser_test</li>
-<li> Talk:Parser test</li>
-<li> Talk:Parser_test</li>
-<li> Parser test</li>
-<li> Parser_test</li>
-<li> </li>
-<li> </li>
-<li> 0</li>
-<li> Talk</li>
-<li> Talk</li>
-<li> </li>
-<li> </li>
-<li> <a href="/index.php?title=Template:Dynamic&action=edit&redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a></li></ul>
+*{{PAGENAME}}
+*{{PAGENAMEE}}
+*{{FULLPAGENAME}}
+*{{FULLPAGENAMEE}}
+*{{BASEPAGENAME}}
+*{{BASEPAGENAMEE}}
+*{{SUBPAGENAME}}
+*{{SUBPAGENAMEE}}
+*{{ROOTPAGENAME}}
+*{{ROOTPAGENAMEE}}
+*{{TALKPAGENAME}}
+*{{TALKPAGENAMEE}}
+*{{SUBJECTPAGENAME}}
+*{{SUBJECTPAGENAMEE}}
+*{{NAMESPACEE}}
+*{{NAMESPACE}}
+*{{NAMESPACENUMBER}}
+*{{TALKSPACE}}
+*{{TALKSPACEE}}
+*{{SUBJECTSPACE}}
+*{{SUBJECTSPACEE}}
+*{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
+!! html
+<ul><li>Parser test</li>
+<li>Parser_test</li>
+<li>Parser test</li>
+<li>Parser_test</li>
+<li>Parser test</li>
+<li>Parser_test</li>
+<li>Parser test</li>
+<li>Parser_test</li>
+<li>Parser test</li>
+<li>Parser_test</li>
+<li>Talk:Parser test</li>
+<li>Talk:Parser_test</li>
+<li>Parser test</li>
+<li>Parser_test</li>
+<li></li>
+<li></li>
+<li>0</li>
+<li>Talk</li>
+<li>Talk</li>
+<li></li>
+<li></li>
+<li><a href="/index.php?title=Template:Dynamic&action=edit&redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a></li></ul>
!! end
### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
; Surrogate: ��
; This is an okay astral character: 💩
!! html+tidy
-<dl><dt> Null</dt>
-<dd> &#00;</dd>
-<dt> FF</dt>
-<dd> &#xC;</dd>
-<dt> CR</dt>
-<dd> &#xD;</dd>
-<dt> Control (low)</dt>
-<dd> &#8;</dd>
-<dt> Control (high)</dt>
-<dd> &#x7F; &#x9F;</dd>
-<dt> Surrogate</dt>
-<dd> &#xD83D;&#xDCA9;</dd>
-<dt> This is an okay astral character</dt>
-<dd> 💩</dd></dl>
+<dl><dt>Null</dt>
+<dd>&#00;</dd>
+<dt>FF</dt>
+<dd>&#xC;</dd>
+<dt>CR</dt>
+<dd>&#xD;</dd>
+<dt>Control (low)</dt>
+<dd>&#8;</dd>
+<dt>Control (high)</dt>
+<dd>&#x7F; &#x9F;</dd>
+<dt>Surrogate</dt>
+<dd>&#xD83D;&#xDCA9;</dd>
+<dt>This is an okay astral character</dt>
+<dd>💩</dd></dl>
!! end
!! test
!! test
Definition list code coverage
!! wikitext
-; title : def
-; title : def
+;title : def
+;title : def
;title: def
!! html/php
-<dl><dt> title  </dt>
-<dd> def</dd>
-<dt> title </dt>
-<dd> def</dd>
+<dl><dt>title  </dt>
+<dd>def</dd>
+<dt>title </dt>
+<dd>def</dd>
<dt>title</dt>
-<dd> def</dd></dl>
+<dd>def</dd></dl>
!! html/parsoid
-<dl><dt> title <span typeof="mw:Placeholder"> </span></dt><dd> def</dd>
-<dt> title<span typeof="mw:Placeholder"> </span></dt><dd> def</dd>
+<dl><dt>title <span typeof="mw:Placeholder"> </span></dt><dd> def</dd>
+<dt>title<span typeof="mw:Placeholder"> </span></dt><dd> def</dd>
<dt>title</dt><dd> def</dd></dl>
!! end
!! config
wgFragmentMode=[ 'html5', 'legacy' ]
!! wikitext
-=== _ +:.3A%3A _ &&]] x ===
+===_ +:.3A%3A _ &&]] x===
{{anchorencode: _ +:.3A%3A _ &&]] x}}
__NOEDITSECTION__
!! html/php
<p>+:.3A%3A_&&]]_x
</p>
!! html/parsoid
-<h3 id="+:.3A%3A_&&]]_x"><span id=".2B:.3A.253A_.26.26.5D.5D_x" typeof="mw:FallbackId"></span> _ +:.3A%3A _ &<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&","dsr":[18,23,null,null]}'>&</span>]] x </h3>
+<h3 id="+:.3A%3A_&&]]_x"><span id=".2B:.3A.253A_.26.26.5D.5D_x" typeof="mw:FallbackId"></span>_ +:.3A%3A _ &<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&","dsr":[18,23,null,null]}'>&</span>]] x</h3>
<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"anchorencode: _ +:.3A%3A _ &&amp;]] x","function":"anchorencode"},"params":{},"i":0}}]}'>+:.3A%3A_&&<span typeof="mw:Entity">]</span><span typeof="mw:Entity">]</span>_x</p>
<meta property="mw:PageProp/noeditsection"/>
!! end
!! config
wgFragmentMode=[ 'legacy' ]
!! wikitext
-=== _ +:.3A%3A&&]] ===
+===_ +:.3A%3A&&]]===
{{anchorencode: _ +:.3A%3A&&]] }}
__NOEDITSECTION__
!! html/php
!! options
language=sr variant=sr-ec
!! wikitext
-== -{Naslov}- ==
+==-{Naslov}-==
Note that even an unprotected headline ID is not affected by language
conversion:
-== Latinski ==
+==Latinski==
!! html/php
<h2><span id="-.7BNaslov.7D-"></span><span class="mw-headline" id="-{Naslov}-">Naslov</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Уреди одељак „Naslov“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>Ноте тхат евен ан унпротецтед хеадлине ИД ис нот аффецтед бy лангуаге
<h2><span class="mw-headline" id="Latinski">Латински</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Уреди одељак „Латински“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
!! html/parsoid
-<h2 id="-{Naslov}-"><span id="-.7BNaslov.7D-" typeof="mw:FallbackId"></span> <span typeof="mw:LanguageVariant" data-mw-variant='{"disabled":{"t":"Naslov"}}'></span> </h2>
+<h2 id="-{Naslov}-"><span id="-.7BNaslov.7D-" typeof="mw:FallbackId"></span><span typeof="mw:LanguageVariant" data-mw-variant='{"disabled":{"t":"Naslov"}}'></span></h2>
<p>Note that even an unprotected headline ID is not affected by language
conversion:</p>
<table>
<tr>
-<td> B
+<td>B
</td></tr></table>
!! html/parsoid
!! test
T2529: Uncovered bullet
!! wikitext
-* Foo {{bullet}}
+*Foo {{bullet}}
!! html
-<ul><li> Foo </li>
-<li> Bar</li></ul>
+<ul><li>Foo</li>
+<li>Bar</li></ul>
!! end
!! test
T2529: Uncovered bullet in a deeply nested list
!! wikitext
-******* Foo {{bullet}}
+*******Foo {{bullet}}
!! html
-<ul><li><ul><li><ul><li><ul><li><ul><li><ul><li><ul><li> Foo </li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li>
-<li> Bar</li></ul>
+<ul><li><ul><li><ul><li><ul><li><ul><li><ul><li><ul><li>Foo</li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li>
+<li>Bar</li></ul>
!! end
</p>
<table>
<tr>
-<td> 1 </td>
-<td> 2
+<td>1</td>
+<td>2
</td></tr>
<tr>
-<td> 3 </td>
-<td> 4
+<td>3</td>
+<td>4
</td></tr></table>
<p>y
</p>
!! test
T2529: Uncovered bullet in parser function result
!! wikitext
-* Foo {{lc:{{bullet}} }}
+*Foo {{lc:{{bullet}} }}
!! html
-<ul><li> Foo </li>
-<li> bar</li></ul>
+<ul><li>Foo</li>
+<li>bar</li></ul>
!! end
Line two</p></blockquote>
!! end
+# Parsoid's output is broken on this because of Tidy-compatibility cruft
!! test
T8200: paragraphs inside blockquotes (extra line break on close)
!! wikitext
Bad images - basic functionality
!! wikitext
[[File:Bad.jpg]]
-!! DISABLED/html/php
+!! html/php+disabled
!! html/parsoid
<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"bad-image","message":"This image is blacklisted in this context."}]}'><a href="./File:Bad.jpg"><img resource="./File:Bad.jpg" height="220" width="220"/></a></span></p>
!! end
Foo bar
[[File:Bad.jpg]]
Bar foo
-!! DISABLED/html/php
+!! html/php+disabled
<p>Foo bar
</p><p>Bar foo
</p>
<indicator name="02">[[Main Page]]</indicator>
<indicator name="03">[[File:Foobar.jpg|25px|link=]]</indicator>
<indicator name="04">[[File:Foobar.jpg|25px]]</indicator>
-<indicator name="05">* foo
-* bar</indicator>
+<indicator name="05">*foo
+*bar</indicator>
<indicator name="06"><nowiki>foo</nowiki></indicator>
<indicator name="07"> Preformatted</indicator>
<indicator name="08"><div>Broken tag</indicator>
<indicator name="09">{| class=wikitable
-| cell
+|cell
|}</indicator>
<indicator name="10">Two
02=<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
03=<img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" />
04=<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" /></a>
-05=<ul><li> foo</li>
-<li> bar</li></ul>
+05=<ul><li>foo</li>
+<li>bar</li></ul>
06=foo
07=<pre>Preformatted
09=<table class="wikitable">
<tr>
-<td> cell
+<td>cell
</td></tr></table>
10=<p>Two
title=[[Main Page]]
!! wikitext
__TOC__
-== ''Lost'' episodes ==
+==''Lost'' episodes==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="Lost_episodes" data-parsoid='{}'> <i>Lost</i> episodes </h2>
+<h2 id="Lost_episodes" data-parsoid='{}'><i>Lost</i> episodes</h2>
!! end
!! test
title=[[Main Page]]
!! wikitext
__TOC__
-== '''should be bold''' then normal text ==
+=='''should be bold''' then normal text==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="should_be_bold_then_normal_text" data-parsoid='{}'> <b>should be bold</b> then normal text </h2>
+<h2 id="should_be_bold_then_normal_text" data-parsoid='{}'><b>should be bold</b> then normal text</h2>
!! end
!! test
title=[[Main Page]]
!! wikitext
__TOC__
-== Image [[Image:foobar.jpg]] ==
+==Image [[Image:foobar.jpg]]==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="Image" data-parsoid='{}'> Image <figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure-inline> </h2>
+<h2 id="Image" data-parsoid='{}'>Image <figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure-inline></h2>
!! end
!! test
title=[[Main Page]]
!! wikitext
__TOC__
-== <blockquote>Quote</blockquote> ==
+==<blockquote>Quote</blockquote>==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
<h2><span class="mw-headline" id="Quote"><blockquote><p>Quote</p></blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&action=edit&section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="Quote" data-parsoid='{}'> <blockquote>Quote</blockquote> </h2>
+<h2 id="Quote" data-parsoid='{}'><blockquote>Quote</blockquote></h2>
!! end
!! test
title=[[Main Page]]
!! wikitext
__TOC__
-== Proof: 2 < 3 ==
+==Proof: 2 < 3==
<small>Hanc marginis exiguitas non caperet.</small>
QED
!! html/php
</p>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="Proof:_2_<_3" data-parsoid='{}'><span id="Proof:_2_.3C_3" typeof="mw:FallbackId"></span> Proof: 2 < 3 </h2>
+<h2 id="Proof:_2_<_3" data-parsoid='{}'><span id="Proof:_2_.3C_3" typeof="mw:FallbackId"></span>Proof: 2 < 3</h2>
<p><small>Hanc marginis exiguitas non caperet.</small>
QED</p>
!! end
Multiple tags in TOC
!! wikitext
__TOC__
-== <i>Foo</i> <b>Bar</b> ==
+==<i>Foo</i> <b>Bar</b>==
-== <i>Foo</i> <blockquote>Bar</blockquote> ==
+==<i>Foo</i> <blockquote>Bar</blockquote>==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
<h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote><p>Bar</p></blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="Foo_Bar" data-parsoid='{}'> <i data-parsoid='{"stx":"html"}'>Foo</i> <b data-parsoid='{"stx":"html"}'>Bar</b> </h2>
+<h2 id="Foo_Bar" data-parsoid='{}'><i data-parsoid='{"stx":"html"}'>Foo</i> <b data-parsoid='{"stx":"html"}'>Bar</b></h2>
-<h2 id="Foo_Bar_2" data-parsoid='{}'> <i data-parsoid='{"stx":"html"}'>Foo</i> <blockquote>Bar</blockquote> </h2>
+<h2 id="Foo_Bar_2" data-parsoid='{}'><i data-parsoid='{"stx":"html"}'>Foo</i> <blockquote>Bar</blockquote></h2>
!! end
# Don't expect Parsoid to roundtrip this until the php parser comes closer to
parsoid=wt2html
!! wikitext
__TOC__
-== <sup class="in-h2">Hello</sup> ==
+==<sup class="in-h2">Hello</sup>==
-== <sup class="a > b">Evilbye</sup> ==
+==<sup class="a > b">Evilbye</sup>==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" />
-<h2 id="Hello"> <sup class="in-h2" data-parsoid='{"stx":"html"}'>Hello</sup> </h2>
+<h2 id="Hello"><sup class="in-h2" data-parsoid='{"stx":"html"}'>Hello</sup></h2>
-<h2 id='b">Evilbye'><span id="b.22.3EEvilbye" typeof="mw:FallbackId"></span> <sup class="a " data-parsoid='{"stx":"html"}'> b">Evilbye</sup> </h2>
+<h2 id='b">Evilbye'><span id="b.22.3EEvilbye" typeof="mw:FallbackId"></span><sup class="a " data-parsoid='{"stx":"html"}'> b">Evilbye</sup></h2>
!! end
!! test
span tags with directionality in TOC
!! wikitext
__TOC__
-== <span dir="ltr">C++</span> ==
+==<span dir="ltr">C++</span>==
-== <span dir="rtl">זבנג!</span> ==
+==<span dir="rtl">זבנג!</span>==
-== <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> ==
+==<span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span>==
-== <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> ==
+==<span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span>==
-== <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
+==<span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span>==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="C++" data-parsoid='{}'><span id="C.2B.2B" typeof="mw:FallbackId"></span> <span dir="ltr">C++</span> </h2>
-<h2 id="זבנג!"><span id=".D7.96.D7.91.D7.A0.D7.92.21" typeof="mw:FallbackId"></span> <span dir="rtl">זבנג!</span> </h2>
-<h2 id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </h2>
-<h2 id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </h2>
-<h2 id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </h2>
+<h2 id="C++" data-parsoid='{}'><span id="C.2B.2B" typeof="mw:FallbackId"></span><span dir="ltr">C++</span></h2>
+<h2 id="זבנג!"><span id=".D7.96.D7.91.D7.A0.D7.92.21" typeof="mw:FallbackId"></span><span dir="rtl">זבנג!</span></h2>
+<h2 id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></h2>
+<h2 id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></h2>
+<h2 id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></h2>
!! end
!! test
T74884: bdi element in ToC
!! wikitext
__TOC__
-== <bdi>test</bdi> ==
+==<bdi>test</bdi>==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="test" data-parsoid='{}'> <bdi>test</bdi> </h2>
+<h2 id="test" data-parsoid='{}'><bdi>test</bdi></h2>
!! end
!! test
T35715: s/strike element in ToC
!! wikitext
__TOC__
-== <s>test</s> test <strike>test</strike> ==
+==<s>test</s> test <strike>test</strike>==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="test_test_test" data-parsoid='{}'> <s>test</s> test <strike>test</strike> </h2>
+<h2 id="test_test_test" data-parsoid='{}'><s>test</s> test <strike>test</strike></h2>
!! end
!! test
Empty <p> tag in TOC, removed by Sanitizer (T92892)
!! wikitext
__TOC__
-== x ==
+==x==
!! html/php
<div id="toc" class="toc"><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2></div>
<ul>
!! html/parsoid
<meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="x" data-parsoid='{}'> x </h2>
+<h2 id="x" data-parsoid='{}'>x</h2>
!! end
!! article
Ignore pipe between table row attributes
!! wikitext
{|
-| quux
+|quux
|- id=foo | style='color: red'
-| bar
+|bar
|}
!! html
<table>
<tr>
-<td> quux
+<td>quux
</td></tr>
<tr id="foo" style="color: red">
-<td> bar
+<td>bar
</td></tr></table>
!! end
notoc
!! wikitext
Lead
-== Section 1 ==
-== Section 2 ==
-== Section 3 ==
-== Section 4 ==
-== Section 5 ==
+==Section 1==
+==Section 2==
+==Section 3==
+==Section 4==
+==Section 5==
!! html
<p>Lead
</p>
!! html/php
<table>
<tr>
-<td> <foo
+<td><foo
</td>
-<td> bar>
+<td>bar>
</td></tr></table>
!! end
Accept empty td cell attribute
!! wikitext
{|
-| align="center" | foo || |
+| align="center" |foo|| |
|}
!! html
<table>
<tr>
-<td align="center"> foo </td>
+<td align="center">foo</td>
<td>
</td></tr></table>
Non-empty attributes in th-cells
!! wikitext
{|
-! Foo !! style="color: red" | Bar
+!Foo!! style="color: red" |Bar
|}
!! html
<table>
<tr>
-<th> Foo </th>
-<th style="color: red"> Bar
+<th>Foo</th>
+<th style="color: red">Bar
</th></tr></table>
!!end
Accept empty attributes in th-cells
!! wikitext
{|
-!| foo !!| bar
+!|foo!!|bar
|}
!! html
<table>
<tr>
-<th> foo </th>
-<th> bar
+<th>foo</th>
+<th>bar
</th></tr></table>
!!end
Empty table rows go away
!! wikitext
{|
-| Hello
-| there
+|Hello
+|there
|- class="foo"
|-
|}
!! html
<table>
<tr>
-<td> Hello
+<td>Hello
</td>
-<td> there
+<td>there
</td></tr>
</table>
!! wikitext
{|
<!--hi-->|-
- | there
+ |there
|}
!! html/php
<table>
<tr>
-<td> there
+<td>there
</td></tr></table>
!! html/parsoid
!! html/parsoid
<ul><li>a<br>b</li><li>c</li></ul>
!! wikitext
-* a<br>b
+* a<br />b
* c
!! end
|<nowiki>- </nowiki>
|-
|<small>-</small>
-|<br>
+|<br />
-
-|<br>
+|<br />
-
|}
!! html/php+tidy
!! html/parsoid
<h2>foo<br/>bar</h2>
!! wikitext
-== foo<br> bar ==
+== foo<br /> bar ==
!! end
!! test
!! test
Empty LI (T49673)
!! wikitext
-* a
+*a
*
*
-* b
+*b
!! html+tidy
-<ul><li> a</li>
-<li class="mw-empty-elt"> </li>
+<ul><li>a</li>
+<li class="mw-empty-elt"></li>
<li class="mw-empty-elt"></li>
-<li> b</li></ul>
+<li>b</li></ul>
!! end
!! test
!! config
wgFragmentMode=[ 'html5', 'legacy' ]
!! wikitext
-== A&B&C&amp;D&amp;amp;E ==
+==A&B&C&amp;D&amp;amp;E==
[[#A&B&C&amp;D&amp;amp;E]]
!! html/php
<h2><span id="A.26B.26C.26amp.3BD.26amp.3Bamp.3BE"></span><span class="mw-headline" id="A&B&C&amp;D&amp;amp;E">A&B&C&amp;D&amp;amp;E</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: A&B&C&amp;D&amp;amp;E">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p><a href="#A&B&C&amp;D&amp;amp;E">#A&B&C&amp;D&amp;amp;E</a>
</p>
!! html/parsoid
-<h2 id="A&B&C&amp;D&amp;amp;E"><span id="A.26B.26C.26amp.3BD.26amp.3Bamp.3BE" typeof="mw:FallbackId" data-parsoid="{}"></span> A&B<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&"}'>&</span>C<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&"}'>&</span>amp;D<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&"}'>&</span>amp;amp;E </h2>
+<h2 id="A&B&C&amp;D&amp;amp;E"><span id="A.26B.26C.26amp.3BD.26amp.3Bamp.3BE" typeof="mw:FallbackId" data-parsoid="{}"></span>A&B<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&"}'>&</span>C<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&"}'>&</span>amp;D<span typeof="mw:Entity" data-parsoid='{"src":"&amp;","srcContent":"&"}'>&</span>amp;amp;E</h2>
<p><a rel="mw:WikiLink" href="./Main_Page#A&B&C&amp;D&amp;amp;E" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#A&B&C&amp;D&amp;amp;E"},"sa":{"href":"#A&B&amp;C&amp;amp;D&amp;amp;amp;E"}}'>#A&B&C&amp;D&amp;amp;E</a></p>
!! end
!! config
wgFragmentMode=[ 'legacy' ]
!! wikitext
-== A&B&C&amp;D&amp;amp;E ==
+==A&B&C&amp;D&amp;amp;E==
[[#A&B&C&amp;D&amp;amp;E]]
!! html/php
<h2><span class="mw-headline" id="A.26B.26C.26amp.3BD.26amp.3Bamp.3BE">A&B&C&amp;D&amp;amp;E</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: A&B&C&amp;D&amp;amp;E">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! config
wgFragmentMode=[ 'html5', 'legacy' ]
!! wikitext
-== Foo bar ==
+==Foo bar==
-== foo Bar ==
+==foo Bar==
-== Тест ==
+==Тест==
-== Тест ==
+==Тест==
-== тест ==
+==тест==
-== Hey < # " > % : ' ==
+==Hey < # " > % : '==
[[#Foo bar]] [[#foo Bar]] [[#Тест]] [[#тест]] [[#Hey < # " > % : ']]
{{anchorencode:💩}} <span id="{{anchorencode:💩}}"></span>
</p><p><a href="#啤酒">#啤酒</a> <a href="#啤酒">#啤酒</a>
</p>
!! html/parsoid
-<h2 id="Foo_bar"> Foo bar </h2>
+<h2 id="Foo_bar">Foo bar</h2>
-<h2 id="foo_Bar_2"> foo Bar </h2>
+<h2 id="foo_Bar_2">foo Bar</h2>
-<h2 id="Тест"><span id=".D0.A2.D0.B5.D1.81.D1.82" typeof="mw:FallbackId"></span> Тест </h2>
+<h2 id="Тест"><span id=".D0.A2.D0.B5.D1.81.D1.82" typeof="mw:FallbackId"></span>Тест</h2>
-<h2 id="Тест_2"><span id=".D0.A2.D0.B5.D1.81.D1.82_2" typeof="mw:FallbackId"></span> Тест </h2>
+<h2 id="Тест_2"><span id=".D0.A2.D0.B5.D1.81.D1.82_2" typeof="mw:FallbackId"></span>Тест</h2>
-<h2 id="тест"><span id=".D1.82.D0.B5.D1.81.D1.82" typeof="mw:FallbackId"></span> тест </h2>
+<h2 id="тест"><span id=".D1.82.D0.B5.D1.81.D1.82" typeof="mw:FallbackId"></span>тест</h2>
-<h2 id="Hey_<_#_"_>_%_:_'"><span id="Hey_.3C_.23_.22_.3E_.25_:_.27" typeof="mw:FallbackId"></span> Hey < # " > %<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"src":" ","isDisplayHack":true}'> </span>: ' </h2>
+<h2 id="Hey_<_#_"_>_%_:_'"><span id="Hey_.3C_.23_.22_.3E_.25_:_.27" typeof="mw:FallbackId"></span>Hey < # " > %<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"src":" ","isDisplayHack":true}'> </span>: '</h2>
<p><a rel="mw:WikiLink" href="./Main_Page#Foo_bar">#Foo bar</a> <a rel="mw:WikiLink" href="./Main_Page#foo_Bar">#foo Bar</a> <a rel="mw:WikiLink" href="./Main_Page#Тест">#Тест</a> <a rel="mw:WikiLink" href="./Main_Page#тест">#тест</a> <a rel="mw:WikiLink" href="./Main_Page#Hey_<_#_"_>_%_:_'" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#Hey_<_#_\"_>_%_:_'"},"sa":{"href":"#Hey < # \" > % : '"}}'>#Hey < # " > % : '</a></p>
-<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"anchorencode:💩","function":"anchorencode"},"params":{},"i":0}}]}'>💩</span> <span id="💩" about="#mwt3" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"id"},{"html":"<span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid='{\"pi\":[[]],\"dsr\":[190,209,null,null]}' data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"anchorencode:💩\",\"function\":\"anchorencode\"},\"params\":{},\"i\":0}}]}'>💩</span>"}]]}'></span></p>
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"anchorencode:💩","function":"anchorencode"},"params":{},"i":0}}]}'>💩</span> <span id="💩" about="#mwt3" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"id"},{"html":"<span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid='{\"pi\":[[]],\"dsr\":[178,197,null,null]}' data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"anchorencode:💩\",\"function\":\"anchorencode\"},\"params\":{},\"i\":0}}]}'>💩</span>"}]]}'></span></p>
<!-- These two links should produce identical HTML -->
<p><a rel="mw:WikiLink" href="./Main_Page#啤酒">#啤酒</a> <a rel="mw:WikiLink" href="./Main_Page#啤酒" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#啤酒"},"sa":{"href":"#%E5%95%A4%E9%85%92"}}'>#啤酒</a></p>
!! config
wgFragmentMode=[ 'legacy', 'html5' ]
!! wikitext
-== Foo bar ==
+==Foo bar==
-== foo Bar ==
+==foo Bar==
-== Тест ==
+==Тест==
-== Тест ==
+==Тест==
-== тест ==
+==тест==
-== Hey < # " > % : ' ==
+==Hey < # " > % : '==
[[#Foo bar]] [[#foo Bar]] [[#Тест]] [[#тест]] [[#Hey < # " > % : ']]
{{anchorencode:💩}} <span id="{{anchorencode:💩}}"></span>
!! config
wgFragmentMode=[ 'html5' ]
!! wikitext
-== Foo bar ==
+==Foo bar==
-== foo Bar ==
+==foo Bar==
-== Тест ==
+==Тест==
-== Тест ==
+==Тест==
-== тест ==
+==тест==
-== Hey < # " > % : ' ==
+==Hey < # " > % : '==
[[#Foo bar]] [[#foo Bar]] [[#Тест]] [[#тест]] [[#Hey < # " > % : ']]
{{anchorencode:💩}} <span id="{{anchorencode:💩}}"></span>
!! config
wgFragmentMode=[ 'html5', 'legacy' ]
!! wikitext
-== Foo bar ==
+==Foo bar==
[[#Foo bar]]
!! html/php
<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p><a href="#Foo_bar">#Foo bar</a>
</p>
+!! html/parsoid
+<h2 id="Foo_bar"> Foo<span typeof="mw:Entity" data-parsoid='{"src":"&nbsp;","srcContent":" "}'> </span>bar </h2>
+<p><a rel="mw:WikiLink" href="./Main_Page#Foo_bar" data-parsoid='{"stx":"simple","a":{"href":"./Main_Page#Foo_bar"},"sa":{"href":"#Foo&nbsp;bar"}}'>#Foo bar</a></p>
!! end
!! test
"wrapSections": true
}
!! wikitext
-= 1 =
+=1=
a
-= 2 =
+=2=
b
-== 2.1 ==
+==2.1==
c
-== 2.2 ==
+==2.2==
d
-=== 2.2.1 ===
+===2.2.1===
e
-= 3 =
+=3=
f
!! html/parsoid
-<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1"> 1 </h1>
+<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1">1</h1>
<p>a</p>
-</section><section data-mw-section-id="2"><h1 id="2"> 2 </h1>
+</section><section data-mw-section-id="2"><h1 id="2">2</h1>
<p>b</p>
-<section data-mw-section-id="3"><h2 id="2.1"> 2.1 </h2>
+<section data-mw-section-id="3"><h2 id="2.1">2.1</h2>
<p>c</p>
-</section><section data-mw-section-id="4"><h2 id="2.2"> 2.2 </h2>
+</section><section data-mw-section-id="4"><h2 id="2.2">2.2</h2>
<p>d</p>
-<section data-mw-section-id="5"><h3 id="2.2.1"> 2.2.1 </h3>
+<section data-mw-section-id="5"><h3 id="2.2.1">2.2.1</h3>
<p>e</p>
-</section></section></section><section data-mw-section-id="6"><h1 id="3"> 3 </h1>
+</section></section></section><section data-mw-section-id="6"><h1 id="3">3</h1>
<p>f</p>
</section>
Para 3.
-= 1 =
+=1=
a
-= 2 =
+=2=
b
-== 2.1 ==
+==2.1==
c
!! html/parsoid
<section data-mw-section-id="0"><p>Para 1.</p>
<p>Para 3.</p>
-</section><section data-mw-section-id="1"><h1 id="1"> 1 </h1>
+</section><section data-mw-section-id="1"><h1 id="1">1</h1>
<p>a</p>
-</section><section data-mw-section-id="2"><h1 id="2"> 2 </h1>
+</section><section data-mw-section-id="2"><h1 id="2">2</h1>
<p>b</p>
-<section data-mw-section-id="3"><h2 id="2.1"> 2.1 </h2>
+<section data-mw-section-id="3"><h2 id="2.1">2.1</h2>
<p>c</p>
</section></section>
"wrapSections": true
}
!! wikitext
-= 1 =
+=1=
a
{{echo|1=
-== 1.1 ==
+==1.1==
b
}}
-== 1.2 ==
+==1.2==
c
-= 2 =
+=2=
d
!! html/parsoid
-<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1"> 1 </h1>
+<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1">1</h1>
<p>a</p>
-<section data-mw-section-id="-1"><h2 about="#mwt1" typeof="mw:Transclusion" id="1.1" data-parsoid='{"dsr":[9,33,null,null],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"== 1.1 ==\nb"}},"i":0}}]}'> 1.1 </h2><span about="#mwt1">
+<section data-mw-section-id="-1"><h2 about="#mwt1" typeof="mw:Transclusion" id="1.1" data-parsoid='{"dsr":[9,33,null,null],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"==1.1==\nb"}},"i":0}}]}'>1.1</h2><span about="#mwt1">
</span><p about="#mwt1">b</p>
-</section><section data-mw-section-id="3"><h2 id="1.2"> 1.2 </h2>
+</section><section data-mw-section-id="3"><h2 id="1.2">1.2</h2>
<p>c</p>
-</section></section><section data-mw-section-id="4"><h1 id="2"> 2 </h1>
+</section></section><section data-mw-section-id="4"><h1 id="2">2</h1>
<p>d</p></section>
!! end
"modes": ["wt2html", "wt2wt"]
}
!! wikitext
-= 1 =
+=1=
a
{{echo|1=
-== 1.1 ==
+==1.1==
b
-=== 1.1.1 ===
+===1.1.1===
d
}}
-= 2 =
+=2=
e
!! html/parsoid
-<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1"> 1 </h1>
+<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1">1</h1>
<p>a</p>
-<section data-mw-section-id="-1"><h2 about="#mwt1" typeof="mw:Transclusion" id="1.1" data-parsoid='{"dsr":[9,50,null,null],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"== 1.1 ==\nb\n=== 1.1.1 ===\nd"}},"i":0}},"\n"]}'> 1.1 </h2><span about="#mwt1">
+<section data-mw-section-id="-1"><h2 about="#mwt1" typeof="mw:Transclusion" id="1.1" data-parsoid='{"dsr":[9,50,null,null],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"==1.1==\nb\n===1.1.1===\nd"}},"i":0}},"\n"]}'>1.1</h2><span about="#mwt1">
</span><p about="#mwt1">b</p><span about="#mwt1">
-</span><section data-mw-section-id="-1" about="#mwt1"><h3 about="#mwt1" id="1.1.1"> 1.1.1 </h3><span about="#mwt1">
+</span><section data-mw-section-id="-1" about="#mwt1"><h3 about="#mwt1" id="1.1.1">1.1.1</h3><span about="#mwt1">
</span><p about="#mwt1">d</p><span about="#mwt1">
-</span></section></section></section><section data-mw-section-id="4" data-parsoid="{}"><h1 id="2"> 2 </h1>
+</span></section></section></section><section data-mw-section-id="4" data-parsoid="{}"><h1 id="2">2</h1>
<p>e</p></section>
!! end
"modes": ["wt2html", "wt2wt"]
}
!! wikitext
-= 1 =
+=1=
a
{{echo|1=
x
-== 1.1 ==
+==1.1==
b
==1.2==
c
===1.2.1===
d
}}
-= 2 =
+=2=
e
!! html/parsoid
<section data-mw-section-id="0"></section><section data-mw-section-id="1" data-parsoid="{}"><h1 id="1"> 1 </h1>
<p>a</p>
-<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"dsr":[9,60,0,0],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"x\n== 1.1 ==\nb\n==1.2==\nc\n===1.2.1===\nd"}},"i":0}},"\n"]}'>x</p><span about="#mwt1">
-</span><section data-mw-section-id="-1" about="#mwt1"><h2 about="#mwt1" id="1.1"> 1.1 </h2><span about="#mwt1">
+<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"dsr":[9,60,0,0],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"x\n==1.1==\nb\n==1.2==\nc\n===1.2.1===\nd"}},"i":0}},"\n"]}'>x</p><span about="#mwt1">
+</span><section data-mw-section-id="-1" about="#mwt1"><h2 about="#mwt1" id="1.1">1.1</h2><span about="#mwt1">
</span><p about="#mwt1">b</p><span about="#mwt1">
</span></section><section data-mw-section-id="-1" about="#mwt1"><h2 about="#mwt1" id="1.2">1.2</h2><span about="#mwt1">
</span><p about="#mwt1">c</p><span about="#mwt1">
</span><section data-mw-section-id="-1" about="#mwt1"><h3 about="#mwt1" id="1.2.1">1.2.1</h3><span about="#mwt1">
</span><p about="#mwt1">d</p><span about="#mwt1">
-</span></section></section></section><section data-mw-section-id="5"><h1 id="2"> 2 </h1>
+</span></section></section></section><section data-mw-section-id="5"><h1 id="2">2</h1>
<p>e</p></section>
!! end
a
{{echo|
-= 1 =
+=1=
b
}}
<section data-mw-section-id="-1"></section><section data-mw-section-id="-2"><div data-parsoid='{"stx":"html"}'>
<p>a</p>
-<span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"\n= 1 =\nb\n"}},"i":0}},"\n\nc\n"]}'>
-</span><section data-mw-section-id="-1" about="#mwt1"><h1 about="#mwt1" id="1"> 1 </h1><span about="#mwt1">
+<span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"\n=1=\nb\n"}},"i":0}},"\n\nc\n"]}'>
+</span><section data-mw-section-id="-1" about="#mwt1"><h1 about="#mwt1" id="1">1</h1><span about="#mwt1">
</span><p about="#mwt1">b
</p><span about="#mwt1">
"wrapSections": true
}
!! wikitext
-= 1 =
+=1=
a
{{echo|1=
-= 2 =
+=2=
b
-== 2.1 ==
+==2.1==
c
}}
d
-= 3 =
+=3=
e
!! html/parsoid
-<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1"> 1 </h1>
+<section data-mw-section-id="0"></section><section data-mw-section-id="1"><h1 id="1">1</h1>
<p>a</p>
-</section><section data-mw-section-id="-1"><h1 about="#mwt1" typeof="mw:Transclusion" id="2" data-parsoid='{"dsr":[9,45,null,null],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"= 2 =\nb\n== 2.1 ==\nc"}},"i":0}},"\n\nd\n\n"]}'> 2 </h1><span about="#mwt1">
+</section><section data-mw-section-id="-1"><h1 about="#mwt1" typeof="mw:Transclusion" id="2" data-parsoid='{"dsr":[9,45,null,null],"pi":[[{"k":"1","named":true,"spc":["","","\n","\n"]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"=2=\nb\n==2.1==\nc"}},"i":0}},"\n\nd\n\n"]}'>2</h1><span about="#mwt1">
</span><p about="#mwt1">b</p><span about="#mwt1">
-</span><section data-mw-section-id="-1" about="#mwt1"><h2 about="#mwt1" id="2.1"> 2.1 </h2><span about="#mwt1">
+</span><section data-mw-section-id="-1" about="#mwt1"><h2 about="#mwt1" id="2.1">2.1</h2><span about="#mwt1">
</span><p about="#mwt1">c</p><span about="#mwt1">
</span><p about="#mwt1">d</p><span about="#mwt1">
-</span></section></section><section data-mw-section-id="4"><h1 id="3"> 3 </h1>
+</span></section></section><section data-mw-section-id="4"><h1 id="3">3</h1>
<p>e</p></section>
!! end
"modes": ["wt2html", "wt2wt"]
}
!! wikitext
-= 1 =
+=1=
a
{{echo|1=
-== 1.2 ==
+==1.2==
b
-= 2 =
+=2=
c
}}
d
-= 3 =
+=3=
e
!! html/parsoid
-<section data-mw-section-id="0"></section><section data-mw-section-id="1" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["= 1 =\na\n\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"== 1.2 ==\nb\n= 2 =\nc"}},"i":0}},"\n\nd\n\n"]}'><h1 id="1"> 1 </h1>
+<section data-mw-section-id="0"></section><section data-mw-section-id="1" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["=1=\na\n\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"==1.2==\nb\n=2=\nc"}},"i":0}},"\n\nd\n\n"]}'><h1 id="1">1</h1>
<p>a</p>
-<section data-mw-section-id="-1"><h2 about="#mwt1" typeof="mw:Transclusion" id="1.2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"== 1.2 ==\nb\n= 2 =\nc"}},"i":0}}]}'> 1.2 </h2><span about="#mwt1">
+<section data-mw-section-id="-1"><h2 about="#mwt1" typeof="mw:Transclusion" id="1.2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"==1.2==\nb\n=2=\nc"}},"i":0}}]}'>1.2</h2><span about="#mwt1">
</span><p about="#mwt1">b</p><span about="#mwt1">
-</span></section></section><section data-mw-section-id="-1" about="#mwt1"><h1 about="#mwt1" id="2"> 2 </h1><span about="#mwt1">
+</span></section></section><section data-mw-section-id="-1" about="#mwt1"><h1 about="#mwt1" id="2">2</h1><span about="#mwt1">
</span><p about="#mwt1">c</p>
<p>d</p>
-</section><section data-mw-section-id="4" data-parsoid="{}"><h1 id="3"> 3 </h1>
+</section><section data-mw-section-id="4" data-parsoid="{}"><h1 id="3">3</h1>
<p>e</p></section>
!! end
foo
<div style="border:1px solid red;">
-= 1 =
+=1=
a
-== 1.1 ==
+==1.1==
b
-= 2 =
+=2=
c
</div>
-= 3 =
+=3=
d
-== 3.1 ==
+==3.1==
e
!! html/parsoid
<section data-mw-section-id="-1"><p>foo</p>
</section><section data-mw-section-id="-2"><div style="border:1px solid red;">
-<section data-mw-section-id="1"><h1 id="1"> 1 </h1>
+<section data-mw-section-id="1"><h1 id="1">1</h1>
<p>a</p>
-<section data-mw-section-id="2"><h2 id="1.1"> 1.1 </h2>
+<section data-mw-section-id="2"><h2 id="1.1">1.1</h2>
<p>b</p>
-</section></section><section data-mw-section-id="-1"><h1 id="2"> 2 </h1>
+</section></section><section data-mw-section-id="-1"><h1 id="2">2</h1>
<p>c</p>
</section></div>
-</section><section data-mw-section-id="4"><h1 id="3"> 3 </h1>
+</section><section data-mw-section-id="4"><h1 id="3">3</h1>
<p>d</p>
-<section data-mw-section-id="5"><h2 id="3.1"> 3.1 </h2>
+<section data-mw-section-id="5"><h2 id="3.1">3.1</h2>
<p>e</p>
</section></section>
!! end
!! wikitext
foo
-= 1 =
+=1=
a
<div style="border:1px solid red;">
b
-== 1.1 ==
+==1.1==
c
-= 2 =
+=2=
d
</div>
e
-= 3 =
+=3=
f
-== 3.1 ==
+==3.1==
g
!! html/parsoid
<section data-mw-section-id="0"><p>foo</p>
-</section><section data-mw-section-id="-1"><h1 id="1"> 1 </h1>
+</section><section data-mw-section-id="-1"><h1 id="1">1</h1>
<p>a</p>
</section><section data-mw-section-id="-2"><div style="border:1px solid red;">
<p>b</p>
-<section data-mw-section-id="2"><h2 id="1.1"> 1.1 </h2>
+<section data-mw-section-id="2"><h2 id="1.1">1.1</h2>
<p>c</p>
-</section><section data-mw-section-id="-1"><h1 id="2"> 2 </h1>
+</section><section data-mw-section-id="-1"><h1 id="2">2</h1>
<p>d</p>
</section></div>
<p>e</p>
-</section><section data-mw-section-id="4"><h1 id="3"> 3 </h1>
+</section><section data-mw-section-id="4"><h1 id="3">3</h1>
<p>f</p>
-<section data-mw-section-id="5"><h2 id="3.1"> 3.1 </h2>
+<section data-mw-section-id="5"><h2 id="3.1">3.1</h2>
<p>g</p>
</section></section>
!! end
<h1>a</h1>
-= b =
+=b=
<h1>c</h1>
-= d =
+=d=
!! html/parsoid
<section data-mw-section-id="0"><p>foo</p>
<h1 id="a" data-parsoid='{"stx":"html"}'>a</h1>
-</section><section data-mw-section-id="1"><h1 id="b"> b </h1>
+</section><section data-mw-section-id="1"><h1 id="b">b</h1>
<h1 id="c" data-parsoid='{"stx":"html"}'>c</h1>
-</section><section data-mw-section-id="2"><h1 id="d"> d </h1></section>
+</section><section data-mw-section-id="2"><h1 id="d">d</h1></section>
!! end
!! test
!! wikitext
<!-- this is a comment, presumably significant to editors -->
-= 1 =
+=1=
a
-= 2 =
+=2=
b
!! html/parsoid
<section data-mw-section-id="0" data-parsoid="{}">
<!-- this is a comment, presumably significant to editors -->
-</section><section data-mw-section-id="1"><h1 id="1"> 1 </h1>
+</section><section data-mw-section-id="1"><h1 id="1">1</h1>
<p>a</p>
-</section><section data-mw-section-id="2"><h1 id="2"> 2 </h1>
+</section><section data-mw-section-id="2"><h1 id="2">2</h1>
<p>b</p></section>
!! end
!! wikitext
foo
{{echo|<div>
-== a ==
-== b ==
+==a==
+==b==
</div>
}}
!! html/parsoid
<section data-mw-section-id="-1"><p>foo</p>
-</section><section data-mw-section-id="-2"><div about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>\n== a ==\n== b ==\n</div>\n"}},"i":0}}]}'>
-<section data-mw-section-id="-1"><h2 id="a"> a </h2>
-</section><section data-mw-section-id="-1"><h2 id="b"> b </h2>
+</section><section data-mw-section-id="-2"><div about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>\n==a==\n==b==\n</div>\n"}},"i":0}}]}'>
+<section data-mw-section-id="-1"><h2 id="a">a</h2>
+</section><section data-mw-section-id="-1"><h2 id="b">b</h2>
</section></div><span about="#mwt1">
</span></section>
!! end
+
+##########################################################################
+Tests demonstrating white-space insensitivity in input wikitext
+for wikitext headings, wikitext list items, and wikitext table captions,
+headings, and cells. HTML versions of the same should preserve whitespace.
+##########################################################################
+!! test
+Trim whitespace in wikitext headings, list items, table captions, headings, and cells
+!! wikitext
+__NOTOC__
+== <!--c1--> <!--c2--> Heading <!--c3--> <!--c4--> ==
+* <!--c1--> <!--c2--> List item <!--c3--> <!--c4-->
+; <!--term to define--> term : <!--term's definition--> definition
+{|
+|+ <!--c1--> <!--c2--> Table Caption <!--c3--> <!--c4-->
+|-
+! <!--c1--> <!--c2--> Table Heading 1 <!--c3--> <!--c4--> !! Table Heading 2 <!--c5-->
+|-
+| <!--c1--> <!--c2--> Table Cell 1 <!--c3--> <!--c4--> || Table Cell 2 <!--c5-->
+|-
+| class="foo" || <!--c1--> <!--c2--> Table Cell 3 <!--c3--> <!--c4-->
+|-
+| <!--c1--> testing [[one|two]] <!--c2--> | <!--c3--> some content
+|}
+: {|
+ | <!--c1--> <!--c2--> Table Cell 1 <!--c3--> <!--c4--> || Table Cell 2 <!--c5-->
+ |} foo <!--c1-->
+!! html/php+tidy
+<h2><span class="mw-headline" id="Heading">Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<ul><li>List item</li></ul>
+<dl><dt>term </dt>
+<dd>definition</dd></dl>
+<table>
+<caption>Table Caption
+</caption>
+<tbody><tr>
+<th>Table Heading 1</th>
+<th>Table Heading 2
+</th></tr>
+<tr>
+<td>Table Cell 1</td>
+<td>Table Cell 2
+</td></tr>
+<tr>
+<td>class="foo"</td>
+<td>Table Cell 3
+</td></tr>
+<tr>
+<td>testing <a href="/index.php?title=One&action=edit&redlink=1" class="new" title="One (page does not exist)">two</a> | some content
+</td></tr></tbody></table>
+<dl><dd><table>
+<tbody><tr>
+<td>Table Cell 1</td>
+<td>Table Cell 2
+</td></tr></tbody></table> foo</dd></dl>
+!! end
+
+# Looks like <caption> is not accepted in HTML
+!! test
+Do not trim whitespace in HTML headings, list items, table captions, headings, and cells
+!! wikitext
+__NOTOC__
+<h2> <!--c1--> <!--c2--> Heading <!--c3--> <!--c4--> <h2>
+<ul><li> <!--c1--> <!--c2--> List item <!--c3--> <!--c4--> </li></ul>
+<table>
+<tr><th> <!--c1--> <!--c2--> Table Heading <!--c3--> <!--c4--> <th></tr>
+<tr><td> <!--c1--> <!--c2--> Table Cell <!--c3--> <!--c4--> <th></tr>
+</table>
+!! html/php+tidy
+<h2> Heading </h2><h2>
+<ul><li> List item </li></ul>
+<table>
+<tbody><tr><th> Table Heading </th><th></th></tr>
+<tr><td> Table Cell </td><th></th></tr>
+</tbody></table>
+</h2>
+!! end
+
+!! test
+Do not trim whitespace in links and quotes
+!! wikitext
+foo '' <!--c1--> italic <!--c2--> '' and ''' <!--c3--> bold <!--c4--> '''
+[[Foo| some text ]]
+!! html/php+tidy
+<p>foo <i> italic </i> and <b> bold </b>
+<a href="/wiki/Foo" title="Foo"> some text </a>
+</p>
+!! end
"homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
}
],
- "license": "GPL-2.0",
+ "license": "GPL-2.0-only",
"support": {
"issues": "https://bugzilla.wikimedia.org/",
"irc": "irc://irc.freenode.net/mediawiki",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT",
- "GPL-3.0"
+ "GPL-3.0-only"
],
"authors": [
{
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "GPL-2.0+"
+ "GPL-2.0-or-later"
],
"authors": [
{
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "GPL-2.0+",
+ "GPL-2.0-or-later",
"MIT"
],
"description": "The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.",
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "GPL-2.0"
+ "GPL-2.0-only"
],
"authors": [
{
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT",
- "GPL-3.0"
+ "GPL-3.0-only"
],
"authors": [
{
"homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
}
],
- "license": "GPL-2.0",
+ "license": "GPL-2.0-only",
"support": {
"issues": "https://bugzilla.wikimedia.org/",
"irc": "irc://irc.freenode.net/mediawiki",
$status,
"* ⧼fooBar!⧽\n* ⧼fooBar2!⧽\n",
"(wrap-long: * (fooBar!)\n* (fooBar2!)\n)",
- "<ul><li> ⧼fooBar!⧽</li>\n<li> ⧼fooBar2!⧽</li></ul>\n",
- "<p>(wrap-long: * (fooBar!)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
+ "<ul><li>⧼fooBar!⧽</li>\n<li>⧼fooBar2!⧽</li></ul>\n",
+ "<p>(wrap-long: * (fooBar!)\n</p>\n<ul><li>(fooBar2!)</li></ul>\n<p>)\n</p>",
];
$status = new Status();
$status,
"* ⧼fooBar!⧽\n* ⧼fooBar2!⧽\n",
"(wrap-long: * (fooBar!: foo, bar)\n* (fooBar2!)\n)",
- "<ul><li> ⧼fooBar!⧽</li>\n<li> ⧼fooBar2!⧽</li></ul>\n",
- "<p>(wrap-long: * (fooBar!: foo, bar)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
+ "<ul><li>⧼fooBar!⧽</li>\n<li>⧼fooBar2!⧽</li></ul>\n",
+ "<p>(wrap-long: * (fooBar!: foo, bar)\n</p>\n<ul><li>(fooBar2!)</li></ul>\n<p>)\n</p>",
];
return $testCases;
public function testNewNullRevision( Title $title, $comment, $minor ) {
$store = MediaWikiServices::getInstance()->getRevisionStore();
$user = TestUserRegistry::getMutableTestUser( __METHOD__ )->getUser();
+
+ $parent = $store->getRevisionByTitle( $title );
$record = $store->newNullRevision(
wfGetDB( DB_MASTER ),
$title,
$this->assertEquals( $comment, $record->getComment() );
$this->assertEquals( $minor, $record->isMinor() );
$this->assertEquals( $user->getName(), $record->getUser()->getName() );
+ $this->assertEquals( $parent->getId(), $record->getParentId() );
+
+ $parentSlot = $parent->getSlot( 'main' );
+ $slot = $record->getSlot( 'main' );
+
+ $this->assertTrue( $slot->isInherited(), 'isInherited' );
+ $this->assertSame( $parentSlot->getOrigin(), $slot->getOrigin(), 'getOrigin' );
+ $this->assertSame( $parentSlot->getAddress(), $slot->getAddress(), 'getAddress' );
}
/**
'model_name' => CONTENT_MODEL_WIKITEXT,
'format_name' => CONTENT_FORMAT_WIKITEXT,
'slot_revision_id' => '2',
- 'slot_inherited' => '1',
+ 'slot_origin' => '1',
'role_name' => 'myRole',
];
return (object)$data;
$this->assertSame( 'someHash', $record->getSha1() );
$this->assertSame( CONTENT_MODEL_WIKITEXT, $record->getModel() );
$this->assertSame( 2, $record->getRevision() );
+ $this->assertSame( 1, $record->getOrigin() );
$this->assertSame( 'tt:456', $record->getAddress() );
$this->assertSame( 33, $record->getContentId() );
$this->assertSame( CONTENT_FORMAT_WIKITEXT, $record->getFormat() );
'format_name' => function () {
return CONTENT_FORMAT_WIKITEXT;
},
- 'slot_inherited' => '0'
+ 'slot_revision_id' => '2',
+ 'slot_origin' => '2',
] );
$content = function () {
$this->assertNotNull( $record->getSha1() );
$this->assertSame( CONTENT_MODEL_WIKITEXT, $record->getModel() );
$this->assertSame( 2, $record->getRevision() );
+ $this->assertSame( 2, $record->getRevision() );
$this->assertSame( 'tt:456', $record->getAddress() );
$this->assertSame( 33, $record->getContentId() );
$this->assertSame( CONTENT_FORMAT_WIKITEXT, $record->getFormat() );
$record->getAddress();
}
- public function testGetRevision_fails() {
+ public function provideIncomplete() {
+ $unsaved = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+ yield 'unsaved' => [ $unsaved ];
+
+ $parent = new SlotRecord( $this->makeRow(), new WikitextContent( 'A' ) );
+ $inherited = SlotRecord::newInherited( $parent );
+ yield 'inherited' => [ $inherited ];
+ }
+
+ /**
+ * @dataProvider provideIncomplete
+ */
+ public function testGetRevision_fails( SlotRecord $record ) {
$record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
$this->setExpectedException( IncompleteRevisionException::class );
$record->getRevision();
}
+ /**
+ * @dataProvider provideIncomplete
+ */
+ public function testGetOrigin_fails( SlotRecord $record ) {
+ $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+ $this->setExpectedException( IncompleteRevisionException::class );
+
+ $record->getOrigin();
+ }
+
public function provideHashStability() {
yield [ '', 'phoiac9h4m842xq45sp7s6u21eteeq1' ];
yield [ 'Lorem ipsum', 'hcr5u40uxr81d3nx89nvwzclfz6r9c5' ];
}
public function testNewInherited() {
- $row = $this->makeRow( [ 'slot_revision_id' => 7, 'slot_inherited' => 0 ] );
+ $row = $this->makeRow( [ 'slot_revision_id' => 7, 'slot_origin' => 7 ] );
$parent = new SlotRecord( $row, new WikitextContent( 'A' ) );
// This would happen while doing an edit, before saving revision meta-data.
$this->assertSame( 20, $saved->getContentId() );
$this->assertSame( 'A', $saved->getContent()->getNativeData() );
$this->assertSame( 10, $saved->getRevision() );
+ $this->assertSame( 10, $saved->getOrigin() );
// make sure we didn't mess with the internal state of $unsaved
$this->assertFalse( $unsaved->hasAddress() );
$freshRow = $this->makeRow( [
'content_id' => 10,
'content_address' => 'address:1',
- 'slot_inherited' => 0,
+ 'slot_origin' => 1,
'slot_revision_id' => 1,
] );
$inheritedRow = $this->makeRow( [
'content_id' => null,
'content_address' => null,
- 'slot_inherited' => 1
+ 'slot_origin' => 0,
+ 'slot_revision_id' => 1,
] );
$inheritedSlot = new SlotRecord( $inheritedRow, new WikitextContent( 'A' ) );
public function testDetectServer( $expected, $input, $description ) {
$this->setMwGlobals( 'wgAssumeProxiesUseDefaultProtocolPorts', true );
- $_SERVER = $input;
+ $this->setServerVars( $input );
$result = WebRequest::detectServer();
$this->assertEquals( $expected, $result, $description );
}
* @covers WebRequest::getIP
*/
public function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
- $_SERVER = $input;
+ $this->setServerVars( $input );
$this->setMwGlobals( [
'wgUsePrivateIPs' => $private,
'wgHooks' => [
* @covers WebRequest::getAcceptLang
*/
public function testAcceptLang( $acceptLanguageHeader, $expectedLanguages, $description ) {
- $_SERVER = [ 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader ];
+ $this->setServerVars( [ 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader ] );
$request = new WebRequest();
$this->assertSame( $request->getAcceptLang(), $expectedLanguages, $description );
}
+
+ protected function setServerVars( $vars ) {
+ // Don't remove vars which should be available in all SAPI.
+ if ( !isset( $vars['REQUEST_TIME_FLOAT'] ) ) {
+ $vars['REQUEST_TIME_FLOAT'] = $_SERVER['REQUEST_TIME_FLOAT'];
+ }
+ if ( !isset( $vars['REQUEST_TIME'] ) ) {
+ $vars['REQUEST_TIME'] = $_SERVER['REQUEST_TIME'];
+ }
+ $_SERVER = $vars;
+ }
}
--- /dev/null
+<?php
+
+/**
+ * @group API
+ * @group medium
+ *
+ * @covers ApiDisabled
+ */
+class ApiDisabledTest extends ApiTestCase {
+ public function testDisabled() {
+ $this->mergeMwGlobalArrayValue( 'wgAPIModules',
+ [ 'login' => 'ApiDisabled' ] );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The "login" module has been disabled.' );
+
+ $this->doApiRequest( [ 'action' => 'login' ] );
+ }
+}
use MediaWiki\MediaWikiServices;
/**
+ * @medium
* @group API
* @group Database
- * @group medium
*
* @covers ApiQueryWatchlist
*/
<?php
/**
- * Abstract class to support upload tests
+ * For backward compatibility since 1.31
*/
-abstract class ApiTestCaseUpload extends ApiTestCase {
- /**
- * Fixture -- run before every test
- */
- protected function setUp() {
- parent::setUp();
+abstract class ApiTestCaseUpload extends ApiUploadTestCase {
- $this->setMwGlobals( [
- 'wgEnableUploads' => true,
- 'wgEnableAPI' => true,
- ] );
-
- $this->clearFakeUploads();
- }
-
- /**
- * Helper function -- remove files and associated articles by Title
- *
- * @param Title $title Title to be removed
- *
- * @return bool
- */
- public function deleteFileByTitle( $title ) {
- if ( $title->exists() ) {
- $file = wfFindFile( $title, [ 'ignoreRedirect' => true ] );
- $noOldArchive = ""; // yes this really needs to be set this way
- $comment = "removing for test";
- $restrictDeletedVersions = false;
- $status = FileDeleteForm::doDelete(
- $title,
- $file,
- $noOldArchive,
- $comment,
- $restrictDeletedVersions
- );
-
- if ( !$status->isGood() ) {
- return false;
- }
-
- $page = WikiPage::factory( $title );
- $page->doDeleteArticle( "removing for test" );
-
- // see if it now doesn't exist; reload
- $title = Title::newFromText( $title->getText(), NS_FILE );
- }
-
- return !( $title && $title instanceof Title && $title->exists() );
- }
-
- /**
- * Helper function -- remove files and associated articles with a particular filename
- *
- * @param string $fileName Filename to be removed
- *
- * @return bool
- */
- public function deleteFileByFileName( $fileName ) {
- return $this->deleteFileByTitle( Title::newFromText( $fileName, NS_FILE ) );
- }
-
- /**
- * Helper function -- given a file on the filesystem, find matching
- * content in the db (and associated articles) and remove them.
- *
- * @param string $filePath Path to file on the filesystem
- *
- * @return bool
- */
- public function deleteFileByContent( $filePath ) {
- $hash = FSFile::getSha1Base36FromPath( $filePath );
- $dupes = RepoGroup::singleton()->findBySha1( $hash );
- $success = true;
- foreach ( $dupes as $dupe ) {
- $success &= $this->deleteFileByTitle( $dupe->getTitle() );
- }
-
- return $success;
- }
-
- /**
- * Fake an upload by dumping the file into temp space, and adding info to $_FILES.
- * (This is what PHP would normally do).
- *
- * @param string $fieldName Name this would have in the upload form
- * @param string $fileName Name to title this
- * @param string $type MIME type
- * @param string $filePath Path where to find file contents
- *
- * @throws Exception
- * @return bool
- */
- function fakeUploadFile( $fieldName, $fileName, $type, $filePath ) {
- $tmpName = $this->getNewTempFile();
- if ( !file_exists( $filePath ) ) {
- throw new Exception( "$filePath doesn't exist!" );
- }
-
- if ( !copy( $filePath, $tmpName ) ) {
- throw new Exception( "couldn't copy $filePath to $tmpName" );
- }
-
- clearstatcache();
- $size = filesize( $tmpName );
- if ( $size === false ) {
- throw new Exception( "couldn't stat $tmpName" );
- }
-
- $_FILES[$fieldName] = [
- 'name' => $fileName,
- 'type' => $type,
- 'tmp_name' => $tmpName,
- 'size' => $size,
- 'error' => null
- ];
-
- return true;
- }
-
- function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
- $tmpName = $this->getNewTempFile();
- // copy the chunk data to temp location:
- if ( !file_put_contents( $tmpName, $chunkData ) ) {
- throw new Exception( "couldn't copy chunk data to $tmpName" );
- }
-
- clearstatcache();
- $size = filesize( $tmpName );
- if ( $size === false ) {
- throw new Exception( "couldn't stat $tmpName" );
- }
-
- $_FILES[$fieldName] = [
- 'name' => $fileName,
- 'type' => $type,
- 'tmp_name' => $tmpName,
- 'size' => $size,
- 'error' => null
- ];
- }
-
- /**
- * Remove traces of previous fake uploads
- */
- function clearFakeUploads() {
- $_FILES = [];
- }
}
*
* @covers ApiUpload
*/
-class ApiUploadTest extends ApiTestCaseUpload {
+class ApiUploadTest extends ApiUploadTestCase {
/**
* Testing login
* XXX this is a funny way of getting session context
--- /dev/null
+<?php
+
+/**
+ * Abstract class to support upload tests
+ */
+abstract class ApiUploadTestCase extends ApiTestCase {
+ /**
+ * Fixture -- run before every test
+ */
+ protected function setUp() {
+ parent::setUp();
+
+ $this->setMwGlobals( [
+ 'wgEnableUploads' => true,
+ 'wgEnableAPI' => true,
+ ] );
+
+ $this->clearFakeUploads();
+ }
+
+ /**
+ * Helper function -- remove files and associated articles by Title
+ *
+ * @param Title $title Title to be removed
+ *
+ * @return bool
+ */
+ public function deleteFileByTitle( $title ) {
+ if ( $title->exists() ) {
+ $file = wfFindFile( $title, [ 'ignoreRedirect' => true ] );
+ $noOldArchive = ""; // yes this really needs to be set this way
+ $comment = "removing for test";
+ $restrictDeletedVersions = false;
+ $status = FileDeleteForm::doDelete(
+ $title,
+ $file,
+ $noOldArchive,
+ $comment,
+ $restrictDeletedVersions
+ );
+
+ if ( !$status->isGood() ) {
+ return false;
+ }
+
+ $page = WikiPage::factory( $title );
+ $page->doDeleteArticle( "removing for test" );
+
+ // see if it now doesn't exist; reload
+ $title = Title::newFromText( $title->getText(), NS_FILE );
+ }
+
+ return !( $title && $title instanceof Title && $title->exists() );
+ }
+
+ /**
+ * Helper function -- remove files and associated articles with a particular filename
+ *
+ * @param string $fileName Filename to be removed
+ *
+ * @return bool
+ */
+ public function deleteFileByFileName( $fileName ) {
+ return $this->deleteFileByTitle( Title::newFromText( $fileName, NS_FILE ) );
+ }
+
+ /**
+ * Helper function -- given a file on the filesystem, find matching
+ * content in the db (and associated articles) and remove them.
+ *
+ * @param string $filePath Path to file on the filesystem
+ *
+ * @return bool
+ */
+ public function deleteFileByContent( $filePath ) {
+ $hash = FSFile::getSha1Base36FromPath( $filePath );
+ $dupes = RepoGroup::singleton()->findBySha1( $hash );
+ $success = true;
+ foreach ( $dupes as $dupe ) {
+ $success &= $this->deleteFileByTitle( $dupe->getTitle() );
+ }
+
+ return $success;
+ }
+
+ /**
+ * Fake an upload by dumping the file into temp space, and adding info to $_FILES.
+ * (This is what PHP would normally do).
+ *
+ * @param string $fieldName Name this would have in the upload form
+ * @param string $fileName Name to title this
+ * @param string $type MIME type
+ * @param string $filePath Path where to find file contents
+ *
+ * @throws Exception
+ * @return bool
+ */
+ function fakeUploadFile( $fieldName, $fileName, $type, $filePath ) {
+ $tmpName = $this->getNewTempFile();
+ if ( !file_exists( $filePath ) ) {
+ throw new Exception( "$filePath doesn't exist!" );
+ }
+
+ if ( !copy( $filePath, $tmpName ) ) {
+ throw new Exception( "couldn't copy $filePath to $tmpName" );
+ }
+
+ clearstatcache();
+ $size = filesize( $tmpName );
+ if ( $size === false ) {
+ throw new Exception( "couldn't stat $tmpName" );
+ }
+
+ $_FILES[$fieldName] = [
+ 'name' => $fileName,
+ 'type' => $type,
+ 'tmp_name' => $tmpName,
+ 'size' => $size,
+ 'error' => null
+ ];
+
+ return true;
+ }
+
+ function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
+ $tmpName = $this->getNewTempFile();
+ // copy the chunk data to temp location:
+ if ( !file_put_contents( $tmpName, $chunkData ) ) {
+ throw new Exception( "couldn't copy chunk data to $tmpName" );
+ }
+
+ clearstatcache();
+ $size = filesize( $tmpName );
+ if ( $size === false ) {
+ throw new Exception( "couldn't stat $tmpName" );
+ }
+
+ $_FILES[$fieldName] = [
+ 'name' => $fileName,
+ 'type' => $type,
+ 'tmp_name' => $tmpName,
+ 'size' => $size,
+ 'error' => null
+ ];
+ }
+
+ /**
+ * Remove traces of previous fake uploads
+ */
+ function clearFakeUploads() {
+ $_FILES = [];
+ }
+}
/**
* @param array $groupDefinition Group definition
* @param string $input Value in URL
- *
- * @dataProvider provideModifyQuery
*/
protected function modifyQueryHelper( $groupDefinition, $input ) {
$ctx = $this->createMock( IContextSource::class );
$this->assertEquals( "Opening text is opening.", $struct->getOpeningText() );
$this->assertEquals( "Opening text is opening. Then we got more text",
$struct->getMainText() );
- $this->assertEquals( [ "Header table row in table another row in table" ],
+ $this->assertEquals( [ "Header table row in table another row in table" ],
$struct->getAuxiliaryText() );
}
}
/**
* @group Http
+ * @group small
*/
class HttpTest extends MediaWikiTestCase {
/**
* Integration test that checks import success and
* LinkCache integration.
*
- * @group medium
+ * @large
* @group Database
+ * @covers ImportStreamSource
+ * @covers ImportReporter
*
* @author mwjames
*/
* @since 1.20
*
* @param callable $function
- *
- * @covers GenericArrayObject::getObjectType
*/
protected function checkTypeChecks( $function ) {
$excption = null;
* @since 1.20
*
* @param array $elements
- *
+ * @covers GenericArrayObject::getObjectType
* @covers GenericArrayObject::offsetSet
*/
public function testOffsetSet( array $elements ) {
* @covers IP::isIPAddress
* @dataProvider provideInvalidIPs
*/
- public function isNotIPAddress( $val, $desc ) {
+ public function testIsNotIPAddress( $val, $desc ) {
$this->assertFalse( IP::isIPAddress( $val ), $desc );
}
'leafo/lessphp' => [
'version' => '0.5.0',
'type' => 'library',
- 'licenses' => [ 'MIT', 'GPL-3.0' ],
+ 'licenses' => [ 'MIT', 'GPL-3.0-only' ],
'authors' => [
[
'name' => 'Leaf Corcoran',
'wikimedia/cdb' => [
'version' => '1.0.1',
'type' => 'library',
- 'licenses' => [ 'GPL-2.0' ],
+ 'licenses' => [ 'GPL-2.0-only' ],
'authors' => [
[
'name' => 'Tim Starling',
'leafo/lessphp' => [
'version' => '0.5.0',
'type' => 'library',
- 'licenses' => [ 'MIT', 'GPL-3.0' ],
+ 'licenses' => [ 'MIT', 'GPL-3.0-only' ],
'authors' => [
[
'name' => 'Leaf Corcoran',
'mediawiki/translate' => [
'version' => '2014.12',
'type' => 'mediawiki-extension',
- 'licenses' => [ 'GPL-2.0+' ],
+ 'licenses' => [ 'GPL-2.0-or-later' ],
'authors' => [
[
'name' => 'Niklas Laxström',
'mediawiki/universal-language-selector' => [
'version' => '2014.12',
'type' => 'mediawiki-extension',
- 'licenses' => [ 'GPL-2.0+', 'MIT' ],
+ 'licenses' => [ 'GPL-2.0-or-later', 'MIT' ],
'authors' => [],
'description' => 'The primary aim is to allow users to select a language ' .
'and configure its support in an easy way. ' .
<?php
use Wikimedia\Rdbms\LikeMatch;
+use Wikimedia\Rdbms\Database;
/**
* Test the parts of the Database abstract class that deal
use MediaWikiCoversValidator;
- /** @var DatabaseTestHelper */
+ /** @var DatabaseTestHelper|Database */
private $database;
protected function setUp() {
];
}
+ /**
+ * @covers Wikimedia\Rdbms\Subquery
+ * @dataProvider provideSelectRowCount
+ * @param $sql
+ * @param $sqlText
+ */
+ public function testSelectRowCount( $sql, $sqlText ) {
+ $this->database->selectRowCount(
+ $sql['tables'],
+ $sql['field'],
+ isset( $sql['conds'] ) ? $sql['conds'] : [],
+ __METHOD__,
+ isset( $sql['options'] ) ? $sql['options'] : [],
+ isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideSelectRowCount() {
+ return [
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ '*' ],
+ 'conds' => [ 'field' => 'text' ],
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE field = 'text' ) tmp_count"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ 'column' ],
+ 'conds' => [ 'field' => 'text' ],
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE field = 'text' AND (column IS NOT NULL) ) tmp_count"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ 'alias' => 'column' ],
+ 'conds' => [ 'field' => 'text' ],
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE field = 'text' AND (column IS NOT NULL) ) tmp_count"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ 'alias' => 'column' ],
+ 'conds' => '',
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE (column IS NOT NULL) ) tmp_count"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ 'alias' => 'column' ],
+ 'conds' => false,
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE (column IS NOT NULL) ) tmp_count"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ 'alias' => 'column' ],
+ 'conds' => null,
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE (column IS NOT NULL) ) tmp_count"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ 'alias' => 'column' ],
+ 'conds' => '1',
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE (1) AND (column IS NOT NULL) ) tmp_count"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'field' => [ 'alias' => 'column' ],
+ 'conds' => '0',
+ ],
+ "SELECT COUNT(*) AS rowcount FROM " .
+ "(SELECT 1 FROM table WHERE (0) AND (column IS NOT NULL) ) tmp_count"
+ ],
+ ];
+ }
+
/**
* @dataProvider provideUpdate
* @covers Wikimedia\Rdbms\Database::update
* @covers WikiPage::newFromID
*/
public function testNewFromId_returnsNullOnNonExistingId() {
- $this->assertNull( WikiPage::newFromID( 73574757437437743743 ) );
+ $this->assertNull( WikiPage::newFromID( 2147483647 ) );
}
public function provideTestInsertProtectNullRevision() {
* Note: the following groups are not used by PHPUnit.
* The list in ParserTestFileSuite::__construct() is used instead.
*
+ * @large
* @group Database
* @group Parser
* @group ParserTests
<?php
/**
+ * @medium
* @group Database
+ * @covers FormattedRCFeed
+ * @covers RecentChange
+ * @covers JSONRCFeedFormatter
+ * @covers MachineReadableRCFeedFormatter
+ * @covers RCFeed
*/
class RCFeedIntegrationTest extends MediaWikiTestCase {
protected function setUp() {
] );
}
- /**
- * @covers RecentChange::notifyRCFeeds
- * @covers RecentChange::getEngine
- * @covers RCFeed::factory
- * @covers FormattedRCFeed::__construct
- * @covers FormattedRCFeed::notify
- * @covers JSONRCFeedFormatter::formatArray
- * @covers MachineReadableRCFeedFormatter::getLine
- */
public function testNotify() {
$feed = $this->getMockBuilder( RCFeedEngine::class )
->setConstructorArgs( [ [ 'formatter' => JSONRCFeedFormatter::class ] ] )
CREATE TABLE /*_*/imagelinks (
il_from int NOT NULL DEFAULT 0,
il_from_namespace int NOT NULL DEFAULT 0,
- il_to varchar(255) NOT NULL DEFAULT '',
- il_frobniz varchar(255) NOT NULL DEFAULT 'FROB',
+ il_to varchar(127) NOT NULL DEFAULT '',
+ il_frobniz varchar(127) NOT NULL DEFAULT 'FROB',
PRIMARY KEY (il_from,il_to)
) /*$wgDBTableOptions*/;
}
apiCreateAccount( username, password ) {
- const url = require( 'url' ), // https://nodejs.org/docs/latest/api/url.html
- baseUrl = url.parse( browser.options.baseUrl ), // http://webdriver.io/guide/testrunner/browserobject.html
- Bot = require( 'nodemw' ), // https://github.com/macbre/nodemw
- client = new Bot( {
- protocol: baseUrl.protocol,
- server: baseUrl.hostname,
- port: baseUrl.port,
- path: baseUrl.path,
- debug: false
- } );
- return new Promise( ( resolve, reject ) => {
- client.api.call(
- {
- action: 'query',
- meta: 'tokens',
- type: 'createaccount'
- },
- /**
- * @param {Error|null} err
- * @param {Object} info Processed query result
- * @param {Object} next More results?
- * @param {Object} data Raw data
- */
- function ( err, info, next, data ) {
- if ( err ) {
- reject( err );
- return;
- }
- client.api.call( {
- action: 'createaccount',
- createreturnurl: browser.options.baseUrl,
- createtoken: data.query.tokens.createaccounttoken,
- username: username,
- password: password,
- retype: password
- }, function ( err ) {
- if ( err ) {
- reject( err );
- return;
- }
- resolve();
- }, 'POST' );
- },
- 'POST'
- );
+ const MWBot = require( 'mwbot' ), // https://github.com/Fannon/mwbot
+ Promise = require( 'bluebird' );
+ let bot = new MWBot();
- } );
+ return Promise.coroutine( function* () {
+ yield bot.loginGetCreateaccountToken( {
+ apiUrl: `${browser.options.baseUrl}/api.php`,
+ username: browser.options.username,
+ password: browser.options.password
+ } );
+ yield bot.request( {
+ action: 'createaccount',
+ createreturnurl: browser.options.baseUrl,
+ createtoken: bot.createaccountToken,
+ username: username,
+ password: password,
+ retype: password
+ } );
+ } ).call( this );
}
}
apiDelete( name, reason ) {
- const url = require( 'url' ), // https://nodejs.org/docs/latest/api/url.html
- baseUrl = url.parse( browser.options.baseUrl ), // http://webdriver.io/guide/testrunner/browserobject.html
- Bot = require( 'nodemw' ), // https://github.com/macbre/nodemw
- client = new Bot( {
- protocol: baseUrl.protocol,
- server: baseUrl.hostname,
- port: baseUrl.port,
- path: baseUrl.path,
+
+ const MWBot = require( 'mwbot' ), // https://github.com/Fannon/mwbot
+ Promise = require( 'bluebird' );
+ let bot = new MWBot();
+
+ return Promise.coroutine( function* () {
+ yield bot.loginGetEditToken( {
+ apiUrl: `${browser.options.baseUrl}/api.php`,
username: browser.options.username,
- password: browser.options.password,
- debug: false
+ password: browser.options.password
} );
+ yield bot.delete( name, reason );
+ } ).call( this );
- return new Promise( ( resolve, reject ) => {
- client.logIn( function ( err ) {
- if ( err ) {
- console.log( err );
- return reject( err );
- }
- client.delete( name, reason, function ( err ) {
- if ( err ) {
- return reject( err );
- }
- resolve();
- } );
- } );
- } );
}
}
}
apiEdit( name, content ) {
- const url = require( 'url' ), // https://nodejs.org/docs/latest/api/url.html
- baseUrl = url.parse( browser.options.baseUrl ), // http://webdriver.io/guide/testrunner/browserobject.html
- Bot = require( 'nodemw' ), // https://github.com/macbre/nodemw
- client = new Bot( {
- protocol: baseUrl.protocol,
- server: baseUrl.hostname,
- port: baseUrl.port,
- path: baseUrl.path,
+
+ const MWBot = require( 'mwbot' ), // https://github.com/Fannon/mwbot
+ Promise = require( 'bluebird' );
+ let bot = new MWBot();
+
+ return Promise.coroutine( function* () {
+ yield bot.loginGetEditToken( {
+ apiUrl: `${browser.options.baseUrl}/api.php`,
username: browser.options.username,
- password: browser.options.password,
- debug: false
+ password: browser.options.password
} );
+ yield bot.edit( name, content, `Created page with "${content}"` );
+ } ).call( this );
- return new Promise( ( resolve, reject ) => {
- client.logIn( function ( err ) {
- if ( err ) {
- console.log( err );
- return reject( err );
- }
- client.edit( name, content, `Created page with "${content}"`, function ( err ) {
- if ( err ) {
- return reject( err );
- }
- resolve();
- } );
- } );
- } );
}
}
'use strict';
class Page {
open( path ) {
- browser.url( '/index.php?title=' + path );
+ browser.url( browser.options.baseUrl + '/index.php?title=' + path );
}
}
module.exports = Page;
get displayedContent() { return browser.element( '#mw-content-text' ); }
open( name ) {
- browser.url( '/index.php?title=Special:Undelete/' + name );
+ super.open( 'Special:Undelete/' + name );
}
restore( name, reason ) {
process.env.MEDIAWIKI_PASSWORD,
screenshotPath: '../log/',
baseUrl: process.env.MW_SERVER + process.env.MW_SCRIPT_PATH,
-
+ exclude: [
+ './extensions/CirrusSearch/tests/selenium/specs/**/*.js'
+ ],
reporters: [ 'spec', 'junit' ],
reporterOptions: {
junit: {