"rules": {
"declaration-no-important": null,
- "indentation": null,
-
"no-descending-specificity": null,
"selector-list-comma-newline-after": null,
* - confirm-rollback-button
* - rollbackfailed
* - rollback-missingparam
+ * - rollback-success-notify
*/
/**
$old = Linker::revUserTools( $current );
$new = Linker::revUserTools( $target );
- $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )
- ->parseAsBlock() );
+ $this->getOutput()->addHTML(
+ $this->msg( 'rollback-success' )
+ ->rawParams( $old, $new )
+ ->params( $current->getUserText( Revision::FOR_THIS_USER, $user ) )
+ ->params( $target->getUserText( Revision::FOR_THIS_USER, $user ) )
+ ->parseAsBlock()
+ );
if ( $user->getBoolOption( 'watchrollback' ) ) {
$user->addWatch( $this->page->getTitle(), User::IGNORE_USER_RIGHTS );
"apierror-reauthenticate": "Non se autentificou recentemente nesta sesión. Por favor, volva a autentificarse.",
"apierror-revwrongpage": "r$1 non é unha revisión de $2.",
"apierror-searchdisabled": "A busca <var>$1</var> está desactivada.",
+ "apierror-sectionreplacefailed": "Non se puido combinar a sección actualizada.",
+ "apierror-sectionsnotsupported": "As seccións non son compatibles co modelo de contido $1.",
"apierror-sectionsnotsupported-what": "As seccións non son compatibles con $1.",
"apierror-show": "Parámetro incorrecto - non se poden proporcionar valores mutuamente excluíntes.",
+ "apierror-siteinfo-includealldenied": "Non se pode ver a información de tódolos servidores a menos que <var>$wgShowHostNames</var> teña valor verdadeiro.",
"apierror-sizediffdisabled": "A diferenza de tamaño está deshabilitada no modo Miser.",
"apierror-spamdetected": "A súa edición foi rexeitada por conter un fragmento de publicidade: <code>$1</code>.",
"apierror-specialpage-cantexecute": "Non ten permiso para ver os resultados desta páxina especial.",
"apierror-unknownformat": "Formato descoñecido \"$1\".",
"apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro non recoñecido|Parámetros non recoñecidos}}: $1.",
"apierror-unrecognizedvalue": "Valor non recoñecido para o parámetro <var>$1</var>: $2.",
+ "apierror-urlparamnormal": "Non se puideron normalizar os parámetros de imaxe de $1.",
+ "apierror-writeapidenied": "Non ten permiso para editar este wiki a través da API.",
+ "apiwarn-alldeletedrevisions-performance": "Para ter un mellor rendemento á hora de xerar títulos, estableza <kbd>$1dir=newer</kbd>.",
+ "apiwarn-badurlparam": "Non se puido analizar <var>$1urlparam</var> para $2. Só se usará a anchura e a altura.",
"apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
"apiwarn-deprecation-parameter": "O parámetro <var>$1</var> está obsoleto.",
"apiwarn-invalidcategory": "\"$1\" non é unha categoría.",
"apierror-upload-filekeyneeded": "חובה לספק <var>filekey</var> כאשר <var>offset</var> אינו אפס.",
"apierror-upload-filekeynotallowed": "לא ניתן לספק <var>filekey</var> כאשר <var>offset</var> הוא 0.",
"apierror-upload-missingresult": "אין תוצאות בנתוני מצב.",
+ "apierror-writeapidenied": "אין לך הרשאה לערוך את הוויקי הזה דרך ה־API.",
+ "apiwarn-alldeletedrevisions-performance": "לביצועים טובים יותר בעת יצירת כותרת, יש להשתמש ב־<kbd>$1dir=newer</kbd>.",
+ "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
+ "apiwarn-badutf8": "הערך הערך שהועבר ל־<var>$1</var> מכיל נתונים בלתי־תקינים או בלתי־מנורמלים. נתונים טקסט אמורים להיות תקינים, מנורמלי NFC ללא תווי בקרה C0 למעט HT (\\t), LF (\\n), ו־CR (\\r).",
+ "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.",
+ "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> הוצהר בתור מיושן. נא להשתמש ב־ <kbd>prop=deletedrevisions</kbd> או ב־<kbd>list=alldeletedrevisions</kbd> במקום זה.",
+ "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
+ "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
+ "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <kbd>action=login</kbd> מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם <kbd>action=login</kbd>, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' <kbd>action=clientlogin</kbd>.",
+ "apiwarn-deprecation-login-token": "אחזור אסימון דרך <kbd>action=login</kbd> מיושן. נא להשתמש ב־<kbd>action=query&meta=tokens&type=login</kbd> במקום זה.",
+ "apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
+ "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
+ "apiwarn-deprecation-purge-get": "שימוש ב־<kbd>action=purge</kbd> דרך GET מיושן. יש להשתמש ב־POST במקום זה.",
+ "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> מיושן. יש להשתמש ב־<kbd>$2</kbd> במקום זה.",
+ "apiwarn-difftohidden": "לא היה אפשר לעשות השוואה עם גרסה $1: התוכן מוסתר.",
+ "apiwarn-errorprinterfailed": "מדפיס השגיאות לא עבד. ינסה שוב ללא פרמטרים.",
+ "apiwarn-errorprinterfailed-ex": "מדפיס השגיאות לא עבד (ינסה שוב ללא פרמטרים): $1",
"apiwarn-invalidcategory": "\"$1\" אינה קטגוריה.",
"apiwarn-invalidtitle": "\"$1\" אינה כותרת תקינה.",
+ "apiwarn-invalidxmlstylesheetext": "לגיליון הסגנונות אמור להיות הסיומת <code dir=\"ltr\">.xsl</code>.",
+ "apiwarn-invalidxmlstylesheet": "ניתן גיליון סגנונות שאינו תקין או אינו קיים.",
+ "apiwarn-invalidxmlstylesheetns": "גיליון הסגנונות אמור להיות במרחב השם {{ns:MediaWiki}}.",
+ "apiwarn-moduleswithoutvars": "המאפיין <kbd>modules</kbd> לא הוגדר, אבל לא <kbd>jsconfigvars</kbd> או <kbd>encodedjsconfigvars</kbd>. משתני הגדרות נחוצים בשביל שימוש נכון במודולים.",
"apiwarn-notfile": "\"$1\" אינו קובץ.",
+ "apiwarn-nothumb-noimagehandler": "לא היה אפשר ליצור תמונה ממוזערת כי לקובץ $1 לא משויך מטפל תמונה.",
+ "apiwarn-parse-nocontentmodel": "לא ניתן <var>title</var> או <var>contentmodel</var>, נניח שזה $1.",
+ "apiwarn-parse-titlewithouttext": "<var>title</var> שימש ללא <var>text</var>, והתבקשו מאפייני דף מפוענח. האם התכוונת להשתמש ב־<var>page</var> במקום <var>title</var>?",
+ "apiwarn-redirectsandrevids": "פתרון הפניות לא יכול לשמש יחד עם הפרמטר <var>revids</var>. הפניות ש־<var>revids</var> מצביע אליהן לא נפתרו.",
"apiwarn-tokennotallowed": "הפעולה \"$1\" אינה מותרת למשתמש הנוכחי.",
"apiwarn-tokens-origin": "לא ניתן לקבל אסימונים כשמדיניות המקור הזהה אינה חלה.",
"apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>: המגבלה היא $2.",
"apiwarn-deprecation-parse-headitems": "{{doc-apierror}}",
"apiwarn-deprecation-purge-get": "{{doc-apierror}}",
"apiwarn-deprecation-withreplacement": "{{doc-apierror}}\n\nParameters:\n* $1 - Query string fragment that is deprecated, e.g. \"action=tokens\".\n* $2 - Query string fragment to use instead, e.g. \"action=tokens\".",
- "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.",
+ "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n\n\"r\" is short for \"revision\". You may translate it.",
"apiwarn-errorprinterfailed": "{{doc-apierror}}",
"apiwarn-errorprinterfailed-ex": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, which may already end in punctuation. Probably in English.",
"apiwarn-invalidcategory": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied category name.",
return new CollationFa;
default:
$match = [];
- if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
+ if ( preg_match( '/^uca-([A-Za-z@=-]+)$/', $collationName, $match ) ) {
return new IcuCollation( $match[1] );
}
"config-apc": "[http://www.php.net/apc APC] е инсталиран",
"config-apcu": "[http://www.php.net/apc APC] е инсталиран",
"config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] е инсталиран",
+ "config-no-cache-apcu": "<strong>Внимание:</strong> [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] и [http://www.iis.net/download/WinCacheForPhp WinCache] не могат да бъдат открити.\nКеширането на обекти не е активирано.",
"config-mod-security": "<strong>Предупреждение:</strong> [http://modsecurity.org/ mod_security]/mod_security2 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [http://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.",
"config-diff3-bad": "GNU diff3 не беше намерен.",
"config-git": "Налична е системата за контрол на версиите Git: <code>$1</code>.",
"config-db-host": "Хост на базата от данни:",
"config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
"config-db-host-oracle": "TNS на базата данни:",
+ "config-db-host-oracle-help": "Въведете валидно [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; файлът tnsnames.ora трябва да бъде видим за инсталацията.<br />Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
"config-db-wiki-settings": "Идентифициране на това уики",
"config-db-name": "Име на базата от данни:",
"config-db-name-help": "Избира се име, което да идентифицира уикито.\nТо не трябва да съдържа интервали.\n\nАко се използва споделен хостинг, доставчикът на услугата би трябвало да е предоставил или име на базата от данни, която да бъде използвана, или да позволява създаването на бази от данни чрез контролния панел.",
"config-mysql-innodb": "InnoDB",
"config-mysql-myisam": "MyISAM",
"config-mysql-myisam-dep": "'''Предупреждение''': Избрана е MyISAM като система за складиране в MySQL, която не се препоръчва за използване с МедияУики, защото:\n* почти не поддържа паралелност заради заключване на таблиците\n* е по-податлива на повреди в сравнение с други системи\n* кодът на МедияУики не винаги поддържа MyISAM коректно\n\nАко инсталацията на MySQL поддържа InnoDB, силно е препоръчително да се използва тя.\nАко инсталацията на MySQL не поддържа InnoDB, вероятно е време за обновяване.",
+ "config-mysql-only-myisam-dep": "<strong>Внимание:</strong> MyISAM e единственият наличен на тази машина тип на таблиците за MySQL и не е препоръчителен за употреба при МедияУики защото:\n* има слаба поддръжка на конкурентност на заявките, поради закючването на таблиците\n* е много по-податлив на грешки в базите от данни от другите типове таблици\n* кодът на МедияУики не винаги работи с MyISAM както трябва\n\nВашият MySQL не поддържа InnoDB, така че може би е дошло време за актуализиране.",
"config-mysql-engine-help": "'''InnoDB''' почти винаги е най-добрата възможност заради навременната си поддръжка.\n\n'''MyISAM''' може да е по-бърза при инсталации с един потребител или само за четене.\nБазите от данни MyISAM се повреждат по-често от InnoDB.",
"config-mysql-charset": "Набор от символи в базата от данни:",
"config-mysql-binary": "Бинарен",
"config-mysql-utf8": "UTF-8",
"config-mysql-charset-help": "В '''бинарен режим''' МедияУики съхранява текстовете в UTF-8 в бинарни полета в базата от данни.\nТова е по-ефективно от UTF-8 режима на MySQL и позволява използването на пълния набор от символи в Уникод.\n\nВ '''UTF-8 режим''' MySQL ще знае в кой набор от символи са данните от уикито и ще може да ги показва и променя по подходящ начин, но няма да позволява складиране на символи извън [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основния многоезичен набор].",
"config-mssql-auth": "Тип на удостоверяването:",
+ "config-mssql-install-auth": "Изберете начин за удостоверяване, който ще бъде използван за връзка с базата от данни по време на инсталацията.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.",
+ "config-mssql-web-auth": "Изберете начина за удостоверяване, който ще се използва от уеб сървъра за връзка със сървъра за бази от данни по време на нормалните операции на уикито.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.",
"config-mssql-sqlauth": "Удостоверяване чрез SQL Server",
"config-mssql-windowsauth": "Удостоверяване чрез Windows",
"config-site-name": "Име на уикито:",
"config-profile-help": "Викијата функционираат најдобро кога имаат што повеќе уредници.\nВо МедијаВики лесно се проверуваат скорешните промени, и лесно се исправа (технички: „враќа“) штетата направена од неупатени или злонамерни корисници.\n\nМногумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е лесно да убедите некого во предностите на вики-концептот.\nЗначи имате избор.\n\n'''{{int:config-profile-wiki}}''' — модел според кој секој може да уредува, дури и без најавување.\nАко имате вики со '''задолжително отворање на сметка''', тогаш добивате повеќе контрола, но ова може даги одврати спонтаните учесници.\n\n'''{{int:config-profile-fishbowl}}''' — може да уредуваат само уредници што имаат добиено дозвола за тоа, но јавноста може да ги гледа страниците, вклучувајќи ја нивната историја.\n'''{{int:config-profile-private}}''' — страниците се видливи и уредливи само за овластени корисници.\n\nПо воспоставката имате на избор и посложени кориснички права и поставки. Погледајте во [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights прирачникот].",
"config-license": "Авторски права и лиценца:",
"config-license-none": "Без подножје за лиценца",
- "config-license-cc-by-sa": "Криејтив комонс НаведиИзвор СподелиПодИстиУслови",
- "config-license-cc-by": "Криејтив комонс НаведиИзвор",
- "config-license-cc-by-nc-sa": "Криејтив комонс НаведиИзвор-Некомерцијално-СподелиПодИстиУслови",
+ "config-license-cc-by-sa": "Криејтив комонс Наведи извор-Сподели под исти услови",
+ "config-license-cc-by": "Криејтив комонс Наведи извор",
+ "config-license-cc-by-nc-sa": "Криејтив комонс Наведи извор-Сподели под исти услови",
"config-license-cc-0": "Криејтив комонс Нула (јавна сопственост)",
"config-license-gfdl": "ГНУ-ова лиценца за слободна документација 1.3 или понова",
"config-license-pd": "Јавна сопственост",
}
}
+ if ( !$wikiModules ) {
+ // Nothing to preload
+ return;
+ }
+
$pageNames = array_keys( $allPages );
sort( $pageNames );
$hash = sha1( implode( '|', $pageNames ) );
"rev-deleted-text-unhide": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
"rev-suppressed-text-unhide": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 праглядзець гэтую вэрсію], калі жадаеце.",
"rev-deleted-text-view": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\nВы можаце праглядзець яе; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
- "rev-suppressed-text-view": "Гэтая вэрсія старонкі была '''схаваная'''.\nВы можаце яе праглядзець; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
+ "rev-suppressed-text-view": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nВы можаце яе праглядзець; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
"rev-deleted-no-diff": "Вы ня можаце праглядаць гэтую розьніцу паміж вэрсіямі, таму што адна з вэрсіяў была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
"rev-suppressed-no-diff": "Вы ня можаце праглядзець гэтую розьніцу, таму што адна з вэрсіяў была '''выдаленая'''.",
"rev-deleted-unhide-diff": "Адна з вэрсіяў гэтай старонкі была '''выдаленая'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце праглядзець [$1 розьніцу паміж вэрсіямі], калі жадаеце.",
"authmanager-authn-no-local-user": "Пададзеныя ўліковыя зьвесткі не зьвязаныя зь ніводным удзельнікам гэтай вікі.",
"authmanager-authn-autocreate-failed": "Аўтаматычнае стварэньне лякальнага рахунку не атрымалася: $1",
"authmanager-change-not-supported": "Пададзеныя ўліковыя зьвесткі ня могуць быць зьмененыя, бо яны ня будуць выкарыстаныя.",
+ "authmanager-create-disabled": "Стварэньне рахункаў адключанае.",
"authmanager-realname-label": "Сапраўднае імя",
"authmanager-provider-temporarypassword": "Часовы пароль",
"changecredentials": "Зьмена ўліковых зьвестак",
"activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
"activeusers-count": "$1 {{PLURAL:$1|дзеянне|дзеянні|дзеянняў}} за апошні{{PLURAL:$3| дзень|я $3 дні|я $3 дзён}}",
"activeusers-from": "Паказ, пачынаючы з:",
- "activeusers-groups": "Паказаць удзельнікаў, якія належаць да групаў:",
+ "activeusers-groups": "Паказаць удзельнікаў, якія належаць да груп:",
"activeusers-noresult": "Няма такіх удзельнікаў.",
"activeusers-submit": "Паказаць актыўных удзельнікаў",
"listgrouprights": "Дазволы для груп удзельнікаў",
"continue-editing": "Продължаване към полето за редактиране",
"previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
"session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново.</strong>\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
- "session_fail_preview_html": "'''За съжаление редакцията ви не беше записана поради изтичането на сесията ви.'''\n\n''Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез Джаваскрипт.''\n\n'''Опитайте отново. Ако все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново.'''",
+ "session_fail_preview_html": "За съжаление редакцията ви не беше записана поради изтичането на сесията ви.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
"token_suffix_mismatch": "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
"edit_form_incomplete": "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
"editing": "Редактиране на „$1“",
"permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
"contentmodelediterror": "Du kannst diese Version nicht bearbeiten, da das Inhaltsmodell <code>$1</code> vom aktuellen Inhaltsmodell der Seite <code>$2</code> abweicht.",
"recreate-moveddeleted-warn": "<strong>Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.</strong>\n\nBitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.\nZu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
- "moveddeleted-notice": "Diese Seite wurde gelöscht. Zur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
- "moveddeleted-notice-recent": "Leider wurde diese Seite kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information wird das Lösch- und Verschiebungs-Logbuch für die Seite unten angezeigt.",
+ "moveddeleted-notice": "Diese Seite wurde gelöscht.\nZur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
+ "moveddeleted-notice-recent": "Diese Seite wurde kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
"log-fulllog": "Alle Logbucheinträge ansehen",
"edit-hook-aborted": "Die Bearbeitung wurde ohne Erklärung durch eine Schnittstelle abgebrochen.",
"edit-gone-missing": "Die Seite konnte nicht aktualisiert werden.\nSie wurde anscheinend gelöscht.",
"missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
"missingcommenttext": "Cêr de jû fıkır bınusên, şıma rê zehmet.",
"missingcommentheader": "'''Diqet:''' Şıma seba nê fıkrvaci yew mewzu/sernuşte nênuşt.\nEke şıma reyna \"{{int:savearticle}}\" bıtıknê, vırnayışê şıa bê mewzu/sernuşte do qeyd bo.",
- "summary-preview": "Verqaytê xulasa:",
+ "summary-preview": "Verasayışê xulasa:",
"subject-preview": "Verqaytê mewzu:",
"previewerrortext": "Verasayışê vırnayışê şıma de yew xeta veciya miyan.",
"blockedtitle": "Karber blokekerdeo",
"deleting-backlinks-warning": "<strong>Προσοχή:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Άλλες σελίδες]] συνδέουν ή ενσωματώνουν τη σελίδα που πρόκειται να διαγράψετε.",
"rollback": "Επαναφορά επεξεργασιών",
"rollbacklink": "αναστροφή",
- "rollbacklinkcount": "Î\95Ï\80αναÏ\86οÏ\81ά $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}",
- "rollbacklinkcount-morethan": "εÏ\80αναÏ\86οÏ\81ά περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
+ "rollbacklinkcount": "Î\91ναÏ\83Ï\84Ï\81οÏ\86ή $1 {{PLURAL:$1|επεξεργασίας|επεξεργασιών}}",
+ "rollbacklinkcount-morethan": "αναÏ\83Ï\84Ï\81οÏ\86ή περισσότερων από $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
"rollbackfailed": "Η επαναφορά απέτυχε.",
"cantrollback": "Δεν είναι δυνατή η αναίρεση αυτής της αλλαγής, πρόκειται για την αρχική ενέργεια δημιουργίας της σελίδας.",
"alreadyrolled": "Αδύνατον να αναιρεθεί η τελευταία αλλαγή της σελίδας [[:$1]] από το χρήστη ([[User:$2|$2]] ([[User talk:$2|Συζήτηση]]){{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), διότι κάποιος έχει ήδη αναιρέσει την αλλαγή ή έχει αλλάξει εκ νέου τη σελίδα.\n\nΤελευταία αλλαγή από το χρήστη ([[User:$3|$3]] ([[User talk:$3|Συζήτηση]]){{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"editcomment": "The edit summary was: <em>$1</em>.",
"revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
"revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
+ "rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.",
"rollback-success-notify": "Reverted edits by $1;\nchanged back to last revision by $2. [$3 Show changes]",
"sessionfailure-title": "Session failure",
"sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
"createacct-email-ph": "Sisesta e-posti aadress",
"createacct-another-email-ph": "Sisesta e-posti aadress",
"createaccountmail": "Kasuta juhuslikku parooli ja saada see määratud e-posti aadressile",
+ "createaccountmail-help": "Saab kasutada konto loomiseks teisele kasutajale ilma parooli teada saamata.",
"createacct-realname": "Pärisnimi (valikuline)",
"createaccountreason": "Põhjus:",
"createacct-reason": "Põhjus",
"createacct-reason-ph": "Miks lood teist kontot?",
+ "createacct-reason-help": "Sõnum, mida näidatakse konto loomise logis",
"createacct-submit": "Loo konto",
"createacct-another-submit": "Loo konto",
+ "createacct-continue-submit": "Jätka konto loomist",
+ "createacct-another-continue-submit": "Jätka konto loomist",
"createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
"createacct-benefit-body1": "{{PLURAL:$1|muudatus|muudatust}}",
"createacct-benefit-body2": "{{PLURAL:$1|lehekülg|lehekülge}}",
"nocookiesnew": "Kasutajakonto loodi, aga sa ei ole sisse logitud, sest {{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja logi siis oma vastse kasutajanime ning parooliga sisse.",
"nocookieslogin": "{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.",
"nocookiesfornew": "Kasutajakonto jäi loomata, kuna me ei saanud selle allikat kindlaks teha.\nVeendu, et sul on küpsised lubatud, taaslaadi see lehekülg ja proovi uuesti.",
+ "createacct-loginerror": "Konto on edukalt loodud, aga automaatselt ei õnnestunud sisse logida. Et jätkata, [[Special:UserLogin|logi palun sisse käsitsi]].",
"noname": "Sa ei sisestanud kasutajanime lubataval kujul.",
"loginsuccesstitle": "Sisse logitud",
"loginsuccess": "Oled sisse loginud. Sinu kasutajanimi on \"$1\".",
"missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
"missingcommentheader": "<strong>Meeldetuletus:</strong> Sa pole kirjutanud kommentaarile teemat.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar ilma teemata.",
"summary-preview": "Resümee eelvaade:",
- "subject-preview": "Alaosa pealkirja eelvaade:",
+ "subject-preview": "Resümee eelvaade:",
"previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
"blockedtitle": "Kasutaja on blokeeritud",
"blockedtext": "'''Sinu kasutajanimi või IP-aadress on blokeeritud.'''\n\nBlokeeris $1.\nTema põhjendus on järgmine: ''$2''.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi.\n\nSinu praegune IP-aadress on $3 ning blokeeringu number on #$5. Lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
"selfredirect": "<strong>Atención:</strong> Está redirixindo esta páxina a si mesma.\nQuizais especificou incorrectamente a páxina de destino ou poida que estea a editar unha páxina errónea.\nSe preme en \"{{int:savearticle}}\" de novo, crearase a redireción de calquera xeito.",
"missingcommenttext": "Por favor, escriba un comentario a continuación.",
"missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme en \"{{int:savearticle}}\" de novo, a súa edición gardarase sen el.",
- "summary-preview": "Vista previa do resumo:",
+ "summary-preview": "Vista previa do resumo de edición:",
"subject-preview": "Vista previa do asunto:",
"previewerrortext": "Produciuse un erro ao intentar previsualizar os cambios.",
"blockedtitle": "O usuario está bloqueado",
"saveusergroups": "Gardar os grupos {{GENDER:$1|do usuario|da usuaria}}",
"userrights-groupsmember": "Membro de:",
"userrights-groupsmember-auto": "Membro implícito de:",
- "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.",
+ "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.\n* Un # indica que só se pode atrasar a data de caducidade deste grupo; non se pode adiantar.",
"userrights-reason": "Motivo:",
"userrights-no-interwiki": "Non ten os permisos necesarios para editar os dereitos de usuario noutros wikis.",
"userrights-nodatabase": "A base de datos \"$1\" non existe ou non é local.",
"userrights-expiry-options": "1 día:1 día,1 semana:1 semana,1 mes:1 mes,3 meses:3 meses,6 meses:6 meses,1 ano:1 ano",
"userrights-invalid-expiry": "O tempo de caducidade para o grupo \"$1\" non é válido.",
"userrights-expiry-in-past": "O tempo de caducidade para o grupo \"$1\" está no pasado.",
+ "userrights-cannot-shorten-expiry": "Non pode adiantar a data de caducidade do grupo \"$1\". Só os usuarios con permisos para engadir e eliminar este grupo poden adiantar datas de caducidade.",
"userrights-conflict": "Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.",
"group": "Grupo:",
"group-user": "Usuarios",
"tog-watchdefault": "Hanaraka ny pejy ary ny rakitra ovaiko",
"tog-watchmoves": "Hanaraka ny pejy ary ny rakitra ovaiko anarana",
"tog-watchdeletion": "Hanaraka ny pejy ary ny rakitra voafafako",
+ "tog-watchuploads": "Ampiana amin'ny pejy arahako ireo rakitra vaovao nalefako",
"tog-watchrollback": "Hanaraka pejy nanaovako famoana",
"tog-minordefault": "Mariho ho madinika foana aloha ny fanovana rehetra",
"tog-previewontop": "Asehoy alohan'ny boaty fanovana ny tsipalotra",
"tagline": "Avy amin'i {{SITENAME}}",
"help": "Fanoroana",
"search": "Tadiavo",
+ "search-ignored-headings": "#<!-- Avelao ho toa izao ity andalana ity --> <pre>\n# Ny lohatenim-pizarana dia tsy horaharahiana amin'ny karoka.\n# Ny fiovana atao eto dia hihatra rehefa voasoratra ao amin'ny tondro ilay pejy miaraka amin'ilay lohateny.\n# Azonao atao ny famerenana an-tondro an'ilay pejy amin'ny alalan'ny fanovana tsy misy inona inona.\n# Ny rariteny dia ireo manaraka:\n# *Izay andalana rehetra manomboka amin'ny \"#\" dia resaka\n# *Izay andalana tsy fotsy dia lohateny tsy horaharahiana, iaraka amin'ny haben-tsoratra\nTsiahy\nRohy ivelany\nJereo koa\n#</pre> <!-- Avelao ho toa izao ity andalana ity -->",
"searchbutton": "Tadiavo",
"go": "Ndao",
"searcharticle": "Tsidiho",
"passwordreset-emailtext-user": "Nisy mpikambana mitondra anarana $1 eo amin'i {{SITENAME}} nangataka fampatsiahivana mikasika ny kaontinao eo amin'i {{SITENAME}} ($4). Manana io adiresy imailaka {{PLURAL:$3|io kaontim-pikambana io|ireo kaontim-pikambana ireo}} :\n\n$2\n\nHitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {{PLURAL:$3|io|ireo}}. Mila miditra dien'izao ianao izao ary mifidy tenimiafina vaovao. Raha tsy avy aminao ity hataka ity na efa nahatadidy ny tenimiafinao taloha ianao, ary raha tsy tianao hovaina intsony ilay tenimiafinao, dia azonao tsy raharahiana ity hafatra ity ary mampiasa ny tenimiafinao taloha.",
"passwordreset-emailelement": "Anaram-pikambana : \n$1\n\nTenimiafina miserana : \n$2",
"passwordreset-emailsentemail": "Lasa ny mailaka famerenana tenimiafina.",
+ "passwordreset-nocaller": "Mila manitsy mpiantso",
+ "passwordreset-nosuchcaller": "Tsy misy ilay mpiantso: $1",
"changeemail": "Hanova ny adiresy imailaka",
"changeemail-header": "Hanova ny adiresy imailak'ilay kaonty",
"changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
"yourdiff": "Fampitahana",
"copyrightwarning": "Ny zavatra rehetra apetraka amin'ny {{SITENAME}} dia raisina ho azo adika malalaka araka ny fahazoan-dalana $2 (Jereo $1 ny fanazavana fanampiny). Raha toa ka tianao ho anao manokana ny tahirin-kevitra dia aleo tsy apetraka ato.\n\n<b>AZA MAMPIASA TAHIRINKEVITRA TSY NAHAZOAN-DALANA</b>",
"copyrightwarning2": "Ny fandraisana anjara ao amin'i {{SITENAME}} dia azo ovaina ary fafan'ny mpikambana hafa. Raha tsy tianao ho ampiasainan, ovaina na zarazaraina ny soratrao, dia aza alefa eto ilay vokatr'asanao<br />\nNy zava-tsoratanao eto dia vokatr'asa naverinao soratana na nodikainao tany amina loharano ao amin'ny vala sarababem-bahoaka na loharano malalaka hafa (Jereo $1 ho an'ny antsipirihany).\n\n'''Aza mampiasa tahirin-kevitra tsy nahazoan-dalana!'''",
+ "editpage-cannot-use-custom-model": "Tsy mety ovaina ny modelim-botoatin'ity pejy ity.",
"longpageerror": "'''Hadisoana : Ny tahirin-tsoratra nalefanao dia manana halava {{PLURAL:$1|iray|$1}} kilooktety, izay lava kokoa nohon'ny fetra avo indridra izay natao ho {{PLURAL:$2|iray|$2}} kilooktety.'''\nTsy afaka tahirizina ilay tahirin-tsoratra.",
"readonlywarning": "'''FAMPITANDREMANA: Nohidiana noho ny antony fikolokoloana aloha ny banky angona,\nkoa tsy afaka mitahiry ny fanovana nataonao aloha ianao izao. Angamba tokony hanao Couper coller aloha\nianao dia tehirizo anaty rakitra ny fanovanao mandra-paha.'''\n\nNy mpandrindra nanidy ny banky angona dia nanome ny antony : <br />$1",
"protectedpagewarning": "'''FAMPITANDREMANA: Voaaro ity pejy ity ka ny mpikambana manana ny fahazoan-dàlana sysop ihany no afaka manova azy.'''",
"invalid-content-data": "Data anaty votoatiny tsy miady amin'ny fepetra",
"content-not-allowed-here": "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
"editwarning-warning": "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.\nRaha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"{{int:prefs-editing}}\" ao amin'ny safidinao.",
+ "editpage-invalidcontentmodel-title": "Andrefim-botoatiny tsy zaka",
+ "editpage-invalidcontentmodel-text": "Andrefim-botoatiny \"$1\" tsy zaka.",
"editpage-notsupportedcontentformat-title": "Tsy zaka io andrefim-botoatiny io",
"editpage-notsupportedcontentformat-text": "Tsy zakan'ny maodelim-botoatiny $1 ny firafi-botoatiny $1",
"content-model-wikitext": "wiki-soratra",
"content-model-css": "CSS",
"content-json-empty-object": "Zavatra foana",
"content-json-empty-array": "Tabilao foana",
+ "deprecated-self-close-category": "Pejy mampiasa balizy HTML mihidy ho azy izay tsy azo raisina",
"duplicate-args-category": "Pejy mampiasa dika mitovy hevitra amin'ny fiantsoana endrika",
"expensive-parserfunction-warning": "Tandremo : Betsaka loatra ny fanantsoana ny tao parser.\n\nTsy maintsy latsaky ny $2 ny tao, kanefa misy $1. {{PLURAL:$2||}}",
"expensive-parserfunction-category": "Pejy mampiasa be loatra ny tao parser",
"search-interwiki-caption": "zandri-tetikasa",
"search-interwiki-default": "Valiny amin'ny $1 :",
"search-interwiki-more": "(be kokoa)",
+ "search-interwiki-more-results": "Valiny be kokoa",
"search-relatedarticle": "voadinika",
"searchrelated": "voadinika",
"searchall": "rehetra",
"youremail": "Imailaka:",
"username": "{{GENDER:$1}}Anaram-pikambana :",
"prefs-memberingroups": "Mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}}:",
+ "group-membership-link-with-expiry": "$1 (hatramin'i $2)",
"prefs-registration": "Daty fidirana :",
"yourrealname": "Tena anarana marina:",
"yourlanguage": "Tenim-pirenena:",
"prefswarning-warning": "Efa nanova tamin'ny safidinao tsy mbola voatahiry ianao. Raha miala amin'ity pejy ity amin'ny alalan'ny fanindriana an'i \"$1\" ianao dia tsy ho voavao ny safidinao.",
"prefs-tabs-navigation-hint": "Torohevitra: afaka mampiasa ny zana-tsipika havia ary havanana ianao ho an'ny fitetezana ny vakizoro ao amin'ny lisi-bakizoro",
"userrights": "Fandrindràna ny fahefahan'ny mpikambana",
- "userrights-lookup-user": "Handrindra vondrom-pikambana",
+ "userrights-lookup-user": "Hisafidy mpikambana",
"userrights-user-editname": "Manomeza solonanarana:",
- "editusergroup": "Hanova satan'ny {{GENDER:$1|}}mpikambana",
+ "editusergroup": "Hampiditra vondrom-pikambana",
"editinguser": "Fanovana ny zon'ny mpikambana <strong>{{GENDER:$1|}}[[User:$1|$1]]</strong> $2",
"userrights-editusergroup": "Hanova vondrom-pikambana",
"saveusergroups": "{{GENDER:$1|}}Tehirizo ny vondrom-pikambana",
"userrights-changeable-col": "Ny gropy azonao ovaina",
"userrights-unchangeable-col": "Ny gropy tsy azonao ovaina",
"userrights-expiry-current": "Mitsahatra ny $1",
+ "userrights-expiry-none": "Tsy mitsahatra",
"userrights-expiry": "Fitsaharana:",
+ "userrights-expiry-existing": "Fotoam-pitsaharana ankehitriny: $3, $2",
+ "userrights-expiry-othertime": "Fotoana hafa:",
+ "userrights-expiry-options": "1 andro:1 day,herinandro:1 week,1 volana:1 month,3 volana:3 months,6 volana:6 months,herintaona:1 year",
+ "userrights-invalid-expiry": "Tsy azo raisina ny fotoam-pitsaharana ho an'ny vondrona \"$1\".",
"userrights-conflict": "Fifandonana fanovana zom-pikambana! Avereno vakiana ary marino ny fanovanao.",
"group": "Gropy :",
"group-user": "Mpikambana",
"permissionserrorstext": "Avètz pas la permission d’efectuar l’operacion demandada per {{PLURAL:$1|la rason seguenta|las rasons seguentas}} :",
"permissionserrorstext-withaction": "Sètz pas autorizat(ada) a $2, per {{PLURAL:$1|la rason seguenta|las rasons seguentas}} :",
"recreate-moveddeleted-warn": "'''Atencion : sètz a tornar crear una pagina qu'es estada suprimida precedentament.'''\n\nDemandatz-vos s'es vertadièrament apropriat de contunhar de l’editar.\nL’istoric de las supressions e dels cambiaments de nom es afichat çaijós :",
- "moveddeleted-notice": "Aquesta pagina es estat suprimida.\nL'istoric de las supressions e dels cambiaments de nom es afichat çaijós coma referéncia.",
+ "moveddeleted-notice": "Aquesta pagina es estada suprimida.\nL'istoric de las supressions e dels cambiaments de nom es afichat çaijós coma referéncia.",
"log-fulllog": "Veire lo jornal complet",
"edit-hook-aborted": "Modificacion fracassada per croquet.\nCap d'explicacion pas balhada.",
"edit-gone-missing": "A pas pogut metre a jorn la pagina.\nSembla que siá estada suprimida.",
"permissionserrorstext-withaction": "This message is \"with action\" version of {{msg-mw|Permissionserrorstext}}.\n\nParameters:\n* $1 - the number of reasons that were found why the action cannot be performed\n* $2 - one of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.",
"contentmodelediterror": "Error message shown when trying to edit an old revision with a content model different from that of the current revision\n* $1 - content model of the old revision\n* $2 - content model of the current revision",
"recreate-moveddeleted-warn": "Warning shown when creating a page which has already been deleted. See for example [[Test]].",
- "moveddeleted-notice": "Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
- "moveddeleted-notice-recent": "Shown on top of a recently deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
+ "moveddeleted-notice": "Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).\n\nSee also {{msg-mw|moveddeleted-notice-recent}}",
+ "moveddeleted-notice-recent": "Shown on top of a recently deleted page in normal view modus ([{{canonicalurl:Test}} example]).\n\nSee also {{msg-mw|moveddeleted-notice}}",
"log-fulllog": "Used as link text.",
"edit-hook-aborted": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
"edit-gone-missing": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
"booksources-text": "Used in [[Special:BookSources/1]].\n\nThis message is followed by a list of links to other sites.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
"booksources-invalid-isbn": "This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].",
"magiclink-tracking-rfc": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use RFC magic links will be added.\n\nSee [https://en.wikipedia.org/wiki/Help:Magic_links#RFC Help:Magic links] for more information on RFC magic links.",
- "magiclink-tracking-rfc-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-rfc}}",
+ "magiclink-tracking-rfc-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-rfc}}",
"magiclink-tracking-pmid": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use PMID magic links will be added.",
- "magiclink-tracking-pmid-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-pmid}}",
+ "magiclink-tracking-pmid-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-pmid}}",
"magiclink-tracking-isbn": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that use ISBN magic links will be added.",
- "magiclink-tracking-isbn-desc": "Description of the tracking category {{mw-msg|magiclink-tracking-isbn}}",
+ "magiclink-tracking-isbn-desc": "Description of the tracking category {{msg-mw|magiclink-tracking-isbn}}",
"rfcurl": "{{notranslate}}\nParameters:\n* $1 - RFC number\nSee also:\n* {{msg-mw|Pubmedurl}}",
"pubmedurl": "{{notranslate}}\nParameters:\n* $1 - Pubmed number\nSee also:\n* {{msg-mw|Rfcurl}}",
"specialloguserlabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions ''performed'' by the specified user. \"Carried out\" and \"done\" are possible alternatives for \"performed\".",
"editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
"revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
"revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
- "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
+ "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). Parameters:\n* $1 - user whose changes have been reverted\n* $2 - user who produced version, which replaces reverted version\n* $3 - the first user's name, can be used for GENDER\n* $4 - the second user's name, can be used for GENDER\n{{Identical|Revert}}\n{{Identical|Rollback}}",
"rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{related|rollback-success}}\n{{Format|jquerymsg}}",
"sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
"sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
"uploaddisabledtext": "கோப்பு பதிவேற்றங்கள் செயலிழக்கச் செய்யப்பட்டுள்ளன.",
"php-uploaddisabledtext": "கோப்பு தரவேற்றம் PHP இல் முடக்கப்பட்டுள்ளது.தயவுகூர்ந்து file_uploads அமைப்பை சரிபார்க்கவும்.",
"uploadscripted": "இந்தக் கோப்பு உலாவியால் பிழையாக விளங்கிக் கொள்ளக்கூடிய எச்.டி.எம்.எல். அல்லது வேறு நிரல்களைக் கொண்டுள்ளது.",
- "uploadscriptednamespace": "இந்த SVG கோப்பு ஒரு சரியில்லாத பெயரிடைவெளியை \"<nowiki>$1</nowiki>\" கொண்டுள்ளது.",
+ "uploadscriptednamespace": "இந்த SVG கோப்பு ஒரு சரியில்லாத பெயரிடைவெளியை கொண்டுள்ளது \"<nowiki>$1</nowiki>\".",
"uploadinvalidxml": "ஏற்றபட்ட கோப்பில் உள்ள XML ஆராய முடியாது.",
"uploadvirus": "கோப்பு நச்சுநிரலைக் (வைரஸ்) கொண்டுள்ளது! விபரங்கள்:$1",
"uploadjava": "இது ஒரு zip கோப்பு.இதில் java.class என்ற கோப்பு உள்ளது.\nஜாவா கோப்புகளை தகவலேற்றுவது தடைசெய்யப்பட்டுள்ளது.ஏனெனில் அது பாதுகாப்பு தடைகளை மீற வழிவகுக்கும்.",
"period-am": "AM",
"period-pm": "PM",
"pagecategories": "{{PLURAL:$1|分类}}",
- "category_header": "å\88\86ç±»â\80\9c$1â\80\9dä¸的页面",
+ "category_header": "å\88\86ç±»â\80\9c$1â\80\9dä¸\8b的页面",
"subcategories": "子分类",
"category-media-header": "分类“$1”中的媒体文件",
"category-empty": "<em>本分类目前不含有任何页面或媒体文件。</em>",
"randompage-nopages": "在以下{{PLURAL:$2|名字空间}}中没有页面:$1。",
"randomincategory": "分类中随机页面",
"randomincategory-invalidcategory": "“$1”不是一个有效的分类名称。",
- "randomincategory-nopages": "[[:Category:$1|$1]]å\88\86ç±»ä¸没有页面。",
+ "randomincategory-nopages": "[[:Category:$1|$1]]å\88\86ç±»ä¸\8b没有页面。",
"randomincategory-category": "分类:",
"randomincategory-legend": "分类中随机页面",
"randomincategory-submit": "提交",
"ancientpages": "最老页面",
"move": "移动",
"movethispage": "移动本页",
- "unusedimagestext": "以下文件实际存在,但并没有插入任何页面。请注意,其他网站可能会使用直接URL链接某个文件,因此它即使被实际使用也可能在这里列出。",
+ "unusedimagestext": "存在以下没有插入任何页面的文件。请注意,其他网站可能会使用直接URL链接某个文件,因此它即使被实际使用也可能在这里列出。",
"unusedcategoriestext": "以下分类页面实际存在,即使没有其它页面或分类利用它们。",
"notargettitle": "无目标",
"notargettext": "您还没有指定一个目标页面或用户以进行此项操作。",
"variantname-gan-hant": "hant",
"variantname-kk-cyrl": "kk-cyrl",
"metadata": "元数据",
- "metadata-help": "此文件中包含有扩展的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。\n\n如果此文件的源文件已经被修改,一些信息在修改后的文件中将不能完全反映出来。",
+ "metadata-help": "此文件中包含有额外的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。如果已自文件的初始状态修改,一些详细说明可能无法反映修改后的文件。",
"metadata-expand": "显示详细资料",
"metadata-collapse": "隐藏详细资料",
"metadata-fields": "在本信息中所列出的 EXIF 元数据域将包含在图片显示页面,当元数据表损坏时只显示以下信息。\n其他的元数据默认为隐藏。\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",
"variantname-gan-hans": "中文(简体)",
"variantname-gan-hant": "中文(繁體)",
"metadata": "詮釋資料",
- "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n若修改此檔案,部份資訊將無法保留。",
+ "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n\n如果已自檔案初始狀態修改,一些詳細說明可能無法反映修改後的檔案。",
"metadata-expand": "顯示詳細資料",
"metadata-collapse": "隱藏詳細資料",
"metadata-fields": "在本訊息中所列出的 EXIF 詮釋資料域將包含在圖片顯示頁面,當詮釋資料表損壞時只顯示以下訊息。\n其他的詮釋資料預設為隱藏。\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",
];
$magicWords = [
+ 'redirect' => [ '0', '#REDIRECCIÓ', '#REDIRECCIO', '#REDIRECT' ],
'numberofarticles' => [ '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ],
'numberoffiles' => [ '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ],
'numberofusers' => [ '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ],
$defaultDateFormat = 'dmy';
$bookstoreList = [
- 'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
- 'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
+ 'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.cat/search*cat/X?SEARCH=$1',
'inherit' => true,
];
.iw-headline {
font-weight: bold;
- font-size: 1rem;
- font-size: 16px;
- opacity: 0.7;
+ font-size: 1rem;
+ font-size: 16px;
+ opacity: 0.7;
}
.iw-results {
- list-style: none;
+ list-style: none;
margin: 0;
}
.iw-resultset {
margin-bottom: 1.2em;
background-color: #f2f4f7;
- vertical-align: top;
- width: 100%;
- float: left;
- list-style-type: none;
+ vertical-align: top;
+ width: 100%;
+ float: left;
+ list-style-type: none;
}
/* clearfix */
.iw-result:after {
- visibility: hidden;
+ visibility: hidden;
display: block;
font-size: 0;
content: " ";
}
* html .interwiki-result { /* IE6 */
- zoom: 1;
+ zoom: 1;
}
*:first-child + html .iw-resultset { /* IE7 */
- zoom: 1;
+ zoom: 1;
}
/* padding each .iw-resultset section seperately.
.iw-result__title,
.iw-result__content,
.iw-result__footer {
- padding: 0.25em 0.85em;
+ padding: 0.25em 0.85em;
}
/* definition titles appear inline,
to resemble a traditional dictionary definition */
.iw-resultset--definition .iw-result__title {
- display: inline;
- padding: 0;
+ display: inline;
+ padding: 0;
}
.iw-resultset > div:first-child {
- padding-top: 0.85em;
+ padding-top: 0.85em;
}
.iw-resultset > div:last-child {
- padding-bottom: 0.85em;
+ padding-bottom: 0.85em;
}
.iw-result__title {
- font-size: 16px; /* rem fallback */
- font-size: 1rem;
+ font-size: 16px; /* rem fallback */
+ font-size: 1rem;
}
.iw-result__title a.extiw {
- color: #252525;
- font-weight: bold;
+ color: #252525;
+ font-weight: bold;
}
.iw-result__content:after { /* clearfix */
- visibility: hidden;
- display: block;
- font-size: 0;
- content: " ";
- clear: both;
- height: 0;
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
}
.iw-result__footer {
- float: right;
+ float: right;
}
.iw-result__icon {
- display: inline-block;
- width: 24px;
- height: 24px;
- vertical-align: middle;
- margin-right: 0.25em;
- background: url( images/special.search/definition-icon.svg ) no-repeat 0 0;
- background-size: 100% 100%;
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ vertical-align: middle;
+ margin-right: 0.25em;
+ background: url( images/special.search/definition-icon.svg ) no-repeat 0 0;
+ background-size: 100% 100%;
}
@interwikiContentTypes: definition, travel, quotation, book, course, news, textbook, image;
.generate-iwIcons();
.generate-iwIcons( @i:1 ) when ( @i =< length( @interwikiContentTypes ) ) {
- @iwIcon: extract( @interwikiContentTypes, @i );
+ @iwIcon: extract( @interwikiContentTypes, @i );
- .iw-result__icon--@{iwIcon} {
- /* stylelint-disable-next-line function-url-quotes */
- background-image: url( 'images/special.search/@{iwIcon}-icon.png' );
- /* stylelint-disable-next-line function-url-quotes */
- background-image: url( 'images/special.search/@{iwIcon}-icon.svg' );
- }
+ .iw-result__icon--@{iwIcon} {
+ /* stylelint-disable-next-line function-url-quotes */
+ background-image: url( 'images/special.search/@{iwIcon}-icon.png' );
+ /* stylelint-disable-next-line function-url-quotes */
+ background-image: url( 'images/special.search/@{iwIcon}-icon.svg' );
+ }
- .generate-iwIcons( @i + 1 );
+ .generate-iwIcons( @i + 1 );
}
/* image search result */
.iw-result__mini-gallery {
- position: relative;
- float: left;
- width: 60%;
- height: 200px;
- box-sizing: border-box;
- padding: 0.25rem;
+ position: relative;
+ float: left;
+ width: 60%;
+ height: 200px;
+ box-sizing: border-box;
+ padding: 0.25rem;
}
-.iw-result__mini-gallery__image {
- display: block;
- position: relative;
- width: 100%;
- height: 100%;
- background-size: cover;
- background-repeat: no-repeat;
- background-position: center center;
+/* second and third images are small */
+.iw-result__mini-gallery:nth-child( 2 ),
+.iw-result__mini-gallery:nth-child( 3 ) { /* stylelint-disable-line indentation */
+ width: 40%;
+ height: 100px;
}
-.iw-result__mini-gallery__image:hover > .iw-result__mini-gallery__caption {
- visibility: visible;
+.iw-result__mini-gallery__image {
+ display: block;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background-size: cover;
+ background-repeat: no-repeat;
+ background-position: center center;
}
.iw-result__mini-gallery__image > .iw-result__mini-gallery__caption { /* image gallery text */
- visibility: hidden;
- position: absolute;
- bottom: 0;
- left: 0;
- text-align: center;
- color: #fff;
- text-shadow: 0 0 10px rgba( 0, 0, 0, 0.4 ); /* improves legibility on white background*/
- font-size: 0.8em;
- padding: 5px;
- background-color: rgba( 0, 0, 0, 0.5 );
+ visibility: hidden;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ text-align: center;
+ color: #fff;
+ text-shadow: 0 0 10px rgba( 0, 0, 0, 0.4 ); /* improves legibility on white background*/
+ font-size: 0.8em;
+ padding: 5px;
+ background-color: rgba( 0, 0, 0, 0.5 );
}
-.iw-result__mini-gallery:nth-child(2),
-.iw-result__mini-gallery:nth-child(3) { /* second and third images are small */
- width: 40%;
- height: 100px;
+.iw-result__mini-gallery__image:hover > .iw-result__mini-gallery__caption {
+ visibility: visible;
}
/* different types of interwiki result boxes */
/* quotation box */
.iw-resultset--quotation .iw-result__content {
- border-left: 4px solid #afb1b5;
- margin-left: 1em;
- padding-top: 0;
- margin-top: 0.25em;
+ border-left: 4px solid #afb1b5;
+ margin-left: 1em;
+ padding-top: 0;
+ margin-top: 0.25em;
}
-.iw-resultset--quotation .iw-result__title{
- margin-left: 1em;
+.iw-resultset--quotation .iw-result__title {
+ margin-left: 1em;
}
-.iw-result--quotation .iw-result__title:before{
- content: ' — ';
- display: inline-block;
+.iw-result--quotation .iw-result__title:before {
+ content: ' — ';
+ display: inline-block;
}
.iw-result--quotation .iw-result__footer {
- text-align: right;
+ text-align: right;
}
/* no results
*/
.mw-search-nonefound ~ #mw-search-interwiki {
- width: 100%;
+ width: 100%;
}
.mw-search-nonefound ~ #mw-search-interwiki .iw-resultset {
- width: 30%;
- max-width: 300px;
- margin-left: 0.5em;
- margin-right: 0.5em;
+ width: 30%;
+ max-width: 300px;
+ margin-left: 0.5em;
+ margin-right: 0.5em;
}
/* mobile */
@media only screen and ( max-width: 768px ) {
- #mw-interwiki-results {
- width: 100%;
- }
- .mw-search-results {
- max-width: none !important;
- }
- .iw-resultset {
- width: 45% !important;
- margin-left: 0.5em !important;
- margin-right: 0.5em !important;
- }
+ #mw-interwiki-results {
+ width: 100%;
+ }
+ .mw-search-results {
+ max-width: none !important;
+ }
+ .iw-resultset {
+ width: 45% !important;
+ margin-left: 0.5em !important;
+ margin-right: 0.5em !important;
+ }
}
@media only screen and ( max-width: 600px ) {
- .iw-resultset {
- width: 100% !important;
- margin-left: 0 !important;
- margin-right: 0 !important;
- max-width: none !important;
- }
+ .iw-resultset {
+ width: 100% !important;
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ max-width: none !important;
+ }
}
/* Evil temporary hax for cawiki */
// Remove the inner padding and cancel buttons in Chrome on OS X and Safari on OS X
&::-webkit-search-cancel-button,
&::-webkit-search-decoration {
- -webkit-appearance: none;
+ -webkit-appearance: none;
}
}
}
+@import 'mediawiki.mixins';
+
.mw-widgets-stashedFileWidget {
display: inline-block;
vertical-align: middle;
vertical-align: middle;
position: relative;
overflow: hidden;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+ .box-sizing( border-box );
> .mw-widgets-stashedFileWidget-label {
line-height: 2.3em;
margin: 0;
overflow: hidden;
white-space: nowrap;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+ .box-sizing( border-box );
text-overflow: ellipsis;
left: 0.5em;
right: 2.375em;
margin-left: 4px;
}
-.mw-icon-question:lang(ar),
-.mw-icon-question:lang(fa),
-.mw-icon-question:lang(ur) {
+/* stylelint-disable indentation */
+.mw-icon-question:lang( ar ),
+.mw-icon-question:lang( fa ),
+.mw-icon-question:lang( ur ) {
-webkit-transform: scaleX( -1 );
-ms-transform: scaleX( -1 );
transform: scaleX( -1 );
Entities inside <nowiki>
!! wikitext
<nowiki><</nowiki>
-!! html
+!! html/php
<p><
</p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki"><span typeof="mw:Entity" data-parsoid='{"src":"&lt;","srcContent":"<"}'><</span></span></p>
!! end
!! test
<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"#tag"},"params":{"1":{"wt":"Foo <nowiki>&rarr;bar</nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
!! end
+## Don't expect this to rt, Parsoid drops the unmatched closing pre tags that
+## aren't enclosed in nowikis.
!! test
<nowiki> and <pre> preference (first one wins)
+!! options
+parsoid=wt2html
!! wikitext
<pre>
<nowiki>
</pre>
</p>
!! html/parsoid
-<pre data-parsoid='{"stx":"html","strippedNL":true}'><nowiki>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n<nowiki>\n"}}'><nowiki>
</pre>
-<p><span typeof="mw:Placeholder" data-parsoid='{"src":"</nowiki>"}'></nowiki></span>
-</pre></p>
+<p></nowiki></p>
+
<p><span typeof="mw:Nowiki">
<pre>
<nowiki>
</pre>
-</span>
-</pre></p>
+</span></p>
!! end
!! test
# Parsoid doesn't strip empty tags, like Tidy does.
!! test
Empty pre; pre inside other HTML tags (T56946)
-!! options
-parsoid=wt2html,wt2wt
!! wikitext
a
!! html/parsoid
<p>a</p>
-<div><pre>foo
+<div data-parsoid='{"stx":"html"}'><pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\nfoo\n"}}'>foo
</pre></div>
-<pre></pre>
+<pre typeof="mw:Extension/pre" about="#mwt4" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":""}}'></pre>
!! end
!! test
# Note that tidy removes the empty <p> tags from the start and end.
# Parsoid does not, by design.
-!!test
+!! test
Block tag pre
!! wikitext
<p><pre>foo</pre></p>
foo
</pre>
!! html/parsoid
-<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre data-parsoid='{"stx":"html"}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
-!!end
+<p data-parsoid='{"stx":"html","autoInsertedEnd":true}'></p><pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html"}'></p>
+!! end
!!test
Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
</pre>
!!end
+## Hmm, should Parsoid rt this?
!! test
Pres with newline attributes
+!! options
+parsoid=wt2html,html2html
!! wikitext
<pre class="one
two">hi</pre>
<pre class="one two">hi</pre>
!! html/parsoid
-<pre class="one
-two" data-parsoid='{"stx":"html"}'>hi</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" class="one two" data-mw='{"name":"pre","attrs":{"class":"one two"},"body":{"extsrc":"hi"}}'>hi</pre>
!! end
!! test
</pre>
<p><pre</p>
!! html/parsoid
-<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"a":{"<pre":null},"sa":{"<pre":""},"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<pre <pre>x</pre>"}},"i":0}}]}'>x</pre>
+<pre about="#mwt1" typeof="mw:Transclusion mw:Extension/pre" data-parsoid='{"a":{"<pre":null},"sa":{"<pre":""},"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<pre <pre>x</pre>"}},"i":0}}]}'>x</pre>
<p><pre </p>
<pre style="width:50%;">{{echo|foo}}</pre>
!! html/parsoid
-<pre style="width:50%;">{{echo|foo}}</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" style="width:50%;" data-mw='{"name":"pre","attrs":{"style":"width:50%;"},"body":{"extsrc":"{{echo|foo}}"}}'>{{echo|foo}}</pre>
!! end
# TODO / maybe: fix wt2wt for this
a <pre typeof="mw:Extension/tag" about="#mwt2" data-parsoid='{}' data-mw='{"name":"tag","attrs":{},"body":null}'></pre>
!! end
+!! test
+5. Indent-Pre and html pre
+!! wikitext
+ <pre class="123">hi</pre>
+!! html/php
+ <pre class="123">hi</pre>
+
+!! html/parsoid
+ <pre typeof="mw:Extension/pre" about="#mwt2" class="123" data-mw='{"name":"pre","attrs":{"class":"123"},"body":{"extsrc":"hi"}}'>hi</pre>
+!! end
+
!!test
Render paragraphs when indent-pre is suppressed in blocklevels
!! wikitext
foo
</pre>
!! html/parsoid
-<pre data-parsoid='{"stx":"html"}'>foo</pre>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"foo"}}'>foo</pre>
-<pre data-parsoid='{"stx":"html","strippedNL":"\n"}'>
-foo
+<pre typeof="mw:Extension/pre" about="#mwt4" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\nfoo\n"}}'>foo
</pre>
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt6" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\nfoo\n"}}'>
foo
</pre>
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt8" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\n\nfoo\n"}}'>
foo
</pre>
!! html/parsoid
-<pre data-parsoid='{"stx":"html"}'>
+<pre typeof="mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html"}' data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n\n\n\n\nhaha\n\n\n\n\nhaha\n\n\n\n\n"}}'>
</pre>
!! html/parsoid
-<pre data-parsoid='{"stx":"html","strippedNL":true}'>* foo
+<pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"\n* foo\n# bar\n= no-h =\n'' no-italic ''\n[[ NoLink ]]\n"}}'>* foo
# bar
= no-h =
'' no-italic ''
<td>foo</td></tr></tbody></table>
!! end
-## Note that Parsoid output differs from PHP and PHP+tidy here.
-## The lack of <tr> tags in the PHP output is arguably a bug in the
-## PHP parser, which tidy then compounds by fostering the content
-## entirely out of the table. Parsoid recognizes the table context
-## and generates <tr> and <td> wrappers as needed. Hopefully nobody
-## depends on PHP's treatment of broken table markup!
!! test
Implicit <td> after a |-
!! options
!! html/php+tidy
<p>a</p>
!! html/parsoid
-<table>
-<tr><td>a</td></tr>
-</table>
-!! end
-
-# Again, Parsoid adds implicit <td>s here, PHP and Tidy strip the b out.
-!! test
-<pre> tags should be recognized in an explicit <td> context, but not in an implicit <td> context
-!! options
-parsoid=wt2html,html2html
-!! wikitext
-{|
-|-
-|
- a
-|-
- b
-|}
-!! html/php
-<table>
-
-<tr>
-<td>
-<pre>a
-</pre>
-</td></tr>
- b
-</table>
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'>a</p><table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
-!! html/php+tidy
-<p>b</p>
-<table>
-<tr>
-<td>
-<pre>
-a
-</pre></td>
-</tr>
-</table>
-!! html/parsoid
-<table>
-<tbody>
-<tr><td><pre>a</pre></td></tr>
-<tr><td> b</td></tr>
-</tbody>
-</table>
+</tr></tbody></table>
!! end
-# PHP + Tidy strips the list out of the table; Parsoid wraps it.
-# Parsoid generates the missing <td>, so wt2wt won't succeed.
!! test
Lists should be recognized in an implicit <td> context
!! options
<li>a</li>
</ul>
!! html/parsoid
-<table>
-<tr>
-<td><ul>
-<li>a</li>
-</ul></td>
-</tr>
-</table>
+<ul data-parsoid='{"fostered":true,"autoInsertedEnd":true}'><li>a</li></ul><table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","autoInsertedEnd":true}'>
+
+</tr></tbody></table>
!! end
!! test
!! 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}}," "]}'> </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> a </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> b</td></tr>
-</tbody></table>
+<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
!! test
Piped link with empty link text
!! wikitext
-[[Main Page|<nowiki />]] - empty nowiki
+[[Main Page|<nowiki/>]] - empty nowiki
[[Main Page| ]] - empty space
[[Main Page| ]] - empty non breaking space
!! html/php
<a href="/wiki/Main_Page" title="Main Page"> </a> - empty non breaking space
</p>
!! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><meta typeof="mw:Placeholder" data-parsoid='{"src":"<nowiki />"}'/></a> - empty nowiki
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><span typeof="mw:Nowiki"></span></a> - empty nowiki
<a rel="mw:WikiLink" href="./Main_Page" title="Main Page"> </a> - empty space
<a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><span typeof="mw:Entity" data-parsoid='{"src":"&nbsp;","srcContent":" "}'> </span></a> - empty non breaking space</p>
!! end
<p><a rel="mw:WikiLink" href="./Cool_%22Gator%22" title='Cool "Gator"'>Cool "Gator"</a></p>
!! end
+!! test
+File containing double quotes and spaces
+!! wikitext
+[[File:Cool "Gator".png]]
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Cool_%22Gator%22.png" data-parsoid='{"a":{"href":"./File:Cool_%22Gator%22.png"},"sa":{"href":"File:Cool \"Gator\".png"}}'><img resource='./File:Cool_"Gator".png' src="./Special:FilePath/Cool_%22Gator%22.png" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Cool_\"Gator\".png","height":"220","width":"220","src":"./Special:FilePath/Cool_%22Gator%22.png"},"sa":{"resource":"File:Cool \"Gator\".png","src":"./Special:FilePath/Cool_\"Gator\".png"}}'/></a></span></p>
+!! end
+
+!! test
+Redirect containing double quotes and spaces
+!! wikitext
+#REDIRECT [[Cool "Gator"]]
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="./Cool_%22Gator%22" data-parsoid='{"src":"#REDIRECT ","a":{"href":"./Cool_%22Gator%22"},"sa":{"href":"Cool \"Gator\""}}'/>
+!! end
+
!! test
Link containing double-single-quotes '' in text (T6598 sanity check)
!! wikitext
!! end
!! test
-Escaping of interlanguage links
+Escaping of interlanguage links (T129218, T156308)
!! wikitext
Blah blah blah
[[:es:Spanish]]
<a href="http://zh.wikipedia.org/wiki/Chinese" class="extiw" title="zh:Chinese"> zh : Chinese </a>
</p>
!! html/parsoid
-<p><a rel="mw:ExtLink" href="http://es.wikipedia.org/wiki/Spanish" title="es:Spanish">es:Spanish</a>
+<p>Blah blah blah
+<a rel="mw:ExtLink" href="http://es.wikipedia.org/wiki/Spanish" title="es:Spanish">es:Spanish</a>
<a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese"> zh : Chinese </a></p>
!! end
<li> zar</li></ul>
!! html/parsoid
-<ul><li> <pre data-parsoid='{"stx":"html"}'>foo</pre></li>
-<li> <pre data-parsoid='{"stx":"html"}'>bar</pre></li>
+<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
<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a><span typeof="mw:Nowiki">junk</span></p>
!! end
-!!test
+!! test
Fuzz testing: URL adjacent extension (no space, dirty; pre)
!! wikitext
http://example.com<pre>junk</pre>
junk
</pre>
!! html/parsoid
-<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a></p><pre data-parsoid='{"stx":"html"}'>junk</pre>
-!!end
+<p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a></p><pre typeof="mw:Extension/pre" about="#mwt2" data-mw='{"name":"pre","attrs":{},"body":{"extsrc":"junk"}}'>junk</pre>
+!! end
-!!test
+!! test
Fuzz testing: image with bogus manual thumbnail
!! wikitext
[[Image:foobar.jpg|thumbnail= ]]
!! html/parsoid
<figure class="mw-default-size" typeof="mw:Error mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"manualthumb","ak":"thumbnail= "}]}' data-mw='{"errors":[{"key":"missing-thumbnail","message":"This thumbnail does not exist.","params":{"name":""}}],"thumb":""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="./Special:FilePath/" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"220"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure>
-!!end
+!! end
!! test
Fuzz testing: encoded newline in generated HTML replacements (T8577)
!! wikitext
<pre dir=" "></pre>
-!! html
+!! html/php
<pre dir=" "></pre>
+!! html/parsoid
+<pre typeof="mw:Extension/pre" about="#mwt2" dir="&#10;" data-mw='{"name":"pre","attrs":{"dir":"&#10;"},"body":{"extsrc":""}}'></pre>
!! end
!! test
</p>
!! end
-# Since Parsoid is starting to emit canonical wikitext for links,
-# [http://example.com http://example.com] will not RT back to that
-# form anymore.
!! test
HTML markups with conversion syntax in attribs, nested in other conversion blocks
!! options
</p>
!! end
+# Since Parsoid is starting to emit canonical wikitext for links,
+# [http://example.com http://example.com] will not RT back to that
+# form anymore.
!! test
Proper conversion of text in external links
!! options
<p></p>
!! end
-#### ----------------------------------------------------------------
-#### Parsoid-only testing of Parsoid's impl of <ref> and <references>
-#### tags. Parsoid's output for these tags differs from that of the
-#### PHP parser.
-#### ----------------------------------------------------------------
-
-!!test
-Ref: 1. ref-location should be replaced with an index span
-!! wikitext
-A <ref>foo</ref>
-B <ref name="x">foo</ref>
-C <ref name="y" />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-2"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-2"><span class="mw-reflink-text">[2]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-y_3-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"y"}}'><a href="./Main_Page#cite_note-y-3"><span class="mw-reflink-text">[3]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-x-2" id="cite_note-x-2"><a href="./Main_Page#cite_ref-x_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-x-2" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-y-3" id="cite_note-y-3"><a href="./Main_Page#cite_ref-y_3-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-y-3" class="mw-reference-text"></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 2. ref-tags with identical names should all get the same index
-!! wikitext
-A <ref name="x">foo</ref>
-B <ref name="x" />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 3. spaces in ref-names should be ignored
-!! wikitext
-A <ref name="x">foo</ref>
-B <ref name=" x " />
-C <ref name= x />
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-x_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-x-1"},"attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-x_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-x_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"x"}}'><a href="./Main_Page#cite_note-x-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-x-1" id="cite_note-x-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-x_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-x_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-x_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-x-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-# NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
-!!test
-Ref: 4. 'constructor' should be accepted as a valid ref-name
-!! wikitext
-A <ref name="constructor">foo</ref>
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-constructor_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-constructor-1"},"attrs":{"name":"constructor"}}'><a href="./Main_Page#cite_note-constructor-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-constructor-1" id="cite_note-constructor-1"><a href="./Main_Page#cite_ref-constructor_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-constructor-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 5. body should accept generic wikitext
-!! wikitext
-A <ref>
- This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">This is a <b><a rel="mw:WikiLink" href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 6. indent-pres should not be output in ref-body
-!! wikitext
-A <ref>
- foo
- bar
- baz
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
- bar
- baz
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 7. No p-wrapping in ref-body
-!! wikitext
-A <ref>
-foo
-
-bar
-
-
-baz
-
-
-
-booz
-</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo
-
-bar
-
-
-baz
-
-
-
-booz
-</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 8. transclusion wikitext has lower precedence
-!! wikitext
-A <ref> foo {{echo|</ref> B C}}
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C}}</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo {{echo|</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 9. unclosed comments should not leak out of ref-body
-!! wikitext
-A <ref> foo <!--</ref> B C
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <!----></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 10. Unclosed HTML tags should not leak out of ref-body
-!! wikitext
-A <ref> <b> foo </ref> B C
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B C</p>
-
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></span></li>
-</ol>
-!!end
-
-!!test
-Ref: 11. ref-tags acts like an inline element wrt P-wrapping
-!! wikitext
-A <ref>foo</ref> B
-C <ref>bar</ref> D
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B
-C <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> D</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 12. ref-tags act as trailing newline migration barrier
-!! wikitext
-<!--the newline at the end of this line moves out of the p tag-->a
-
-b<!--the newline at the end of this line stays inside the p tag--> <ref />
-<ref />
-
-c
-<references />
-!! html/parsoid
-<!--the newline at the end of this line moves out of the p tag--><p>a</p>
-
-
-<p>b<!--the newline at the end of this line stays inside the p tag--> <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<p>c</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"></span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text"></span></li></ol>
-!!end
-
-!!test
-Ref: 13. ref-tags are not SOL-transparent and block indent-pres
-!! wikitext
-<ref>foo</ref> A
-<ref>bar
-</ref> B
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> A
-<span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[2]</span></a></span> B</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar
-</span></li>
-</ol>
-!!end
-
-## Roundtripping fails because of nowiki'ing
-!! test
-Ref: 14. A nested ref-tag should be emitted as plain text
-!! options
-parsoid=wt2html
-!! wikitext
-<ref>foo <ref>bar</ref> baz</ref>
-
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span> baz</ref></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo <ref>bar</span></li></ol>
-!! end
-
-!!test
-Ref: 15. ref-tags with identical names should get identical indexes
-!! wikitext
-A1 <ref name="a">foo</ref> A2 <ref name="a" />
-B1 <ref name="b" /> B2 <ref name="b">bar</ref>
-
-<references />
-!! html/parsoid
-<p>A1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a-1"},"attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span> A2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B1 <span about="#mwt7" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span> B2 <span about="#mwt8" class="mw-ref" id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-b_2-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-b_2-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-## We don't bother wt2wt-ing non-standard whitespace
-!!test
-Ref: 16. Tokenizer should accept non-standard whitespace in <ref> and </ref> tags
-!!options
-parsoid=wt2html
-!! wikitext
-A <ref >foo</ref >
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
-!!end
-
-!!test
-Ref: 17. Generate valid HTML5 id/about attributes
-!!wikitext
-<ref name="a b">foo</ref>
-<ref name=":0">ve-created name</ref>
-
-<references />
-!!html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-a_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_b-1"},"attrs":{"name":"a b"}}'><a href="./Main_Page#cite_note-a_b-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span>
-<span about="#mwt4" class="mw-ref" id="cite_ref-:0_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-:0-2"},"attrs":{"name":":0"}}'><a href="./Main_Page#cite_note-:0-2" style="counter-reset: mw-Ref 2;"><span class="mw-reflink-text">[2]</span></a></span>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a_b-1" id="cite_note-a_b-1"><a href="./Main_Page#cite_ref-a_b_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a_b-1" class="mw-reference-text">foo</span></li><li about="#cite_note-:0-2" id="cite_note-:0-2"><a href="./Main_Page#cite_ref-:0_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-:0-2" class="mw-reference-text">ve-created name</span></li></ol>
-
-!!end
-
-!!test
-Ref: 18. T58916: Extension attributes should be parsed as plain text
-!!wikitext
-<ref name="{{echo|a}}">foo</ref>
-
-<references />
-!!html/parsoid
-<p><span class="mw-ref" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1"},"attrs":{"name":"{{echo|a}}"}}'><a href="./Main_Page#cite_note-.7B.7Becho.7Ca.7D.7D-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-.7B.7Becho.7Ca.7D.7D-1" id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><a href="./Main_Page#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-.7B.7Becho.7Ca.7D.7D-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 19. ref-tags with identical name encodings should get identical indexes
-!! wikitext
-1 <ref name="a & b">foo</ref> 2 <ref name="a & b" />
-
-<references />
-!! html/parsoid
-<p>1 <span about="#mwt3" class="mw-ref" id="cite_ref-a_.26_b_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-a_.26_b-1"},"attrs":{"name":"a & b"}}'><a href="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span> 2 <span about="#mwt4" class="mw-ref" id="cite_ref-a_.26_b_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp; b"}}'><a href="./Main_Page#cite_note-a_.26_b-1"><span class="mw-reflink-text">[1]</span></a></span>
-</p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-a_.26_b-1" id="cite_note-a_.26_b-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-a_.26_b_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-a_.26_b_1-1"><span class="mw-linkback-text">2 </span></a></span> <span id="mw-reference-text-cite_note-a_.26_b-1" class="mw-reference-text">foo</span></li>
-</ol>
-!!end
-
-!!test
-Ref: 20. ref-tags with identical names but different content should keep it
-!! wikitext
-A <ref name="foo">Foo one</ref>
-B <ref name="foo">Foo two</ref>
-C <ref name="foo" />
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-foo_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-foo-1"},"attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-foo_1-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"Foo two"},"attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span>
-C <span about="#mwt6" class="mw-ref" id="cite_ref-foo_1-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"foo"}}'><a href="./Main_Page#cite_note-foo-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-foo-1" id="cite_note-foo-1"><span rel="mw:referencedBy"><a href="./Main_Page#cite_ref-foo_1-0"><span class="mw-linkback-text">1 </span></a><a href="./Main_Page#cite_ref-foo_1-1"><span class="mw-linkback-text">2 </span></a><a href="./Main_Page#cite_ref-foo_1-2"><span class="mw-linkback-text">3 </span></a></span> <span id="mw-reference-text-cite_note-foo-1" class="mw-reference-text">Foo one</span></li>
-</ol>
-!!end
-
-!!test
-References: 1. references tag without any refs should be handled properly
-!! wikitext
-<references />
-!! html/parsoid
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
-!!end
-
-!!test
-References: 2. references tag with group only outputs references from that group
-!! wikitext
-A <ref group="a">foo</ref>
-B <ref group="b">bar</ref>
-C <ref>baz</ref>
-
-<references group="a" />
-<references />
-<references group="b" />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"b"}}'><a href="./Main_Page#cite_note-2" data-mw-group="b"><span class="mw-reflink-text">[b 1]</span></a></span>
-C <span class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">baz</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt12" data-mw-group="b" data-mw='{"name":"references","attrs":{"group":"b"}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="b" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-References: 3. ref list should be cleared after processing references
-!! wikitext
-A <ref>foo</ref>
-
-<references />
-
-B <ref>bar</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-
-<p>B <span about="#mwt6" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!!end
-
-!!test
-References: 4. only referenced group should be cleared after processing references
-!! wikitext
-A <ref group="a">afoo</ref>
-B <ref>bfoo</ref>
-
-<references group="a" />
-
-C <ref>cfoo</ref>
-
-<references />
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{"group":"a"}}'><a href="./Main_Page#cite_note-1" data-mw-group="a"><span class="mw-reflink-text">[a 1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{}}'><a href="./Main_Page#cite_note-2"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="a" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" data-mw-group="a" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">afoo</span></li>
-</ol>
-
-<p>C <span about="#mwt8" class="mw-ref" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-3"},"attrs":{}}'><a href="./Main_Page#cite_note-3"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt10" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bfoo</span></li><li about="#cite_note-3" id="cite_note-3"><a href="./Main_Page#cite_ref-3" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-3" class="mw-reference-text">cfoo</span></li>
-</ol>
-!!end
-
-## Don't expect this to rt since we're dropping content
-!! test
-References: 5. ref tags in references should be processed while ignoring all other content
-!! options
-parsoid=wt2html,html2html
-!! wikitext
-A <ref name="a" />
-B <ref name="b">bar</ref>
-
-<references>
-<ref name="a">foo</ref>
-This should just get lost.
-</references>
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-a_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a"}}'><a href="./Main_Page#cite_note-a-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="./Main_Page#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{},"body":{"html":"\n<span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[59,82,14,6]}' data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}'><a href=\"./Main_Page#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\" data-parsoid=\"{}\"><span class=\"mw-reflink-text\" data-parsoid=\"{}\">[1]</span></a></span>\n"}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="./Main_Page#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
-</ol>
-!! end
-
-!! test
-References: 6. <references /> from a transclusion
-!! wikitext
-<ref>Foo</ref> {{echo|<references />}}
-!! html/parsoid
-<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
-</ol>
-!! end
-
-!! test
-References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
-!! wikitext
-A <ref>foo bar for a</ref>
-B <ref group="X" name="b" />
-
-<references />
-
-<references group="X">
-<ref name="b">foo</ref>
-</references>
-!! html/parsoid
-<p>A <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span>
-B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a href="./Main_Page#cite_note-b-2" data-mw-group="X"><span class="mw-reflink-text">[X 1]</span></a></span>
-</p>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
-</ol>
-
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","attrs":{"group":"X"},"body":{"html":"\n<span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[96,119,14,6]}' data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}'><a href=\"./Main_Page#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\" data-parsoid=\"{}\"><span class=\"mw-reflink-text\" data-parsoid=\"{}\">[X 1]</span></a></span>\n"}}'>
-<li about="#cite_note-b-2" id="cite_note-b-2"><a href="./Main_Page#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
-</ol>
-!! end
-
-!! test
-References: 8. T88019: Remove <meta>s from templates inside <ref> that's itself inside a template
-!! wikitext
-X{{echo|<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>}}
-<references />
-!! html/parsoid
-<p>X<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<ref>foo {{echo|<b>bar</b>}} and {{echo|baz}} boo</ref>"}},"i":0}}]}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt7" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo <b data-parsoid='{"stx":"html"}'>bar</b> and baz boo</span></li>
-</ol>
-!!end
-
-# This test only works in wt2html now as the <references /> are always generated
-# unless selser is active. Once T72722 is fixed, we should add a changes test
-# here to ensure that unrelated changes don't add the new <references />
-# when selser is active.
-!! test
-References: 9. Generate missing references list at the end
-!! wikitext
-A <ref>foo</ref>
-B <ref group="inexistent">bar</ref>
-!! html/parsoid
-<p>A <span class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> B <span class="mw-ref" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-2"},"attrs":{"group":"inexistent"}}'><a href="./Main_Page#cite_note-2" data-mw-group="inexistent"><span class="mw-reflink-text">[inexistent 1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'>
-<li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li>
-</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw-group="inexistent" data-mw='{"name":"references","attrs":{"group":"inexistent"},"autoGenerated":true}'>
-<li about="#cite_note-2" id="cite_note-2"><a href="./Main_Page#cite_ref-2" data-mw-group="inexistent" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-2" class="mw-reference-text">bar</span></li>
-</ol>
-!! end
-
-!! test
-References: 10. New <references/> shouldn't be added for unrelated edits.
-!! options
-parsoid={
- "modes": ["selser"],
- "changes": [["#x", "remove"]],
- "selser": "noauto"
-}
-!! wikitext
-Unrelated text<span id="x"> that's going to disappear</span>.
-A <ref>foo</ref>
-!! wikitext/edited
-Unrelated text.
-A <ref>foo</ref>
-!!end
-
-!! test
-Entities in ref name
-!! wikitext
-<ref name="test & me">hi</ref>
-<references />
-!! html/parsoid
-<p><span about="#mwt2" class="mw-ref" id="cite_ref-test_.26_me_1-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-test_.26_me-1"},"attrs":{"name":"test &amp; me"}}'><a href="./Main_Page#cite_note-test_.26_me-1"><span class="mw-reflink-text">[1]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-test_.26_me-1" id="cite_note-test_.26_me-1"><a href="./Main_Page#cite_ref-test_.26_me_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-test_.26_me-1" class="mw-reference-text">hi</span></li>
-</ol>
-!! end
-
-## The output here may look funny, but it's what the php parser will do. The
-## unclosed references tag becomes escaped text, and then a new references
-## tag is auto-generated. The test is wt2html only because it roundtrips with
-## nowiki tags, and the auto-generated references tag is only dropped in
-## rtTestMode.
-!! test
-Generate references for unclosed references tag
-!! options
-parsoid=wt2html
-!! wikitext
-a<ref>foo</ref>
-
-<references>
-!! html/parsoid
-<p>a<span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></p>
-
-<p><references></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{},"autoGenerated":true}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
-!! end
-
-!! test
-New reference serializes on its own line
-!! options
-parsoid=wt2wt,html2wt
-!! wikitext
-foo
-<references />
-!! html/parsoid
-foo<ol class="mw-references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'></ol>
-!! end
-
#### ----------------------------------------------------------------
#### Parsoid-only testing of Parsoid's impl of LST
#### Not implemented yet, see
parsoid={
"modes": ["wt2wt"],
"changes": [
- [ "meta", "remove" ]
+ [ "span", "remove" ]
]
}
!! wikitext
// to avoid notices during testMakeModuleResponse for missing
// wgResourceLoaderLESSVars keys in extension hooks.
'wgHooks' => [],
+ 'wgShowExceptionDetails' => true,
] );
}
/*
* @example QUnit
* <code>
- QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+ QUnit.test( 'Output matches PHP parser', function ( assert ) {
mw.messages.set( mw.libs.phpParserData.messages );
$.each( mw.libs.phpParserData.tests, function ( i, test ) {
QUnit.stop();
}
} ) );
- QUnit.test( 'Setup', 3, function ( assert ) {
+ QUnit.test( 'Setup', function ( assert ) {
assert.equal( mw.html.escape( 'foo' ), 'mocked', 'setup() callback was ran.' );
assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
mw.messages.set( 'testMsg', 'Bar.' );
} );
- QUnit.test( 'Teardown', 2, function ( assert ) {
+ QUnit.test( 'Teardown', function ( assert ) {
assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
} );
- QUnit.test( 'Loader status', 2, function ( assert ) {
+ QUnit.test( 'Loader status', function ( assert ) {
var i, len, state,
modules = mw.loader.getModuleNames(),
error = [],
assert.deepEqual( missing, [], 'Modules in missing state' );
} );
- QUnit.test( 'htmlEqual', 8, function ( assert ) {
+ QUnit.test( 'htmlEqual', function ( assert ) {
assert.htmlEqual(
'<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
'<div><p data-length=\'10\' class=\'some classes\'>Child paragraph with <a href=\'http://example.com\' >A link</a></p>Regular text<span>A span</span></div>',
QUnit.module( 'test.mediawiki.qunit.testrunner-after', QUnit.newMwEnvironment() );
- QUnit.test( 'Teardown', 3, function ( assert ) {
+ QUnit.test( 'Teardown', function ( assert ) {
assert.equal( mw.html.escape( '<' ), '<', 'teardown() callback was ran.' );
assert.equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
assert.equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
return '<input title="' + title + '" ' + ( accessKey ? 'accessKey="' + accessKey + '" ' : '' ) + ' />';
}
- QUnit.test( 'getAccessKeyPrefix', getAccessKeyPrefixTestData.length, function ( assert ) {
+ QUnit.test( 'getAccessKeyPrefix', function ( assert ) {
var i;
for ( i = 0; i < getAccessKeyPrefixTestData.length; i++ ) {
assert.equal( $.fn.updateTooltipAccessKeys.getAccessKeyPrefix( {
}
} );
- QUnit.test( 'updateTooltipAccessKeys - current browser', 2, function ( assert ) {
+ QUnit.test( 'updateTooltipAccessKeys - current browser', function ( assert ) {
var title = $( makeInput( 'Title', 'a' ) ).updateTooltipAccessKeys().prop( 'title' ),
// The new title should be something like "Title [alt-a]", but the exact label will depend on the browser.
// The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
assert.notEqual( result[ 1 ], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
} );
- QUnit.test( 'updateTooltipAccessKeys - no access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+ QUnit.test( 'updateTooltipAccessKeys - no access key', function ( assert ) {
var i, oldTitle, $input, newTitle;
for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
}
} );
- QUnit.test( 'updateTooltipAccessKeys - with access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+ QUnit.test( 'updateTooltipAccessKeys - with access key', function ( assert ) {
$.fn.updateTooltipAccessKeys.setTestMode( true );
var i, oldTitle, $input, newTitle;
for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
$.fn.updateTooltipAccessKeys.setTestMode( false );
} );
- QUnit.test( 'updateTooltipAccessKeys with label element', 2, function ( assert ) {
+ QUnit.test( 'updateTooltipAccessKeys with label element', function ( assert ) {
$.fn.updateTooltipAccessKeys.setTestMode( true );
var html = '<label for="testInput" title="Title">Label</label><input id="testInput" accessKey="a" />',
$label, $input;
$.fn.updateTooltipAccessKeys.setTestMode( false );
} );
- QUnit.test( 'updateTooltipAccessKeys with label element as parent', 2, function ( assert ) {
+ QUnit.test( 'updateTooltipAccessKeys with label element as parent', function ( assert ) {
$.fn.updateTooltipAccessKeys.setTestMode( true );
var html = '<label title="Title">Label<input id="testInput" accessKey="a" /></label>',
$label, $input;
return i;
}
- QUnit.test( 'Position right', 4, function ( assert ) {
+ QUnit.test( 'Position right', function ( assert ) {
// We need this thing to be visible, so append it to the DOM
var $span, spanText, d, spanTextNew,
origText = 'This is a really long random string and there is no way it fits in 100 pixels.',
( function ( $ ) {
QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() );
- QUnit.test( 'Simple text', 5, function ( assert ) {
+ QUnit.test( 'Simple text', function ( assert ) {
var azLc = 'abcdefghijklmnopqrstuvwxyz',
azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
num = '0123456789',
} );
- QUnit.test( 'Special text', 4, function ( assert ) {
+ QUnit.test( 'Special text', function ( assert ) {
// https://en.wikipedia.org/wiki/UTF-8
var u0024 = '$',
// Cent symbol
expected: ''
} );
- QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
+ QUnit.test( 'Confirm properties and attributes set', function ( assert ) {
var $el, $elA, $elB;
$el = $( '<input>' ).attr( 'type', 'text' )
$el.byteLimit();
} );
- QUnit.test( 'Trim from insertion when limit exceeded', 2, function ( assert ) {
+ QUnit.test( 'Trim from insertion when limit exceeded', function ( assert ) {
var $el;
// Use a new <input /> because the bug only occurs on the first time
( function ( $ ) {
QUnit.module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
- QUnit.test( 'getRGB', 18, function ( assert ) {
+ QUnit.test( 'getRGB', function ( assert ) {
assert.strictEqual( $.colorUtil.getRGB(), undefined, 'No arguments' );
assert.strictEqual( $.colorUtil.getRGB( '' ), undefined, 'Empty string' );
assert.deepEqual( $.colorUtil.getRGB( [ 0, 100, 255 ] ), [ 0, 100, 255 ], 'Parse array of rgb values' );
assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
} );
- QUnit.test( 'rgbToHsl', 1, function ( assert ) {
+ QUnit.test( 'rgbToHsl', function ( assert ) {
var hsl, ret;
// Cross-browser differences in decimals...
assert.deepEqual( ret, [ 0.33, 0.73, 0.75 ], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
} );
- QUnit.test( 'hslToRgb', 1, function ( assert ) {
+ QUnit.test( 'hslToRgb', function ( assert ) {
var rgb, ret;
rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
assert.deepEqual( ret, [ 183, 240, 168 ], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
} );
- QUnit.test( 'getColorBrightness', 2, function ( assert ) {
+ QUnit.test( 'getColorBrightness', function ( assert ) {
var a, b;
a = $.colorUtil.getColorBrightness( 'red', +0.1 );
assert.equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
( function ( $ ) {
QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
- QUnit.test( 'getAttrs()', 1, function ( assert ) {
+ QUnit.test( 'getAttrs()', function ( assert ) {
var attrs = {
foo: 'bar',
'class': 'lorem',
( function ( $ ) {
QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
- QUnit.test( 'devicePixelRatio', 1, function ( assert ) {
+ QUnit.test( 'devicePixelRatio', function ( assert ) {
var devicePixelRatio = $.devicePixelRatio();
assert.equal( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
} );
- QUnit.test( 'bracketedDevicePixelRatio', 1, function ( assert ) {
+ QUnit.test( 'bracketedDevicePixelRatio', function ( assert ) {
var devicePixelRatio = $.devicePixelRatio();
assert.equal( typeof devicePixelRatio, 'number', '$.bracketedDevicePixelRatio() returns a number' );
} );
- QUnit.test( 'bracketDevicePixelRatio', 8, function ( assert ) {
+ QUnit.test( 'bracketDevicePixelRatio', function ( assert ) {
assert.equal( $.bracketDevicePixelRatio( 0.75 ), 1, '0.75 gives 1' );
assert.equal( $.bracketDevicePixelRatio( 1 ), 1, '1 gives 1' );
assert.equal( $.bracketDevicePixelRatio( 1.25 ), 1.5, '1.25 gives 1.5' );
assert.equal( $.bracketDevicePixelRatio( 3 ), 2, '3 gives 2' );
} );
- QUnit.test( 'matchSrcSet', 6, function ( assert ) {
+ QUnit.test( 'matchSrcSet', function ( assert ) {
var srcset = 'onefive.png 1.5x, two.png 2x';
// Nice exact matches
expected: '<span class="highlight">بو</span>ل إيردوس'
}
];
- QUnit.expect( cases.length );
$.each( cases, function ( i, item ) {
$fixture = $( '<p>' ).text( item.text ).highlightText( item.highlight );
( function ( $, mw ) {
QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
- QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
+ QUnit.test( 'Handle basic replacements', function ( assert ) {
var html, $lc;
mw.messages.set( 'basic', 'Basic stuff' );
assert.strictEqual( $lc.attr( 'placeholder' ), 'Basic stuff', 'Attribute: placeholder-msg' );
} );
- QUnit.test( 'Proper escaping', 2, function ( assert ) {
+ QUnit.test( 'Proper escaping', function ( assert ) {
var html, $lc;
mw.messages.set( 'properfoo', '<proper esc="test">' );
assert.strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
} );
- QUnit.test( 'Options', 7, function ( assert ) {
+ QUnit.test( 'Options', function ( assert ) {
mw.messages.set( {
'foo-lorem': 'Lorem',
'foo-ipsum': 'Ipsum',
assert.strictEqual( $lc.attr( 'title' ), 'Read more about bazz at Wikipedia (last modified: 3 minutes ago)', 'Combination of options prefix, params and keys - attr' );
} );
- QUnit.test( 'Handle data text', 2, function ( assert ) {
+ QUnit.test( 'Handle data text', function ( assert ) {
var html, $lc;
mw.messages.set( 'option-one', 'Item 1' );
mw.messages.set( 'option-two', 'Item 2' );
assert.strictEqual( $lc.eq( 1 ).text(), mw.msg( 'option-two' ), 'data-msg-text becomes text of options' );
} );
- QUnit.test( 'Handle data html', 2, function ( assert ) {
+ QUnit.test( 'Handle data html', function ( assert ) {
var html, $lc;
mw.messages.set( 'html', 'behold... there is a <a>link</a> here!!' );
html = '<div><div data-msg-html="html"></div></div>';
}
// This test is first because if it fails, then almost all of the latter tests are meaningless.
- QUnit.test( 'testing hooks/triggers', 4, function ( assert ) {
+ QUnit.test( 'testing hooks/triggers', function ( assert ) {
var test = this,
$collapsible = prepareCollapsible(
'<div class="mw-collapsible">' + loremIpsum + '</div>'
$toggle.trigger( 'click' );
} );
- QUnit.test( 'basic operation (<div>)', 5, function ( assert ) {
+ QUnit.test( 'basic operation (<div>)', function ( assert ) {
var test = this,
$collapsible = prepareCollapsible(
'<div class="mw-collapsible">' + loremIpsum + '</div>'
$toggle.trigger( 'click' );
} );
- QUnit.test( 'basic operation (<table>)', 7, function ( assert ) {
+ QUnit.test( 'basic operation (<table>)', function ( assert ) {
var test = this,
$collapsible = prepareCollapsible(
'<table class="mw-collapsible">' +
$toggle.trigger( 'click' );
}
- QUnit.test( 'basic operation (<table> with caption)', 10, function ( assert ) {
+ QUnit.test( 'basic operation (<table> with caption)', function ( assert ) {
tableWithCaptionTest( prepareCollapsible(
'<table class="mw-collapsible">' +
'<caption>' + loremIpsum + '</caption>' +
), this, assert );
} );
- QUnit.test( 'basic operation (<table> with caption and <thead>)', 10, function ( assert ) {
+ QUnit.test( 'basic operation (<table> with caption and <thead>)', function ( assert ) {
tableWithCaptionTest( prepareCollapsible(
'<table class="mw-collapsible">' +
'<caption>' + loremIpsum + '</caption>' +
$toggle.trigger( 'click' );
}
- QUnit.test( 'basic operation (<ul>)', 7, function ( assert ) {
+ QUnit.test( 'basic operation (<ul>)', function ( assert ) {
listTest( 'ul', this, assert );
} );
- QUnit.test( 'basic operation (<ol>)', 7, function ( assert ) {
+ QUnit.test( 'basic operation (<ol>)', function ( assert ) {
listTest( 'ol', this, assert );
} );
- QUnit.test( 'basic operation when synchronous (options.instantHide)', 2, function ( assert ) {
+ QUnit.test( 'basic operation when synchronous (options.instantHide)', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div class="mw-collapsible">' + loremIpsum + '</div>',
{ instantHide: true }
assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
} );
- QUnit.test( 'mw-made-collapsible data added', 1, function ( assert ) {
+ QUnit.test( 'mw-made-collapsible data added', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div>' + loremIpsum + '</div>'
);
assert.equal( $collapsible.data( 'mw-made-collapsible' ), true, 'mw-made-collapsible data present' );
} );
- QUnit.test( 'mw-collapsible added when missing', 1, function ( assert ) {
+ QUnit.test( 'mw-collapsible added when missing', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div>' + loremIpsum + '</div>'
);
assert.assertTrue( $collapsible.hasClass( 'mw-collapsible' ), 'mw-collapsible class present' );
} );
- QUnit.test( 'mw-collapsed added when missing', 1, function ( assert ) {
+ QUnit.test( 'mw-collapsed added when missing', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div>' + loremIpsum + '</div>',
{ collapsed: true }
assert.assertTrue( $collapsible.hasClass( 'mw-collapsed' ), 'mw-collapsed class present' );
} );
- QUnit.test( 'initial collapse (mw-collapsed class)', 2, function ( assert ) {
+ QUnit.test( 'initial collapse (mw-collapsed class)', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
),
$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
} );
- QUnit.test( 'initial collapse (options.collapsed)', 2, function ( assert ) {
+ QUnit.test( 'initial collapse (options.collapsed)', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div class="mw-collapsible">' + loremIpsum + '</div>',
{ collapsed: true }
$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
} );
- QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', 2, function ( assert ) {
+ QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div class="mw-collapsible">' +
'<div class="mw-collapsible-toggle">' +
assert.assertTrue( $content.is( ':hidden' ), 'click event on non-link inside toggle toggles content' );
} );
- QUnit.test( 'collapse/expand text (data-collapsetext, data-expandtext)', 2, function ( assert ) {
+ QUnit.test( 'collapse/expand text (data-collapsetext, data-expandtext)', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +
loremIpsum +
$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
} );
- QUnit.test( 'collapse/expand text (options.collapseText, options.expandText)', 2, function ( assert ) {
+ QUnit.test( 'collapse/expand text (options.collapseText, options.expandText)', function ( assert ) {
var $collapsible = prepareCollapsible(
'<div class="mw-collapsible">' + loremIpsum + '</div>',
{ collapseText: 'Collapse me!', expandText: 'Expand me!' }
$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
} );
- QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) {
+ QUnit.test( 'cloned collapsibles can be made collapsible again', function ( assert ) {
var test = this,
$collapsible = prepareCollapsible(
'<div class="mw-collapsible">' + loremIpsum + '</div>'
}
} ) );
- QUnit.test( 'String functions', 7, function ( assert ) {
+ QUnit.test( 'String functions', function ( assert ) {
assert.equal( $.trimLeft( ' foo bar ' ), 'foo bar ', 'trimLeft' );
assert.equal( $.trimRight( ' foo bar ' ), ' foo bar', 'trimRight' );
assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
} );
- QUnit.test( 'isDomElement', 6, function ( assert ) {
+ QUnit.test( 'isDomElement', function ( assert ) {
assert.strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
'isDomElement: HTMLElement' );
assert.strictEqual( $.isDomElement( document.createTextNode( '' ) ), true,
'isDomElement: Plain Object' );
} );
- QUnit.test( 'isEmpty', 7, function ( assert ) {
+ QUnit.test( 'isEmpty', function ( assert ) {
assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmpty: "string"' );
assert.strictEqual( $.isEmpty( '0' ), true, 'isEmpty: "0"' );
assert.strictEqual( $.isEmpty( '' ), true, 'isEmpty: ""' );
assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmpty: { length: 0 }' );
} );
- QUnit.test( 'Comparison functions', 5, function ( assert ) {
+ QUnit.test( 'Comparison functions', function ( assert ) {
assert.ok( $.compareArray( [ 0, 'a', [], [ 2, 'b' ] ], [ 0, 'a', [], [ 2, 'b' ] ] ),
'compareArray: Two deep arrays that are excactly the same' );
assert.ok( !$.compareArray( [ 1 ], [ 2 ] ), 'compareArray: Two different arrays (false)' );
QUnit.module( 'jquery.placeholder', QUnit.newMwEnvironment() );
- QUnit.test( 'caches results of feature tests', 2, function ( assert ) {
+ QUnit.test( 'caches results of feature tests', function ( assert ) {
assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input' );
assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea' );
} );
$el.placeholder( placeholder );
};
- QUnit.test( 'emulates placeholder for <input type=text>', 22, function ( assert ) {
+ QUnit.test( 'emulates placeholder for <input type=text>', function ( assert ) {
$( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
testElement( $( '#input-type-text' ), assert );
} );
- QUnit.test( 'emulates placeholder for <input type=search>', 22, function ( assert ) {
+ QUnit.test( 'emulates placeholder for <input type=search>', function ( assert ) {
$( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
testElement( $( '#input-type-search' ), assert );
} );
- QUnit.test( 'emulates placeholder for <input type=email>', 22, function ( assert ) {
+ QUnit.test( 'emulates placeholder for <input type=email>', function ( assert ) {
$( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
testElement( $( '#input-type-email' ), assert );
} );
- QUnit.test( 'emulates placeholder for <input type=url>', 22, function ( assert ) {
+ QUnit.test( 'emulates placeholder for <input type=url>', function ( assert ) {
$( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
testElement( $( '#input-type-url' ), assert );
} );
- QUnit.test( 'emulates placeholder for <input type=tel>', 22, function ( assert ) {
+ QUnit.test( 'emulates placeholder for <input type=tel>', function ( assert ) {
$( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
testElement( $( '#input-type-tel' ), assert );
} );
- QUnit.test( 'emulates placeholder for <input type=password>', 13, function ( assert ) {
+ QUnit.test( 'emulates placeholder for <input type=password>', function ( assert ) {
$( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
var selector = '#input-type-password',
} );
- QUnit.test( 'emulates placeholder for <textarea></textarea>', 22, function ( assert ) {
+ QUnit.test( 'emulates placeholder for <textarea></textarea>', function ( assert ) {
$( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
testElement( $( '#textarea' ), assert );
} );
( function ( $ ) {
QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
- QUnit.test( 'firstTabIndex', 2, function ( assert ) {
+ QUnit.test( 'firstTabIndex', function ( assert ) {
var html, $testA, $testB;
html = '<form>' +
'<input tabindex="7" />' +
assert.strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
} );
- QUnit.test( 'lastTabIndex', 2, function ( assert ) {
+ QUnit.test( 'lastTabIndex', function ( assert ) {
var html, $testA, $testB;
html = '<form>' +
'<input tabindex="7" />' +
* @param {function($table)} callback something to do before we start the testcase
*/
function parserTest( msg, parserId, data, callback ) {
- QUnit.test( msg, data.length * 2, function ( assert ) {
+ QUnit.test( msg, function ( assert ) {
var extractedR, extractedF, parser;
if ( callback !== undefined ) {
} );
}
- text = [
+ text = [
[ 'Mars', true, 'mars', 'Simple text' ],
[ 'Mẘas', true, 'mẘas', 'Non ascii character' ],
[ 'A sentence', true, 'a sentence', 'A sentence with space chars' ]
$table.find( '.headerSort:eq(1)' ).trigger( event );
}
);
- QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
+ QUnit.test( 'Reset sorting making table appear unsorted', function ( assert ) {
var $table = tableCreate( header, simple );
$table.tablesorter(
{ sortList: [
}
);
- QUnit.test( 'Basic planet table: one unsortable column', 3, function ( assert ) {
+ QUnit.test( 'Basic planet table: one unsortable column', function ( assert ) {
var $table = tableCreate( header, planets ),
$cell;
$table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' );
}
);
- QUnit.test( 'Rowspan not exploded on init', 1, function ( assert ) {
+ QUnit.test( 'Rowspan not exploded on init', function ( assert ) {
var $table = tableCreate( header, planets );
// Modify the table to have a multiple-row-spanning cell:
}
);
- QUnit.test( 'Test detection routine', 1, function ( assert ) {
+ QUnit.test( 'Test detection routine', function ( assert ) {
var $table;
$table = $(
'<table class="sortable">' +
} );
/** FIXME: the diff output is not very readeable. */
- QUnit.test( 'T34047 - caption must be before thead', 1, function ( assert ) {
+ QUnit.test( 'T34047 - caption must be before thead', function ( assert ) {
var $table;
$table = $(
'<table class="sortable">' +
);
} );
- QUnit.test( 'data-sort-value attribute, when available, should override sorting position', 3, function ( assert ) {
+ QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
var $table, data;
// Example 1: All cells except one cell without data-sort-value,
);
// TODO add numbers sorting tests for T10115 with a different language
- QUnit.test( 'T34888 - Tables inside a tableheader cell', 2, function ( assert ) {
+ QUnit.test( 'T34888 - Tables inside a tableheader cell', function ( assert ) {
var $table;
$table = $(
'<table class="sortable" id="mw-bug-32888">' +
}
);
- QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
+ QUnit.test( 'Sorting images using alt text', function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<tr><th>THEAD</th></tr>' +
);
} );
- QUnit.test( 'Sorting images using alt text (complex)', 1, function ( assert ) {
+ QUnit.test( 'Sorting images using alt text (complex)', function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<tr><th>THEAD</th></tr>' +
);
} );
- QUnit.test( 'Sorting images using alt text (with format autodetection)', 1, function ( assert ) {
+ QUnit.test( 'Sorting images using alt text (with format autodetection)', function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<tr><th>THEAD</th></tr>' +
);
} );
- QUnit.test( 'T40911 - The row with the largest amount of columns should receive the sort indicators', 3, function ( assert ) {
+ QUnit.test( 'T40911 - The row with the largest amount of columns should receive the sort indicators', function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<thead>' +
);
} );
- QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', 2, function ( assert ) {
+ QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<thead>' +
);
} );
- QUnit.test( 'holes in the table headers should not throw JS errors', 2, function ( assert ) {
+ QUnit.test( 'holes in the table headers should not throw JS errors', function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<thead>' +
} );
// T55527
- QUnit.test( 'td cells in thead should not be taken into account for longest row calculation', 2, function ( assert ) {
+ QUnit.test( 'td cells in thead should not be taken into account for longest row calculation', function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<thead>' +
// T55211 - exploding rowspans in more complex cases
QUnit.test(
- 'Rowspan exploding with row headers and colspans', 1, function ( assert ) {
+ 'Rowspan exploding with row headers and colspans', function ( assert ) {
var $table = $( '<table class="sortable">' +
'<thead><tr><th rowspan="2">n</th><th colspan="2">foo</th><th rowspan="2">baz</th></tr>' +
'<tr><th>foo</th><th>bar</th></tr></thead>' +
]
);
- QUnit.test( 'T105731 - incomplete rows in table body', 3, function ( assert ) {
+ QUnit.test( 'T105731 - incomplete rows in table body', function ( assert ) {
var $table, parsers;
$table = $(
'<table class="sortable">' +
);
} );
- QUnit.test( 'bug T114721 - use of expand-child class', 2, function ( assert ) {
+ QUnit.test( 'bug T114721 - use of expand-child class', function ( assert ) {
var $table, parsers;
$table = $(
'<table class="sortable">' +
}, opt.after );
QUnit.test( opt.description, function ( assert ) {
- var $textarea, start, end, options, text, selected,
- tests = 1;
- if ( opt.after.selected !== null ) {
- tests++;
- }
- QUnit.expect( tests );
+ var $textarea, start, end, options, text, selected;
$textarea = $( '<textarea>' );
} );
function caretTest( options ) {
- QUnit.test( options.description, 2, function ( assert ) {
+ QUnit.test( options.description, function ( assert ) {
var pos,
$textarea = $( '<textarea>' ).text( options.text );
}
} ) );
- QUnit.test( 'origin is included in GET requests', 1, function ( assert ) {
+ QUnit.test( 'origin is included in GET requests', function ( assert ) {
var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
this.server.respond( function ( request ) {
return api.get( {} );
} );
- QUnit.test( 'origin is included in POST requests', 2, function ( assert ) {
+ QUnit.test( 'origin is included in POST requests', function ( assert ) {
var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
this.server.respond( function ( request ) {
}
} ) );
- QUnit.test( '.getCategoriesByPrefix()', 1, function ( assert ) {
+ QUnit.test( '.getCategoriesByPrefix()', function ( assert ) {
this.server.respondWith( [ 200, { 'Content-Type': 'application/json' },
'{ "query": { "allpages": [ ' +
'{ "title": "Category:Food" },' +
}
} ) );
- QUnit.test( '.getMessages()', 1, function ( assert ) {
+ QUnit.test( '.getMessages()', function ( assert ) {
this.server.respondWith( /ammessages=foo%7Cbaz/, [
200,
{ 'Content-Type': 'application/json' },
}
} ) );
- QUnit.test( 'saveOption', 2, function ( assert ) {
+ QUnit.test( 'saveOption', function ( assert ) {
var api = new mw.Api(),
stub = this.sandbox.stub( mw.Api.prototype, 'saveOptions' );
assert.deepEqual( stub.getCall( 0 ).args, [ { foo: 'bar' } ], '#saveOptions called correctly' );
} );
- QUnit.test( 'saveOptions without Unit Separator', 13, function ( assert ) {
+ QUnit.test( 'saveOptions without Unit Separator', function ( assert ) {
var api = new mw.Api( { useUS: false } );
// We need to respond to the request for token first, otherwise the other requests won't be sent
);
} );
- QUnit.test( 'saveOptions with Unit Separator', 14, function ( assert ) {
+ QUnit.test( 'saveOptions with Unit Separator', function ( assert ) {
var api = new mw.Api( { useUS: true } );
// We need to respond to the request for token first, otherwise the other requests won't be sent
}
} );
- QUnit.test( '#abort', 3, function ( assert ) {
+ QUnit.test( '#abort', function ( assert ) {
this.api.get( {
a: 1
} );
( function ( mw, $ ) {
QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
- QUnit.test( 'Basic functionality', 2, function ( assert ) {
+ QUnit.test( 'Basic functionality', function ( assert ) {
var api = new mw.Api();
assert.ok( api.upload );
assert.throws( function () {
} );
} );
- QUnit.test( 'Set up iframe upload', 5, function ( assert ) {
+ QUnit.test( 'Set up iframe upload', function ( assert ) {
var $iframe, $form, $input,
api = new mw.Api();
// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
- QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
+ QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
var selectHtml, $env, $options,
rc = require( 'mediawiki.special.recentchanges' );
( function ( mw, $ ) {
QUnit.module( 'mediawiki.RegExp' );
- QUnit.test( 'escape', 16, function ( assert ) {
+ QUnit.test( 'escape', function ( assert ) {
var specials, normal;
specials = [
}
} ) );
- QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
+ QUnit.test( 'constructor', function ( assert ) {
var i, title;
for ( i = 0; i < cases.valid.length; i++ ) {
title = new mw.Title( cases.valid[ i ] );
}
} );
- QUnit.test( 'newFromText', cases.valid.length + cases.invalid.length, function ( assert ) {
+ QUnit.test( 'newFromText', function ( assert ) {
var i;
for ( i = 0; i < cases.valid.length; i++ ) {
assert.equal(
}
} );
- QUnit.test( 'makeTitle', 6, function ( assert ) {
+ QUnit.test( 'makeTitle', function ( assert ) {
var cases, i, title, expected,
NS_MAIN = 0,
NS_TALK = 1,
}
} );
- QUnit.test( 'Basic parsing', 21, function ( assert ) {
+ QUnit.test( 'Basic parsing', function ( assert ) {
var title;
title = new mw.Title( 'File:Foo_bar.JPG' );
assert.equal( title.getPrefixedText(), '.foo' );
} );
- QUnit.test( 'Transformation', 12, function ( assert ) {
+ QUnit.test( 'Transformation', function ( assert ) {
var title;
title = new mw.Title( 'File:quux pif.jpg' );
assert.equal( title.getFragment(), ' foo bar baz', 'Fragment' );
} );
- QUnit.test( 'Namespace detection and conversion', 10, function ( assert ) {
+ QUnit.test( 'Namespace detection and conversion', function ( assert ) {
var title;
title = new mw.Title( 'File:User:Example' );
assert.equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
} );
- QUnit.test( 'Throw error on invalid title', 1, function ( assert ) {
+ QUnit.test( 'Throw error on invalid title', function ( assert ) {
assert.throws( function () {
return new mw.Title( '' );
}, 'Throw error on empty string' );
} );
- QUnit.test( 'Case-sensivity', 5, function ( assert ) {
+ QUnit.test( 'Case-sensivity', function ( assert ) {
var title;
// Default config
assert.equal( title.toString(), 'User:John', '$wgCapitalLinks=false: User namespace is insensitive, first-letter becomes uppercase' );
} );
- QUnit.test( 'toString / toText', 2, function ( assert ) {
+ QUnit.test( 'toString / toText', function ( assert ) {
var title = new mw.Title( 'Some random page' );
assert.equal( title.toString(), title.getPrefixedDb() );
assert.equal( title.toText(), title.getPrefixedText() );
} );
- QUnit.test( 'getExtension', 7, function ( assert ) {
+ QUnit.test( 'getExtension', function ( assert ) {
function extTest( pagename, ext, description ) {
var title = new mw.Title( pagename );
assert.equal( title.getExtension(), ext, description || pagename );
// extTest( '.NET', null, 'Leading dot is (or is not?) an extension' );
} );
- QUnit.test( 'exists', 3, function ( assert ) {
+ QUnit.test( 'exists', function ( assert ) {
var title;
// Empty registry, checks default to null
} );
- QUnit.test( 'getUrl', 4, function ( assert ) {
+ QUnit.test( 'getUrl', function ( assert ) {
var title;
mw.config.set( {
wgScript: '/w/index.php',
assert.equal( title.getUrl( { meme: true } ), '/w/index.php?title=User_talk:John_Cena&meme=true#And_His_Name_Is', 'title with fragment and query parameter' );
} );
- QUnit.test( 'newFromImg', 44, function ( assert ) {
+ QUnit.test( 'newFromImg', function ( assert ) {
var title, i, thisCase, prefix,
cases = [
{
}
} );
- QUnit.test( 'getRelativeText', 5, function ( assert ) {
+ QUnit.test( 'getRelativeText', function ( assert ) {
var i, thisCase, title,
cases = [
{
}
} );
- QUnit.test( 'normalizeExtension', 5, function ( assert ) {
+ QUnit.test( 'normalizeExtension', function ( assert ) {
var extension, i, thisCase, prefix,
cases = [
{
}
} );
- QUnit.test( 'newFromUserInput', 12, function ( assert ) {
+ QUnit.test( 'newFromUserInput', function ( assert ) {
var title, i, thisCase, prefix,
cases = [
{
}
} );
- QUnit.test( 'newFromFileName', 54, function ( assert ) {
+ QUnit.test( 'newFromFileName', function ( assert ) {
var title, i, thisCase, prefix,
cases = [
{
} ) );
$.each( [ true, false ], function ( i, strictMode ) {
- QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', 2, function ( assert ) {
+ QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', function ( assert ) {
var uriString, uri;
uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
uri = new mw.Uri( uriString, {
} );
} );
- QUnit.test( 'Constructor( String[, Object ] )', 11, function ( assert ) {
+ QUnit.test( 'Constructor( String[, Object ] )', function ( assert ) {
var uri;
uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
/*jshint +W001 */
} );
- QUnit.test( 'Constructor( Object )', 3, function ( assert ) {
+ QUnit.test( 'Constructor( Object )', function ( assert ) {
var uri = new mw.Uri( {
protocol: 'http',
host: 'www.foo.local',
);
} );
- QUnit.test( 'Constructor( empty[, Object ] )', 5, function ( assert ) {
+ QUnit.test( 'Constructor( empty[, Object ] )', function ( assert ) {
var testuri, MyUri, uri;
testuri = 'http://example.org/w/index.php?a=1&a=2';
assert.deepEqual( uri.query, { a: '2' }, 'null, with options' );
} );
- QUnit.test( 'Properties', 8, function ( assert ) {
+ QUnit.test( 'Properties', function ( assert ) {
var uriBase, uri;
uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
assert.ok( uri.toString().indexOf( 'pif=paf' ) >= 0, 'extend query arguments' );
} );
- QUnit.test( '.getQueryString()', 2, function ( assert ) {
+ QUnit.test( '.getQueryString()', function ( assert ) {
var uri = new mw.Uri( 'http://search.example.com/?q=uri' );
assert.deepEqual(
} );
- QUnit.test( '.clone()', 6, function ( assert ) {
+ QUnit.test( '.clone()', function ( assert ) {
var original, clone;
original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
);
} );
- QUnit.test( '.toString() after query manipulation', 8, function ( assert ) {
+ QUnit.test( '.toString() after query manipulation', function ( assert ) {
var uri;
uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
assert.equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
} );
- QUnit.test( 'Variable defaultUri', 2, function ( assert ) {
+ QUnit.test( 'Variable defaultUri', function ( assert ) {
var uri,
href = 'http://example.org/w/index.php#here',
UriClass = mw.UriRelative( function () {
);
} );
- QUnit.test( 'Advanced URL', 11, function ( assert ) {
+ QUnit.test( 'Advanced URL', function ( assert ) {
var uri, queryString, relativePath;
uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragment in relative path' );
} );
- QUnit.test( 'Parse a uri with an @ symbol in the path and query', 1, function ( assert ) {
+ QUnit.test( 'Parse a uri with an @ symbol in the path and query', function ( assert ) {
var uri = new mw.Uri( 'http://www.example.com/test@test?x=@uri&y@=uri&z@=@' );
assert.deepEqual(
);
} );
- QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
+ QUnit.test( 'Handle protocol-relative URLs', function ( assert ) {
var UriRel, uri;
UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
} );
- QUnit.test( 'T37658', 2, function ( assert ) {
+ QUnit.test( 'T37658', function ( assert ) {
var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
testProtocol = 'https://';
};
function pluralTest( langCode, tests ) {
- QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
+ QUnit.test( 'Plural Test for ' + langCode, function ( assert ) {
for ( var i = 0; i < tests.length; i++ ) {
assert.equal(
mw.language.convertPlural( tests[ i ][ 0 ], tests[ i ][ 1 ] ),
}
} ) );
- QUnit.test( 'set( key, value )', 7, function ( assert ) {
+ QUnit.test( 'set( key, value )', function ( assert ) {
var call;
// Simple case
assert.strictEqual( call[ 1 ], '0', '0 is value' );
} );
- QUnit.test( 'set( key, value, expires )', 6, function ( assert ) {
+ QUnit.test( 'set( key, value, expires )', function ( assert ) {
var date, options;
date = new Date();
assert.strictEqual( options.expires, date, 'custom expiration (with wgCookieExpiration=0)' );
} );
- QUnit.test( 'set( key, value, options )', 4, function ( assert ) {
+ QUnit.test( 'set( key, value, options )', function ( assert ) {
var date, call;
mw.cookie.set( 'foo', 'bar', {
}, 'Options (incl. expires)' );
} );
- QUnit.test( 'get( key ) - no values', 6, function ( assert ) {
+ QUnit.test( 'get( key ) - no values', function ( assert ) {
var key, value;
mw.cookie.get( 'foo' );
assert.strictEqual( value, 'bar', 'Custom default value' );
} );
- QUnit.test( 'get( key ) - with value', 1, function ( assert ) {
+ QUnit.test( 'get( key ) - with value', function ( assert ) {
var value;
$.cookie.returns( 'bar' );
assert.strictEqual( value, 'bar', 'Return value of cookie' );
} );
- QUnit.test( 'get( key, prefix )', 1, function ( assert ) {
+ QUnit.test( 'get( key, prefix )', function ( assert ) {
var key;
mw.cookie.get( 'foo', 'bar' );
( function ( $, mw ) {
QUnit.module( 'mediawiki.errorLogger', QUnit.newMwEnvironment() );
- QUnit.test( 'installGlobalHandler', 7, function ( assert ) {
+ QUnit.test( 'installGlobalHandler', function ( assert ) {
var w = {},
errorMessage = 'Foo',
errorUrl = 'http://example.com',
QUnit.module( 'mediawiki.experiments' );
- QUnit.test( 'getBucket( experiment, token )', 4, function ( assert ) {
+ QUnit.test( 'getBucket( experiment, token )', function ( assert ) {
var experiment = createExperiment(),
token = '123457890';
( function ( mw ) {
QUnit.module( 'mediawiki.html' );
- QUnit.test( 'escape', 2, function ( assert ) {
+ QUnit.test( 'escape', function ( assert ) {
assert.throws(
function () {
mw.html.escape();
);
} );
- QUnit.test( 'element()', 1, function ( assert ) {
+ QUnit.test( 'element()', function ( assert ) {
assert.equal(
mw.html.element(),
'<undefined/>',
);
} );
- QUnit.test( 'element( tagName )', 1, function ( assert ) {
+ QUnit.test( 'element( tagName )', function ( assert ) {
assert.equal( mw.html.element( 'div' ), '<div/>', 'DIV' );
} );
- QUnit.test( 'element( tagName, attrs )', 2, function ( assert ) {
+ QUnit.test( 'element( tagName, attrs )', function ( assert ) {
assert.equal( mw.html.element( 'div', {} ), '<div/>', 'DIV' );
assert.equal(
);
} );
- QUnit.test( 'element( tagName, attrs, content )', 8, function ( assert ) {
+ QUnit.test( 'element( tagName, attrs, content )', function ( assert ) {
assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'DIV with empty attributes and content' );
next();
}
- QUnit.test( 'Replace', 15, function ( assert ) {
+ QUnit.test( 'Replace', function ( assert ) {
mw.messages.set( 'simple', 'Foo $1 baz $2' );
assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
);
} );
- QUnit.test( 'Plural', 9, function ( assert ) {
+ QUnit.test( 'Plural', function ( assert ) {
assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
assert.equal( formatParse( 'plural-empty-explicit-form', 2 ), 'There is me and other people.' );
} );
- QUnit.test( 'Gender', 15, function ( assert ) {
+ QUnit.test( 'Gender', function ( assert ) {
var originalGender = mw.user.options.get( 'gender' );
// TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
mw.user.options.set( 'gender', originalGender );
} );
- QUnit.test( 'Case changing', 8, function ( assert ) {
+ QUnit.test( 'Case changing', function ( assert ) {
mw.messages.set( 'to-lowercase', '{{lc:thIS hAS MEsSed uP CapItaliZatiON}}' );
assert.equal( formatParse( 'to-lowercase' ), 'this has messed up capitalization', 'To lowercase' );
assert.equal( formatParse( 'all-caps-except-first' ), 'tHIS HAS MESSED UP CAPITALIZATION', 'To opposite sentence case' );
} );
- QUnit.test( 'Grammar', 2, function ( assert ) {
+ QUnit.test( 'Grammar', function ( assert ) {
assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj Wiki', 'Grammar Test with sitename' );
mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
} );
- QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+ QUnit.test( 'Match PHP parser', function ( assert ) {
mw.messages.set( mw.libs.phpParserData.messages );
var tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
var done = assert.async();
process( tasks );
} );
- QUnit.test( 'Links', 15, function ( assert ) {
+ QUnit.test( 'Links', function ( assert ) {
var testCases,
expectedDisambiguationsText,
expectedMultipleBars,
} );
} );
- QUnit.test( 'Replacements in links', 14, function ( assert ) {
+ QUnit.test( 'Replacements in links', function ( assert ) {
var testCases = [
[
'extlink-param-href-full',
} );
// Tests that {{-transformation vs. general parsing are done as requested
- QUnit.test( 'Curly brace transformation', 16, function ( assert ) {
+ QUnit.test( 'Curly brace transformation', function ( assert ) {
var oldUserLang = mw.config.get( 'wgUserLanguage' );
assertBothModes( assert, [ 'gender-msg', 'Bob', 'male' ], 'Bob: blue', 'gender is resolved' );
mw.config.set( 'wgUserLanguage', oldUserLang );
} );
- QUnit.test( 'Int', 4, function ( assert ) {
+ QUnit.test( 'Int', function ( assert ) {
var newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Foobar}}|foobar]] for more info). If you are here by mistake, click your browser\'s back button.',
expectedNewarticletext,
helpPageTitle = 'Help:Foobar';
);
} );
- QUnit.test( 'Ns', 4, function ( assert ) {
+ QUnit.test( 'Ns', function ( assert ) {
mw.messages.set( 'ns-template-talk', '{{ns:Template talk}}' );
assert.equal(
formatParse( 'ns-template-talk' ),
// Tests that getMessageFunction is used for non-plain messages with curly braces or
// square brackets, but not otherwise.
- QUnit.test( 'mw.Message.prototype.parser monkey-patch', 22, function ( assert ) {
+ QUnit.test( 'mw.Message.prototype.parser monkey-patch', function ( assert ) {
var oldGMF, outerCalled, innerCalled;
mw.messages.set( {
}
];
- QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
+ QUnit.test( 'formatnum', function ( assert ) {
mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
var queue = $.map( formatnumTests, function ( test ) {
} );
// HTML in wikitext
- QUnit.test( 'HTML', 33, function ( assert ) {
+ QUnit.test( 'HTML', function ( assert ) {
mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
);
} );
- QUnit.test( 'Nowiki', 3, function ( assert ) {
+ QUnit.test( 'Nowiki', function ( assert ) {
mw.messages.set( 'jquerymsg-nowiki-link', 'Foo <nowiki>[[bar]]</nowiki> baz.' );
assert.equal(
formatParse( 'jquerymsg-nowiki-link' ),
);
} );
- QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {
+ QUnit.test( 'Behavior in case of invalid wikitext', function ( assert ) {
mw.messages.set( 'invalid-wikitext', '<b>{{FAIL}}</b>' );
this.suppressWarnings();
assert.equal( logSpy.callCount, 2, 'mw.log.warn calls' );
} );
- QUnit.test( 'Integration', 5, function ( assert ) {
+ QUnit.test( 'Integration', function ( assert ) {
var expected, logSpy, msg;
expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
( function ( $ ) {
QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
- QUnit.test( 'Variable with Unicode letter in name', 3, function ( assert ) {
+ QUnit.test( 'Variable with Unicode letter in name', function ( assert ) {
var orig, ŝablono;
orig = 'some token';
expected, $textarea;
maxn = 4;
- QUnit.expect( maxn * 2 );
function repeat( str, n ) {
var out;
}
} ) );
- QUnit.test( 'mw.language getData and setData', 3, function ( assert ) {
+ QUnit.test( 'mw.language getData and setData', function ( assert ) {
mw.language.setData( 'en', 'testkey', 'testvalue' );
assert.equal( mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
assert.equal( mw.language.getData( 'en-US', 'testkey' ), 'testvalue', 'Case insensitive test for mw.language' );
} );
- QUnit.test( 'mw.language.commafy test', 9, function ( assert ) {
+ QUnit.test( 'mw.language.commafy test', function ( assert ) {
mw.language.setData( 'en', 'digitGroupingPattern', null );
mw.language.setData( 'en', 'digitTransformTable', null );
mw.language.setData( 'en', 'separatorTransformTable', null );
assert.equal( mw.language.commafy( 123456789.567, '###,###,#0.00' ), '1,234,567,89.56', 'Decimal part as group of 3 and last one 2' );
} );
- QUnit.test( 'mw.language.convertNumber', 2, function ( assert ) {
+ QUnit.test( 'mw.language.convertNumber', function ( assert ) {
mw.language.setData( 'en', 'digitGroupingPattern', null );
mw.language.setData( 'en', 'digitTransformTable', null );
mw.language.setData( 'en', 'separatorTransformTable', { ',': '.', '.': ',' } );
mw.config.set( 'wgUserLanguage', 'en' );
+ mw.config.set( 'wgTranslateNumerals', true );
assert.equal( mw.language.convertNumber( 1800 ), '1.800', 'formatting' );
assert.equal( mw.language.convertNumber( '1.800', true ), '1800', 'unformatting' );
} );
+ QUnit.test( 'mw.language.convertNumber - digitTransformTable', function ( assert ) {
+ mw.config.set( 'wgUserLanguage', 'hi' );
+ mw.config.set( 'wgTranslateNumerals', true );
+ mw.language.setData( 'hi', 'digitGroupingPattern', null );
+ mw.language.setData( 'hi', 'separatorTransformTable', { ',': '.', '.': ',' } );
+
+ // Example from Hindi (MessagesHi.php)
+ mw.language.setData( 'hi', 'digitTransformTable', {
+ 0: '०',
+ 1: '१',
+ 2: '२'
+ } );
+
+ assert.equal( mw.language.convertNumber( 1200 ), '१.२००', 'format' );
+ assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform' );
+ assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain' );
+
+ mw.config.set( 'wgTranslateNumerals', false );
+
+ assert.equal( mw.language.convertNumber( 1200 ), '1.200', 'format (digit transform disabled)' );
+ assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform (when disabled)' );
+ assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain (digit transform disabled)' );
+ } );
+
function grammarTest( langCode, test ) {
// The test works only if the content language is opt.language
// because it requires [lang].js to be loaded.
QUnit.test( 'Grammar test for lang=' + langCode, function ( assert ) {
- QUnit.expect( test.length );
for ( var i = 0; i < test.length; i++ ) {
assert.equal(
}
} );
- QUnit.test( 'List to text test', 4, function ( assert ) {
+ QUnit.test( 'List to text test', function ( assert ) {
assert.equal( mw.language.listToText( [] ), '', 'Blank list' );
assert.equal( mw.language.listToText( [ 'a' ] ), 'a', 'Single item' );
assert.equal( mw.language.listToText( [ 'a', 'b' ] ), 'a and b', 'Two items' );
);
}
- QUnit.test( 'Basic', 2, function ( assert ) {
+ QUnit.test( 'Basic', function ( assert ) {
var isAwesomeDone;
mw.loader.testCallback = function () {
} );
} );
- QUnit.test( 'Object method as module name', 2, function ( assert ) {
+ QUnit.test( 'Object method as module name', function ( assert ) {
var isAwesomeDone;
mw.loader.testCallback = function () {
} );
} );
- QUnit.test( '.using( .. ) Promise', 2, function ( assert ) {
+ QUnit.test( '.using( .. ) Promise', function ( assert ) {
var isAwesomeDone;
mw.loader.testCallback = function () {
).always( done );
} );
- QUnit.test( '.load() - Error: Unregistered (ignored)', 0, function ( assert ) {
+ QUnit.test( '.load() - Error: Unregistered (ignored)', function ( assert ) {
+ assert.expect( 0 );
mw.loader.load( 'test.using.unreg2' );
} );
- QUnit.test( '.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
+ QUnit.test( '.implement( styles={ "css": [text, ..] } )', function ( assert ) {
var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
assert.notEqual(
return mw.loader.using( 'test.implement.a' );
} );
- QUnit.test( '.implement( styles={ "url": { <media>: [url, ..] } } )', 7, function ( assert ) {
+ QUnit.test( '.implement( styles={ "url": { <media>: [url, ..] } } )', function ( assert ) {
var $element1 = $( '<div class="mw-test-implement-b1"></div>' ).appendTo( '#qunit-fixture' ),
$element2 = $( '<div class="mw-test-implement-b2"></div>' ).appendTo( '#qunit-fixture' ),
$element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' ),
} );
// Backwards compatibility
- QUnit.test( '.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
+ QUnit.test( '.implement( styles={ <media>: text } ) (back-compat)', function ( assert ) {
var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
assert.notEqual(
} );
// Backwards compatibility
- QUnit.test( '.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
+ QUnit.test( '.implement( styles={ <media>: [url, ..] } ) (back-compat)', function ( assert ) {
var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
$element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' ),
done = assert.async();
} );
// @import (T33676)
- QUnit.test( '.implement( styles has @import )', 7, function ( assert ) {
+ QUnit.test( '.implement( styles has @import )', function ( assert ) {
var isJsExecuted, $element,
done = assert.async();
} );
} );
- QUnit.test( '.implement( dependency with styles )', 4, function ( assert ) {
+ QUnit.test( '.implement( dependency with styles )', function ( assert ) {
var $element = $( '<div class="mw-test-implement-e"></div>' ).appendTo( '#qunit-fixture' ),
$element2 = $( '<div class="mw-test-implement-e2"></div>' ).appendTo( '#qunit-fixture' );
return mw.loader.using( 'test.implement.e' );
} );
- QUnit.test( '.implement( only scripts )', 1, function ( assert ) {
+ QUnit.test( '.implement( only scripts )', function ( assert ) {
mw.loader.implement( 'test.onlyscripts', function () {} );
assert.strictEqual( mw.loader.getState( 'test.onlyscripts' ), 'ready' );
} );
- QUnit.test( '.implement( only messages )', 2, function ( assert ) {
+ QUnit.test( '.implement( only messages )', function ( assert ) {
assert.assertFalse( mw.messages.exists( 'T31107' ), 'Verify that the test message doesn\'t exist yet' );
mw.loader.implement( 'test.implement.msgs', [], {}, { T31107: 'loaded' } );
} );
} );
- QUnit.test( '.implement( empty )', 1, function ( assert ) {
+ QUnit.test( '.implement( empty )', function ( assert ) {
mw.loader.implement( 'test.empty' );
assert.strictEqual( mw.loader.getState( 'test.empty' ), 'ready' );
} );
- QUnit.test( 'Broken indirect dependency', 4, function ( assert ) {
+ QUnit.test( 'Broken indirect dependency', function ( assert ) {
// don't emit an error event
this.sandbox.stub( mw, 'track' );
assert.strictEqual( mw.track.callCount, 1 );
} );
- QUnit.test( 'Out-of-order implementation', 9, function ( assert ) {
+ QUnit.test( 'Out-of-order implementation', function ( assert ) {
mw.loader.register( [
[ 'test.module4', '0' ],
[ 'test.module5', '0', [ 'test.module4' ] ],
assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
} );
- QUnit.test( 'Missing dependency', 13, function ( assert ) {
+ QUnit.test( 'Missing dependency', function ( assert ) {
mw.loader.register( [
[ 'test.module7', '0' ],
[ 'test.module8', '0', [ 'test.module7' ] ],
);
} );
- QUnit.test( 'Dependency handling', 5, function ( assert ) {
+ QUnit.test( 'Dependency handling', function ( assert ) {
var done = assert.async();
mw.loader.register( [
// [module, version, dependencies, group, source]
);
} );
- QUnit.test( 'Skip-function handling', 5, function ( assert ) {
+ QUnit.test( 'Skip-function handling', function ( assert ) {
mw.loader.register( [
// [module, version, dependencies, group, source, skip]
[ 'testSkipped', '1', [], null, 'testloader', 'return true;' ],
);
} );
- QUnit.asyncTest( '.load( "//protocol-relative" ) - T32825', 2, function ( assert ) {
+ QUnit.asyncTest( '.load( "//protocol-relative" ) - T32825', function ( assert ) {
// This bug was actually already fixed in 1.18 and later when discovered in 1.17.
// Test is for regressions!
mw.loader.load( target );
} );
- QUnit.asyncTest( '.load( "/absolute-path" )', 2, function ( assert ) {
+ QUnit.asyncTest( '.load( "/absolute-path" )', function ( assert ) {
// Forge a URL to the test callback script
var target = QUnit.fixurl(
mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
} );
} );
- QUnit.test( 'Executing race - T112232', 2, function ( assert ) {
+ QUnit.test( 'Executing race - T112232', function ( assert ) {
var done = false;
// The red herring schedules its CSS buffer first. In T112232, a bug in the
} );
} );
- QUnit.test( 'require()', 6, function ( assert ) {
+ QUnit.test( 'require()', function ( assert ) {
mw.loader.register( [
[ 'test.require1', '0' ],
[ 'test.require2', '0' ],
}
} ) );
- QUnit.test( 'register', 2, function ( assert ) {
+ QUnit.test( 'register', function ( assert ) {
var testMessagePosterConstructor = function () {};
mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
}
} );
- QUnit.test( 'render', 2, function ( assert ) {
+ QUnit.test( 'render', function ( assert ) {
var html, htmlPartial, data, partials,
template = mw.template.get( 'stub', 'test_greeting.mustache' ),
partial = mw.template.get( 'stub', 'test_greeting_suffix.mustache' );
}
} );
- QUnit.test( 'add', 1, function ( assert ) {
+ QUnit.test( 'add', function ( assert ) {
assert.throws(
function () {
mw.template.add( 'module', 'test_templates_foo', 'hello' );
);
} );
- QUnit.test( 'compile', 1, function ( assert ) {
+ QUnit.test( 'compile', function ( assert ) {
assert.throws(
function () {
mw.template.compile( '{{foo}}', 'rainbow' );
);
} );
- QUnit.test( 'get', 4, function ( assert ) {
+ QUnit.test( 'get', function ( assert ) {
assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.xyz' ), 'xyz compiler' );
assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.abc' ), 'abc default compiler' );
assert.throws(
}
} ) );
- QUnit.test( 'Initial check', 8, function ( assert ) {
+ QUnit.test( 'Initial check', function ( assert ) {
assert.ok( window.jQuery, 'jQuery defined' );
assert.ok( window.$, '$ defined' );
assert.strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
this.restoreWarnings();
} );
- QUnit.test( 'mw.format', 2, function ( assert ) {
+ QUnit.test( 'mw.format', function ( assert ) {
assert.equal(
mw.format( 'Format $1 $2', 'foo', 'bar' ),
'Format foo bar',
} );
- QUnit.test( 'mw.msg', 14, function ( assert ) {
+ QUnit.test( 'mw.msg', function ( assert ) {
assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
assert.equal( mw.msg( 'goodbye' ), '⧼goodbye⧽', 'Gets message with default options (nonexistent message)' );
assert.equal( mw.msg( 'int-msg' ), 'Some Other Message', 'int is resolved' );
} );
- QUnit.test( 'mw.hook', 13, function ( assert ) {
+ QUnit.test( 'mw.hook', function ( assert ) {
var hook, add, fire, chars, callback;
mw.hook( 'test.hook.unfired' ).add( function () {
}
} ) );
- QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
+ QUnit.asyncTest( 'toggleToc', function ( assert ) {
var tocHtml, $toggleLink, $tocList;
assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
( function ( mw ) {
QUnit.module( 'mediawiki.track' );
- QUnit.test( 'track', 1, function ( assert ) {
+ QUnit.test( 'track', function ( assert ) {
var sequence = [];
mw.trackSubscribe( 'simple', function ( topic, data ) {
sequence.push( [ topic, data ] );
], 'Events after subscribing' );
} );
- QUnit.test( 'trackSubscribe', 4, function ( assert ) {
+ QUnit.test( 'trackSubscribe', function ( assert ) {
var now,
sequence = [];
mw.track( 'before', { key: 1 } );
} );
} );
- QUnit.test( 'trackUnsubscribe', 1, function ( assert ) {
+ QUnit.test( 'trackUnsubscribe', function ( assert ) {
var sequence = [];
function unsubber( topic, data ) {
sequence.push( [ topic, data ] );
}
} ) );
- QUnit.test( 'rawurlencode', 1, function ( assert ) {
+ QUnit.test( 'rawurlencode', function ( assert ) {
assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
} );
- QUnit.test( 'escapeId', 17, function ( assert ) {
+ QUnit.test( 'escapeId', function ( assert ) {
mw.config.set( 'wgExperimentalHtmlIds', false );
$.each( {
'+': '.2B',
} );
} );
- QUnit.test( 'wikiUrlencode', 11, function ( assert ) {
+ QUnit.test( 'wikiUrlencode', function ( assert ) {
assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
// See also wfUrlencodeTest.php#provideURLS
$.each( {
} );
} );
- QUnit.test( 'getUrl', 14, function ( assert ) {
+ QUnit.test( 'getUrl', function ( assert ) {
var href;
mw.config.set( {
wgScript: '/w/index.php',
assert.equal( href, '/w/index.php?action=edit#.2B.26.3D:.3B.40.24-_..21.2A.2F.5B.5D.3C.3E.27.C2.A7', 'fragment with various characters' );
} );
- QUnit.test( 'wikiScript', 4, function ( assert ) {
+ QUnit.test( 'wikiScript', function ( assert ) {
mw.config.set( {
// customized wgScript for T41103
wgScript: '/w/i.php',
assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
} );
- QUnit.test( 'addCSS', 3, function ( assert ) {
+ QUnit.test( 'addCSS', function ( assert ) {
var $el, style;
$el = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
$( style.ownerNode ).remove();
} );
- QUnit.test( 'getParamValue', 5, function ( assert ) {
+ QUnit.test( 'getParamValue', function ( assert ) {
var url;
url = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'T32441: getParamValue must understand "+" encoding of space (multiple spaces)' );
} );
- QUnit.test( '$content', 2, function ( assert ) {
+ QUnit.test( '$content', function ( assert ) {
assert.ok( mw.util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
assert.strictEqual( mw.util.$content.length, 1, 'mw.util.$content must have length of 1' );
} );
* Previously, test elements where invisible to the selector since only
* one element can have a given id.
*/
- QUnit.test( 'addPortletLink', 13, function ( assert ) {
+ QUnit.test( 'addPortletLink', function ( assert ) {
var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
} );
- QUnit.test( 'validateEmail', 6, function ( assert ) {
+ QUnit.test( 'validateEmail', function ( assert ) {
assert.strictEqual( mw.util.validateEmail( '' ), null, 'Should return null for empty string ' );
assert.strictEqual( mw.util.validateEmail( 'user@localhost' ), true, 'Return true for a valid e-mail address' );
assert.strictEqual( mw.util.validateEmail( 'userfoo@ex-ample.org' ), true, 'Emails may contain a hyphen' );
} );
- QUnit.test( 'isIPv6Address', 40, function ( assert ) {
+ QUnit.test( 'isIPv6Address', function ( assert ) {
$.each( IPV6_CASES, function ( i, ipCase ) {
assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
} );
} );
- QUnit.test( 'isIPv4Address', 11, function ( assert ) {
+ QUnit.test( 'isIPv4Address', function ( assert ) {
$.each( IPV4_CASES, function ( i, ipCase ) {
assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
} );
} );
- QUnit.test( 'isIPAddress', 51, function ( assert ) {
+ QUnit.test( 'isIPAddress', function ( assert ) {
$.each( IPV4_CASES, function ( i, ipCase ) {
assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
} );
}
} ) );
- QUnit.test( 'isElementInViewport', 6, function ( assert ) {
+ QUnit.test( 'isElementInViewport', function ( assert ) {
var viewport = $.extend( {}, DEFAULT_VIEWPORT );
assert.ok( mw.viewport.isElementInViewport( this.el, viewport ),
'It should return true when the element is fully enclosed in the viewport' );
'It should default to the window object if no viewport is given' );
} );
- QUnit.test( 'isElementInViewport with scrolled page', 1, function ( assert ) {
+ QUnit.test( 'isElementInViewport with scrolled page', function ( assert ) {
var viewport = {
top: 2000,
left: 0,
window.scrollTo( 0, 0 );
} );
- QUnit.test( 'isElementCloseToViewport', 3, function ( assert ) {
+ QUnit.test( 'isElementCloseToViewport', function ( assert ) {
var
viewport = {
top: 90,
QUnit.module( 'startup', QUnit.newMwEnvironment() );
- QUnit.test( 'isCompatible( featureTestable )', testcases.tested.length, function ( assert ) {
+ QUnit.test( 'isCompatible( featureTestable )', function ( assert ) {
$.each( testcases.tested, function ( i, ua ) {
assert.strictEqual( isCompatible( ua ), true, ua );
}
);
} );
- QUnit.test( 'isCompatible( blacklisted )', testcases.blacklisted.length, function ( assert ) {
+ QUnit.test( 'isCompatible( blacklisted )', function ( assert ) {
$.each( testcases.blacklisted, function ( i, ua ) {
assert.strictEqual( isCompatible( ua ), false, ua );
}