diff options
author | 2020-10-02 14:49:18 -0400 | |
---|---|---|
committer | 2020-10-02 14:49:18 -0400 | |
commit | d31271608550a4b9e7e5b616d8d5eeb83b892e53 (patch) | |
tree | b06377cdc3748c3c1ac6d25eaa375824a1f7468b | |
parent | Update CheckUser to 1.35 (diff) | |
download | extensions-d31271608550a4b9e7e5b616d8d5eeb83b892e53.tar.gz extensions-d31271608550a4b9e7e5b616d8d5eeb83b892e53.tar.bz2 extensions-d31271608550a4b9e7e5b616d8d5eeb83b892e53.zip |
Update CommentStreams to 1.35
Signed-off-by: Brian Evans <grknight@gentoo.org>
80 files changed, 2913 insertions, 271 deletions
diff --git a/CommentStreams/.gitignore b/CommentStreams/.gitignore index 994b50f7..8ec4b929 100644 --- a/CommentStreams/.gitignore +++ b/CommentStreams/.gitignore @@ -1,4 +1,3 @@ node_modules/ vendor/ composer.lock -package-lock.json diff --git a/CommentStreams/.phpcs.xml b/CommentStreams/.phpcs.xml index 3839d784..1b870b71 100644 --- a/CommentStreams/.phpcs.xml +++ b/CommentStreams/.phpcs.xml @@ -1,6 +1,9 @@ <?xml version="1.0"?> <ruleset> - <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki" /> + <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki"> + <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate" /> + <exclude name="PSR12.Properties.ConstantVisibility.NotFound" /> + </rule> <file>.</file> <arg name="extensions" value="php,php5,inc" /> <arg name="encoding" value="UTF-8" /> diff --git a/CommentStreams/CODE_OF_CONDUCT.md b/CommentStreams/CODE_OF_CONDUCT.md index d8e5d087..498acf76 100644 --- a/CommentStreams/CODE_OF_CONDUCT.md +++ b/CommentStreams/CODE_OF_CONDUCT.md @@ -1 +1 @@ -The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct). +The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct). diff --git a/CommentStreams/Gruntfile.js b/CommentStreams/Gruntfile.js index a45071e1..9a4c9a39 100644 --- a/CommentStreams/Gruntfile.js +++ b/CommentStreams/Gruntfile.js @@ -1,12 +1,19 @@ /*jshint node:true */ module.exports = function ( grunt ) { + var conf = grunt.file.readJSON( 'extension.json' ); + grunt.loadNpmTasks( 'grunt-jsonlint' ); grunt.loadNpmTasks( 'grunt-banana-checker' ); grunt.initConfig( { - banana: { - all: 'i18n/' - }, + banana: Object.assign( + conf.MessagesDirs, + { + options: { + requireLowerCase: 'initial' + } + } + ), jsonlint: { all: [ '**/*.json', diff --git a/CommentStreams/composer.json b/CommentStreams/composer.json index 104cbaef..ace3ac5e 100644 --- a/CommentStreams/composer.json +++ b/CommentStreams/composer.json @@ -2,10 +2,10 @@ "name": "mediawiki/comment-streams", "type": "mediawiki-extension", "require-dev": { - "jakub-onderka/php-parallel-lint": "1.0.0", - "jakub-onderka/php-console-highlighter": "0.3.2", - "mediawiki/mediawiki-codesniffer": "20.0.0", - "mediawiki/minus-x": "0.3.1" + "mediawiki/mediawiki-codesniffer": "31.0.0", + "mediawiki/minus-x": "1.1.0", + "php-parallel-lint/php-console-highlighter": "0.5.0", + "php-parallel-lint/php-parallel-lint": "1.2.0" }, "scripts": { "test": [ @@ -14,8 +14,8 @@ "minus-x check ." ], "fix": [ - "phpcbf", - "minus-x fix ." + "minus-x fix .", + "phpcbf" ] } } diff --git a/CommentStreams/extension.json b/CommentStreams/extension.json index 75048583..aae4b282 100644 --- a/CommentStreams/extension.json +++ b/CommentStreams/extension.json @@ -1,6 +1,6 @@ { "name": "CommentStreams", - "version": "4.5", + "version": "4.7", "author": [ "[https://www.mediawiki.org/wiki/User:Jji Jason Ji]", "[https://www.mediawiki.org/wiki/User:Cindy.cicalese Cindy Cicalese]" @@ -9,8 +9,12 @@ "descriptionmsg": "commentstreams-desc", "manifest_version": 1, "type": "parserhook", + "license-name": "MIT", + "requires": { + "MediaWiki": ">= 1.31.0" + }, "SpecialPages": { - "CommentStreamsAllComments": "CommentStreamsAllComments" + "CommentStreamsAllComments": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsAllComments" }, "MessagesDirs": { "CommentStreams": [ @@ -112,45 +116,33 @@ "localBasePath": "resources", "remoteExtPath": "CommentStreams/resources" }, - "AutoloadClasses": { - "CommentStreamsHooks": "includes/CommentStreamsHooks.php", - "CommentStreamsUtils": "includes/CommentStreamsUtils.php", - "CommentStreams": "includes/CommentStreams.php", - "Comment": "includes/Comment.php", - "ApiCSBase": "includes/ApiCSBase.php", - "ApiCSPostComment": "includes/ApiCSPostComment.php", - "ApiCSQueryComment": "includes/ApiCSQueryComment.php", - "ApiCSEditComment": "includes/ApiCSEditComment.php", - "ApiCSDeleteComment": "includes/ApiCSDeleteComment.php", - "ApiCSVote": "includes/ApiCSVote.php", - "ApiCSWatch": "includes/ApiCSWatch.php", - "ApiCSUnwatch": "includes/ApiCSUnwatch.php", - "EchoCSPresentationModel": "includes/EchoCSPresentationModel.php", - "CommentStreamsAllComments": "includes/CommentStreamsAllComments.php" + "AutoloadNamespaces": { + "MediaWiki\\Extension\\CommentStreams\\": "includes/" }, "APIModules": { - "csPostComment": "ApiCSPostComment", - "csQueryComment": "ApiCSQueryComment", - "csEditComment": "ApiCSEditComment", - "csDeleteComment": "ApiCSDeleteComment", - "csVote": "ApiCSVote", - "csWatch": "ApiCSWatch", - "csUnwatch": "ApiCSUnwatch" + "csPostComment": "MediaWiki\\Extension\\CommentStreams\\ApiCSPostComment", + "csQueryComment": "MediaWiki\\Extension\\CommentStreams\\ApiCSQueryComment", + "csEditComment": "MediaWiki\\Extension\\CommentStreams\\ApiCSEditComment", + "csDeleteComment": "MediaWiki\\Extension\\CommentStreams\\ApiCSDeleteComment", + "csVote": "MediaWiki\\Extension\\CommentStreams\\ApiCSVote", + "csWatch": "MediaWiki\\Extension\\CommentStreams\\ApiCSWatch", + "csUnwatch": "MediaWiki\\Extension\\CommentStreams\\ApiCSUnwatch" }, "Hooks": { - "LoadExtensionSchemaUpdates": "CommentStreamsHooks::addCommentTableToDatabase", - "CanonicalNamespaces": "CommentStreamsHooks::addCommentStreamsNamespaces", - "MediaWikiPerformAction": "CommentStreamsHooks::onMediaWikiPerformAction", - "MovePageIsValidMove": "CommentStreamsHooks::onMovePageIsValidMove", - "userCan": "CommentStreamsHooks::userCan", - "ParserFirstCallInit": "CommentStreamsHooks::onParserSetup", - "BeforePageDisplay": "CommentStreamsHooks::addCommentsAndInitializeJS", - "ShowSearchHitTitle": "CommentStreamsHooks::showSearchHitTitle", - "smwInitProperties": "CommentStreamsHooks::initProperties", - "SMWStore::updateDataBefore": "CommentStreamsHooks::updateData", - "BeforeCreateEchoEvent": "CommentStreamsHooks::onBeforeCreateEchoEvent" + "LoadExtensionSchemaUpdates": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::addCommentTableToDatabase", + "CanonicalNamespaces": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::addCommentStreamsNamespaces", + "MediaWikiPerformAction": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::onMediaWikiPerformAction", + "MovePageIsValidMove": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::onMovePageIsValidMove", + "userCan": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::userCan", + "ParserFirstCallInit": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::onParserSetup", + "BeforePageDisplay": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::addCommentsAndInitializeJS", + "ShowSearchHitTitle": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::showSearchHitTitle", + "smwInitProperties": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::initProperties", + "SMWStore::updateDataBefore": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::updateData", + "BeforeCreateEchoEvent": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::onBeforeCreateEchoEvent", + "SMW::Settings::BeforeInitializationComplete": "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::onSMWInitialization" }, - "callback" : "CommentStreamsHooks::onRegistration", + "callback" : "MediaWiki\\Extension\\CommentStreams\\CommentStreamsHooks::onRegistration", "config": { "CommentStreamsNamespaceIndex": 844, "CommentStreamsAllowedNamespaces" : null, diff --git a/CommentStreams/i18n/ar.json b/CommentStreams/i18n/ar.json index 64585be3..bda729dd 100644 --- a/CommentStreams/i18n/ar.json +++ b/CommentStreams/i18n/ar.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "محمد أحمد عبد الفتاح", - "ديفيد" + "ديفيد", + "محمد أحمد عبد الفتاح" ] }, "commentstreams-desc": "يسمح بالتعليق على صفحات الويكي", @@ -154,5 +154,6 @@ "commentstreams-allcomments-label-lasteditor": "آخر محرر", "commentstreams-allcomments-label-lastedited": "آخر تعديل", "commentstreams-allcomments-button-next": "التالي", - "commentstreams-allcomments-button-previous": "السابق" + "commentstreams-allcomments-button-previous": "السابق", + "commentstreams-ve-conversion-error": "خطأ في التحويل بين نص الويكي وHTML للمحرر المرئي" } diff --git a/CommentStreams/i18n/bg.json b/CommentStreams/i18n/bg.json new file mode 100644 index 00000000..535d249b --- /dev/null +++ b/CommentStreams/i18n/bg.json @@ -0,0 +1,18 @@ +{ + "@metadata": { + "authors": [ + "StanProg", + "Ted Masters", + "Vlad5250" + ] + }, + "commentstreams-desc": "Позволява коментиране в уики страници", + "commentstreams-error-prohibitedaction": "Действието $1 не е разрешено на страници за коментари.", + "commentstreams-error-comment-on-deleted-page": "Страницата, към която е бил свързан коментарът, е изтрита.", + "commentstreams-author-anonymous": "анонимен", + "apihelp-csQueryComment-description": "Връщане на заглавието, потребителя, времето и датата и уики текста на коментара. Трябва да се посочи идентификация на страницата или заглавие.", + "apihelp-csQueryComment-summary": "Връщане на заглавието, потребителя, времето и датата, и уики текста на коментара. Трябва да се посочи идентификационен номер на страницата или заглавие.", + "commentstreams-buttontooltip-delete": "изтриване", + "commentstreams-buttontooltip-cancel": "Отказ", + "commentstreams-dialog-buttontext-cancel": "Отказ" +} diff --git a/CommentStreams/i18n/ce.json b/CommentStreams/i18n/ce.json index cb1440d6..a63087f8 100644 --- a/CommentStreams/i18n/ce.json +++ b/CommentStreams/i18n/ce.json @@ -5,5 +5,7 @@ ] }, "commentstreams-buttontext-add": "ТӀетоха коммент", - "commentstreams-buttontext-reply": "Жоп ло" + "commentstreams-buttontext-reply": "Жоп ло", + "commentstreams-buttontooltip-cancel": "юхаяккхар", + "commentstreams-allcomments-button-previous": "Хьалхара" } diff --git a/CommentStreams/i18n/cs.json b/CommentStreams/i18n/cs.json index e9938729..d54180a6 100644 --- a/CommentStreams/i18n/cs.json +++ b/CommentStreams/i18n/cs.json @@ -1,10 +1,12 @@ { "@metadata": { "authors": [ + "Dvorapa", "Ilimanaq29", - "Dvorapa" + "Patriccck" ] }, "commentstreams-buttontext-add": "Přidat komentář", - "commentstreams-buttontext-reply": "Odpovědět" + "commentstreams-buttontext-reply": "Odpovědět", + "commentstreams-ve-conversion-error": "Chyba při převodu mezi Wikitextem a HTML pro Vizuální editor" } diff --git a/CommentStreams/i18n/da.json b/CommentStreams/i18n/da.json new file mode 100644 index 00000000..eb939354 --- /dev/null +++ b/CommentStreams/i18n/da.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Saederup92" + ] + }, + "commentstreams-author-anonymous": "anonym", + "commentstreams-buttontext-add": "Tilføj kommentar", + "commentstreams-buttontext-reply": "Svar", + "commentstreams-buttontooltip-add": "tilføj kommentar", + "commentstreams-buttontooltip-reply": "svar", + "commentstreams-buttontooltip-edit": "rediger", + "commentstreams-buttontooltip-delete": "slet", + "commentstreams-dialog-buttontext-yes": "Ja", + "commentstreams-dialog-buttontext-no": "Nej", + "commentstreams-title-field-placeholder": "Indtast titel...", + "commentstreamsallcomments": "Alle kommentarer", + "commentstreams-allcomments-label-commenttitle": "Kommentartitel", + "commentstreams-allcomments-label-wikitext": "Kommentar", + "commentstreams-allcomments-label-author": "Forfatter", + "commentstreams-allcomments-label-created": "Oprettet", + "commentstreams-allcomments-label-lastedited": "Sidst redigeret", + "commentstreams-allcomments-button-next": "Næste", + "commentstreams-allcomments-button-previous": "Forrige" +} diff --git a/CommentStreams/i18n/de.json b/CommentStreams/i18n/de.json index 76f9c32d..8a506d84 100644 --- a/CommentStreams/i18n/de.json +++ b/CommentStreams/i18n/de.json @@ -9,10 +9,46 @@ "commentstreams-error-prohibitedaction": "Die Aktion $1 ist auf Kommentarseiten nicht erlaubt.", "commentstreams-error-comment-on-deleted-page": "Die Seite, die mit diesem Kommentar verbunden ist, wurde gelöscht.", "commentstreams-author-anonymous": "Anonym", + "apihelp-csQueryComment-param-pageid": "Kennung der Seite, die den abzurufenden Kommentar enthält.", + "apihelp-csQueryComment-param-title": "Titel der Seite, die den abzurufenden Kommentar enthält.", + "apihelp-csQueryComment-pageid-example": "Ruft den Kommentar mit der Seitenkennung 3 in Wikitext ab", + "apihelp-csQueryComment-title-example": "Ruft den Kommentar mit dem Seitentitel CommentStreams:3 in Wikitext ab", + "apihelp-csDeleteComment-description": "Löscht einen Kommentar. Entweder muss pageid oder title angegeben werden.", + "apihelp-csDeleteComment-summary": "Löscht einen Kommentar. Es muss entweder pageid oder title angegeben werden.", + "apihelp-csDeleteComment-param-pageid": "Kennung der Seite, die den zu löschenden Kommentar enthält.", + "apihelp-csDeleteComment-param-title": "Titel der Seite, die den zu löschenden Kommentar enthält.", + "apihelp-csDeleteComment-pageid-example": "Löscht den Kommentar mit der Seitenkennung 3", + "apihelp-csDeleteComment-title-example": "Löscht den Kommentar mit dem Seitentitel CommentStreams:3", "apihelp-csPostComment-description": "Speichert einen neuen Kommentar.", "apihelp-csPostComment-summary": "Speichert einen neuen Kommentar.", "apihelp-csPostComment-param-commenttitle": "optionaler Titel für den Kommentar.", + "apihelp-csPostComment-param-wikitext": "Wikitext für den Kommentar.", + "apihelp-csPostComment-param-associatedid": "Seite, mit der dieser Kommentar verknüpft ist.", + "apihelp-csPostComment-param-parentid": "Seitenkennung des übergeordneten Kommentars, falls dies eine Antwort ist.", + "apihelp-csEditComment-description": "Bearbeitet einen vorhandenen Kommentar. Entweder pageid oder title muss angegeben werden.", + "apihelp-csEditComment-summary": "Bearbeitet einen vorhandenen Kommentar. Entweder muss pageid oder title angegeben werden.", + "apihelp-csEditComment-param-pageid": "Kennung der Seite, die den zu bearbeitenden Kommentar enthält.", + "apihelp-csEditComment-param-title": "Titel der Seite, die den zu bearbeitenden Kommentar enthält.", + "apihelp-csEditComment-param-commenttitle": "Optionaler Titel für den Kommentar.", "apihelp-csEditComment-param-wikitext": "Wikitext für den Kommentar.", + "apihelp-csVote-description": "Stimmt über einen Kommentar ab (Gefällt mir, Gefällt mir nicht oder neutral).", + "apihelp-csVote-summary": "Stimmt über einen Kommentar ab (Gefällt mir, Gefällt mir nicht oder neutral).", + "apihelp-csVote-param-title": "Titel der Seite, die den Kommentar enthält, über den abgestimmt werden soll.", + "apihelp-csVote-param-vote": "Stimmt ab (1, -1 oder 0).", + "apihelp-csVote-pageid-example": "Stimmt über den Kommentar mit der Seitenkennung 3 ab", + "apihelp-csVote-title-example": "Stimmt über den Kommentar mit dem Seitentitel CommentStreams:3 ab", + "apihelp-csWatch-description": "Beobachtet einen Kommentar, um benachrichtigt zu werden, wenn er Antworten erhält.", + "apihelp-csWatch-summary": "Beobachtet einen Kommentar, um benachrichtigt zu werden, wenn er Antworten erhält.", + "apihelp-csWatch-param-pageid": "Kennung der Seite, die den zu beobachtenden Kommentar enthält.", + "apihelp-csWatch-param-title": "Titel der Seite, die den zu beobachtenden Kommentar enthält.", + "apihelp-csWatch-pageid-example": "Beobachtet den Kommentar mit der Seitenkennung 3", + "apihelp-csWatch-title-example": "Beobachtet den Kommentar mit dem Seitentitel CommentStreams:3", + "apihelp-csUnwatch-description": "Beobachtet einen Kommentar nicht mehr, um nicht mehr benachrichtigt zu werden, wenn er Antworten erhält.", + "apihelp-csUnwatch-summary": "Beobachtet einen Kommentar nicht mehr, um nicht länger benachrichtigt zu werden, wenn er Antworten erhält.", + "apihelp-csUnwatch-param-pageid": "Kennung der Seite, die den nicht mehr zu beobachtenden Kommentar enthält.", + "apihelp-csUnwatch-param-title": "Titel der Seite, die den nicht mehr zu beobachtenden Kommentar enthält.", + "apihelp-csUnwatch-pageid-example": "Beobachtet den Kommentar mit der Seitenkennung 3 nicht mehr", + "apihelp-csUnwatch-title-example": "Beobachtet den Kommentar mit dem Seitentitel CommentStreams:3 nicht mehr", "commentstreams-api-error-notloggedin": "Du musst angemeldet sein.", "commentstreams-api-error-commentnotfound": "Der angeforderte Kommentar wurde nicht gefunden.", "commentstreams-api-error-notacomment": "Die angegebene Seitenkennung bezieht sich nicht auf einen gültigen Kommentar.", @@ -115,5 +151,6 @@ "commentstreams-allcomments-label-lasteditor": "Letzter Bearbeiter", "commentstreams-allcomments-label-lastedited": "Zuletzt bearbeitet", "commentstreams-allcomments-button-next": "Nächster", - "commentstreams-allcomments-button-previous": "Vorheriger" + "commentstreams-allcomments-button-previous": "Vorheriger", + "commentstreams-ve-conversion-error": "Fehler beim Konvertieren zwischen Wikitext und HTML für den visuellen Editor" } diff --git a/CommentStreams/i18n/diq.json b/CommentStreams/i18n/diq.json new file mode 100644 index 00000000..c0e44a4a --- /dev/null +++ b/CommentStreams/i18n/diq.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Mirzali", + "Orbot707" + ] + }, + "commentstreams-buttontooltip-edit": "bıvurne", + "commentstreams-buttontooltip-delete": "bestere", + "commentstreams-buttontooltip-collapse": "teng ke", + "commentstreams-buttontooltip-expand": "hera kerê", + "commentstreams-buttontooltip-cancel": "bıtexelne", + "commentstreams-dialog-buttontext-cancel": "Bıtexelne", + "commentstreams-dialog-buttontext-yes": "Eya", + "commentstreams-dialog-buttontext-no": "Nê", + "commentstreams-allcomments-button-previous": "Verên" +} diff --git a/CommentStreams/i18n/eo.json b/CommentStreams/i18n/eo.json new file mode 100644 index 00000000..6c6907ba --- /dev/null +++ b/CommentStreams/i18n/eo.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Robin van der Vliet", + "YvesNevelsteen" + ] + }, + "commentstreams-buttontooltip-cancel": "nuligi", + "commentstreams-dialog-buttontext-cancel": "Nuligi", + "commentstreams-allcomments-button-next": "Sekva" +} diff --git a/CommentStreams/i18n/es.json b/CommentStreams/i18n/es.json index fa7a2076..cdf44c78 100644 --- a/CommentStreams/i18n/es.json +++ b/CommentStreams/i18n/es.json @@ -19,6 +19,7 @@ "commentstreams-api-error-post": "Error al añadir el comentario.", "commentstreams-api-error-edit-notloggedin": "Debes acceder a tu cuenta para editar.", "commentstreams-api-error-edit": "Error al editar el comentario.", + "commentstreams-api-error-delete": "Error al eliminar el comentario.", "commentstreams-api-error-vote-notloggedin": "Debes acceder a tu cuenta para votar.", "commentstreams-api-error-vote-novoteonreply": "No se permite emitir votos para las respuestas.", "commentstreams-api-error-vote": "Error al emitir el voto para el comentario.", diff --git a/CommentStreams/i18n/fi.json b/CommentStreams/i18n/fi.json index d1e7126b..b6e63bb2 100644 --- a/CommentStreams/i18n/fi.json +++ b/CommentStreams/i18n/fi.json @@ -1,10 +1,15 @@ { "@metadata": { "authors": [ - "Nike" + "Nike", + "Silvonen", + "Yupik" ] }, "commentstreams-buttontooltip-add": "lisää kommentti", + "commentstreams-buttontooltip-permalink": "ikilinkki", "logentry-commentstreams-comment-create": "$1 {{GENDER:$2|loi}} kommentin $3", - "commentstreams-allcomments-label-lastedited": "Viimeksi muokattu" + "commentstreams-allcomments-label-lastedited": "Viimeksi muokattu", + "commentstreams-allcomments-button-next": "Seuraava", + "commentstreams-allcomments-button-previous": "Edellinen" } diff --git a/CommentStreams/i18n/fr.json b/CommentStreams/i18n/fr.json index ff39bdff..040383ca 100644 --- a/CommentStreams/i18n/fr.json +++ b/CommentStreams/i18n/fr.json @@ -2,6 +2,7 @@ "@metadata": { "authors": [ "Gomoko", + "Thibaut120094", "Wladek92" ] }, @@ -97,7 +98,7 @@ "commentstreams-buttontooltip-unwatch": "ne plus surveiller", "commentstreams-buttontooltip-submit": "soumettre", "commentstreams-buttontooltip-cancel": "annuler", - "commentstreams-dialog-delete-message": "Êtes-vous sûr de vouloir supprimer ce commentaire ?", + "commentstreams-dialog-delete-message": "Êtes-vous sûr de vouloir supprimer ce commentaire ?", "commentstreams-dialog-anonymous-message": "Vous n’êtes pas connecté. Si vous poursuivez l’enregistrement de ce commentaire, votre adresse IP sera enregistrée, et vous ne pourrez plus modifier ou supprimer ce commentaire.", "commentstreams-dialog-buttontext-ok": "OK", "commentstreams-dialog-buttontext-cancel": "Annuler", @@ -154,5 +155,6 @@ "commentstreams-allcomments-label-lasteditor": "Dernier contributeur", "commentstreams-allcomments-label-lastedited": "Dernière modification", "commentstreams-allcomments-button-next": "Suivant", - "commentstreams-allcomments-button-previous": "Précédent" + "commentstreams-allcomments-button-previous": "Précédent", + "commentstreams-ve-conversion-error": "Erreur de conversion entre wikitexte et HTML pour VisualEditor" } diff --git a/CommentStreams/i18n/fy.json b/CommentStreams/i18n/fy.json new file mode 100644 index 00000000..a06e46fd --- /dev/null +++ b/CommentStreams/i18n/fy.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "PiefPafPier" + ] + }, + "echo-category-title-commentstreams-notification-category": "Nij kommentaar en antwurd" +} diff --git a/CommentStreams/i18n/gl.json b/CommentStreams/i18n/gl.json index b2d1ea85..19fd3d54 100644 --- a/CommentStreams/i18n/gl.json +++ b/CommentStreams/i18n/gl.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "Elisardojm", - "Athena in Wonderland" + "Athena in Wonderland", + "Elisardojm" ] }, "commentstreams-desc": "Permite deixar comentarios nas páxinas da wiki", diff --git a/CommentStreams/i18n/hak.json b/CommentStreams/i18n/hak.json new file mode 100644 index 00000000..17a2b428 --- /dev/null +++ b/CommentStreams/i18n/hak.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "唐吉訶德的侍從" + ] + }, + "commentstreams-buttontooltip-collapse": "chap-thia̍p", + "commentstreams-buttontooltip-expand": "chán-khôi" +} diff --git a/CommentStreams/i18n/he.json b/CommentStreams/i18n/he.json index 8e4c2263..d1e8a779 100644 --- a/CommentStreams/i18n/he.json +++ b/CommentStreams/i18n/he.json @@ -1,12 +1,13 @@ { "@metadata": { "authors": [ + "Amire80", "Guycn2" ] }, "commentstreams-desc": "מתן אפשרות להגיב על דפי ויקי", "commentstreams-error-prohibitedaction": "הפעולה $1 אינה מותרת בדפי תגובות.", - "commentstreams-error-comment-on-deleted-page": "הדף שאליו התגובה הזו משויכת נמחק.", + "commentstreams-error-comment-on-deleted-page": "הדף שהתגובה הזאת משויכת אליו נמחק.", "commentstreams-author-anonymous": "אנונימי", "apihelp-csQueryComment-description": "החזרת הכותרת, המשתמש, מועד היצירה וטקסט הוויקי של תגובה. יש לציין את מזהה הדף או את כותרתו.", "apihelp-csQueryComment-summary": "החזרת הכותרת, המשתמש, מועד היצירה וטקסט הוויקי של תגובה. יש לציין את מזהה הדף או את כותרתו.", @@ -97,12 +98,12 @@ "commentstreams-buttontooltip-submit": "שליחה", "commentstreams-buttontooltip-cancel": "ביטול", "commentstreams-dialog-delete-message": "האם ברצונך למחוק תגובה זו?", - "commentstreams-dialog-anonymous-message": "לא נכנסת לחשבון. שמירת התגובה תגרום לתיעוד כתובת ה־IP שלך, ולא יהיה באפשרותך לערוך או למחוק את התגובה הזו.", + "commentstreams-dialog-anonymous-message": "לא נכנסת לחשבון. שמירת התגובה תגרום לתיעוד כתובת ה־IP שלך, ולא יהיה באפשרותך לערוך או למחוק את התגובה הזאת.", "commentstreams-dialog-buttontext-ok": "אישור", "commentstreams-dialog-buttontext-cancel": "ביטול", "commentstreams-dialog-buttontext-yes": "כן", "commentstreams-dialog-buttontext-no": "לא", - "commentstreams-urldialog-instructions": "יש להעתיק ולהדביק את כתובת ה־URL שלהלן כדי לשתף קישור קבוע לתגובה זו. ניתן להקיש על Esc כדי לסגור את תיבת הדו־שיח הזו.", + "commentstreams-urldialog-instructions": "יש להעתיק ולהדביק את כתובת ה־URL שלהלן כדי לשתף קישור קבוע לתגובה הזאת. ניתן להקיש על Esc כדי לסגור את תיבת הדו־שיח הזאת.", "commentstreams-datetext-postedon": "פורסמה בתאריך", "commentstreams-datetext-lasteditedon": "נערכה לאחרונה בתאריך", "commentstreams-datetext-moderated": "נוהלה", @@ -153,5 +154,6 @@ "commentstreams-allcomments-label-lasteditor": "העורך האחרון", "commentstreams-allcomments-label-lastedited": "תאריך העריכה האחרונה", "commentstreams-allcomments-button-next": "הבא", - "commentstreams-allcomments-button-previous": "הקודם" + "commentstreams-allcomments-button-previous": "הקודם", + "commentstreams-ve-conversion-error": "שגיאה בהמרת קוד ויקי ל־HTML בעורך החזותי" } diff --git a/CommentStreams/i18n/hi.json b/CommentStreams/i18n/hi.json index 7ab85135..fafb97c3 100644 --- a/CommentStreams/i18n/hi.json +++ b/CommentStreams/i18n/hi.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "Rishi.Singh", - "Bhatakati aatma" + "Bhatakati aatma", + "Rishi.Singh" ] }, "apihelp-csWatch-summary": "उत्तर प्राप्त होने पर अधिसूचित होने के लिए एक टिप्पणी देखें", diff --git a/CommentStreams/i18n/hu.json b/CommentStreams/i18n/hu.json index 8e21c9ca..9a3d1f47 100644 --- a/CommentStreams/i18n/hu.json +++ b/CommentStreams/i18n/hu.json @@ -1,8 +1,9 @@ { "@metadata": { "authors": [ - "Csega" + "Csega", + "R-Joe" ] }, - "commentstreams-buttontext-reply": "VÁLASZ" + "commentstreams-buttontext-reply": "Válasz" } diff --git a/CommentStreams/i18n/hy.json b/CommentStreams/i18n/hy.json index c3d09018..a92147e0 100644 --- a/CommentStreams/i18n/hy.json +++ b/CommentStreams/i18n/hy.json @@ -4,9 +4,11 @@ "Kareyac" ] }, + "commentstreams-author-anonymous": "անանուն", "commentstreams-buttontooltip-edit": "խմբագրել", "commentstreams-buttontooltip-delete": "ջնջել", "commentstreams-buttontooltip-permalink": "մշտական հղում", + "commentstreams-buttontooltip-collapse": "ծալել", "commentstreams-buttontooltip-expand": "բացել", "commentstreams-buttontooltip-watch": "հսկել", "commentstreams-buttontooltip-cancel": "չեղարկել", diff --git a/CommentStreams/i18n/hyw.json b/CommentStreams/i18n/hyw.json new file mode 100644 index 00000000..9b23dade --- /dev/null +++ b/CommentStreams/i18n/hyw.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Kareyac" + ] + }, + "commentstreams-buttontooltip-permalink": "մշտական յղում", + "commentstreams-dialog-buttontext-ok": "Լաւ", + "commentstreams-dialog-buttontext-yes": "Այո" +} diff --git a/CommentStreams/i18n/ia.json b/CommentStreams/i18n/ia.json index 1e8cff69..4516d104 100644 --- a/CommentStreams/i18n/ia.json +++ b/CommentStreams/i18n/ia.json @@ -4,6 +4,6 @@ "McDutchie" ] }, - "commentstreams-buttontext-add": "ADDER UN COMMENTO", - "commentstreams-buttontext-reply": "RESPONDER" + "commentstreams-buttontext-add": "Adder commento", + "commentstreams-buttontext-reply": "Responder" } diff --git a/CommentStreams/i18n/io.json b/CommentStreams/i18n/io.json new file mode 100644 index 00000000..d0aaaca1 --- /dev/null +++ b/CommentStreams/i18n/io.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Joao Xavier" + ] + }, + "commentstreams-buttontooltip-edit": "redaktar", + "commentstreams-buttontooltip-delete": "efacar", + "commentstreams-buttontooltip-cancel": "anular", + "commentstreams-dialog-buttontext-cancel": "Nuligar" +} diff --git a/CommentStreams/i18n/ja.json b/CommentStreams/i18n/ja.json index 2d0ce033..cd8e7e60 100644 --- a/CommentStreams/i18n/ja.json +++ b/CommentStreams/i18n/ja.json @@ -1,8 +1,9 @@ { "@metadata": { "authors": [ + "Hinaloe", "Otokoume", - "Hinaloe" + "Shirayuki" ] }, "commentstreams-desc": "ウィキページへのコメントを可能にする", @@ -47,7 +48,8 @@ "notification-body-commentstreams-comment-on-watched-page": "コメントはこちらから確認できます:\n\n\n$5", "notification-body-commentstreams-reply-on-watched-page": "返信はこちらから確認できます:\n\n\n$5", "notification-body-commentstreams-reply-to-watched-comment": "返信はこちらから確認できます:\n\n\n$5", - "right-cs-comment": "自身のコメントの投稿、編集、削除", + "right-cs-comment": "自身のコメントを投稿、編集、削除", + "action-cs-comment": "コメントの投稿、編集、削除", "right-cs-moderator-edit": "利用者によるコメントの編集", "action-cs-moderator-edit": "利用者によるコメントの編集", "right-cs-moderator-delete": "利用者によるコメントの削除", diff --git a/CommentStreams/i18n/jv.json b/CommentStreams/i18n/jv.json index 5381e499..b6c02a6f 100644 --- a/CommentStreams/i18n/jv.json +++ b/CommentStreams/i18n/jv.json @@ -1,7 +1,9 @@ { "@metadata": { "authors": [ - "NoiX180" + "Diki Ananta", + "NoiX180", + "Sumbukompor" ] }, "commentstreams-error-prohibitedaction": "Tumindak $1 ora diidinaké tumrap ing kaca tanggapan.", @@ -17,7 +19,7 @@ "commentstreams-title-field-placeholder": "Isi sesirah...", "echo-category-title-commentstreams-notification-category": "Ora ana tanggapan lan wangsulané", "action-cs-comment": "kirim, besut, utawa busak tanggapan", - "action-cs-moderator-edit": "besut tanggapané panganggo liyané", + "action-cs-moderator-edit": "besut tanggapané naraguna liyané", "logentry-commentstreams-comment-create": "$1 {{GENDER:$2|awèh}} tanggapan $3", "commentstreams-allcomments-nocommentsfound": "Ora ana tanggapan.", "commentstreams-allcomments-label-page": "Kaca Tanggapan", diff --git a/CommentStreams/i18n/kiu.json b/CommentStreams/i18n/kiu.json new file mode 100644 index 00000000..f65a16b3 --- /dev/null +++ b/CommentStreams/i18n/kiu.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Mirzali" + ] + }, + "commentstreams-buttontooltip-cancel": "bıtexelne", + "commentstreams-dialog-buttontext-cancel": "Bıtexelne", + "commentstreams-dialog-buttontext-yes": "Heya", + "commentstreams-dialog-buttontext-no": "Nê" +} diff --git a/CommentStreams/i18n/kjp.json b/CommentStreams/i18n/kjp.json new file mode 100644 index 00000000..1e07b2c1 --- /dev/null +++ b/CommentStreams/i18n/kjp.json @@ -0,0 +1,10 @@ +{ + "@metadata": { + "authors": [ + "Rul1902" + ] + }, + "commentstreams-buttontooltip-delete": "ထုဂ်ဆိင့်", + "commentstreams-buttontooltip-collapse": "မာအိင်း", + "commentstreams-buttontooltip-expand": "မာလာဲ" +} diff --git a/CommentStreams/i18n/ko.json b/CommentStreams/i18n/ko.json index 50ac4d46..60638140 100644 --- a/CommentStreams/i18n/ko.json +++ b/CommentStreams/i18n/ko.json @@ -66,6 +66,7 @@ "commentstreams-buttontooltip-submit": "제출", "commentstreams-buttontooltip-cancel": "취소", "commentstreams-dialog-delete-message": "이 댓글을 삭제하겠습니까?", + "commentstreams-dialog-anonymous-message": "로그인되어 있지 않습니다. 이 댓글의 저장을 계속하면 IP 주소가 기록되며 이 댓글을 편집하거나 삭제할 수 없게 됩니다.", "commentstreams-dialog-buttontext-ok": "확인", "commentstreams-dialog-buttontext-cancel": "취소", "commentstreams-dialog-buttontext-yes": "예", @@ -114,5 +115,6 @@ "commentstreams-allcomments-label-lasteditor": "마지막 편집자", "commentstreams-allcomments-label-lastedited": "최근 편집", "commentstreams-allcomments-button-next": "다음", - "commentstreams-allcomments-button-previous": "이전" + "commentstreams-allcomments-button-previous": "이전", + "commentstreams-ve-conversion-error": "시각편집기에서 위키텍스트와 HTML 간 변환에 오류가 있습니다" } diff --git a/CommentStreams/i18n/mk.json b/CommentStreams/i18n/mk.json index 2cd7a16c..a5e48c5c 100644 --- a/CommentStreams/i18n/mk.json +++ b/CommentStreams/i18n/mk.json @@ -13,6 +13,13 @@ "apihelp-csQueryComment-param-pageid": "назнака на страницата каде се наоѓа коментарот што се бара", "apihelp-csQueryComment-param-title": "наслов на страницата каде се наоѓа коментарот што се бара", "apihelp-csQueryComment-pageid-example": "побарај коментар со назнака на страницата 3 во викитекстот", + "apihelp-csQueryComment-title-example": "побарај коментар со наслов на страница CommentStreams:3 во викитекстот", + "apihelp-csDeleteComment-description": "Избришете коментар. Треба да се укаже назнака или наслов на страницата.", + "apihelp-csDeleteComment-summary": "Избришете коментар. Треба да се укаже назнака или наслов на страницата.", + "apihelp-csDeleteComment-param-pageid": "назнака на страницата каде се наоѓа коментарот што за бришење", + "apihelp-csDeleteComment-param-title": "наслов на страницата каде се наоѓа коментарот што за бришење", + "apihelp-csDeleteComment-pageid-example": "избриши коментар со назнака на страницата 3", + "apihelp-csDeleteComment-title-example": "избриши коментар до наслов на страница CommentStreams:3", "apihelp-csPostComment-description": "Ставете нов коментар.", "apihelp-csPostComment-summary": "Ставете нов коментар.", "apihelp-csPostComment-param-commenttitle": "незадолжителен наслов на коментарот.", diff --git a/CommentStreams/i18n/my.json b/CommentStreams/i18n/my.json new file mode 100644 index 00000000..3fdbc5b2 --- /dev/null +++ b/CommentStreams/i18n/my.json @@ -0,0 +1,36 @@ +{ + "@metadata": { + "authors": [ + "Dr Lotus Black" + ] + }, + "commentstreams-author-anonymous": "အမည်မသိ", + "commentstreams-buttontext-add": "မှတ်ချက် ပေါင်းထည့်ရန်", + "commentstreams-buttontext-reply": "အကြောင်းပြန်ရန်", + "commentstreams-buttontooltip-add": "မှတ်ချက် ပေါင်းထည့်ရန်", + "commentstreams-buttontooltip-reply": "အကြောင်းပြန်ရန်", + "commentstreams-buttontooltip-edit": "တည်းဖြတ်", + "commentstreams-buttontooltip-delete": "ဖျက်ပါ", + "commentstreams-buttontooltip-permalink": "ပုံသေလိပ်စာ", + "commentstreams-buttontooltip-watch": "စောင့်ကြည့်ရန်", + "commentstreams-buttontooltip-unwatch": "စောင့်မကြည့်ပါနှင့်", + "commentstreams-buttontooltip-submit": "ထည့်သွင်းရန်", + "commentstreams-buttontooltip-cancel": "မလုပ်တော့", + "commentstreams-dialog-delete-message": "ဤမှတ်ချက်အား ဖျက်ရန် သေချာပါသလား", + "commentstreams-dialog-buttontext-ok": "အိုကေ", + "commentstreams-dialog-buttontext-cancel": "မလုပ်တော့ပါ", + "commentstreams-dialog-buttontext-yes": "လုပ်မည်", + "commentstreams-dialog-buttontext-no": "မလုပ်ပါ", + "commentstreamsallcomments": "မှတ်ချက်များ အားလုံး", + "commentstreams-allcomments-nocommentsfound": "မှတ်ချက်များ မတွေ့ပါ", + "commentstreams-allcomments-label-page": "မှတ်ချက် စာမျက်နှာ", + "commentstreams-allcomments-label-associatedpage": "ဆက်နွယ်သော စာမျက်နှာ", + "commentstreams-allcomments-label-commenttitle": "မှတ်ချက် ခေါင်းစဉ်", + "commentstreams-allcomments-label-wikitext": "မှတ်ချက်", + "commentstreams-allcomments-label-author": "စာရေးသူ", + "commentstreams-allcomments-label-created": "ဖန်တီးခဲ့သည်", + "commentstreams-allcomments-label-lasteditor": "နောက်ဆုံး တည်းဖြတ်သူ", + "commentstreams-allcomments-label-lastedited": "နောက်ဆုံး တည်းဖြတ်ခဲ့", + "commentstreams-allcomments-button-next": "ရှေ့", + "commentstreams-allcomments-button-previous": "ယခင်" +} diff --git a/CommentStreams/i18n/nah.json b/CommentStreams/i18n/nah.json new file mode 100644 index 00000000..ad36d681 --- /dev/null +++ b/CommentStreams/i18n/nah.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Akapochtli" + ] + }, + "commentstreams-buttontooltip-cancel": "moxitiniz", + "commentstreams-dialog-buttontext-cancel": "Moxitiniz" +} diff --git a/CommentStreams/i18n/nb.json b/CommentStreams/i18n/nb.json index 35012417..3974279b 100644 --- a/CommentStreams/i18n/nb.json +++ b/CommentStreams/i18n/nb.json @@ -1,40 +1,73 @@ { "@metadata": { "authors": [ - "Jon Harald Søby", "Citadell", + "Jon Harald Søby", "Orf3us" ] }, "commentstreams-desc": "Muliggjør kommentarer på wikisider", "commentstreams-error-prohibitedaction": "Handlingen $1 er ikke tillatt på kommentarsider.", + "commentstreams-error-comment-on-deleted-page": "Siden kommentaren assosieres med har blitt slettet.", "commentstreams-author-anonymous": "anonym", + "apihelp-csQueryComment-description": "Returner tittelen, brukeren, opprettelsestidspunktet og wikiteksten til en kommentar. Enten pageid eller title må angis.", "apihelp-csQueryComment-summary": "Returnerer tittelen, brukeren, opprettelsestidsstempelet og wikiteksten til en kommentar. Enten pageid eller title må oppgis.", + "apihelp-csQueryComment-param-pageid": "Side-ID-en til siden som inneholder kommentaren det skal spørres mot", + "apihelp-csQueryComment-param-title": "Tittelen til siden som inneholder kommentaren det skal spørres mot", "apihelp-csQueryComment-pageid-example": "spørringskommentar med side-ID 3 i wikitekst", + "apihelp-csQueryComment-title-example": "Spør mot kommentar med sidetittelen CommentStreams:3 i wikitekst", + "apihelp-csDeleteComment-description": "Slett en kommentar. Enten pageid eller title må angis.", "apihelp-csDeleteComment-summary": "Slett en kommentar. Enten pageid eller title må oppgis.", + "apihelp-csDeleteComment-param-pageid": "Side-ID-en til siden som inneholder kommentaren som skal slettes", + "apihelp-csDeleteComment-param-title": "Tittelen til siden som inneholder kommentaren som skal slettes", "apihelp-csDeleteComment-pageid-example": "slett kommentar med side-ID 3", + "apihelp-csDeleteComment-title-example": "Slett kommentar med sidetittel CommentStreams:3", "apihelp-csPostComment-description": "Post en ny kommentar.", + "apihelp-csPostComment-summary": "Post en ny kommentar.", "apihelp-csPostComment-param-commenttitle": "valgfri tittel på kommentar.", + "apihelp-csPostComment-param-wikitext": "Wikitekst for kommentaren.", + "apihelp-csPostComment-param-associatedid": "Side kommentaren assosieres med.", + "apihelp-csPostComment-param-parentid": "Side-ID-en til den overordnede kommentaren hvis det finnes et svar.", "apihelp-csEditComment-description": "Redigere en eksisterende kommentar. Enten pageid eller title må oppgis.", "apihelp-csEditComment-summary": "Rediger en eksisterende kommentar. Enten pageid eller title må oppgis.", + "apihelp-csEditComment-param-pageid": "Side-ID-en til siden som inneholder kommentaren som skal redigeres", + "apihelp-csEditComment-param-title": "Tittelen til siden som inneholder kommentaren som skal redigeres", + "apihelp-csEditComment-param-commenttitle": "Valgfri tittel på kommentar.", "apihelp-csEditComment-param-wikitext": "wikitekst for kommentar.", "apihelp-csVote-description": "Stem (opp, ned eller nøytralt) på en kommentar.", "apihelp-csVote-summary": "Stem (opp, ned eller nøytralt) på en kommentar.", + "apihelp-csVote-param-pageid": "Side-ID-en til siden som inneholder kommentaren som skal stemmes på", "apihelp-csVote-param-title": "tittelen på siden som inneholder kommentaren det skal stemmes på", "apihelp-csVote-param-vote": "stem (1, -1 eller 0).", "apihelp-csVote-pageid-example": "stem på kommentar med side-ID 3", + "apihelp-csVote-title-example": "Stem på kommentar med sidetittelen CommentStreams:3", + "apihelp-csWatch-description": "Overvåk en kommentar for å få varsel når den får svar", "apihelp-csWatch-summary": "Overvåk en kommentar for å få varsel når det kommer svar", + "apihelp-csWatch-param-pageid": "Side-ID-en til siden som inneholder kommentaren som skal overvåkes", "apihelp-csWatch-param-title": "tittelen på siden som inneholder kommentaren som skal overvåkes", + "apihelp-csWatch-pageid-example": "Overvåk kommentar med side-ID 3", "apihelp-csWatch-title-example": "overvåk kommentaren med sidetittelen CommentStreams:3", + "apihelp-csUnwatch-description": "Fjern overvåking av en kommentar for ikke lenger å få varsel når den får svar", "apihelp-csUnwatch-summary": "Fjern overvåkning av en kommentar for ikke lenger å motta varsler når den får svar", + "apihelp-csUnwatch-param-pageid": "Side-ID-en til siden som inneholder kommentaren som skal fjernes fra overvåkning", + "apihelp-csUnwatch-param-title": "Tittelen til siden som inneholder kommentaren som skal fjernes fra overvåkning", "apihelp-csUnwatch-pageid-example": "fjern overvåking av kommentaren med side-ID 3", + "apihelp-csUnwatch-title-example": "Fjern overvåkning av en kommentar med sidetittel CommentStreams:3", + "commentstreams-api-error-notloggedin": "Du må være innlogget.", "commentstreams-api-error-commentnotfound": "Den etterspurte kommentaren ble ikke funnet.", + "commentstreams-api-error-notacomment": "Den gitte side-ID-en refererer ikke til en gyldig kommentar.", + "commentstreams-api-error-missingcommenttitle": "En kommentartittel må angis for kommentarer som ikke er svar.", "commentstreams-api-error-post-permissions": "Brukeren har ikke tillatelse til å poste en kommentar.", "commentstreams-api-error-post-parentandtitle": "Du kan ikke angi både foreldre-ID-en og kommentartittelen.", + "commentstreams-api-error-post-parentpagedoesnotexist": "Kommentaren det svares på finnes ikke.", + "commentstreams-api-error-post-associatedpageidmismatch": "Siden det kommenteres på matcher ikke med siden den overordnede kommentaren gjelder.", "commentstreams-api-error-post-associatedpagedoesnotexist": "Siden det kommenteres på finnes ikke.", "commentstreams-api-error-post": "Feil under tilføyelse av kommentar.", "commentstreams-api-error-edit-notloggedin": "Du må være logget inn for å redigere.", "commentstreams-api-error-edit-permissions": "Brukeren har ikke tillatelse til å redigere kommentaren.", + "commentstreams-api-error-edit": "Feil under redigering av kommentar.", + "commentstreams-api-error-delete-notloggedin": "Du må være innlogget for å slette.", + "commentstreams-api-error-delete-permissions": "Brukeren har ikke tillatelse til å slette kommentaren.", "commentstreams-api-error-delete-haschildren": "Kan ikke slette et emne som har svar. Oppdater siden for å se den oppdaterte kommentarstrømmen.", "commentstreams-api-error-delete": "Feil under sletting av kommentar.", "commentstreams-api-error-vote-notloggedin": "Du må være logget inn for å stemme.", @@ -42,57 +75,86 @@ "commentstreams-api-error-vote": "Feil under stemming på kommentar.", "commentstreams-api-error-watch-notloggedin": "Du må være logget inn for å overvåke en kommentar.", "commentstreams-api-error-watch-nowatchreply": "Overvåking av svar er ikke tillatt.", + "commentstreams-api-error-watch": "Feil under overvåkning av kommentar.", "commentstreams-api-error-unwatch-notloggedin": "Du må være logget inn for å fjerne overvåkning av en kommentar.", + "commentstreams-api-error-unwatch-nounwatchreply": "Å fjerne overvåkning av svar er ikke tillatt.", + "commentstreams-api-error-unwatch": "Feil under fjerning av kommentar fra overvåkning.", + "commentstreams-validation-error-nocommenttitle": "Du må skrive inn en kommentartittel.", "commentstreams-validation-error-nocommenttext": "Du må skrive inn kommentartekst.", "commentstreams-buttontext-add": "Legg til kommentar", "commentstreams-buttontext-reply": "Svar", "commentstreams-buttontooltip-add": "legg til en kommentar", "commentstreams-buttontooltip-reply": "svar", "commentstreams-buttontooltip-edit": "rediger", + "commentstreams-buttontooltip-moderator-edit": "moderatorredigering", "commentstreams-buttontooltip-delete": "slett", + "commentstreams-buttontooltip-moderator-delete": "moderatorsletting", "commentstreams-buttontooltip-permalink": "permanent lenke", "commentstreams-buttontooltip-collapse": "slå sammen", "commentstreams-buttontooltip-expand": "utvid", "commentstreams-buttontooltip-upvote": "stem opp", + "commentstreams-buttontooltip-downvote": "stem ned", + "commentstreams-buttontooltip-watch": "overvåk", "commentstreams-buttontooltip-unwatch": "fjern overvåkning", "commentstreams-buttontooltip-submit": "send", "commentstreams-buttontooltip-cancel": "avbryt", "commentstreams-dialog-delete-message": "Er du sikker på at du vil slette denne kommentaren?", + "commentstreams-dialog-anonymous-message": "Du er ikke innlogget. Hvis du fortsetter og lagrer denne kommentaren vil IP-adressen din lagres, og du vil ikke kunne redigere eller slette kommentaren.", + "commentstreams-dialog-buttontext-ok": "OK", "commentstreams-dialog-buttontext-cancel": "Avbryt", "commentstreams-dialog-buttontext-yes": "Ja", "commentstreams-dialog-buttontext-no": "Nei", + "commentstreams-urldialog-instructions": "Kopier og lim inn URL-en nedenfor for å dele en permanent lenke til denne kommentaren. Trykk Esc for å lukke dette dialogvinduet.", "commentstreams-datetext-postedon": "Postet", "commentstreams-datetext-lasteditedon": "Sist redigert", "commentstreams-datetext-moderated": "moderert", "commentstreams-title-field-placeholder": "Skriv inn tittel …", + "commentstreams-body-field-placeholder": "Skriv inn ny kommentartekst …", "echo-category-title-commentstreams-notification-category": "Nye kommentarer og svar", "notification-header-commentstreams-comment-on-watched-page": "$1 {{GENDER:$4|kommenterte}} «<i>$2</i>» på siden «<i>$3</i>», som {{GENDER:$6|du}} overvåker.", + "notification-header-commentstreams-reply-on-watched-page": "$1 {{GENDER:$4|svarte}} på kommentaren «<i>$2</i>» på siden «<i>$3</i>», som {{GENDER:$6|du}} overvåker.", + "notification-header-commentstreams-reply-to-watched-comment": "$1 {{GENDER:$4|svarte}} på kommentaren «<i>$2</i>», som {{GENDER:$6|du}} overvåker, på siden «<i>$3</i>».", + "notification-subject-commentstreams-comment-on-watched-page": "None har kommentert på en side du overvåker", "notification-subject-commentstreams-reply-on-watched-page": "Noen har svart på en kommentar på en side du overvåker", + "notification-subject-commentstreams-reply-to-watched-comment": "Noen har svart på en kommentar du overvåker", "notification-body-commentstreams-comment-on-watched-page": "Kommentaren er:\n\n\n$5", "notification-body-commentstreams-reply-on-watched-page": "Svaret er:\n\n\n$5", + "notification-body-commentstreams-reply-to-watched-comment": "Svaret er:\n\n$5", "notification-link-label-commentstreams-comment-on-watched-page": "Besøk kommentar", + "notification-link-label-commentstreams-reply-on-watched-page": "Besøk svar", "notification-link-label-commentstreams-reply-to-watched-comment": "Besøk svar", + "group-csmoderator": "Moderatorer (CommentStreams)", + "group-csmoderator-member": "{{GENDER:$1|moderator (CommentStreams)}}", + "grouppage-csmoderator": "{{ns:project}}:Moderatorer (CommentStreams)", "right-cs-comment": "Poste, redigere og slette sine egne kommentarer", "action-cs-comment": "poste, redigere eller slette kommentarer", "right-cs-moderator-edit": "Redigere kommentarer fra andre brukere", "action-cs-moderator-edit": "redigere kommentarer fra andre brukere", "right-cs-moderator-delete": "Slette kommentarer av alle brukere", "action-cs-moderator-delete": "slette kommentarer av andre brukere", + "log-name-commentstreams": "CommentStreams-logg", + "log-description-commentstreams": "Disse hendelsene sporer når CommentStreams-hendelser skjer.", "logentry-commentstreams-comment-create": "$1 {{GENDER:$2|opprettet}} kommentaren $3", "logentry-commentstreams-reply-create": "$1 {{GENDER:$2|opprettet}} svaret $3", + "logentry-commentstreams-comment-edit": "$1 {{GENDER:$2|redigerte}} kommenatren $3", "logentry-commentstreams-comment-moderator-edit": "$1 (moderator) {{GENDER:$2|redigerte}} kommentaren $3", + "logentry-commentstreams-reply-edit": "$1 {{GENDER:$2|redigerte}} svaret $3", "logentry-commentstreams-reply-moderator-edit": "$1 (moderator) {{GENDER:$2|redigerte}} svaret $3", "logentry-commentstreams-comment-delete": "$1 {{GENDER:$2|slettet}} kommentaren $3", "logentry-commentstreams-comment-moderator-delete": "$1 (moderator) {{GENDER:$2|slettet}} kommentaren $3", + "logentry-commentstreams-reply-delete": "$1 {{GENDER:$2|slettet}} svaret $3", "logentry-commentstreams-reply-moderator-delete": "$1 (moderator) {{GENDER:$2|slettet}} svaret $3", "commentstreamsallcomments": "Alle kommentarer", "commentstreams-allcomments-nocommentsfound": "Ingen kommentarer funnet.", "commentstreams-allcomments-label-page": "Kommentarside", + "commentstreams-allcomments-label-associatedpage": "Tilhørende side", "commentstreams-allcomments-label-commenttitle": "Kommentartittel", "commentstreams-allcomments-label-wikitext": "Kommentar", "commentstreams-allcomments-label-author": "Forfatter", + "commentstreams-allcomments-label-created": "Opprettet", "commentstreams-allcomments-label-lasteditor": "Siste bidragsyter", "commentstreams-allcomments-label-lastedited": "Sist redigert", "commentstreams-allcomments-button-next": "Neste", - "commentstreams-allcomments-button-previous": "Forrige" + "commentstreams-allcomments-button-previous": "Forrige", + "commentstreams-ve-conversion-error": "Feil under konvertering mellom wikitekst og HTML for VisualEditor" } diff --git a/CommentStreams/i18n/nds-nl.json b/CommentStreams/i18n/nds-nl.json new file mode 100644 index 00000000..d1d1fabe --- /dev/null +++ b/CommentStreams/i18n/nds-nl.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Servien" + ] + }, + "commentstreams-buttontooltip-permalink": "vaste verwysing", + "commentstreams-buttontooltip-expand": "uutklappen" +} diff --git a/CommentStreams/i18n/ne.json b/CommentStreams/i18n/ne.json new file mode 100644 index 00000000..f7be94f1 --- /dev/null +++ b/CommentStreams/i18n/ne.json @@ -0,0 +1,36 @@ +{ + "@metadata": { + "authors": [ + "हिमाल सुबेदी" + ] + }, + "commentstreams-author-anonymous": "अज्ञात", + "commentstreams-api-error-edit-notloggedin": "तपाई सम्पादन गर्न प्रवेश हुनुपर्दछ।", + "commentstreams-api-error-edit-permissions": "प्रयोगकर्तालाई टिप्पणी सम्पादन गर्न अनुमति छैन।", + "commentstreams-api-error-delete-notloggedin": "तपाई मेटाउन गर्न प्रवेश हुनुपर्दछ।", + "commentstreams-buttontext-add": "टिप्पणी थप्नुहाेस्", + "commentstreams-buttontext-reply": "जवाफ दिनुहोस्", + "commentstreams-buttontooltip-add": "टिप्पणी थप्नुहाेस्", + "commentstreams-buttontooltip-reply": "जवाफ दिनुहोस्", + "commentstreams-buttontooltip-edit": "सम्पादन", + "commentstreams-buttontooltip-delete": "मेटाउनु", + "commentstreams-buttontooltip-permalink": "स्थायी सूत्र", + "commentstreams-buttontooltip-collapse": "खुम्च्याउनुहाेस्", + "commentstreams-buttontooltip-expand": "फैलाउनुहोस्", + "commentstreams-buttontooltip-watch": "अवलोकन", + "commentstreams-buttontooltip-submit": "पेश गर्नुहोस्", + "commentstreams-buttontooltip-cancel": "रद्द गर्नुहोस्", + "commentstreams-dialog-buttontext-ok": "ठीक", + "commentstreams-dialog-buttontext-cancel": "रद्द गर्नुहोस्", + "commentstreams-dialog-buttontext-yes": "हो", + "commentstreams-dialog-buttontext-no": "होइन", + "commentstreams-datetext-postedon": "प्रेषित मिति", + "commentstreams-datetext-lasteditedon": "अन्तिम पटक सम्पादन", + "commentstreams-datetext-moderated": "सामान्य", + "commentstreams-allcomments-label-author": "लेखक", + "commentstreams-allcomments-label-created": "सृजना गरिएको", + "commentstreams-allcomments-label-lasteditor": "अन्तिम सम्पादक", + "commentstreams-allcomments-label-lastedited": "अन्तिम पटक सम्पादन", + "commentstreams-allcomments-button-next": "अर्को", + "commentstreams-allcomments-button-previous": "अघिल्लो" +} diff --git a/CommentStreams/i18n/nl.json b/CommentStreams/i18n/nl.json index 45278354..2a5881e5 100644 --- a/CommentStreams/i18n/nl.json +++ b/CommentStreams/i18n/nl.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "Hzjethro", "Mainframe98" ] }, @@ -8,6 +9,11 @@ "commentstreams-api-error-notloggedin": "U moet ingelogd zijn.", "commentstreams-api-error-edit-notloggedin": "U moet aangemeld zijn om te kunnen bewerken.", "commentstreams-api-error-delete-notloggedin": "U moet aangemeld zijn om te kunnen verwijderen.", + "commentstreams-validation-error-nocommenttitle": "Geen titel ingevuld.", + "commentstreams-validation-error-nocommenttext": "Geen commentaar ingevuld.", + "commentstreams-buttontext-add": "Voeg commentaar toe", + "commentstreams-buttontext-reply": "Beantwoorden", + "commentstreams-buttontooltip-add": "voeg commentaar toe", "commentstreams-buttontooltip-reply": "antwoorden", "commentstreams-buttontooltip-edit": "bewerken", "commentstreams-buttontooltip-delete": "verwijderen", @@ -17,6 +23,8 @@ "commentstreams-buttontooltip-watch": "volgen", "commentstreams-buttontooltip-submit": "verzenden", "commentstreams-buttontooltip-cancel": "annuleren", + "commentstreams-dialog-delete-message": "Weet u zeker dat u dit commentaar wilt verwijderen?", + "commentstreams-dialog-anonymous-message": "U bent niet aangemeld. Als u doorgaat met het opslaan van dit commentaar, wordt uw IP-adres geregistreerd en kunt u dit commentaar niet bewerken of verwijderen.", "commentstreams-dialog-buttontext-ok": "OK", "commentstreams-dialog-buttontext-cancel": "Annuleren", "commentstreams-dialog-buttontext-yes": "Ja", @@ -24,9 +32,11 @@ "commentstreams-datetext-postedon": "Geplaatst op", "commentstreams-datetext-lasteditedon": "Laatste bewerkt op", "commentstreams-title-field-placeholder": "Voer titel in...", + "commentstreams-body-field-placeholder": "Vul tekst nieuw commentaar in...", "notification-link-label-commentstreams-reply-on-watched-page": "Bekijk reactie", "notification-link-label-commentstreams-reply-to-watched-comment": "Bekijk reactie", "log-name-commentstreams": "CommentStreams logboek", + "commentstreamsallcomments": "Alle reacties", "commentstreams-allcomments-label-associatedpage": "Gekoppelde pagina", "commentstreams-allcomments-label-author": "Auteur", "commentstreams-allcomments-label-created": "Aangemaakt", diff --git a/CommentStreams/i18n/ps.json b/CommentStreams/i18n/ps.json index 5337bbbd..0b02458b 100644 --- a/CommentStreams/i18n/ps.json +++ b/CommentStreams/i18n/ps.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "Amjad Khan", "Baloch Khan" ] }, diff --git a/CommentStreams/i18n/pt-br.json b/CommentStreams/i18n/pt-br.json index 885c8dfe..98bad75f 100644 --- a/CommentStreams/i18n/pt-br.json +++ b/CommentStreams/i18n/pt-br.json @@ -124,7 +124,7 @@ "group-csmoderator": "Moderadores (CommentStreams)", "group-csmoderator-member": "{{GENDER:$1|moderador|moderadora}} (CommentStreams)", "grouppage-csmoderator": "{{ns:project}}:Moderadores (CommentStreams)", - "right-cs-comment": "Publicar, editar e eliminar comentários do próprio utilizador", + "right-cs-comment": "Publicar, editar e eliminar comentários do próprio usuário", "action-cs-comment": "publicar, editar ou eliminar comentários", "right-cs-moderator-edit": "Editar comentários de qualquer usuário", "action-cs-moderator-edit": "editar comentários de outros usuários", @@ -153,5 +153,6 @@ "commentstreams-allcomments-label-lasteditor": "Último editor", "commentstreams-allcomments-label-lastedited": "Última edição", "commentstreams-allcomments-button-next": "Próximo", - "commentstreams-allcomments-button-previous": "Anterior" + "commentstreams-allcomments-button-previous": "Anterior", + "commentstreams-ve-conversion-error": "Ocorreu uma falha de conversão entre texto wiki e HTML para o Editor Visual" } diff --git a/CommentStreams/i18n/pt.json b/CommentStreams/i18n/pt.json index 9652106b..32344948 100644 --- a/CommentStreams/i18n/pt.json +++ b/CommentStreams/i18n/pt.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "Hamilton Abreu", - "Athena in Wonderland" + "Athena in Wonderland", + "Hamilton Abreu" ] }, "commentstreams-desc": "Permite deixar comentários nas páginas da wiki", @@ -154,5 +154,6 @@ "commentstreams-allcomments-label-lasteditor": "Último editor", "commentstreams-allcomments-label-lastedited": "Última edição", "commentstreams-allcomments-button-next": "Seguinte", - "commentstreams-allcomments-button-previous": "Anterior" + "commentstreams-allcomments-button-previous": "Anterior", + "commentstreams-ve-conversion-error": "Ocorreu uma falha de conversão entre texto wiki e HTML para o Editor Visual" } diff --git a/CommentStreams/i18n/ro.json b/CommentStreams/i18n/ro.json new file mode 100644 index 00000000..ed240020 --- /dev/null +++ b/CommentStreams/i18n/ro.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "NGC 54" + ] + }, + "commentstreams-author-anonymous": "anonim", + "commentstreams-dialog-buttontext-yes": "Da", + "commentstreams-dialog-buttontext-no": "Nu", + "commentstreamsallcomments": "Toate comentariile", + "commentstreams-allcomments-label-author": "Autor", + "commentstreams-allcomments-label-created": "Creat" +} diff --git a/CommentStreams/i18n/ru.json b/CommentStreams/i18n/ru.json index 99aad599..8b139ccd 100644 --- a/CommentStreams/i18n/ru.json +++ b/CommentStreams/i18n/ru.json @@ -1,9 +1,13 @@ { "@metadata": { "authors": [ - "Kareyac" + "Kareyac", + "Vlad5250" ] }, + "commentstreams-desc": "Позволяет комментировать викистраницы", + "commentstreams-error-prohibitedaction": "Действие $1 не разрешено на страницах комментариев.", + "commentstreams-error-comment-on-deleted-page": "Страница, с которой связан этот комментарий, удалена.", "commentstreams-author-anonymous": "аноним", "commentstreams-buttontooltip-add": "добавить комментарий", "commentstreams-buttontooltip-reply": "ответить", diff --git a/CommentStreams/i18n/sd.json b/CommentStreams/i18n/sd.json index 4cea6bc8..751aab5e 100644 --- a/CommentStreams/i18n/sd.json +++ b/CommentStreams/i18n/sd.json @@ -1,7 +1,9 @@ { "@metadata": { "authors": [ - "Indus Asia" + "Indus Asia", + "Mehtab ahmed", + "Tweety" ] }, "apihelp-csPostComment-description": "نيئن راءِ درج ڪيو.", @@ -14,15 +16,16 @@ "commentstreams-buttontooltip-cancel": "رد", "commentstreams-dialog-buttontext-ok": "ٺيڪ (او ڪي) آهي", "commentstreams-dialog-buttontext-yes": "ھا", - "commentstreams-dialog-buttontext-no": "نه", + "commentstreams-dialog-buttontext-no": "نہ", "commentstreams-datetext-postedon": "تي درجيڪاري ڪئي وئي (پوسٽيڊ آن)", "commentstreams-datetext-lasteditedon": "تي آخري ڀيرو سنواريو ويو", "commentstreams-title-field-placeholder": "عنوان ڏيو (اينٽر ٽائيٽل)", - "commentstreams-allcomments-nocommentsfound": "ڪي به رايا نه مليا.", + "commentstreams-allcomments-nocommentsfound": "ڪي بہ رايا نہ لڌا.", "commentstreams-allcomments-label-associatedpage": "لاڳاپيل صفحو", "commentstreams-allcomments-label-author": "ليکڪ", "commentstreams-allcomments-label-created": "سرجيل (Created)", - "commentstreams-allcomments-label-lasteditor": "آخري ايڊيٽر", + "commentstreams-allcomments-label-lasteditor": "آخري سنواريندڙ", "commentstreams-allcomments-label-lastedited": "آخري ڀيرو سنواريل", + "commentstreams-allcomments-button-next": "اڳيون", "commentstreams-allcomments-button-previous": "اڳوڻو" } diff --git a/CommentStreams/i18n/se.json b/CommentStreams/i18n/se.json new file mode 100644 index 00000000..5ddce6f7 --- /dev/null +++ b/CommentStreams/i18n/se.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Yupik" + ] + }, + "commentstreams-allcomments-button-next": "Čuovvovaš" +} diff --git a/CommentStreams/i18n/smn.json b/CommentStreams/i18n/smn.json new file mode 100644 index 00000000..56fe0d30 --- /dev/null +++ b/CommentStreams/i18n/smn.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Yupik" + ] + }, + "commentstreams-allcomments-button-next": "Čuávuvâš" +} diff --git a/CommentStreams/i18n/sms.json b/CommentStreams/i18n/sms.json new file mode 100644 index 00000000..ccf057da --- /dev/null +++ b/CommentStreams/i18n/sms.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Yupik" + ] + }, + "commentstreams-buttontooltip-permalink": "põõšši liŋkk" +} diff --git a/CommentStreams/i18n/sr-ec.json b/CommentStreams/i18n/sr-ec.json new file mode 100644 index 00000000..aa93c17f --- /dev/null +++ b/CommentStreams/i18n/sr-ec.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "BadDog" + ] + }, + "action-cs-comment": "објављујете, уређујете или бришете коментаре" +} diff --git a/CommentStreams/i18n/su.json b/CommentStreams/i18n/su.json new file mode 100644 index 00000000..c03f38cd --- /dev/null +++ b/CommentStreams/i18n/su.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Uchup19" + ] + }, + "commentstreams-buttontooltip-cancel": "bolay", + "commentstreams-dialog-buttontext-cancel": "Bolay" +} diff --git a/CommentStreams/i18n/sv.json b/CommentStreams/i18n/sv.json index ff985daf..f6ab8849 100644 --- a/CommentStreams/i18n/sv.json +++ b/CommentStreams/i18n/sv.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "WikiPhoenix", - "Bengtsson96" + "Bengtsson96", + "WikiPhoenix" ] }, "commentstreams-desc": "Tillåter kommentarer på wikisidor", @@ -154,5 +154,6 @@ "commentstreams-allcomments-label-lasteditor": "Senaste redigerare", "commentstreams-allcomments-label-lastedited": "Senast redigerad", "commentstreams-allcomments-button-next": "Nästa", - "commentstreams-allcomments-button-previous": "Föregående" + "commentstreams-allcomments-button-previous": "Föregående", + "commentstreams-ve-conversion-error": "Fel uppstod under konvertering mellan wikitext och HTML för VisualEditor" } diff --git a/CommentStreams/i18n/ti.json b/CommentStreams/i18n/ti.json new file mode 100644 index 00000000..d4e17134 --- /dev/null +++ b/CommentStreams/i18n/ti.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Joanmp17" + ] + }, + "commentstreams-buttontooltip-submit": "ኣረክብ", + "commentstreams-allcomments-label-created": "ተፈጢሩ" +} diff --git a/CommentStreams/i18n/tly.json b/CommentStreams/i18n/tly.json new file mode 100644 index 00000000..5d8c4ff8 --- /dev/null +++ b/CommentStreams/i18n/tly.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Patriot Kur" + ] + }, + "commentstreams-buttontooltip-cancel": "ləğv karde", + "commentstreams-dialog-buttontext-cancel": "Ləğv karde" +} diff --git a/CommentStreams/i18n/tr.json b/CommentStreams/i18n/tr.json index 6c52f597..6061b9fb 100644 --- a/CommentStreams/i18n/tr.json +++ b/CommentStreams/i18n/tr.json @@ -1,8 +1,160 @@ { "@metadata": { "authors": [ + "BaRaN6161 TURK", + "MuratTheTurkish", "Sayginer" ] }, - "commentstreams-error-comment-on-deleted-page": "Bu yorumla bağlantılı olan sayfa silinmiş." + "commentstreams-desc": "Viki sayfalarında yorum yapmaya izin verir", + "commentstreams-error-prohibitedaction": "Yorum sayfalarında $1 eylemine izin verilmiyor.", + "commentstreams-error-comment-on-deleted-page": "Bu yorumla bağlantılı olan sayfa silinmiş.", + "commentstreams-author-anonymous": "anonim", + "apihelp-csQueryComment-description": "Bir yorumun başlığını, kullanıcısını, oluşturma zaman damgasını ve vikimetin değerini döndürün. Sayfa kimliği veya başlık sağlanmalıdır.", + "apihelp-csQueryComment-summary": "Bir yorumun başlığını, kullanıcısını, oluşturma zaman damgasını ve vikimetin değerini döndürün. Sayfa kimliği veya başlık sağlanmalıdır.", + "apihelp-csQueryComment-param-pageid": "sorgulanacak yorumu tutan sayfanın sayfa kimliği", + "apihelp-csQueryComment-param-title": "sorgulanacak yorumu içeren sayfanın başlığı", + "apihelp-csQueryComment-pageid-example": "vikimetinde sayfa kimliği 3 ile sorgu yorumu", + "apihelp-csQueryComment-title-example": "yorum başlığıyla yorum sorgusu CommentStreams:3 vikimetinde", + "apihelp-csDeleteComment-description": "Bir yorumu silin. Sayfa kimliği veya başlık sağlanmalıdır.", + "apihelp-csDeleteComment-summary": "Bir yorumu silin. Sayfa kimliği veya başlık sağlanmalıdır.", + "apihelp-csDeleteComment-param-pageid": "silinecek yorumu içeren sayfanın sayfa kimliği", + "apihelp-csDeleteComment-param-title": "silinecek yorumu içeren sayfanın başlığı", + "apihelp-csDeleteComment-pageid-example": "sayfa kimliği 3 ile yorumu sil", + "apihelp-csDeleteComment-title-example": "sayfa başlığı CommentStreams:3 ile yorumu sil", + "apihelp-csPostComment-description": "Yeni bir yorum gönderin.", + "apihelp-csPostComment-summary": "Yeni bir yorum gönder.", + "apihelp-csPostComment-param-commenttitle": "yorum için isteğe bağlı başlık.", + "apihelp-csPostComment-param-wikitext": "yorum için vikimetin.", + "apihelp-csPostComment-param-associatedid": "bu yorumun ilişkilendirildiği sayfa.", + "apihelp-csPostComment-param-parentid": "bu bir yanıtsa üst yorumun sayfa kimliği.", + "apihelp-csEditComment-description": "Mevcut bir yorumu düzenleyin. Sayfa kimliği veya başlık sağlanmalıdır.", + "apihelp-csEditComment-summary": "Mevcut bir yorumu düzenleyin. Sayfa kimliği veya başlık sağlanmalıdır.", + "apihelp-csEditComment-param-pageid": "düzenlenecek yorumu içeren sayfanın sayfa kimliği", + "apihelp-csEditComment-param-title": "düzenlenecek yorumu içeren sayfanın başlığı", + "apihelp-csEditComment-param-commenttitle": "yorum için isteğe bağlı başlık.", + "apihelp-csEditComment-param-wikitext": "yorum için vikimetin.", + "apihelp-csVote-description": "Bir yoruma oy verin (yukarı, aşağı veya nötr).", + "apihelp-csVote-summary": "Bir yoruma oy verin (yukarı, aşağı veya nötr).", + "apihelp-csVote-param-pageid": "oylanacak yorumu içeren sayfanın sayfa kimliği", + "apihelp-csVote-param-title": "oylanacak yorumu içeren sayfanın başlığı", + "apihelp-csVote-param-vote": "oyla (1, -1, veya 0).", + "apihelp-csVote-pageid-example": "sayfa kimliği 3 ile yorumu oylayın", + "apihelp-csVote-title-example": "sayfa başlığı CommentStreams:3 ile yoruma oy verin", + "apihelp-csWatch-description": "Yanıt aldığında bildirim almak için bir yorumu izleyin", + "apihelp-csWatch-summary": "Yanıt aldığında bildirim almak için bir yorumu izleyin", + "apihelp-csWatch-param-pageid": "izlenecek yorumu içeren sayfanın sayfa kimliği", + "apihelp-csWatch-param-title": "izlenecek yorumu içeren sayfanın sayfa kimliği", + "apihelp-csWatch-pageid-example": "sayfa kimliği 3 ile yorumu izleyin", + "apihelp-csWatch-title-example": "sayfa başlığı CommentStreams:3 ile yorumu izleyin", + "apihelp-csUnwatch-description": "Yanıt aldığında artık bildirim gönderilmeyecek bir yorumu izlemeyin", + "apihelp-csUnwatch-summary": "Yanıt aldığında artık bildirim gönderilmeyecek bir yorumu izlemeyin", + "apihelp-csUnwatch-param-pageid": "izlenecek yorumu tutan sayfanın sayfa kimliği", + "apihelp-csUnwatch-param-title": "izlenecek yorumu içeren sayfanın başlığı", + "apihelp-csUnwatch-pageid-example": "sayfa kimliği 3 ile yorumu izlemeyin", + "apihelp-csUnwatch-title-example": "sayfa başlığı CommentStreams:3 ile yorumu izlemeyin", + "commentstreams-api-error-notloggedin": "Oturum açmalısınız.", + "commentstreams-api-error-commentnotfound": "İstenen yorum bulunamadı.", + "commentstreams-api-error-notacomment": "Verilen sayfa kimliği geçerli bir açıklamaya gönderme yapmıyor.", + "commentstreams-api-error-missingcommenttitle": "Yanıtlanmamış yorumlar için bir yorum başlığı sağlanmalıdır.", + "commentstreams-api-error-post-permissions": "Kullanıcının yorum gönderme izni yok.", + "commentstreams-api-error-post-parentandtitle": "Hem üst kimliği hem de yorum başlığını belirtebilirsiniz.", + "commentstreams-api-error-post-parentpagedoesnotexist": "Yanıtlanan yorum mevcut değil.", + "commentstreams-api-error-post-associatedpageidmismatch": "Yorum yapılan sayfa, üst yorumun yorum yaptığı sayfayla eşleşmiyor.", + "commentstreams-api-error-post-associatedpagedoesnotexist": "Yorum yapılan sayfa mevcut değil.", + "commentstreams-api-error-post": "Yorum eklenirken hata oluştu.", + "commentstreams-api-error-edit-notloggedin": "Düzenlemek için oturum açmalısınız.", + "commentstreams-api-error-edit-permissions": "Kullanıcının yorumu düzenleme izni yok.", + "commentstreams-api-error-edit": "Yorum düzenlenirken hata oluştu.", + "commentstreams-api-error-delete-notloggedin": "Silmek için oturum açmalısınız.", + "commentstreams-api-error-delete-permissions": "Kullanıcının yorumu silme izni yok.", + "commentstreams-api-error-delete-haschildren": "Yanıtları olan bir konu silinemez. Güncellenmiş yorum akışını görmek için lütfen sayfayı yenileyin.", + "commentstreams-api-error-delete": "Yorum silinirken hata oluştu.", + "commentstreams-api-error-vote-notloggedin": "Oy vermek için oturum açmalısınız.", + "commentstreams-api-error-vote-novoteonreply": "Yanıtlarda oylamaya izin verilmiyor.", + "commentstreams-api-error-vote": "Yorum oylanırken hata oluştu.", + "commentstreams-api-error-watch-notloggedin": "Bir yorum izlemek için oturum açmalısınız.", + "commentstreams-api-error-watch-nowatchreply": "Yanıtları izlemeye izin verilmiyor.", + "commentstreams-api-error-watch": "Yorum izlerken hata oluştu.", + "commentstreams-api-error-unwatch-notloggedin": "Bir yorumu izlemek için oturum açmalısınız.", + "commentstreams-api-error-unwatch-nounwatchreply": "Yanıtların izlememesine izin verilmiyor.", + "commentstreams-api-error-unwatch": "Yorum izlemesi kaldırırken hata oluştu.", + "commentstreams-validation-error-nocommenttitle": "Bir yorum başlığı girmelisiniz.", + "commentstreams-validation-error-nocommenttext": "Yorum metni girmelisiniz.", + "commentstreams-buttontext-add": "Yorum ekle", + "commentstreams-buttontext-reply": "Yanıtla", + "commentstreams-buttontooltip-add": "yorum ekle", + "commentstreams-buttontooltip-reply": "yanıtla", + "commentstreams-buttontooltip-edit": "düzenle", + "commentstreams-buttontooltip-moderator-edit": "moderatör düzenleme", + "commentstreams-buttontooltip-delete": "sil", + "commentstreams-buttontooltip-moderator-delete": "moderatör silinme", + "commentstreams-buttontooltip-permalink": "kalıcı bağlantı", + "commentstreams-buttontooltip-collapse": "daralt", + "commentstreams-buttontooltip-expand": "genişlet", + "commentstreams-buttontooltip-upvote": "yukarı oy", + "commentstreams-buttontooltip-downvote": "aşağı oy", + "commentstreams-buttontooltip-watch": "izle", + "commentstreams-buttontooltip-unwatch": "izlemeyi durdur", + "commentstreams-buttontooltip-submit": "gönder", + "commentstreams-buttontooltip-cancel": "iptal", + "commentstreams-dialog-delete-message": "Bu yorumu silmek istediğinizden emin misiniz?", + "commentstreams-dialog-anonymous-message": "Oturum açmadınız. Bu yorumu kaydetmeye devam ederseniz, IP adresiniz kaydedilir ve bu yorumu düzenleyemez veya silemezsiniz.", + "commentstreams-dialog-buttontext-ok": "Tamam", + "commentstreams-dialog-buttontext-cancel": "İptal", + "commentstreams-dialog-buttontext-yes": "Evet", + "commentstreams-dialog-buttontext-no": "Hayır", + "commentstreams-urldialog-instructions": "Bu yoruma bir kalıcı bağlantı paylaşmak için aşağıdaki URL'yi kopyalayıp yapıştırın. Bu iletişim kutusunu kapatmak için escape tuşuna basın.", + "commentstreams-datetext-postedon": "Gönderilme tarihi", + "commentstreams-datetext-lasteditedon": "Son düzenleme tarihi", + "commentstreams-datetext-moderated": "denetlendi", + "commentstreams-title-field-placeholder": "Başlık girin...", + "commentstreams-body-field-placeholder": "Yeni yorum metni girin...", + "echo-category-title-commentstreams-notification-category": "Yeni yorumlar ve cevaplar", + "notification-header-commentstreams-comment-on-watched-page": "$1, {{GENDER:$6|izlediğiniz}} \"<i>$2</i>\" yorumu \"<i>$3</i>\" sayfasında {{GENDER:$4|yorumladı}}.", + "notification-header-commentstreams-reply-on-watched-page": "$1, {{GENDER:$6|izlediğiniz}} \"<i>$2</i>\" yorumda \"<i>$3</i>\" sayfasında {{GENDER:$4|yanıtladı}}.", + "notification-header-commentstreams-reply-to-watched-comment": "$1, \"<i>$3</i>\" sayfasında {{GENDER:$6|izlediğiniz}} \"<i>$2</i>\" {{GENDER:$4|yorumunu yanıtladı}}.", + "notification-subject-commentstreams-comment-on-watched-page": "Birisi izlediğiniz bir sayfaya yorum yaptı", + "notification-subject-commentstreams-reply-on-watched-page": "Birisi izlediğiniz bir sayfadaki yorumu yanıtladı", + "notification-subject-commentstreams-reply-to-watched-comment": "Birisi izlediğiniz bir yoruma cevap verdi", + "notification-body-commentstreams-comment-on-watched-page": "Yorum:\n\n\n$5", + "notification-body-commentstreams-reply-on-watched-page": "Yanıt:\n\n\n$5", + "notification-body-commentstreams-reply-to-watched-comment": "Yanıt:\n\n\n$5", + "notification-link-label-commentstreams-comment-on-watched-page": "Yorumu ziyaret et", + "notification-link-label-commentstreams-reply-on-watched-page": "Yanıtı ziyaret et", + "notification-link-label-commentstreams-reply-to-watched-comment": "Yanıtı ziyaret et", + "group-csmoderator": "Moderatörler (CommentStreams)", + "group-csmoderator-member": "{{GENDER:$1|moderatör (CommentStreams)}}", + "grouppage-csmoderator": "{{ns:project}}:Moderatörler (CommentStreams)", + "right-cs-comment": "Kullanıcının kendi yorumlarını gönderin, düzenleyin ve silin", + "action-cs-comment": "yorum gönder, düzenle veya sil", + "right-cs-moderator-edit": "Herhangi bir kullanıcı tarafından yorumları düzenle", + "action-cs-moderator-edit": "diğer kullanıcıların yorumlarını düzenle", + "right-cs-moderator-delete": "Herhangi bir kullanıcının yorumlarını sil", + "action-cs-moderator-delete": "diğer kullanıcıların yorumlarını sil", + "log-name-commentstreams": "CommentStreams günlüğü", + "log-description-commentstreams": "Bu olaylar, CommentStreams olayları gerçekleştiğinde izlenir.", + "logentry-commentstreams-comment-create": "$1 yorum {{GENDER:$2|oluşturdu}} $3", + "logentry-commentstreams-reply-create": "$1 yanıt {{GENDER:$2|oluşturdu}} $3", + "logentry-commentstreams-comment-edit": "$1 yorum {{GENDER:$2|düzenledi}} $3", + "logentry-commentstreams-comment-moderator-edit": "$1 yorum {{GENDER:$2|(moderatör) düzenledi}} $3", + "logentry-commentstreams-reply-edit": "$1 yanıtı {{GENDER:$2|düzenledi}} $3", + "logentry-commentstreams-reply-moderator-edit": "$1 yanıtı {{GENDER:$2|(moderatör) düzenledi}} $3", + "logentry-commentstreams-comment-delete": "$1 yorum {{GENDER:$2|sildi}} $3", + "logentry-commentstreams-comment-moderator-delete": "$1 yorum {{GENDER:$2|(moderatör) sildi}} $3", + "logentry-commentstreams-reply-delete": "$1 yanıtı {{GENDER:$2|sildi}} $3", + "logentry-commentstreams-reply-moderator-delete": "$1 yanıtı {{GENDER:$2|(moderatör) sildi}} $3", + "commentstreamsallcomments": "Tüm Yorumlar", + "commentstreams-allcomments-nocommentsfound": "Yorum bulunamadı.", + "commentstreams-allcomments-label-page": "Yorum Sayfası", + "commentstreams-allcomments-label-associatedpage": "İlişkili Sayfa", + "commentstreams-allcomments-label-commenttitle": "Yorum Başlığı", + "commentstreams-allcomments-label-wikitext": "Yorum", + "commentstreams-allcomments-label-author": "Yazar", + "commentstreams-allcomments-label-created": "Oluşturuldu", + "commentstreams-allcomments-label-lasteditor": "Son Düzenleyen", + "commentstreams-allcomments-label-lastedited": "Son Düzenleme", + "commentstreams-allcomments-button-next": "Sonraki", + "commentstreams-allcomments-button-previous": "Önceki", + "commentstreams-ve-conversion-error": "Görsel Düzenleyici için vikimetin ve HTML arasında dönüştürme hatası" } diff --git a/CommentStreams/i18n/ug-arab.json b/CommentStreams/i18n/ug-arab.json index 67b728ae..95f45453 100644 --- a/CommentStreams/i18n/ug-arab.json +++ b/CommentStreams/i18n/ug-arab.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "چۈشكۈن", - "Uzdil" + "Uzdil", + "چۈشكۈن" ] }, "commentstreams-buttontext-add": "باھا قوشۇش", diff --git a/CommentStreams/i18n/uk.json b/CommentStreams/i18n/uk.json index 254e9f89..6411c4cd 100644 --- a/CommentStreams/i18n/uk.json +++ b/CommentStreams/i18n/uk.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "SimondR", - "Piramidion" + "Piramidion", + "SimondR" ] }, "commentstreams-desc": "Дає можливість коментувати вікісторінки", @@ -80,6 +80,8 @@ "commentstreams-api-error-unwatch": "Помилка при спробі припинити спостереження за коментарем.", "commentstreams-validation-error-nocommenttitle": "Вам треба вказати назву коментаря.", "commentstreams-validation-error-nocommenttext": "Вам треба вказати текст коментаря.", + "commentstreams-buttontext-add": "Додати коментар", + "commentstreams-buttontext-reply": "Відповісти", "commentstreams-buttontooltip-add": "додати коментар", "commentstreams-buttontooltip-reply": "відповісти", "commentstreams-buttontooltip-edit": "редагувати", @@ -123,11 +125,11 @@ "group-csmoderator": "Модератори (CommentStreams)", "group-csmoderator-member": "{{GENDER:$1|модератор (CommentStreams)|модераторка (CommentStreams)}}", "grouppage-csmoderator": "{{ns:project}}:Модератори (CommentStreams)", - "right-cs-comment": "публікація, редагування та вилучення власних коментарів", + "right-cs-comment": "Публікація, редагування та вилучення власних коментарів", "action-cs-comment": "публікацію, редагування чи вилучення коментарів", - "right-cs-moderator-edit": "редагування коментарів будь-якого користувача", + "right-cs-moderator-edit": "Редагування коментарів будь-якого користувача", "action-cs-moderator-edit": "редагування коментарів інших користувачів", - "right-cs-moderator-delete": "вилучення коментарів будь-якого користувача", + "right-cs-moderator-delete": "Вилучення коментарів будь-якого користувача", "action-cs-moderator-delete": "вилучення коментарів інших користувачів", "log-name-commentstreams": "Журнал CommentStreams", "log-description-commentstreams": "Ці події відстежуються, коли відбуваються події CommentStreams.", @@ -152,5 +154,6 @@ "commentstreams-allcomments-label-lasteditor": "Останній редактор", "commentstreams-allcomments-label-lastedited": "Востаннє відредаговано", "commentstreams-allcomments-button-next": "Наступне", - "commentstreams-allcomments-button-previous": "Попереднє" + "commentstreams-allcomments-button-previous": "Попереднє", + "commentstreams-ve-conversion-error": "Виникла помилка під час конвертування між вікірозміткою та HTML для Візуального редактора" } diff --git a/CommentStreams/i18n/vec.json b/CommentStreams/i18n/vec.json new file mode 100644 index 00000000..4f6ca65e --- /dev/null +++ b/CommentStreams/i18n/vec.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Fierodelveneto" + ] + }, + "commentstreams-buttontooltip-permalink": "łinganbo permanente" +} diff --git a/CommentStreams/i18n/za.json b/CommentStreams/i18n/za.json new file mode 100644 index 00000000..31441a31 --- /dev/null +++ b/CommentStreams/i18n/za.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "唐吉訶德的侍從" + ] + }, + "commentstreams-buttontooltip-collapse": "rwt", + "commentstreams-buttontooltip-expand": "mbe" +} diff --git a/CommentStreams/i18n/zh-hans.json b/CommentStreams/i18n/zh-hans.json index d81d3bc8..eedbca36 100644 --- a/CommentStreams/i18n/zh-hans.json +++ b/CommentStreams/i18n/zh-hans.json @@ -154,5 +154,6 @@ "commentstreams-allcomments-label-lasteditor": "最后编辑者", "commentstreams-allcomments-label-lastedited": "上次编辑于", "commentstreams-allcomments-button-next": "下一个", - "commentstreams-allcomments-button-previous": "上一个" + "commentstreams-allcomments-button-previous": "上一个", + "commentstreams-ve-conversion-error": "在可视化编辑器中转换wiki文本和HTML时出错" } diff --git a/CommentStreams/i18n/zh-hant.json b/CommentStreams/i18n/zh-hant.json index 3a5438fd..d8571753 100644 --- a/CommentStreams/i18n/zh-hant.json +++ b/CommentStreams/i18n/zh-hant.json @@ -1,8 +1,8 @@ { "@metadata": { "authors": [ - "Liuxinyu970226", - "Kly" + "Kly", + "Liuxinyu970226" ] }, "commentstreams-desc": "允許在 wiki 頁面上評論", @@ -154,5 +154,6 @@ "commentstreams-allcomments-label-lasteditor": "上一個編輯者", "commentstreams-allcomments-label-lastedited": "上一次編輯", "commentstreams-allcomments-button-next": "下一個", - "commentstreams-allcomments-button-previous": "上一個" + "commentstreams-allcomments-button-previous": "上一個", + "commentstreams-ve-conversion-error": "視覺化編輯器在 wiki 文字與 HTML 之間轉換時發生錯誤" } diff --git a/CommentStreams/includes/ApiCSBase.php b/CommentStreams/includes/ApiCSBase.php index ac0a9991..51ec172e 100644 --- a/CommentStreams/includes/ApiCSBase.php +++ b/CommentStreams/includes/ApiCSBase.php @@ -21,6 +21,12 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use ApiBase; +use ApiMessage; +use ManualLogEntry; + abstract class ApiCSBase extends ApiBase { private $edit; @@ -44,11 +50,11 @@ abstract class ApiCSBase extends ApiBase { $wikipage = $this->getTitleOrPageId( $params, $this->edit ? 'frommasterdb' : 'fromdb' ); $this->comment = Comment::newFromWikiPage( $wikipage ); - if ( is_null( $this->comment ) ) { + if ( $this->comment === null ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-notacomment' ); } $result = $this->executeBody(); - if ( !is_null( $result ) ) { + if ( $result !== null ) { $this->getResult()->addValue( null, $this->getModuleName(), $result ); } } @@ -112,7 +118,6 @@ abstract class ApiCSBase extends ApiBase { $logEntry->setTarget( $this->comment->getWikiPage()->getTitle() ); } $logid = $logEntry->insert(); - $logEntry->publish($logid); } /** diff --git a/CommentStreams/includes/ApiCSDeleteComment.php b/CommentStreams/includes/ApiCSDeleteComment.php index 7609e2e9..345a314f 100644 --- a/CommentStreams/includes/ApiCSDeleteComment.php +++ b/CommentStreams/includes/ApiCSDeleteComment.php @@ -21,6 +21,8 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + class ApiCSDeleteComment extends ApiCSBase { /** @@ -37,7 +39,8 @@ class ApiCSDeleteComment extends ApiCSBase { * @return result of API request */ protected function executeBody() { - if ( $this->getUser()->isAnon() ) { + $user = $this->getUser(); + if ( $user->isAnon() ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-delete-notloggedin' ); } @@ -50,10 +53,21 @@ class ApiCSDeleteComment extends ApiCSBase { $action = 'cs-moderator-delete'; } - if ( !$this->comment->getWikiPage()->getTitle()->userCan( $action, - $this->getUser() ) ) { - $this->dieCustomUsageMessage( - 'commentstreams-api-error-delete-permissions' ); + $title = $this->comment->getWikiPage()->getTitle(); + if ( class_exists( 'MediaWiki\Permissions\PermissionManager' ) ) { + // MW 1.33+ + if ( !\MediaWiki\MediaWikiServices::getInstance() + ->getPermissionManager() + ->userCan( $action, $user, $title ) + ) { + $this->dieCustomUsageMessage( + 'commentstreams-api-error-delete-permissions' ); + } + } else { + if ( !$title->userCan( $action, $user ) ) { + $this->dieCustomUsageMessage( + 'commentstreams-api-error-delete-permissions' ); + } } $childCount = $this->comment->getNumReplies(); @@ -65,15 +79,15 @@ class ApiCSDeleteComment extends ApiCSBase { 'commentstreams-api-error-delete-haschildren' ); } } else { - $result = $this->comment->delete(); + $result = $this->comment->delete( $user ); if ( $action === 'cs-comment' ) { - if ( is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() === null ) { $this->logAction( 'comment-delete' ); } else { $this->logAction( 'reply-delete' ); } } else { - if ( is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() === null ) { $this->logAction( 'comment-moderator-delete' ); } else { $this->logAction( 'reply-moderator-delete' ); @@ -93,6 +107,7 @@ class ApiCSDeleteComment extends ApiCSBase { * recursively delete comment and replies * * @param Comment $comment the comment to recursively delete + * @return bool */ private function recursiveDelete( $comment ) { $replies = Comment::getReplies( $comment->getId() ); @@ -102,9 +117,9 @@ class ApiCSDeleteComment extends ApiCSBase { return $result; } } - $result = $comment->delete(); + $result = $comment->delete( $this->getUser() ); $title = $comment->getWikiPage()->getTitle(); - if ( is_null( $comment->getParentId() ) ) { + if ( $comment->getParentId() === null ) { $this->logAction( 'comment-moderator-delete', $title ); } else { $this->logAction( 'reply-moderator-delete', $title ); diff --git a/CommentStreams/includes/ApiCSEditComment.php b/CommentStreams/includes/ApiCSEditComment.php index 485553c5..c40f035c 100644 --- a/CommentStreams/includes/ApiCSEditComment.php +++ b/CommentStreams/includes/ApiCSEditComment.php @@ -21,6 +21,10 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use ApiBase; + class ApiCSEditComment extends ApiCSBase { /** @@ -48,16 +52,28 @@ class ApiCSEditComment extends ApiCSBase { } else { $action = 'cs-moderator-edit'; } - if ( !$this->comment->getWikiPage()->getTitle()->userCan( $action, - $this->getUser() ) ) { - $this->dieCustomUsageMessage( - 'commentstreams-api-error-edit-permissions' ); + + $title = $this->comment->getWikiPage()->getTitle(); + if ( class_exists( 'MediaWiki\Permissions\PermissionManager' ) ) { + // MW 1.33+ + if ( !\MediaWiki\MediaWikiServices::getInstance() + ->getPermissionManager() + ->userCan( $action, $this->getUser(), $title ) + ) { + $this->dieCustomUsageMessage( + 'commentstreams-api-error-edit-permissions' ); + } + } else { + if ( !$title->userCan( $action, $this->getUser() ) ) { + $this->dieCustomUsageMessage( + 'commentstreams-api-error-edit-permissions' ); + } } $comment_title = $this->getMain()->getVal( 'commenttitle' ); $wikitext = $this->getMain()->getVal( 'wikitext' ); - if ( is_null( $this->comment->getParentId() ) && is_null( $comment_title ) ) { + if ( $this->comment->getParentId() === null && $comment_title === null ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-missingcommenttitle' ); } @@ -68,13 +84,13 @@ class ApiCSEditComment extends ApiCSBase { } if ( $action === 'cs-comment' ) { - if ( is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() === null ) { $this->logAction( 'comment-edit' ); } else { $this->logAction( 'reply-edit' ); } } else { - if ( is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() === null ) { $this->logAction( 'comment-moderator-edit' ); } else { $this->logAction( 'reply-moderator-edit' ); @@ -83,7 +99,7 @@ class ApiCSEditComment extends ApiCSBase { $json = $this->comment->getJSON(); - if ( is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() === null ) { if ( $GLOBALS['wgCommentStreamsEnableVoting'] ) { $json['vote'] = $this->comment->getVote( $this->getUser() ); } @@ -94,7 +110,7 @@ class ApiCSEditComment extends ApiCSBase { } /** - * @return array allowed paramters + * @return array allowed parameters */ public function getAllowedParams() { return array_merge( parent::getAllowedParams(), diff --git a/CommentStreams/includes/ApiCSPostComment.php b/CommentStreams/includes/ApiCSPostComment.php index 925151f9..c37d6a3d 100644 --- a/CommentStreams/includes/ApiCSPostComment.php +++ b/CommentStreams/includes/ApiCSPostComment.php @@ -21,6 +21,15 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use ApiBase; +use ApiMessage; +use EchoEvent; +use ExtensionRegistry; +use ManualLogEntry; +use WikiPage; + class ApiCSPostComment extends ApiBase { /** @@ -46,19 +55,19 @@ class ApiCSPostComment extends ApiBase { $comment_title = $this->getMain()->getVal( 'commenttitle' ); $wikitext = $this->getMain()->getVal( 'wikitext' ); - if ( is_null( $parentid ) && is_null( $comment_title ) ) { + if ( $parentid === null && $comment_title === null ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-missingcommenttitle' ); } - if ( !is_null( $parentid ) && !is_null( $comment_title ) ) { + if ( $parentid !== null && $comment_title !== null ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-post-parentandtitle' ); } - if ( !is_null( $parentid ) ) { + if ( $parentid !== null ) { $parent_page = WikiPage::newFromId( $parentid ); - if ( is_null( $parent_page ) || !$parent_page->getTitle()->exists() ) { + if ( $parent_page === null || !$parent_page->getTitle()->exists() ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-post-parentpagedoesnotexist' ); } @@ -70,7 +79,7 @@ class ApiCSPostComment extends ApiBase { } $associated_page = WikiPage::newFromId( $associatedid ); - if ( is_null( $associated_page ) || + if ( $associated_page === null || !$associated_page->getTitle()->exists() ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-post-associatedpagedoesnotexist' ); @@ -83,7 +92,7 @@ class ApiCSPostComment extends ApiBase { } $title = $comment->getWikiPage()->getTitle(); - if ( is_null( $comment->getParentId() ) ) { + if ( $comment->getParentId() === null ) { $this->logAction( 'comment-create', $title ); } else { $this->logAction( 'reply-create', $title ); @@ -91,7 +100,7 @@ class ApiCSPostComment extends ApiBase { $json = $comment->getJSON(); if ( ExtensionRegistry::getInstance()->isLoaded( 'Echo' ) && - is_null( $comment->getParentId() ) + $comment->getParentId() === null ) { $json['watching'] = 1; } @@ -101,7 +110,7 @@ class ApiCSPostComment extends ApiBase { } /** - * @return array allowed paramters + * @return array allowed parameters */ public function getAllowedParams() { return [ @@ -144,15 +153,15 @@ class ApiCSPostComment extends ApiBase { } $parent_id = $comment->getParentId(); - if ( is_null( $parent_id ) ) { + if ( $parent_id === null ) { $comment_title = $comment->getCommentTitle(); } else { $parent_page = WikiPage::newFromId( $parent_id ); - if ( is_null( $parent_page ) ) { + if ( $parent_page === null ) { return; } $parent_comment = Comment::newFromWikiPage( $parent_page ); - if ( is_null( $parent_comment ) ) { + if ( $parent_comment === null ) { return; } else { $comment_title = $parent_comment->getCommentTitle(); @@ -163,7 +172,7 @@ class ApiCSPostComment extends ApiBase { $associated_page->getTitle()->getPrefixedText(); if ( class_exists( 'PageProps' ) ) { $associated_title = $associated_page->getTitle(); - $values = PageProps::getInstance()->getProperties( $associated_title, + $values = \PageProps::getInstance()->getProperties( $associated_title, 'displaytitle' ); if ( array_key_exists( $associated_title->getArticleID(), $values ) ) { $associated_page_display_title = @@ -181,7 +190,7 @@ class ApiCSPostComment extends ApiBase { 'comment_wikitext' => $comment->getWikitext() ]; - if ( !is_null( $parent_id ) ) { + if ( $parent_id !== null ) { EchoEvent::create( [ 'type' => 'commentstreams-reply-on-watched-page', 'title' => $associated_page->getTitle(), @@ -215,7 +224,6 @@ class ApiCSPostComment extends ApiBase { $logEntry->setPerformer( $this->getUser() ); $logEntry->setTarget( $title ); $logid = $logEntry->insert(); - $logEntry->publish($logid); } /** diff --git a/CommentStreams/includes/ApiCSQueryComment.php b/CommentStreams/includes/ApiCSQueryComment.php index d0d290fb..a27196ee 100644 --- a/CommentStreams/includes/ApiCSQueryComment.php +++ b/CommentStreams/includes/ApiCSQueryComment.php @@ -21,6 +21,8 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + class ApiCSQueryComment extends ApiCSBase { /** diff --git a/CommentStreams/includes/ApiCSUnwatch.php b/CommentStreams/includes/ApiCSUnwatch.php index 85d746e3..27251f97 100644 --- a/CommentStreams/includes/ApiCSUnwatch.php +++ b/CommentStreams/includes/ApiCSUnwatch.php @@ -21,6 +21,8 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + class ApiCSUnwatch extends ApiCSBase { /** @@ -42,7 +44,7 @@ class ApiCSUnwatch extends ApiCSBase { 'commentstreams-api-error-unwatch-notloggedin' ); } - if ( !is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() !== null ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-unwatch-nounwatchonreply' ); } diff --git a/CommentStreams/includes/ApiCSVote.php b/CommentStreams/includes/ApiCSVote.php index e93021f1..3e92c346 100644 --- a/CommentStreams/includes/ApiCSVote.php +++ b/CommentStreams/includes/ApiCSVote.php @@ -21,6 +21,10 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use ApiBase; + class ApiCSVote extends ApiCSBase { /** @@ -44,7 +48,7 @@ class ApiCSVote extends ApiCSBase { $vote = $this->getMain()->getVal( 'vote' ); - if ( !is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() !== null ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-vote-novoteonreply' ); } @@ -58,7 +62,7 @@ class ApiCSVote extends ApiCSBase { } /** - * @return array allowed paramters + * @return array allowed parameters */ public function getAllowedParams() { return array_merge( parent::getAllowedParams(), diff --git a/CommentStreams/includes/ApiCSWatch.php b/CommentStreams/includes/ApiCSWatch.php index a1a67072..8c4e9e8c 100644 --- a/CommentStreams/includes/ApiCSWatch.php +++ b/CommentStreams/includes/ApiCSWatch.php @@ -21,6 +21,8 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + class ApiCSWatch extends ApiCSBase { /** @@ -42,7 +44,7 @@ class ApiCSWatch extends ApiCSBase { 'commentstreams-api-error-watch-notloggedin' ); } - if ( !is_null( $this->comment->getParentId() ) ) { + if ( $this->comment->getParentId() !== null ) { $this->dieCustomUsageMessage( 'commentstreams-api-error-watch-nowatchonreply' ); } diff --git a/CommentStreams/includes/Comment.php b/CommentStreams/includes/Comment.php index 27a8300c..755c24c3 100644 --- a/CommentStreams/includes/Comment.php +++ b/CommentStreams/includes/Comment.php @@ -21,6 +21,21 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use Html; +use MediaWiki\MediaWikiServices; +use MWTimestamp; +use Parser; +use ParserOptions; +use SMWDataItem; +use SMWUpdateJob; +use Title; +use User; +use wAvatar; +use WikiPage; +use WikitextContent; + class Comment { // wiki page object for this comment wiki page @@ -73,7 +88,7 @@ class Comment { * error */ public static function newFromWikiPage( $wikipage ) { - if ( !is_null( $wikipage ) && + if ( $wikipage !== null && $wikipage->getTitle()->getNamespace() === NS_COMMENTSTREAMS ) { $comment = new Comment( $wikipage ); if ( $wikipage->exists() ) { @@ -100,10 +115,10 @@ class Comment { */ public static function newFromValues( $assoc_page_id, $parent_page_id, $comment_title, $wikitext, $user ) { - if ( is_null( $comment_title ) && is_null( $parent_page_id ) ) { + if ( $comment_title === null && $parent_page_id === null ) { return null; } - if ( !is_null( $comment_title ) && !is_null( $parent_page_id ) ) { + if ( $comment_title !== null && $parent_page_id !== null ) { return null; } $annotated_wikitext = self::addAnnotations( $wikitext, $comment_title, @@ -114,9 +129,20 @@ class Comment { $index = wfRandomString(); $title = Title::newFromText( (string)$index, NS_COMMENTSTREAMS ); if ( !$title->isDeletedQuick() && !$title->exists() ) { - if ( !$title->userCan( 'cs-comment' ) ) { - return null; + if ( class_exists( 'MediaWiki\Permissions\PermissionManager' ) ) { + // MW 1.33+ + if ( !MediaWikiServices::getInstance() + ->getPermissionManager() + ->userCan( 'cs-comment', $user, $title ) + ) { + return null; + } + } else { + if ( !$title->userCan( 'cs-comment' ) ) { + return null; + } } + $wikipage = new WikiPage( $title ); $status = $wikipage->doEditContent( $content, '', EDIT_NEW | EDIT_SUPPRESS_RC, false, $user, null ); @@ -152,15 +178,15 @@ class Comment { } $comment->loadFromValues( $assoc_page_id, $parent_page_id, $comment_title ); - if ( is_null( $parent_page_id ) ) { + if ( $parent_page_id === null ) { $comment->watch( $user ); } else { self::watchComment( $parent_page_id, $user ); } if ( defined( 'SMW_VERSION' ) ) { - $job = new SMWUpdateJob( $title ); - JobQueueGroup::singleton()->push( $job ); + $job = new SMWUpdateJob( $title, [] ); + \JobQueueGroup::singleton()->push( $job ); } return $comment; @@ -195,7 +221,7 @@ class Comment { if ( $result ) { $this->assoc_page_id = (int)$result->cst_assoc_page_id; $this->parent_page_id = $result->cst_parent_page_id; - if ( !is_null( $this->parent_page_id ) ) { + if ( $this->parent_page_id !== null ) { $this->parent_page_id = (int)$this->parent_page_id; } $this->comment_title = $result->cst_comment_title; @@ -215,7 +241,7 @@ class Comment { $comment_title ) { $this->assoc_page_id = (int)$assoc_page_id; $this->parent_page_id = $parent_page_id; - if ( !is_null( $this->parent_page_id ) ) { + if ( $this->parent_page_id !== null ) { $this->parent_page_id = (int)$this->parent_page_id; } $this->comment_title = $comment_title; @@ -271,9 +297,9 @@ class Comment { * @return string wikitext of the comment */ public function getWikiText() { - if ( is_null( $this->wikitext ) ) { - $wikitext = ContentHandler::getContentText( $this->wikipage->getContent( - Revision::RAW ) ); + if ( $this->wikitext === null ) { + $wikitext = \ContentHandler::getContentText( $this->wikipage->getContent( + \Revision::RAW ) ); $wikitext = $this->removeAnnotations( $wikitext ); $this->wikitext = $wikitext; } @@ -284,10 +310,16 @@ class Comment { * @return string parsed HTML of the comment */ public function getHTML() { - if ( is_null( $this->html ) ) { + if ( $this->html === null ) { $this->getWikiText(); - if ( !is_null( $this->wikitext ) ) { - $parser = new Parser; + if ( $this->wikitext !== null ) { + if ( class_exists( \ParserFactory::class ) ) { + // @requires MediaWiki >= 1.32.0 + $parser = MediaWikiServices::getInstance()->getParserFactory()->create(); + } else { + $parser = new Parser(); + } + $this->html = $parser->parse( $this->wikitext, $this->wikipage->getTitle(), new ParserOptions )->getText(); } @@ -299,7 +331,7 @@ class Comment { * @return User the author of this comment */ public function getUser() { - if ( is_null( $this->user ) ) { + if ( $this->user === null ) { $user_id = $this->wikipage->getOldestRevision()->getUser(); $this->user = User::newFromId( $user_id ); } @@ -342,7 +374,7 @@ class Comment { * @return string the URL of the avatar of the author of this comment */ public function getAvatar() { - if ( is_null( $this->avatar ) ) { + if ( $this->avatar === null ) { if ( class_exists( 'wAvatar' ) ) { // from Extension:SocialProfile $avatar = new wAvatar( $this->getUser()->getId(), 'l' ); @@ -359,7 +391,7 @@ class Comment { * @return MWTimestamp the earliest revision date for this */ public function getCreationTimestamp() { - if ( is_null( $this->creation_timestamp ) ) { + if ( $this->creation_timestamp === null ) { $this->creation_timestamp = MWTimestamp::getLocalInstance( $this->wikipage->getTitle()->getEarliestRevTime() ); } @@ -370,11 +402,7 @@ class Comment { * @return MWTimestamp the earliest revision date for this */ public function getCreationDate() { - if ( !is_null( $this->getCreationTimestamp() ) ) { - $user = RequestContext::getMain()->getUser(); - if ($user && !$user->isAnon()) { - $this->creation_timestamp->offsetForUser($user); - } + if ( $this->getCreationTimestamp() !== null ) { return $this->creation_timestamp->format( "M j \a\\t g:i a" ); } return ""; @@ -384,13 +412,20 @@ class Comment { * @return MWTimestamp the latest revision date for this */ public function getModificationTimestamp() { - if ( is_null( $this->modification_timestamp ) ) { + if ( $this->modification_timestamp === null ) { $title = $this->wikipage->getTitle(); if ( $title->getFirstRevision()->getId() === $title->getLatestRevID() ) { return null; } - $timestamp = Revision::getTimestampFromId( $title, - $title->getLatestRevID() ); + + $revStore = MediaWikiServices::getInstance()->getRevisionStore(); + $latestRev = $title->getLatestRevId(); + if ( version_compare( MW_VERSION, '1.34', '<' ) ) { + $timestamp = $revStore->getTimestampFromId( $title, $latestRev ); + } else { + $timestamp = $revStore->getTimestampFromId( $latestRev ); + } + $this->modification_timestamp = MWTimestamp::getLocalInstance( $timestamp ); } @@ -401,11 +436,7 @@ class Comment { * @return MWTimestamp the earliest revision date for this */ public function getModificationDate() { - if ( !is_null( $this->getModificationTimestamp() ) ) { - $user = RequestContext::getMain()->getUser(); - if ($user && !$user->isAnon()) { - $this->modification_timestamp->offsetForUser($user); - } + if ( $this->getModificationTimestamp() !== null ) { return $this->modification_timestamp->format( "M j \a\\t g:i a" ); } return null; @@ -415,7 +446,7 @@ class Comment { * @return int number of replies */ public function getNumReplies() { - if ( is_null( $this->num_replies ) ) { + if ( $this->num_replies === null ) { $dbr = wfGetDB( DB_REPLICA ); $this->num_replies = $dbr->selectRowCount( 'cs_comment_data', @@ -491,7 +522,7 @@ class Comment { * @return int number of up votes */ public function getNumUpVotes() { - if ( is_null( $this->num_up_votes ) ) { + if ( $this->num_up_votes === null ) { $dbr = wfGetDB( DB_REPLICA ); $this->num_up_votes = $dbr->selectRowCount( 'cs_votes', @@ -510,7 +541,7 @@ class Comment { * @return int number of down votes */ public function getNumDownVotes() { - if ( is_null( $this->num_down_votes ) ) { + if ( $this->num_down_votes === null ) { $dbr = wfGetDB( DB_REPLICA ); $this->num_down_votes = $dbr->selectRowCount( 'cs_votes', @@ -530,7 +561,7 @@ class Comment { * * @param string $vote 1 for up vote, -1 for down vote, 0 for no vote * @param User $user the user voting on the comment - * @return database status code + * @return bool database status code */ public function vote( $vote, $user ) { if ( $vote !== "-1" && $vote !== "0" && $vote !== "1" ) { @@ -599,7 +630,7 @@ class Comment { * watch a comment (get page ID from this comment) * * @param User $user the user watching the comment - * @return database true for OK, false for error + * @return bool database true for OK, false for error */ public function watch( $user ) { return self::watchComment( $this->getID(), $user ); @@ -608,9 +639,9 @@ class Comment { /** * watch a comment (get page ID from parameter) * - * @param $pageid the page ID of the comment to watch + * @param int $pageid the page ID of the comment to watch * @param User $user the user watching the comment - * @return database true for OK, false for error + * @return bool database true for OK, false for error */ private static function watchComment( $pageid, $user ) { if ( self::isWatchingComment( $pageid, $user ) ) { @@ -632,7 +663,7 @@ class Comment { * unwatch a comment * * @param User $user the user unwatching the comment - * @return database true for OK, false for error + * @return bool database true for OK, false for error */ public function unwatch( $user ) { if ( !$this->isWatching( $user ) ) { @@ -654,7 +685,7 @@ class Comment { * Check if a particular user is watching this comment * * @param User $user the user watching the comment - * @return database true for OK, false for error + * @return bool database true for OK, false for error */ public function isWatching( $user ) { return self::isWatchingComment( $this->getId(), $user ); @@ -663,9 +694,9 @@ class Comment { /** * Check if a particular user is watching a comment * - * @param $pageid the page ID of the comment to check + * @param int $pageid the page ID of the comment to check * @param User $user the user watching the comment - * @return database true for OK, false for error + * @return bool database true for OK, false for error */ private static function isWatchingComment( $pageid, $user ) { $dbr = wfGetDB( DB_REPLICA ); @@ -724,10 +755,10 @@ class Comment { * @return bool true if successful */ public function update( $comment_title, $wikitext, $user ) { - if ( is_null( $comment_title ) && is_null( $this->getParentId() ) ) { + if ( $comment_title === null && $this->getParentId() === null ) { return false; } - if ( !is_null( $comment_title ) && !is_null( $this->getParentId() ) ) { + if ( $comment_title !== null && $this->getParentId() !== null ) { return false; } $annotated_wikitext = @@ -765,17 +796,28 @@ class Comment { /** * delete comment from database * + * @param User $deleter * @return bool true if successful */ - public function delete() { - $pageid = $this->getId(); + public function delete( User $deleter ) { + if ( version_compare( MW_VERSION, '1.35', '<' ) ) { + $status = $this->getWikiPage()->doDeleteArticleReal( + 'comment deleted', + true + ); + } else { + $status = $this->getWikiPage()->doDeleteArticleReal( + 'comment deleted', + $deleter, + true + ); + } - $status = $this->getWikiPage()->doDeleteArticleReal( 'comment deleted', - true, 0 ); if ( !$status->isOK() && !$status->isGood() ) { return false; } + $pageid = $this->getId(); $dbw = wfGetDB( DB_MASTER ); $result = $dbw->delete( 'cs_comment_data', @@ -797,7 +839,7 @@ class Comment { */ public static function addAnnotations( $wikitext, $comment_title, $assoc_page_id ) { - if ( !is_null( $comment_title ) ) { + if ( $comment_title !== null ) { $wikitext .= <<<EOT {{DISPLAYTITLE: $comment_title @@ -815,7 +857,7 @@ EOT; */ public function removeAnnotations( $wikitext ) { $comment_title = $this->getCommentTitle(); - if ( !is_null( $comment_title ) ) { + if ( $comment_title !== null ) { $strip = <<<EOT {{DISPLAYTITLE: $comment_title @@ -849,7 +891,7 @@ EOT; $page_id = $row->cst_page_id; $wikipage = WikiPage::newFromId( $page_id ); $comment = self::newFromWikiPage( $wikipage ); - if ( !is_null( $comment ) ) { + if ( $comment !== null ) { $comments[] = $comment; } } @@ -879,7 +921,7 @@ EOT; $page_id = $row->cst_page_id; $wikipage = WikiPage::newFromId( $page_id ); $comment = self::newFromWikiPage( $wikipage ); - if ( !is_null( $comment ) ) { + if ( $comment !== null ) { $comments[] = $comment; } } @@ -905,23 +947,23 @@ EOT; } $userpage = $user->getUserPage(); $displayname = null; - if ( !is_null( $GLOBALS['wgCommentStreamsUserRealNamePropertyName'] ) ) { + if ( $GLOBALS['wgCommentStreamsUserRealNamePropertyName'] !== null ) { $displayname = self::getUserProperty( $user, $GLOBALS['wgCommentStreamsUserRealNamePropertyName'] ); } - if ( is_null( $displayname ) || strlen( $displayname ) == 0 ) { + if ( $displayname === null || strlen( $displayname ) == 0 ) { if ( class_exists( 'PageProps' ) ) { - $values = PageProps::getInstance()->getProperties( $userpage, + $values = \PageProps::getInstance()->getProperties( $userpage, 'displaytitle' ); if ( array_key_exists( $userpage->getArticleID(), $values ) ) { $displayname = $values[$userpage->getArticleID()]; } } } - if ( is_null( $displayname ) || strlen( $displayname ) == 0 ) { + if ( $displayname === null || strlen( $displayname ) == 0 ) { $displayname = $user->getRealName(); } - if ( is_null( $displayname ) || strlen( $displayname ) == 0 ) { + if ( $displayname === null || strlen( $displayname ) == 0 ) { $displayname = $user->getName(); } if ( $linked && $userpage->exists() ) { @@ -938,13 +980,13 @@ EOT; */ public static function getAvatarFromUser( $user ) { $avatar = null; - if ( !is_null( $GLOBALS['wgCommentStreamsUserAvatarPropertyName'] ) ) { + if ( $GLOBALS['wgCommentStreamsUserAvatarPropertyName'] !== null ) { $avatar = self::getUserProperty( $user, $GLOBALS['wgCommentStreamsUserAvatarPropertyName'] ); - if ( !is_null( $avatar ) ) { + if ( $avatar !== null ) { if ( gettype( $avatar ) === 'string' ) { $avatar = Title::newFromText( $avatar ); - if ( is_null( $avatar ) ) { + if ( $avatar === null ) { return null; } } @@ -952,7 +994,13 @@ EOT; return null; } if ( $avatar->isKnown() && $avatar->getNamespace() === NS_FILE ) { - $file = wfFindFile( $avatar ); + if ( method_exists( MediaWikiServices::class, 'getRepoGroup' ) ) { + // MediaWiki 1.34+ + $file = MediaWikiServices::getInstance()->getRepoGroup() + ->findFile( $avatar ); + } else { + $file = wfFindFile( $avatar ); + } if ( $file ) { return $file->getFullUrl(); } @@ -974,9 +1022,9 @@ EOT; $userpage = $user->getUserPage(); if ( $userpage->exists() ) { $store = \SMW\StoreFactory::getStore(); - $subject = SMWDIWikiPage::newFromTitle( $userpage ); + $subject = \SMWDIWikiPage::newFromTitle( $userpage ); $data = $store->getSemanticData( $subject ); - $property = SMWDIProperty::newFromUserLabel( $propertyName ); + $property = \SMWDIProperty::newFromUserLabel( $propertyName ); $values = $data->getPropertyValues( $property ); if ( count( $values ) > 0 ) { // this property should only have one value so pick the first one @@ -1002,9 +1050,9 @@ EOT; public static function locateUsersWatchingComment( $event ) { $id = $event->getExtraParam( 'parent_id' ); $wikipage = WikiPage::newFromId( $id ); - if ( !is_null( $wikipage ) ) { + if ( $wikipage !== null ) { $comment = self::newFromWikiPage( $wikipage ); - if ( !is_null( $comment ) ) { + if ( $comment !== null ) { return $comment->getWatchers(); } } diff --git a/CommentStreams/includes/CommentStreams.php b/CommentStreams/includes/CommentStreams.php index fba47e54..d7426969 100644 --- a/CommentStreams/includes/CommentStreams.php +++ b/CommentStreams/includes/CommentStreams.php @@ -21,6 +21,11 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use ExtensionRegistry; +use MWNamespace; + class CommentStreams { // CommentStreams singleton instance @@ -39,7 +44,7 @@ class CommentStreams { * @return CommentStreams a singleton CommentStreams instance */ public static function singleton() { - if ( is_null( self::$instance ) ) { + if ( self::$instance === null ) { self::$instance = new CommentStreams(); } return self::$instance; @@ -86,7 +91,7 @@ class CommentStreams { * checks to see if comments should be displayed on this page * * @param OutputPage $output the OutputPage object - * @return boolean true if comments should be displayed on this page + * @return bool true if comments should be displayed on this page */ private function checkDisplayComments( $output ) { // don't display comments on this page if they are explicitly disabled @@ -95,14 +100,14 @@ class CommentStreams { } // don't display comments on any page action other than view action - if ( Action::getActionName( $output->getContext() ) !== "view" ) { + if ( \Action::getActionName( $output->getContext() ) !== "view" ) { return false; } // if $wgCommentStreamsAllowedNamespaces is not set, display comments // in all content namespaces $csAllowedNamespaces = $GLOBALS['wgCommentStreamsAllowedNamespaces']; - if ( is_null( $csAllowedNamespaces ) ) { + if ( $csAllowedNamespaces === null ) { $csAllowedNamespaces = $GLOBALS['wgContentNamespaces']; } elseif ( !is_array( $csAllowedNamespaces ) ) { $csAllowedNamespaces = [ $csAllowedNamespaces ]; @@ -246,14 +251,15 @@ class CommentStreams { * return all discussions (top level comments) in an array of comments * * @param array $allComments an array of all comments on a page - * @param boolean $newestOnTop true if array should be sorted from newest to + * @param bool $newestOnTop true if array should be sorted from newest to + * @param bool $enableVoting * @return array an array of all discussions * oldest */ private function getDiscussions( $allComments, $newestOnTop, $enableVoting ) { $array = array_filter( $allComments, function ( $comment ) { - return is_null( $comment->getParentId() ); + return $comment->getParentId() === null; } ); usort( $array, function ( $comment1, $comment2 ) use ( $newestOnTop, $enableVoting ) { diff --git a/CommentStreams/includes/CommentStreamsAllComments.alias.php b/CommentStreams/includes/CommentStreamsAllComments.alias.php index 7a213537..841defd1 100644 --- a/CommentStreams/includes/CommentStreamsAllComments.alias.php +++ b/CommentStreams/includes/CommentStreamsAllComments.alias.php @@ -34,7 +34,7 @@ $specialPageAliases['he'] = [ 'CommentStreamsAllComments' => [ 'כל_התגובות' ] ]; -/** Serbian Cyrilic (српски (ћирлица)) */ +/** Serbian Cyrillic (српски (ћирлица)) */ $specialPageAliases['sr-ec'] = [ 'CommentStreamsAllComments' => [ 'Сви_коментари' ] ]; diff --git a/CommentStreams/includes/CommentStreamsAllComments.php b/CommentStreams/includes/CommentStreamsAllComments.php index 52eea7b1..c11810e7 100644 --- a/CommentStreams/includes/CommentStreamsAllComments.php +++ b/CommentStreams/includes/CommentStreamsAllComments.php @@ -22,6 +22,13 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use Html; +use SpecialPage; +use Title; +use WikiPage; + class CommentStreamsAllComments extends SpecialPage { public function __construct() { @@ -75,11 +82,11 @@ class CommentStreamsAllComments extends SpecialPage { if ( $index < $limit ) { $wikipage = WikiPage::newFromId( $page->page_id ); $comment = Comment::newFromWikiPage( $wikipage ); - if ( !is_null( $comment ) ) { + if ( $comment !== null ) { $pagename = $comment->getWikiPage()->getTitle()->getPrefixedText(); $associatedpageid = $comment->getAssociatedId(); $associatedpage = WikiPage::newFromId( $associatedpageid ); - if ( !is_null( $associatedpage ) ) { + if ( $associatedpage !== null ) { $associatedpagename = '[[' . $associatedpage->getTitle()->getPrefixedText() . ']]'; $author = $comment->getUser(); @@ -90,11 +97,11 @@ class CommentStreamsAllComments extends SpecialPage { $author = $author->getName(); } $modificationdate = $comment->getModificationDate(); - if ( is_null( $modificationdate ) ) { + if ( $modificationdate === null ) { $lasteditor = ''; } else { $lasteditor = - User::newFromId( $wikipage->getRevision()->getUser() ); + \User::newFromId( $wikipage->getRevision()->getUser() ); if ( $lasteditor->isAnon() ) { $lasteditor = '<i>' . wfMessage( 'commentstreams-author-anonymous' ) . '</i>'; @@ -111,7 +118,7 @@ class CommentStreamsAllComments extends SpecialPage { $wikitext .= '| ' . $lasteditor . PHP_EOL; $wikitext .= '| ' . $comment->getCreationDate() . PHP_EOL; $wikitext .= '| ' . $modificationdate . PHP_EOL; - $index ++; + $index++; } } } else { @@ -120,7 +127,11 @@ class CommentStreamsAllComments extends SpecialPage { } $wikitext .= '|}' . PHP_EOL; - $this->getOutput()->addWikiText( $wikitext ); + if ( method_exists( 'OutputPage', 'addWikiTextAsInterface' ) ) { + $this->getOutput()->addWikiTextAsInterface( $wikitext ); + } else { + $this->getOutput()->addWikiText( $wikitext ); + } if ( $offset > 0 || $more ) { $this->addTableNavigation( $offset, $more, $limit, 'offset' ); diff --git a/CommentStreams/includes/CommentStreamsHooks.php b/CommentStreams/includes/CommentStreamsHooks.php index 6bfcf99a..38afb6d3 100644 --- a/CommentStreams/includes/CommentStreamsHooks.php +++ b/CommentStreams/includes/CommentStreamsHooks.php @@ -21,6 +21,24 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use Article; +use DatabaseUpdater; +use MediaWiki; +use OutputPage; +use Parser; +use PPFrame; +use SearchResult; +use Skin; +use SMW\DIWikiPage; +use SpecialSearch; +use Status; +use Title; +use User; +use WebRequest; +use WikiPage; + class CommentStreamsHooks { /** @@ -92,16 +110,16 @@ class CommentStreamsHooks { } $wikipage = new WikiPage( $title ); $comment = Comment::newFromWikiPage( $wikipage ); - if ( !is_null( $comment ) ) { + if ( $comment !== null ) { $commentTitle = $comment->getCommentTitle(); - if ( !is_null( $commentTitle ) ) { + if ( $commentTitle !== null ) { $output->setPageTitle( $commentTitle ); } $associatedTitle = Title::newFromId( $comment->getAssociatedId() ); - if ( !is_null( $associatedTitle ) ) { + if ( $associatedTitle !== null ) { $values = []; if ( class_exists( 'PageProps' ) ) { - $values = PageProps::getInstance()->getProperties( $associatedTitle, + $values = \PageProps::getInstance()->getProperties( $associatedTitle, 'displaytitle' ); } if ( array_key_exists( $comment->getAssociatedId(), $values ) ) { @@ -117,7 +135,11 @@ class CommentStreamsHooks { wfMessage( 'commentstreams-error-comment-on-deleted-page' )->text(); $output->addHTML( '<p class="error">' . $message . '</p>' ); } - $output->addWikitext( $comment->getHTML() ); + if ( method_exists( 'OutputPage', 'addWikiTextAsInterface' ) ) { + $output->addWikiTextAsInterface( $comment->getHTML() ); + } else { + $output->addWikiText( $comment->getHTML() ); + } } return false; } @@ -213,11 +235,11 @@ class CommentStreamsHooks { */ public static function onParserSetup( Parser $parser ) { $parser->setHook( 'comment-streams', - 'CommentStreamsHooks::enableCommentStreams' ); + 'MediaWiki\Extension\CommentStreams\CommentStreamsHooks::enableCommentStreams' ); $parser->setHook( 'no-comment-streams', - 'CommentStreamsHooks::disableCommentStreams' ); + 'MediaWiki\Extension\CommentStreams\CommentStreamsHooks::disableCommentStreams' ); $parser->setHook( 'comment-streams-initially-collapsed', - 'CommentStreamsHooks::initiallyCollapseCommentStreams' ); + 'MediaWiki\Extension\CommentStreams\CommentStreamsHooks::initiallyCollapseCommentStreams' ); return true; } @@ -233,7 +255,7 @@ class CommentStreamsHooks { */ public static function enableCommentStreams( $input, array $args, Parser $parser, PPFrame $frame ) { - $parser->disableCache(); + $parser->getOutput()->updateCacheExpiry( 0 ); $cs = CommentStreams::singleton(); $cs->enableCommentsOnPage(); if ( isset( $args['location'] ) && $args['location'] === 'footer' ) { @@ -256,7 +278,7 @@ class CommentStreamsHooks { */ public static function disableCommentStreams( $input, array $args, Parser $parser, PPFrame $frame ) { - $parser->disableCache(); + $parser->getOutput()->updateCacheExpiry( 0 ); $cs = CommentStreams::singleton(); $cs->disableCommentsOnPage(); return ""; @@ -274,7 +296,7 @@ class CommentStreamsHooks { */ public static function initiallyCollapseCommentStreams( $input, array $args, Parser $parser, PPFrame $frame ) { - $parser->disableCache(); + $parser->getOutput()->updateCacheExpiry( 0 ); $cs = CommentStreams::singleton(); $cs->initiallyCollapseCommentsOnPage(); return ""; @@ -312,9 +334,9 @@ class CommentStreamsHooks { public static function showSearchHitTitle( Title &$title, &$text, SearchResult $result, array $terms, SpecialSearch $page ) { $comment = Comment::newFromWikiPage( WikiPage::factory( $title ) ); - if ( !is_null( $comment ) ) { + if ( $comment !== null ) { $t = Title::newFromId( $comment->getAssociatedId() ); - if ( !is_null( $t ) ) { + if ( $t !== null ) { $title = $t; } } @@ -322,9 +344,21 @@ class CommentStreamsHooks { } /** + * Implements SMW::Settings::BeforeInitializationComplete callback. + * See https://github.com/SemanticMediaWiki/SemanticMediaWiki/blob/master/docs/technical/hooks/hook.settings.beforeinitializationcomplete.md + * Defines CommentStreams namespace constants. + * + * @param array &$configuration An array of the configuration options + */ + public static function onSMWInitialization( array &$configuration ) { + $namespace = $GLOBALS['wgCommentStreamsNamespaceIndex']; + $configuration['smwgNamespacesWithSemanticLinks'][$namespace] = true; + } + + /** * Implements extension registration callback. * See https://www.mediawiki.org/wiki/Manual:Extension_registration#Customizing_registration - * Defines CommentStreams namespace constants. + * Sets configuration constants. * */ public static function onRegistration() { @@ -332,7 +366,6 @@ class CommentStreamsHooks { define( 'NS_COMMENTSTREAMS_TALK', $GLOBALS['wgCommentStreamsNamespaceIndex'] + 1 ); $GLOBALS['wgNamespacesToBeSearchedDefault'][NS_COMMENTSTREAMS] = true; - $GLOBALS['smwgNamespacesWithSemanticLinks'][NS_COMMENTSTREAMS] = true; $found = false; foreach ( $GLOBALS['wgGroupPermissions'] as $groupperms ) { if ( isset( $groupperms['cs-comment'] ) ) { @@ -392,40 +425,40 @@ class CommentStreamsHooks { */ public static function updateData( $store, $semanticData ) { $subject = $semanticData->getSubject(); - if ( !is_null( $subject ) && !is_null( $subject->getTitle() ) && + if ( $subject !== null && $subject->getTitle() !== null && $subject->getTitle()->getNamespace() === NS_COMMENTSTREAMS ) { $page_id = $subject->getTitle()->getArticleID( Title::GAID_FOR_UPDATE ); $wikipage = WikiPage::newFromId( $page_id ); $comment = Comment::newFromWikiPage( $wikipage ); - if ( is_null( $comment ) ) { + if ( $comment === null ) { return true; } $assoc_page_id = $comment->getAssociatedId(); - if ( !is_null( $assoc_page_id ) ) { + if ( $assoc_page_id !== null ) { $assoc_wikipage = WikiPage::newFromId( $assoc_page_id ); - if ( !is_null( $assoc_wikipage ) ) { + if ( $assoc_wikipage !== null ) { $propertyDI = new SMW\DIProperty( '___CS_ASSOCPG' ); $dataItem = - SMW\DIWikiPage::newFromTitle( $assoc_wikipage->getTitle() ); + DIWikiPage::newFromTitle( $assoc_wikipage->getTitle() ); $semanticData->addPropertyObjectValue( $propertyDI, $dataItem ); } } $parent_page_id = $comment->getParentId(); - if ( !is_null( $parent_page_id ) ) { + if ( $parent_page_id !== null ) { $parent_wikipage = WikiPage::newFromId( $parent_page_id ); - if ( !is_null( $parent_wikipage ) ) { + if ( $parent_wikipage !== null ) { $propertyDI = new SMW\DIProperty( '___CS_REPLYTO' ); $dataItem = - SMW\DIWikiPage::newFromTitle( $parent_wikipage->getTitle() ); + DIWikiPage::newFromTitle( $parent_wikipage->getTitle() ); $semanticData->addPropertyObjectValue( $propertyDI, $dataItem ); } } $commentTitle = $comment->getCommentTitle(); - if ( !is_null( $commentTitle ) ) { + if ( $commentTitle !== null ) { $propertyDI = new SMW\DIProperty( '___CS_TITLE' ); $dataItem = new SMWDIBlob( $comment->getCommentTitle() ); $semanticData->addPropertyObjectValue( $propertyDI, $dataItem ); diff --git a/CommentStreams/includes/CommentStreamsUtils.php b/CommentStreams/includes/CommentStreamsUtils.php index 10d3446e..1e09303c 100644 --- a/CommentStreams/includes/CommentStreamsUtils.php +++ b/CommentStreams/includes/CommentStreamsUtils.php @@ -19,7 +19,11 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use Linker; use MediaWiki\MediaWikiServices; +use Title; class CommentStreamsUtils { @@ -33,7 +37,7 @@ class CommentStreamsUtils { if ( method_exists( 'MediaWikiServices', 'getLinkRenderer' ) ) { $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); return $linkRenderer->makeLink( $title, $display ); - }; + } return Linker::link( $title, $display ); } } diff --git a/CommentStreams/includes/EchoCSPresentationModel.php b/CommentStreams/includes/EchoCSPresentationModel.php index bc6786cf..3dba5cc9 100644 --- a/CommentStreams/includes/EchoCSPresentationModel.php +++ b/CommentStreams/includes/EchoCSPresentationModel.php @@ -21,6 +21,10 @@ * DEALINGS IN THE SOFTWARE. */ +namespace MediaWiki\Extension\CommentStreams; + +use EchoEventPresentationModel; + class EchoCSPresentationModel extends EchoEventPresentationModel { /** @@ -81,6 +85,6 @@ class EchoCSPresentationModel extends EchoEventPresentationModel { * @inheritDoc */ public function canRender() { - return !is_null( $this->event->getTitle() ); + return $this->event->getTitle() !== null; } } diff --git a/CommentStreams/package-lock.json b/CommentStreams/package-lock.json new file mode 100644 index 00000000..a48acfe0 --- /dev/null +++ b/CommentStreams/package-lock.json @@ -0,0 +1,1864 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "JSV": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", + "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "~5.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "grunt": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz", + "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==", + "dev": true, + "requires": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.3.2", + "grunt-known-options": "~1.1.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.0", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + }, + "dependencies": { + "grunt-cli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", + "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", + "dev": true, + "requires": { + "grunt-known-options": "~1.1.0", + "interpret": "~1.1.0", + "liftoff": "~2.5.0", + "nopt": "~4.0.1", + "v8flags": "~3.1.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + } + } + }, + "grunt-banana-checker": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.9.0.tgz", + "integrity": "sha512-SqPiB6OazWqR8USL0NymtuT5Br3mD9WBBsM1rHC/3wIi2SrZNM6/+j9CIeuEM5oCn+AtO2Y0+rzzFyOdC9afAg==", + "dev": true + }, + "grunt-jsonlint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-jsonlint/-/grunt-jsonlint-1.1.0.tgz", + "integrity": "sha1-ox7pckCu4/NDyiY8Rb1TIGMSfbI=", + "dev": true, + "requires": { + "jsonlint": "1.6.2", + "strip-json-comments": "^2.0.0" + } + }, + "grunt-known-options": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "dev": true + }, + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "requires": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "requires": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-util": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz", + "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==", + "dev": true, + "requires": { + "async": "~1.5.2", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.20", + "underscore.string": "~3.3.5", + "which": "~1.3.0" + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsonlint": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz", + "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=", + "dev": true, + "requires": { + "JSV": ">= 4.0.x", + "nomnom": ">= 1.5.x" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "underscore.string": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "dev": true, + "requires": { + "sprintf-js": "^1.0.3", + "util-deprecate": "^1.0.2" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/CommentStreams/package.json b/CommentStreams/package.json index bcf5b133..ec570705 100644 --- a/CommentStreams/package.json +++ b/CommentStreams/package.json @@ -4,8 +4,8 @@ "test": "grunt test" }, "devDependencies": { - "grunt": "1.0.1", - "grunt-banana-checker": "0.5.0", + "grunt": "1.3.0", + "grunt-banana-checker": "0.9.0", "grunt-jsonlint": "1.1.0" } } diff --git a/CommentStreams/resources/CommentStreams.css b/CommentStreams/resources/CommentStreams.css index 574e6a82..0e1b648e 100644 --- a/CommentStreams/resources/CommentStreams.css +++ b/CommentStreams/resources/CommentStreams.css @@ -107,7 +107,7 @@ padding-left: 5px; } -button:hover { +.cs-button:hover { background-color: #8eddf5; } diff --git a/CommentStreams/resources/CommentStreams.js b/CommentStreams/resources/CommentStreams.js index e16ed87e..45a2ce5a 100644 --- a/CommentStreams/resources/CommentStreams.js +++ b/CommentStreams/resources/CommentStreams.js @@ -333,7 +333,7 @@ var commentstreams_controller = ( function( mw, $ ) { .addClass( 'cs-comment-header-right' ); if ( commentData.parentid === null && this.enableWatchlist && - !mw.user.isAnon() ) { + !this.isLoggedIn ) { rightDiv.append( this.createWatchButton( commentData ) ); } @@ -437,7 +437,7 @@ var commentstreams_controller = ( function( mw, $ ) { 'data-toggle': 'tooltip' } ); var editimage = $( '<img>' ); - if ( mw.user.getName() !== username ) { + if ( mw.config.get( 'wgUserName' ) !== username ) { editimage .attr( { title: mw.message( 'commentstreams-buttontooltip-moderator-edit' ), @@ -471,7 +471,7 @@ var commentstreams_controller = ( function( mw, $ ) { 'data-toggle': 'tooltip' } ); var deleteimage = $( '<img>' ); - if ( mw.user.getName() !== username ) { + if ( mw.config.get( 'wgUserName' ) !== username ) { deleteimage .attr( { title: mw.message( 'commentstreams-buttontooltip-moderator-delete' ), @@ -553,10 +553,7 @@ var commentstreams_controller = ( function( mw, $ ) { var self = this; var upButton; - if ( mw.user.isAnon() ) { - upButton = $( '<span>' ) - .addClass( 'cs-button' ); - } else { + if ( this.isLoggedIn ) { upButton = $( '<button>' ) .addClass( 'cs-button' ) .addClass( 'cs-vote-button' ) @@ -564,6 +561,9 @@ var commentstreams_controller = ( function( mw, $ ) { self.vote( $( this ), commentData.pageid, true, commentData.created_timestamp ); } ); + } else { + upButton = $( '<span>' ) + .addClass( 'cs-button' ); } var upimage = $( '<img>' ) .attr( 'title', mw.message( 'commentstreams-buttontooltip-upvote' ) ) @@ -581,10 +581,7 @@ var commentstreams_controller = ( function( mw, $ ) { upButton.append( upcountspan ); var downButton; - if ( mw.user.isAnon() ) { - downButton = $( '<span>' ) - .addClass( 'cs-button' ); - } else { + if ( this.isLoggedIn ) { downButton = $( '<button>' ) .addClass( 'cs-button' ) .addClass( 'cs-vote-button' ) @@ -592,6 +589,9 @@ var commentstreams_controller = ( function( mw, $ ) { self.vote( $( this ), commentData.pageid, false, commentData.created_timestamp ); } ); + } else { + downButton = $( '<span>' ) + .addClass( 'cs-button' ); } var downimage = $( '<img>' ) .attr( 'title', mw.message( 'commentstreams-buttontooltip-downvote' ) ) @@ -1392,7 +1392,7 @@ var commentstreams_controller = ( function( mw, $ ) { }, canEdit: function( comment ) { var username = comment.username; - if ( !mw.user.isAnon() && ( mw.user.getName() === username || + if ( this.isLoggedIn && ( mw.config.get( 'wgUserName' ) === username || this.moderatorEdit ) ) { return true; } @@ -1400,8 +1400,8 @@ var commentstreams_controller = ( function( mw, $ ) { }, canDelete: function( comment ) { var username = comment.username; - if ( !mw.user.isAnon() && - ( mw.user.getName() === username || this.moderatorDelete ) && + if ( this.isLoggedIn && ( mw.config.get( 'wgUserName' ) === username || + this.moderatorDelete ) && ( comment.numreplies === 0 || this.moderatorFastDelete ) ) { return true; } diff --git a/CommentStreams/resources/CommentStreamsQuerier.js b/CommentStreams/resources/CommentStreamsQuerier.js index b124656a..84d92403 100644 --- a/CommentStreams/resources/CommentStreamsQuerier.js +++ b/CommentStreams/resources/CommentStreamsQuerier.js @@ -42,7 +42,7 @@ var commentstreams_querier = ( function( mw ) { api.post( { action: 'csDeleteComment', pageid: pageid, - token: mw.user.tokens.get( 'editToken' ) + token: mw.user.tokens.get( 'csrfToken' ) } ) .done( function( data ) { reply( data ); @@ -59,7 +59,7 @@ var commentstreams_querier = ( function( mw ) { action: 'csPostComment', wikitext: wikitext, associatedid: associatedid, - token: mw.user.tokens.get( 'editToken' ) + token: mw.user.tokens.get( 'csrfToken' ) }; if ( commenttitle !== null ) { data.commenttitle = commenttitle; @@ -85,7 +85,7 @@ var commentstreams_querier = ( function( mw ) { pageid: pageid, commenttitle: commenttitle, wikitext: wikitext, - token: mw.user.tokens.get( 'editToken' ) + token: mw.user.tokens.get( 'csrfToken' ) } ) .done( function( data ) { reply( data.csEditComment ); @@ -101,7 +101,7 @@ var commentstreams_querier = ( function( mw ) { action: 'csVote', pageid: pageid, vote: vote, - token: mw.user.tokens.get( 'editToken' ) + token: mw.user.tokens.get( 'csrfToken' ) } ) .done( function( data ) { reply( data.csVote ); @@ -116,7 +116,7 @@ var commentstreams_querier = ( function( mw ) { api.post( { action: action ? 'csWatch' : 'csUnwatch', pageid: pageid, - token: mw.user.tokens.get( 'editToken' ) + token: mw.user.tokens.get( 'csrfToken' ) } ) .done( function( data ) { if ( action ) { |