MarkTraceur has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/109299


Change subject: Move models to their own modules
......................................................................

Move models to their own modules

Change-Id: Ib3d32496bfbc174dc136a269abf0b66cf0ae475d
---
M MultimediaViewer.php
D resources/mmv/mmv.model.js
A resources/mmv/model/mmv.model.FileUsage.js
A resources/mmv/model/mmv.model.Image.js
A resources/mmv/model/mmv.model.Repo.js
A resources/mmv/model/mmv.model.js
6 files changed, 504 insertions(+), 406 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MultimediaViewer 
refs/changes/99/109299/1

diff --git a/MultimediaViewer.php b/MultimediaViewer.php
index 7624dc4..0ad250b 100644
--- a/MultimediaViewer.php
+++ b/MultimediaViewer.php
@@ -31,6 +31,11 @@
        'remoteExtPath' => 'MultimediaViewer/resources/mmv',
 );
 
+$moduleInfoMMVM = array(
+       'localBasePath' => __DIR__ . '/resources/mmv/model',
+       'remoteExtPath' => 'MultimediaViewer/resources/mmv/model',
+);
+
 $moduleInfoMoment = array(
        'localBasePath' => __DIR__ . '/resources/momentjs',
        'remoteExtPath' => 'MultimediaViewer/resources/momentjs',
@@ -101,7 +106,40 @@
                'mmv.base',
                'oojs',
        ),
