summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/MultimediaViewer/resources/mmv/model/mmv.model.Repo.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/MultimediaViewer/resources/mmv/model/mmv.model.Repo.js')
-rw-r--r--www/wiki/extensions/MultimediaViewer/resources/mmv/model/mmv.model.Repo.js209
1 files changed, 209 insertions, 0 deletions
diff --git a/www/wiki/extensions/MultimediaViewer/resources/mmv/model/mmv.model.Repo.js b/www/wiki/extensions/MultimediaViewer/resources/mmv/model/mmv.model.Repo.js
new file mode 100644
index 00000000..d23ac74b
--- /dev/null
+++ b/www/wiki/extensions/MultimediaViewer/resources/mmv/model/mmv.model.Repo.js
@@ -0,0 +1,209 @@
+/*
+ * This file is part of the MediaWiki extension MultimediaViewer.
+ *
+ * MultimediaViewer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MultimediaViewer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MultimediaViewer. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* eslint-disable no-use-before-define */
+
+( function ( mw, oo ) {
+ /**
+ * Represents information about a single image repository
+ *
+ * @class mw.mmv.model.Repo
+ * @constructor
+ * @param {string} displayName
+ * @param {string} favIcon URL to the repo's favicon
+ * @param {boolean} isLocal
+ */
+ function Repo(
+ displayName,
+ favIcon,
+ isLocal
+ ) {
+ /** @property {string} displayName Human-readable name of the repository */
+ this.displayName = displayName;
+
+ /** @property {string} favIcon An icon that represents the repository */
+ this.favIcon = favIcon;
+
+ /** @property {boolean} isLocal Whether the repository is the local wiki */
+ this.isLocal = isLocal;
+ }
+
+ /**
+ * Creates a new object from repoInfo we found in an API response.
+ *
+ * @static
+ * @param {Object} repoInfo
+ * @return {mw.mmv.model.Repo}
+ */
+ Repo.newFromRepoInfo = function ( repoInfo ) {
+ if ( repoInfo.apiurl ) {
+ return new ForeignApiRepo(
+ repoInfo.displayname,
+ repoInfo.favicon,
+ false,
+ repoInfo.apiurl,
+ repoInfo.server,
+ repoInfo.articlepath
+ );
+ } else if ( repoInfo.descBaseUrl ) {
+ return new ForeignDbRepo(
+ repoInfo.displayname,
+ repoInfo.favicon,
+ false,
+ repoInfo.descBaseUrl
+ );
+ } else {
+ return new Repo( repoInfo.displayname, repoInfo.favicon, repoInfo.local );
+ }
+ };
+
+ /**
+ * Returns true if the repo is Wikimedia Commons.
+ *
+ * @return {boolean}
+ */
+ Repo.prototype.isCommons = function () {
+ // there does not seem to be a sane way to do this
+ return this.displayName === 'Wikimedia Commons';
+ };
+
+ /**
+ * Gets the article path for the repository.
+ *
+ * @param {boolean} absolute if true, the URL will be absolute (if false, it still might be)
+ * @return {string} Replace $1 with the page name you want to link to.
+ */
+ Repo.prototype.getArticlePath = function ( absolute ) {
+ var articlePath = mw.config.get( 'wgArticlePath' );
+ if ( absolute ) {
+ articlePath = mw.config.get( 'wgServer' ) + articlePath;
+ }
+ return articlePath;
+ };
+
+ /**
+ * Gets the a link to the site where the image was uploaded to.
+ * This is a hack and might break for wikis with exotic config; unfortunately no
+ * better data is provided currently.
+ *
+ * @return {string}
+ */
+ Repo.prototype.getSiteLink = function () {
+ return this.getArticlePath( true ).replace( '$1', '' );
+ };
+
+ /**
+ * Represents information about a foreign API repository
+ *
+ * @class mw.mmv.model.ForeignApiRepo
+ * @extends mw.mmv.model.Repo
+ * @constructor
+ * @inheritdoc
+ * @param {string} displayName
+ * @param {string} favIcon
+ * @param {boolean} isLocal
+ * @param {string} apiUrl URL to the wiki's api.php
+ * @param {string} server Hostname for the wiki
+ * @param {string} articlePath Path to articles on the wiki, relative to the hostname.
+ */
+ function ForeignApiRepo(
+ displayName,
+ favIcon,
+ isLocal,
+ apiUrl,
+ server,
+ articlePath
+ ) {
+ Repo.call( this, displayName, favIcon, isLocal );
+
+ /** @property {string} apiUrl URL to the wiki's api.php */
+ this.apiUrl = apiUrl;
+
+ /** @property {string} server Hostname for the wiki */
+ this.server = server;
+
+ /** @property {string} articlePath Path to articles on the wiki, relative to the hostname */
+ this.articlePath = articlePath;
+
+ /** @property {string} absoluteArticlePath Path to articles on the wiki, relative to nothing */
+ this.absoluteArticlePath = server + articlePath;
+ }
+
+ oo.inheritClass( ForeignApiRepo, Repo );
+
+ /**
+ * @override
+ * @inheritdoc
+ */
+ ForeignApiRepo.prototype.getArticlePath = function () {
+ return this.absoluteArticlePath;
+ };
+
+ /**
+ * @override
+ * @inheritdoc
+ */
+ ForeignApiRepo.prototype.isCommons = function () {
+ return /^(https?:)?\/\/commons.wikimedia.org/.test( this.server );
+ };
+
+ /**
+ * Represents information about a foreign, shared DB repository
+ *
+ * @class mw.mmv.model.ForeignDbRepo
+ * @extends mw.mmv.model.Repo
+ * @constructor
+ * @inheritdoc
+ * @param {string} displayName
+ * @param {string} favIcon
+ * @param {boolean} isLocal
+ * @param {string} descBaseUrl Base URL for description pages - should include the "File:" prefix or similar.
+ */
+ function ForeignDbRepo(
+ displayName,
+ favIcon,
+ isLocal,
+ descBaseUrl
+ ) {
+ Repo.call( this, displayName, favIcon, isLocal );
+
+ /** @property {string} descBaseUrl Base URL for descriptions on the wiki - append a file's title to this to get the description page */
+ this.descBaseUrl = descBaseUrl;
+ }
+
+ oo.inheritClass( ForeignDbRepo, Repo );
+
+ /**
+ * @override
+ * @inheritdoc
+ */
+ ForeignDbRepo.prototype.getArticlePath = function () {
+ return this.descBaseUrl.replace( /[^/:]*:$/, '$1' );
+ };
+
+ /**
+ * @override
+ * @inheritdoc
+ */
+ ForeignDbRepo.prototype.isCommons = function () {
+ return /^(https?:)?\/\/commons.wikimedia.org/.test( this.descBaseUrl );
+ };
+
+ mw.mmv.model.Repo = Repo;
+ mw.mmv.model.ForeignApiRepo = ForeignApiRepo;
+ mw.mmv.model.ForeignDbRepo = ForeignDbRepo;
+}( mediaWiki, OO ) );