diff --git a/h5p.classes.php b/h5p.classes.php index 2661a43..32aeb38 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -310,12 +310,14 @@ interface H5PFrameworkInterface { * * @param int $libraryId * Library identifier + * @param boolean $skipContent + * Flag to indicate if content usage should be skipped * @return array * Associative array containing: * - content: Number of content using the library * - libraries: Number of libraries depending on the library */ - public function getLibraryUsage($libraryId); + public function getLibraryUsage($libraryId, $skipContent = FALSE); /** * Loads a library @@ -2456,10 +2458,6 @@ class H5PCore { // Failed retrieving uuid if (!$registration) { $errorMessage = $this->h5pF->t('Site could not be registered with the hub. Please contact your site administrator.'); - H5PCore::ajaxError( - $errorMessage, - 'SITE_REGISTRATION_FAILED' - ); $this->h5pF->setErrorMessage($errorMessage); $this->h5pF->setErrorMessage( $this->h5pF->t('The H5P Hub has been disabled until this problem can be resolved. You may still upload libraries through the "H5P Libraries" page.') @@ -2506,7 +2504,7 @@ class H5PCore { // No data received if (!$result || empty($result)) { - return; + return FALSE; } // Handle libraries metadata @@ -2975,16 +2973,18 @@ class H5PCore { public static function returnBytes($val) { $val = trim($val); $last = strtolower($val[strlen($val) - 1]); + $bytes = (int) $val; + switch ($last) { case 'g': - $val *= 1024; + $bytes *= 1024; case 'm': - $val *= 1024; + $bytes *= 1024; case 'k': - $val *= 1024; + $bytes *= 1024; } - return $val; + return $bytes; } /** @@ -3009,6 +3009,67 @@ class H5PCore { return $can; } + + /** + * Provide localization for the Core JS + * @return array + */ + public function getLocalization() { + return array( + 'fullscreen' => $this->h5pF->t('Fullscreen'), + 'disableFullscreen' => $this->h5pF->t('Disable fullscreen'), + 'download' => $this->h5pF->t('Download'), + 'copyrights' => $this->h5pF->t('Rights of use'), + 'embed' => $this->h5pF->t('Embed'), + 'size' => $this->h5pF->t('Size'), + 'showAdvanced' => $this->h5pF->t('Show advanced'), + 'hideAdvanced' => $this->h5pF->t('Hide advanced'), + 'advancedHelp' => $this->h5pF->t('Include this script on your website if you want dynamic sizing of the embedded content:'), + 'copyrightInformation' => $this->h5pF->t('Rights of use'), + 'close' => $this->h5pF->t('Close'), + 'title' => $this->h5pF->t('Title'), + 'author' => $this->h5pF->t('Author'), + 'year' => $this->h5pF->t('Year'), + 'source' => $this->h5pF->t('Source'), + 'license' => $this->h5pF->t('License'), + 'thumbnail' => $this->h5pF->t('Thumbnail'), + 'noCopyrights' => $this->h5pF->t('No copyright information available for this content.'), + 'downloadDescription' => $this->h5pF->t('Download this content as a H5P file.'), + 'copyrightsDescription' => $this->h5pF->t('View copyright information for this content.'), + 'embedDescription' => $this->h5pF->t('View the embed code for this content.'), + 'h5pDescription' => $this->h5pF->t('Visit H5P.org to check out more cool content.'), + 'contentChanged' => $this->h5pF->t('This content has changed since you last used it.'), + 'startingOver' => $this->h5pF->t("You'll be starting over."), + 'by' => $this->h5pF->t('by'), + 'showMore' => $this->h5pF->t('Show more'), + 'showLess' => $this->h5pF->t('Show less'), + 'subLevel' => $this->h5pF->t('Sublevel'), + 'confirmDialogHeader' => $this->h5pF->t('Confirm action'), + 'confirmDialogBody' => $this->h5pF->t('Please confirm that you wish to proceed. This action is not reversible.'), + 'cancelLabel' => $this->h5pF->t('Cancel'), + 'confirmLabel' => $this->h5pF->t('Confirm'), + 'licenseU' => $this->h5pF->t('Undisclosed'), + 'licenseCCBY' => $this->h5pF->t('Attribution'), + 'licenseCCBYSA' => $this->h5pF->t('Attribution-ShareAlike'), + 'licenseCCBYND' => $this->h5pF->t('Attribution-NoDerivs'), + 'licenseCCBYNC' => $this->h5pF->t('Attribution-NonCommercial'), + 'licenseCCBYNCSA' => $this->h5pF->t('Attribution-NonCommercial-ShareAlike'), + 'licenseCCBYNCND' => $this->h5pF->t('Attribution-NonCommercial-NoDerivs'), + 'licenseCC40' => $this->h5pF->t('4.0 International'), + 'licenseCC30' => $this->h5pF->t('3.0 Unported'), + 'licenseCC25' => $this->h5pF->t('2.5 Generic'), + 'licenseCC20' => $this->h5pF->t('2.0 Generic'), + 'licenseCC10' => $this->h5pF->t('1.0 Generic'), + 'licenseGPL' => $this->h5pF->t('General Public License'), + 'licenseV3' => $this->h5pF->t('Version 3'), + 'licenseV2' => $this->h5pF->t('Version 2'), + 'licenseV1' => $this->h5pF->t('Version 1'), + 'licensePD' => $this->h5pF->t('Public Domain'), + 'licenseCC010' => $this->h5pF->t('CC0 1.0 Universal (CC0 1.0) Public Domain Dedication'), + 'licensePDM' => $this->h5pF->t('Public Domain Mark'), + 'licenseC' => $this->h5pF->t('Copyright') + ); + } } /** @@ -3930,6 +3991,29 @@ class H5PContentValidator { static $semantics; if ($semantics === NULL) { + $cc_versions = array( + (object) array( + 'value' => '4.0', + 'label' => $this->h5pF->t('4.0 International') + ), + (object) array( + 'value' => '3.0', + 'label' => $this->h5pF->t('3.0 Unported') + ), + (object) array( + 'value' => '2.5', + 'label' => $this->h5pF->t('2.5 Generic') + ), + (object) array( + 'value' => '2.0', + 'label' => $this->h5pF->t('2.0 Generic') + ), + (object) array( + 'value' => '1.0', + 'label' => $this->h5pF->t('1.0 Generic') + ) + ); + $semantics = (object) array( 'name' => 'copyright', 'type' => 'group', @@ -3979,49 +4063,81 @@ class H5PContentValidator { ), (object) array( 'value' => 'CC BY', - 'label' => $this->h5pF->t('Attribution 4.0') + 'label' => $this->h5pF->t('Attribution'), + 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-SA', - 'label' => $this->h5pF->t('Attribution-ShareAlike 4.0') + 'label' => $this->h5pF->t('Attribution-ShareAlike'), + 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-ND', - 'label' => $this->h5pF->t('Attribution-NoDerivs 4.0') + 'label' => $this->h5pF->t('Attribution-NoDerivs'), + 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC', - 'label' => $this->h5pF->t('Attribution-NonCommercial 4.0') + 'label' => $this->h5pF->t('Attribution-NonCommercial'), + 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC-SA', - 'label' => $this->h5pF->t('Attribution-NonCommercial-ShareAlike 4.0') + 'label' => $this->h5pF->t('Attribution-NonCommercial-ShareAlike'), + 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC-ND', - 'label' => $this->h5pF->t('Attribution-NonCommercial-NoDerivs 4.0') + 'label' => $this->h5pF->t('Attribution-NonCommercial-NoDerivs'), + 'versions' => $cc_versions ), (object) array( 'value' => 'GNU GPL', - 'label' => $this->h5pF->t('General Public License v3') + 'label' => $this->h5pF->t('General Public License'), + 'versions' => array( + (object) array( + 'value' => 'v3', + 'label' => $this->h5pF->t('Version 3') + ), + (object) array( + 'value' => 'v2', + 'label' => $this->h5pF->t('Version 2') + ), + (object) array( + 'value' => 'v1', + 'label' => $this->h5pF->t('Version 1') + ) + ) ), (object) array( 'value' => 'PD', - 'label' => $this->h5pF->t('Public Domain') - ), - (object) array( - 'value' => 'ODC PDDL', - 'label' => $this->h5pF->t('Public Domain Dedication and Licence') - ), - (object) array( - 'value' => 'CC PDM', - 'label' => $this->h5pF->t('Public Domain Mark') + 'label' => $this->h5pF->t('Public Domain'), + 'versions' => array( + (object) array( + 'value' => '-', + 'label' => '-' + ), + (object) array( + 'value' => 'CC0 1.0', + 'label' => $this->h5pF->t('CC0 1.0 Universal') + ), + (object) array( + 'value' => 'CC PDM', + 'label' => $this->h5pF->t('Public Domain Mark') + ) + ) ), (object) array( 'value' => 'C', 'label' => $this->h5pF->t('Copyright') ) ) + ), + (object) array( + 'name' => 'version', + 'type' => 'select', + 'label' => $this->h5pF->t('License Version'), + 'options' => array() ) ) ); diff --git a/js/h5p.js b/js/h5p.js index 26bd5f2..d68ed00 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1234,16 +1234,65 @@ H5P.MediaCopyright = function (copyright, labels, order, extraFields) { }; /** - * Get humanized value for field. + * Get humanized value for the license field. * * @private - * @param {string} fieldName - * @param {string} value + * @param {string} license + * @param {string} [version] * @returns {string} */ - var humanizeValue = function (fieldName, value) { - if (fieldName === 'license') { - return H5P.copyrightLicenses[value]; + var humanizeLicense = function (license, version) { + var copyrightLicense = H5P.copyrightLicenses[license]; + + // Build license string + var value = ''; + if (!(license === 'PD' && version)) { + // Add license label + value += (copyrightLicense.hasOwnProperty('label') ? copyrightLicense.label : copyrightLicense); + } + + // Check for version info + var versionInfo; + if (version && copyrightLicense.versions[version]) { + versionInfo = copyrightLicense.versions[version]; + } + + if (versionInfo) { + // Add license version + if (value) { + value += ' '; + } + value += (versionInfo.hasOwnProperty('label') ? versionInfo.label : versionInfo); + } + + // Add link if specified + var link; + if (copyrightLicense.hasOwnProperty('link')) { + link = copyrightLicense.link.replace(':version', copyrightLicense.linkVersions ? copyrightLicense.linkVersions[version] : version); + } + else if (versionInfo && copyrightLicense.hasOwnProperty('link')) { + link = versionInfo.link + } + if (link) { + value = '' + value + ''; + } + + // Generate parenthesis + var parenthesis = ''; + if (license !== 'PD' && license !== 'C') { + parenthesis += license; + } + if (version && version !== 'CC0 1.0') { + if (parenthesis && license !== 'GNU GPL') { + parenthesis += ' '; + } + parenthesis += version; + } + if (parenthesis) { + value += ' (' + parenthesis + ')'; + } + if (license === 'C') { + value += ' ©'; } return value; @@ -1265,7 +1314,11 @@ H5P.MediaCopyright = function (copyright, labels, order, extraFields) { for (var i = 0; i < order.length; i++) { var fieldName = order[i]; if (copyright[fieldName] !== undefined) { - list.add(new H5P.Field(getLabel(fieldName), humanizeValue(fieldName, copyright[fieldName]))); + var humanValue = copyright[fieldName]; + if (fieldName === 'license') { + humanValue = humanizeLicense(copyright.license, copyright.version); + } + list.add(new H5P.Field(getLabel(fieldName), humanValue)); } } } @@ -1288,7 +1341,7 @@ H5P.MediaCopyright = function (copyright, labels, order, extraFields) { this.undisclosed = function () { if (list.size() === 1) { var field = list.get(0); - if (field.getLabel() === getLabel('license') && field.getValue() === humanizeValue('license', 'U')) { + if (field.getLabel() === getLabel('license') && field.getValue() === humanizeLicense('U')) { return true; } } @@ -1320,26 +1373,6 @@ H5P.MediaCopyright = function (copyright, labels, order, extraFields) { }; }; -/** - * Maps copyright license codes to their human readable counterpart. - * - * @type {Object} - */ -H5P.copyrightLicenses = { - 'U': 'Undisclosed', - 'CC BY': 'Attribution 4.0', - 'CC BY-SA': 'Attribution-ShareAlike 4.0', - 'CC BY-ND': 'Attribution-NoDerivs 4.0', - 'CC BY-NC': 'Attribution-NonCommercial 4.0', - 'CC BY-NC-SA': 'Attribution-NonCommercial-ShareAlike 4.0', - 'CC BY-NC-ND': 'Attribution-NonCommercial-NoDerivs 4.0', - 'GNU GPL': 'General Public License v3', - 'PD': 'Public Domain', - 'ODC PDDL': 'Public Domain Dedication and Licence', - 'CC PDM': 'Public Domain Mark', - 'C': 'Copyright' -}; - /** * A simple and elegant class for creating thumbnails of images. * @@ -1978,6 +2011,83 @@ H5P.createTitle = function (rawTitle, maxLength) { // Init H5P when page is fully loadded $(document).ready(function () { + var ccVersions = { + '4.0': H5P.t('licenseCC40'), + '3.0': H5P.t('licenseCC30'), + '2.5': H5P.t('licenseCC25'), + '2.0': H5P.t('licenseCC20'), + '1.0': H5P.t('licenseCC10'), + }; + + /** + * Maps copyright license codes to their human readable counterpart. + * + * @type {Object} + */ + H5P.copyrightLicenses = { + 'U': H5P.t('licenseU'), + 'CC BY': { + label: H5P.t('licenseCCBY'), + link: 'http://creativecommons.org/licenses/by/:version/legalcode', + versions: ccVersions + }, + 'CC BY-SA': { + label: H5P.t('licenseCCBYSA'), + link: 'http://creativecommons.org/licenses/by-sa/:version/legalcode', + versions: ccVersions + }, + 'CC BY-ND': { + label: H5P.t('licenseCCBYND'), + link: 'http://creativecommons.org/licenses/by-nd/:version/legalcode', + versions: ccVersions + }, + 'CC BY-NC': { + label: H5P.t('licenseCCBYNC'), + link: 'http://creativecommons.org/licenses/by-nc/:version/legalcode', + versions: ccVersions + }, + 'CC BY-NC-SA': { + label: H5P.t('licenseCCBYNCSA'), + link: 'http://creativecommons.org/licenses/by-nc-sa/:version/legalcode', + versions: ccVersions + }, + 'CC BY-NC-ND': { + label: H5P.t('licenseCCBYNCND'), + link: 'http://creativecommons.org/licenses/by-nc-nd/:version/legalcode', + versions: ccVersions + }, + 'GNU GPL': { + label: H5P.t('licenseGPL'), + link: 'http://www.gnu.org/licenses/gpl-:version-standalone.html', + linkVersions: { + 'v3': '3.0', + 'v2': '2.0', + 'v1': '1.0' + }, + versions: { + 'v3': H5P.t('licenseV3'), + 'v2': H5P.t('licenseV2'), + 'v1': H5P.t('licenseV1') + } + }, + 'PD': { + label: H5P.t('licensePD'), + versions: { + 'CC0 1.0': { + label: H5P.t('licenseCC010'), + link: 'https://creativecommons.org/publicdomain/zero/1.0/' + }, + 'CC PDM': { + label: H5P.t('licensePDM'), + link: 'https://creativecommons.org/publicdomain/mark/1.0/' + } + } + }, + 'ODC PDDL': 'Public Domain Dedication and Licence', + 'CC PDM': H5P.t('licensePDM'), + 'C': H5P.t('licenseC'), + }; + /** * Indicates if H5P is embedded on an external page using iframe. * @member {boolean} H5P.externalEmbed