-), $moduleInfoMMV );
+), $moduleInfoMMVM );
+
+$wgResourceModules['mmv.model.FileUsage'] = array_merge( array(
+       'scripts' => array(
+               'mmv.model.FileUsage.js',
+       ),
+
+       'dependencies' => array(
+               'mmv.model',
+               'oojs',
+       ),
+), $moduleInfoMMVM );
+
+$wgResourceModules['mmv.model.Image'] = array_merge( array(
+       'scripts' => array(
+               'mmv.model.Image.js',
+       ),
+
+       'dependencies' => array(
+               'mmv.model',
+               'oojs',
+       ),
+), $moduleInfoMMVM );
+
+$wgResourceModules['mmv.model.Repo'] = array_merge( array(
+       'scripts' => array(
+               'mmv.model.Repo.js',
+       ),
+
+       'dependencies' => array(
+               'mmv.model',
+               'oojs',
+       ),
+), $moduleInfoMMVM );
 
 $wgResourceModules['mmv.provider'] = array_merge( array(
        'scripts' => array(
@@ -159,6 +197,9 @@
                'jquery.ui.dialog',
                'jquery.hidpi',
                'mmv.model',
+               'mmv.model.FileUsage',
+               'mmv.model.Image',
+               'mmv.model.Repo',
                'mmv.provider',
                'mediawiki.language',
        ),
diff --git a/resources/mmv/mmv.model.js b/resources/mmv/mmv.model.js
deleted file mode 100644
index e2c5e1d..0000000
--- a/resources/mmv/mmv.model.js
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * 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/>.
- */
-
-( function ( mw, oo ) {
-       /**
-        * @class mw.mmv.model.Image
-        * Represents information about a single image
-        * @constructor
-        * @param {mw.Title} title
-        * @param {number} size Filesize in bytes of the original image
-        * @param {number} width Width of the original image
-        * @param {number} height Height of the original image
-        * @param {string} mimeType
-        * @param {string} url URL to the image itself (original version)
-        * @param {string} descriptionUrl URL to the image description page
-        * @param {string} repo The repository this image belongs to
-        * @param {string} lastUploader The last person to upload a version of 
this image.
-        * @param {string} lastUploadDateTime The time and date the last upload 
occurred
-        * @param {string} originalUploadDateTime The time and date the 
original upload occurred
-        * @param {string} description
-        * @param {string} source
-        * @param {string} author
-        * @param {string} license
-        * @param {number} latitude
-        * @param {number} longitude
-        */
-       function Image(
-                       title,
-                       size,
-                       width,
-                       height,
-                       mimeType,
-                       url,
-                       descriptionUrl,
-                       repo,
-                       lastUploader,
-                       uploadDateTime,
-                       creationDateTime,
-                       description,
-                       source,
-                       author,
-                       license,
-                       latitude,
-                       longitude
-       ) {
-               /** @property {mw.Title} title The title of the image file */
-               this.title = title;
-
-               /** @property {number} size The filesize, in bytes, of the 
original image */
-               this.size = size;
-
-               /** @property {number} width The width, in pixels, of the 
original image */
-               this.width = width;
-
-               /** @property {number} height The height, in pixels, of the 
original image */
-               this.height = height;
-
-               /** @property {string} mimeType The MIME type of the original 
image */
-               this.mimeType = mimeType;
-
-               /** @property {string} url The URL to the original image */
-               this.url = url;
-
-               /** @property {string} descriptionUrl The URL to the 
description page for the image */
-               this.descriptionUrl = descriptionUrl;
-
-               /** @property {string} repo The name of the repository where 
this image is stored */
-               this.repo = repo;
-
-               /** @property {string} lastUploader The person who uploaded the 
last version of the file */
-               this.lastUploader = lastUploader;
-
-               /** @property {string} uploadDateTime The date and time of the 
last upload */
-               this.uploadDateTime = uploadDateTime;
-
-               /** @property {string} creationDateTime The date and time that 
the image was created */
-               this.creationDateTime = creationDateTime;
-
-               /** @property {string} description The description from the 
file page - unsafe HTML sometimes goes here */
-               this.description = description;
-
-               /** @property {string} source The source for the image (could 
be an organization, e.g.) - unsafe HTML sometimes goes here */
-               this.source = source;
-
-               /** @property {string} author The author of the image - unsafe 
HTML sometimes goes here */
-               this.author = author;
-
-               /** @property {string} license The license under which the 
image is distributed */
-               this.license = license;
-
-               /** @property {number} latitude The latitude of the place where 
the image was created */
-               this.latitude = latitude;
-
-               /** @property {number} longitude The longitude of the place 
where the image was created */
-               this.longitude = longitude;
-
-               /**
-                * @property {Object} thumbUrls
-                * An object indexed by image widths
-                * with URLs to appropriately sized thumbnails
-                */
-               this.thumbUrls = {};
-       }
-
-       /**
-        * @method
-        * @static
-        * Constructs a new Image object out of an object containing
-        * imageinfo data from an API response.
-        * @param {mw.Title} title
-        * @param {Object} imageInfo
-        * @returns {mw.mmv.model.Image}
-        */
-       Image.newFromImageInfo = function ( title, imageInfo ) {
-               var uploadDateTime, creationDateTime, imageData,
-                       description, source, author, license,
-                       latitude, longitude,
-                       innerInfo = imageInfo.imageinfo[0],
-                       extmeta = innerInfo.extmetadata;
-
-               if ( extmeta ) {
-                       creationDateTime = extmeta.DateTimeOriginal;
-                       uploadDateTime = extmeta.DateTime;
-
-                       if ( uploadDateTime ) {
-                               uploadDateTime = uploadDateTime.value.replace( 
/<.*?>/g, '' );
-                       }
-
-                       if ( creationDateTime ) {
-                               creationDateTime = 
creationDateTime.value.replace( /<.*?>/g, '' );
-                       }
-
-                       description = extmeta.ImageDescription && 
extmeta.ImageDescription.value;
-                       source = extmeta.Credit && extmeta.Credit.value;
-                       author = extmeta.Artist && extmeta.Artist.value;
-                       license = extmeta.License && extmeta.License.value;
-
-                       latitude = extmeta.GPSLatitude && parseFloat( 
extmeta.GPSLatitude.value );
-                       longitude = extmeta.GPSLongitude && parseFloat( 
extmeta.GPSLongitude.value );
-               }
-
-               imageData = new Image(
-                       title,
-                       innerInfo.size,
-                       innerInfo.width,
-                       innerInfo.height,
-                       innerInfo.mime,
-                       innerInfo.url,
-                       innerInfo.descriptionurl,
-                       imageInfo.imagerepository,
-                       innerInfo.user,
-                       uploadDateTime,
-                       creationDateTime,
-                       description,
-                       source,
-                       author,
-                       license,
-                       latitude,
-                       longitude
-               );
-
-               if ( innerInfo.thumburl ) {
-                       imageData.addThumbUrl(
-                               innerInfo.thumbwidth,
-                               innerInfo.thumburl
-                       );
-               }
-
-               return imageData;
-       };
-
-       /**
-        * @method
-        * Add a thumb URL
-        * @param {number} width
-        * @param {string} url
-        */
-       Image.prototype.addThumbUrl = function ( width, url ) {
-               this.thumbUrls[width] = url;
-       };
-
-       /**
-        * @method
-        * Get a thumb URL if we have it.
-        * @param {number} width
-        * @returns {string|undefined}
-        */
-       Image.prototype.getThumbUrl = function ( width ) {
-               return this.thumbUrls[width];
-       };
-
-       /**
-        * @method
-        * Check whether the image is CC-licensed.
-        * @returns {boolean}
-        */
-       Image.prototype.isCcLicensed = function () {
-               return this.license && this.license.substr( 0, 2 ) === 'cc';
-       };
-
-       /**
-        * @method
-        * Check whether the image has geolocation data.
-        * @returns {boolean}
-        */
-       Image.prototype.hasCoords = function () {
-               return this.hasOwnProperty( 'latitude' ) && 
this.hasOwnProperty( 'longitude' ) &&
-                       this.latitude !== undefined && this.latitude !== null &&
-                       this.longitude !== undefined && this.longitude !== null;
-       };
-
-       /**
-        * @class mw.mmv.model.Repo
-        * Represents information about a single image repository
-        * @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;
-       }
-
-       /**
-        * @method
-        * @static
-        * Creates a new object from repoInfo we found in an API response.
-        * @param {Object} repoInfo
-        * @returns {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 );
-               }
-       };
-
-       /**
-        * @class mw.mmv.model.ForeignApiRepo
-        * Represents information about a foreign API repository
-        * @extends mw.mmv.model.Repo
-        * @constructor
-        * @inheritdoc
-        * @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 );
-
-       /**
-        * @class mw.mmv.model.ForeignDbRepo
-        * Represents information about a foreign, shared DB repository
-        * @extends mw.mmv.model.Repo
-        * @constructor
-        * @inheritdoc
-        */
-       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 );
-
-       /**
-        * @class mw.mmv.model.FileUsage
-        * Represents information about the wiki pages using a given file
-        * @constructor
-        * @param {mw.Title} file
-        * @param {mw.mmv.model.FileUsage.Scope} scope
-        * @param {{wiki: String|null, page: mw.Title}[]} pages
-        *     A list of pages which use this file. Each page is an object with 
a 'page' field
-        *     containing the wiki page (a Title object) and a 'wiki' field 
which is a domain name,
-        *     or null for local files.
-        * @param {Number} [totalCount] total number of pages where the file is 
used (the list passed
-        *     in pages parameter might be cut off at some limit)
-        * @param {boolean} [totalCountIsLowerBound = false] False means 
totalCount is accurate,
-        *     true means it is a lower bound (the real count can be way 
greater).
-        *
-        */
-       function FileUsage(
-               file,
-               scope,
-               pages,
-               totalCount,
-               totalCountIsLowerBound
-       ) {
-               /** @property {mw.Title} mw.mmv.model.FileUsage.file */
-               this.file = file;
-
-               /** @property {mw.mmv.model.FileUsage.Scope} 
mw.mmv.model.FileUsage.scope */
-               this.scope = scope;
-
-               /** @property {{wiki: String|null, page: mw.Title}[]} 
mw.mmv.model.FileUsage.pages */
-               this.pages = pages;
-
-               /** @property {Number} mw.mmv.model.FileUsage.totalCount
-                */
-               this.totalCount = totalCount || pages.length;
-
-               /**
-                * For files which are used on a huge amount of pages, getting 
an exact count might be
-                * impossible. In such a case this field tells us that the 
count is "fake". For example
-                * if totalCount is 100 and totalCountIsLowerBound is true, a 
message about usage count
-                * should be something like "this file is used on more than 100 
pages". (This would happen
-                * when we query the api with a limit of 100; the real usage 
count could be in the millions
-                * for all we know.)
-                * @property {boolean} 
mw.mmv.model.FileUsage.totalCountIsLowerBound
-                */
-               this.totalCountIsLowerBound = !!totalCountIsLowerBound;
-       }
-
-       /**
-        * @typedef {mw.mmv.model.FileUsage.Scope}
-        * @enum
-        * @type {String}
-        */
-       FileUsage.Scope = {
-               /**
-                * Only pages from the local wiki (the one where the user is 
now)
-                */
-               LOCAL: 'local',
-
-               /**
-                * All pages, including other wikis
-                */
-               GLOBAL: 'global'
-       };
-
-       mw.mmv.model = {};
-       mw.mmv.model.Image = Image;
-       mw.mmv.model.Repo = Repo;
-       mw.mmv.model.ForeignApiRepo = ForeignApiRepo;
-       mw.mmv.model.ForeignDbRepo = ForeignDbRepo;
-       mw.mmv.model.FileUsage = FileUsage;
-}( mediaWiki, OO ) );
diff --git a/resources/mmv/model/mmv.model.FileUsage.js 
b/resources/mmv/model/mmv.model.FileUsage.js
new file mode 100644
index 0000000..1d1e3c7
--- /dev/null
+++ b/resources/mmv/model/mmv.model.FileUsage.js
@@ -0,0 +1,85 @@
+/*
+ * 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/>.
+ */
+
+( function ( mw, oo ) {
+       /**
+        * @class mw.mmv.model.FileUsage
+        * Represents information about the wiki pages using a given file
+        * @constructor
+        * @param {mw.Title} file
+        * @param {mw.mmv.model.FileUsage.Scope} scope
+        * @param {{wiki: String|null, page: mw.Title}[]} pages
+        *     A list of pages which use this file. Each page is an object with 
a 'page' field
+        *     containing the wiki page (a Title object) and a 'wiki' field 
which is a domain name,
+        *     or null for local files.
+        * @param {Number} [totalCount] total number of pages where the file is 
used (the list passed
+        *     in pages parameter might be cut off at some limit)
+        * @param {boolean} [totalCountIsLowerBound = false] False means 
totalCount is accurate,
+        *     true means it is a lower bound (the real count can be way 
greater).
+        *
+        */
+       function FileUsage(
+               file,
+               scope,
+               pages,
+               totalCount,
+               totalCountIsLowerBound
+       ) {
+               /** @property {mw.Title} mw.mmv.model.FileUsage.file */
+               this.file = file;
+
+               /** @property {mw.mmv.model.FileUsage.Scope} 
mw.mmv.model.FileUsage.scope */
+               this.scope = scope;
+
+               /** @property {{wiki: String|null, page: mw.Title}[]} 
mw.mmv.model.FileUsage.pages */
+               this.pages = pages;
+
+               /** @property {Number} mw.mmv.model.FileUsage.totalCount
+                */
+               this.totalCount = totalCount || pages.length;
+
+               /**
+                * For files which are used on a huge amount of pages, getting 
an exact count might be
+                * impossible. In such a case this field tells us that the 
count is "fake". For example
+                * if totalCount is 100 and totalCountIsLowerBound is true, a 
message about usage count
+                * should be something like "this file is used on more than 100 
pages". (This would happen
+                * when we query the api with a limit of 100; the real usage 
count could be in the millions
+                * for all we know.)
+                * @property {boolean} 
mw.mmv.model.FileUsage.totalCountIsLowerBound
+                */
+               this.totalCountIsLowerBound = !!totalCountIsLowerBound;
+       }
+
+       /**
+        * @typedef {mw.mmv.model.FileUsage.Scope}
+        * @enum
+        * @type {String}
+        */
+       FileUsage.Scope = {
+               /**
+                * Only pages from the local wiki (the one where the user is 
now)
+                */
+               LOCAL: 'local',
+
+               /**
+                * All pages, including other wikis
+                */
+               GLOBAL: 'global'
+       };
+
+       mw.mmv.model.FileUsage = FileUsage;
+}( mediaWiki, OO ) );
diff --git a/resources/mmv/model/mmv.model.Image.js 
b/resources/mmv/model/mmv.model.Image.js
new file mode 100644
index 0000000..d8a99ac
--- /dev/null
+++ b/resources/mmv/model/mmv.model.Image.js
@@ -0,0 +1,227 @@
+/*
+ * 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/>.
+ */
+
+( function ( mw, oo ) {
+       /**
+        * @class mw.mmv.model.Image
+        * Represents information about a single image
+        * @constructor
+        * @param {mw.Title} title
+        * @param {number} size Filesize in bytes of the original image
+        * @param {number} width Width of the original image
+        * @param {number} height Height of the original image
+        * @param {string} mimeType
+        * @param {string} url URL to the image itself (original version)
+        * @param {string} descriptionUrl URL to the image description page
+        * @param {string} repo The repository this image belongs to
+        * @param {string} lastUploader The last person to upload a version of 
this image.
+        * @param {string} lastUploadDateTime The time and date the last upload 
occurred
+        * @param {string} originalUploadDateTime The time and date the 
original upload occurred
+        * @param {string} description
+        * @param {string} source
+        * @param {string} author
+        * @param {string} license
+        * @param {number} latitude
+        * @param {number} longitude
+        */
+       function Image(
+                       title,
+                       size,
+                       width,
+                       height,
+                       mimeType,
+                       url,
+                       descriptionUrl,
+                       repo,
+                       lastUploader,
+                       uploadDateTime,
+                       creationDateTime,
+                       description,
+                       source,
+                       author,
+                       license,
+                       latitude,
+                       longitude
+       ) {
+               /** @property {mw.Title} title The title of the image file */
+               this.title = title;
+
+               /** @property {number} size The filesize, in bytes, of the 
original image */
+               this.size = size;
+
+               /** @property {number} width The width, in pixels, of the 
original image */
+               this.width = width;
+
+               /** @property {number} height The height, in pixels, of the 
original image */
+               this.height = height;
+
+               /** @property {string} mimeType The MIME type of the original 
image */
+               this.mimeType = mimeType;
+
+               /** @property {string} url The URL to the original image */
+               this.url = url;
+
+               /** @property {string} descriptionUrl The URL to the 
description page for the image */
+               this.descriptionUrl = descriptionUrl;
+
+               /** @property {string} repo The name of the repository where 
this image is stored */
+               this.repo = repo;
+
+               /** @property {string} lastUploader The person who uploaded the 
last version of the file */
+               this.lastUploader = lastUploader;
+
+               /** @property {string} uploadDateTime The date and time of the 
last upload */
+               this.uploadDateTime = uploadDateTime;
+
+               /** @property {string} creationDateTime The date and time that 
the image was created */
+               this.creationDateTime = creationDateTime;
+
+               /** @property {string} description The description from the 
file page - unsafe HTML sometimes goes here */
+               this.description = description;
+
+               /** @property {string} source The source for the image (could 
be an organization, e.g.) - unsafe HTML sometimes goes here */
+               this.source = source;
+
+               /** @property {string} author The author of the image - unsafe 
HTML sometimes goes here */
+               this.author = author;
+
+               /** @property {string} license The license under which the 
image is distributed */
+               this.license = license;
+
+               /** @property {number} latitude The latitude of the place where 
the image was created */
+               this.latitude = latitude;
+
+               /** @property {number} longitude The longitude of the place 
where the image was created */
+               this.longitude = longitude;
+
+               /**
+                * @property {Object} thumbUrls
+                * An object indexed by image widths
+                * with URLs to appropriately sized thumbnails
+                */
+               this.thumbUrls = {};
+       }
+
+       /**
+        * @method
+        * @static
+        * Constructs a new Image object out of an object containing
+        * imageinfo data from an API response.
+        * @param {mw.Title} title
+        * @param {Object} imageInfo
+        * @returns {mw.mmv.model.Image}
+        */
+       Image.newFromImageInfo = function ( title, imageInfo ) {
+               var uploadDateTime, creationDateTime, imageData,
+                       description, source, author, license,
+                       latitude, longitude,
+                       innerInfo = imageInfo.imageinfo[0],
+                       extmeta = innerInfo.extmetadata;
+
+               if ( extmeta ) {
+                       creationDateTime = extmeta.DateTimeOriginal;
+                       uploadDateTime = extmeta.DateTime;
+
+                       if ( uploadDateTime ) {
+                               uploadDateTime = uploadDateTime.value.replace( 
/<.*?>/g, '' );
+                       }
+
+                       if ( creationDateTime ) {
+                               creationDateTime = 
creationDateTime.value.replace( /<.*?>/g, '' );
+                       }
+
+                       description = extmeta.ImageDescription && 
extmeta.ImageDescription.value;
+                       source = extmeta.Credit && extmeta.Credit.value;
+                       author = extmeta.Artist && extmeta.Artist.value;
+                       license = extmeta.License && extmeta.License.value;
+
+                       latitude = extmeta.GPSLatitude && parseFloat( 
extmeta.GPSLatitude.value );
+                       longitude = extmeta.GPSLongitude && parseFloat( 
extmeta.GPSLongitude.value );
+               }
+
+               imageData = new Image(
+                       title,
+                       innerInfo.size,
+                       innerInfo.width,
+                       innerInfo.height,
+                       innerInfo.mime,
+                       innerInfo.url,
+                       innerInfo.descriptionurl,
+                       imageInfo.imagerepository,
+                       innerInfo.user,
+                       uploadDateTime,
+                       creationDateTime,
+                       description,
+                       source,
+                       author,
+                       license,
+                       latitude,
+                       longitude
+               );
+
+               if ( innerInfo.thumburl ) {
+                       imageData.addThumbUrl(
+                               innerInfo.thumbwidth,
+                               innerInfo.thumburl
+                       );
+               }
+
+               return imageData;
+       };
+
+       /**
+        * @method
+        * Add a thumb URL
+        * @param {number} width
+        * @param {string} url
+        */
+       Image.prototype.addThumbUrl = function ( width, url ) {
+               this.thumbUrls[width] = url;
+       };
+
+       /**
+        * @method
+        * Get a thumb URL if we have it.
+        * @param {number} width
+        * @returns {string|undefined}
+        */
+       Image.prototype.getThumbUrl = function ( width ) {
+               return this.thumbUrls[width];
+       };
+
+       /**
+        * @method
+        * Check whether the image is CC-licensed.
+        * @returns {boolean}
+        */
+       Image.prototype.isCcLicensed = function () {
+               return this.license && this.license.substr( 0, 2 ) === 'cc';
+       };
+
+       /**
+        * @method
+        * Check whether the image has geolocation data.
+        * @returns {boolean}
+        */
+       Image.prototype.hasCoords = function () {
+               return this.hasOwnProperty( 'latitude' ) && 
this.hasOwnProperty( 'longitude' ) &&
+                       this.latitude !== undefined && this.latitude !== null &&
+                       this.longitude !== undefined && this.longitude !== null;
+       };
+
+       mw.mmv.model.Image = Image;
+}( mediaWiki, OO ) );
diff --git a/resources/mmv/model/mmv.model.Repo.js 
b/resources/mmv/model/mmv.model.Repo.js
new file mode 100644
index 0000000..6e8351d
--- /dev/null
+++ b/resources/mmv/model/mmv.model.Repo.js
@@ -0,0 +1,130 @@
+/*
+ * 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/>.
+ */
+
+( function ( mw, oo ) {
+       /**
+        * @class mw.mmv.model.Repo
+        * Represents information about a single image repository
+        * @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;
+       }
+
+       /**
+        * @method
+        * @static
+        * Creates a new object from repoInfo we found in an API response.
+        * @param {Object} repoInfo
+        * @returns {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 );
+               }
+       };
+
+       /**
+        * @class mw.mmv.model.ForeignApiRepo
+        * Represents information about a foreign API repository
+        * @extends mw.mmv.model.Repo
+        * @constructor
+        * @inheritdoc
+        * @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 );
+
+       /**
+        * @class mw.mmv.model.ForeignDbRepo
+        * Represents information about a foreign, shared DB repository
+        * @extends mw.mmv.model.Repo
+        * @constructor
+        * @inheritdoc
+        */
+       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 );
+
+       mw.mmv.model.Repo = Repo;
+       mw.mmv.model.ForeignApiRepo = ForeignApiRepo;
+       mw.mmv.model.ForeignDbRepo = ForeignDbRepo;
+}( mediaWiki, OO ) );
diff --git a/resources/mmv/model/mmv.model.js b/resources/mmv/model/mmv.model.js
new file mode 100644
index 0000000..22a8563
--- /dev/null
+++ b/resources/mmv/model/mmv.model.js
@@ -0,0 +1,20 @@
+/*
+ * 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/>.
+ */
+
+( function ( mw, oo ) {
+       mw.mmv.model = {};
+}( mediaWiki, OO ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/109299
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib3d32496bfbc174dc136a269abf0b66cf0ae475d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MultimediaViewer
Gerrit-Branch: master
Gerrit-Owner: MarkTraceur <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to