From 011c7df6758fc692e4c52ae91eb27e0a45b03eed Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Fri, 16 Mar 2018 20:11:08 +0100 Subject: [PATCH 01/32] HFP-1905 Add metadata to contentData --- js/h5p.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/js/h5p.js b/js/h5p.js index dd74a79..34a1223 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -99,7 +99,8 @@ H5P.init = function (target) { } var library = { library: contentData.library, - params: JSON.parse(contentData.jsonContent) + params: JSON.parse(contentData.jsonContent), + metadata: contentData.metadata }; H5P.getUserData(contentId, 'state', function (err, previousState) { @@ -795,6 +796,10 @@ H5P.newRunnable = function (library, contentId, $attachTo, skipResize, extras) { extras.previousState = library.userDatas.state; } + if (library.metadata) { + extras.metadata = library.metadata; + } + // Makes all H5P libraries extend H5P.ContentType: var standalone = extras.standalone || false; // This order makes it possible for an H5P library to override H5P.ContentType functions! From 6ef2f96e8bbb22798f77fabd8f3108769b73d2d7 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Fri, 23 Mar 2018 13:11:00 +0100 Subject: [PATCH 02/32] HFP-1905 Add logic for download/upload Add metadata fields to h5p.json --- h5p.classes.php | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index d8ed62e..3f54f0d 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -620,8 +620,17 @@ class H5PValidator { private $h5pOptional = array( 'contentType' => '/^.{1,255}$/', + // deprecated 'author' => '/^.{1,255}$/', - 'license' => '/^(cc-by|cc-by-sa|cc-by-nd|cc-by-nc|cc-by-nc-sa|cc-by-nc-nd|pd|cr|MIT|GPL1|GPL2|GPL3|MPL|MPL2)$/', + 'authors' => array( + 'name' => '/^.{1,255}$/', + 'role' => '/^(Illustrator|Designer|Photographer)$/', + ), + 'license' => '/^(CC BY|CC BY-SA|CC BY-ND|CC BY-NC|CC BY-NC-SA|CC BY-NC-ND|GNU GPL|PD|ODC PDDL|CC PDM|U|C|cc-by|cc-by-sa|cc-by-nd|cc-by-nc|cc-by-nc-sa|cc-by-nc-nd|pd|cr|MIT|GPL1|GPL2|GPL3|MPL|MPL2)$/', + 'licenseVersion' => '/^(1.0|2.0|2.5|3.0|4.0)$/', + 'source' => '/^(http[s]?://.+)$', + 'yearsFrom' => '/^([0-9]{1,4})$/', + 'yearsTo' => '/^([0-9]{1,4})$/', 'dynamicDependencies' => array( 'machineName' => '/^[\w0-9\-\.]{1,255}$/i', 'majorVersion' => '/^[0-9]{1,5}$/', @@ -629,7 +638,9 @@ class H5PValidator { ), 'w' => '/^[0-9]{1,4}$/', 'h' => '/^[0-9]{1,4}$/', + // deprecated 'metaKeywords' => '/^.{1,}$/', + // deprecated 'metaDescription' => '/^.{1,}$/', ); @@ -1584,14 +1595,30 @@ Class H5PExport { // Make embedType into an array $embedTypes = explode(', ', $content['embedType']); - // Build h5p.json + // Build h5p.json, the en-/de-coding will ensure proper escaping $h5pJson = array ( 'title' => $content['title'], 'language' => (isset($content['language']) && strlen(trim($content['language'])) !== 0) ? $content['language'] : 'und', 'mainLibrary' => $content['library']['name'], 'embedTypes' => $embedTypes, + 'authors' => json_decode(json_encode($content['metadata']['authors'], TRUE)), + 'source' => $content['metadata']['source'], + 'yearFrom' => $content['metadata']['yearFrom'], + 'yearTo' => $content['metadata']['yearTo'], + 'license' => $content['metadata']['license'], + 'licenseVersion' => $content['metadata']['licenseVersion'], + 'licenseExtras' => $content['metadata']['licenseExtras'], + 'changes' => json_decode(json_encode($content['metadata']['changes'], TRUE)), + 'authorComments' => $content['metadata']['authorComments'] ); + // Remove all values that are not set + foreach ($h5pJson as $key => $value) { + if (!isset($value)) { + unset($h5pJson[$key]); + } + } + // Add dependencies to h5p foreach ($content['dependencies'] as $dependency) { $library = $dependency['library']; From c589285351d5471be05484e35d73917eb61579d5 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 26 Mar 2018 11:24:26 +0200 Subject: [PATCH 03/32] HFP-1905 Fix unset values for array fields Some array fields were filled with undefined and lead to warnings. --- h5p.classes.php | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 3f54f0d..659475c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -1600,18 +1600,15 @@ Class H5PExport { 'title' => $content['title'], 'language' => (isset($content['language']) && strlen(trim($content['language'])) !== 0) ? $content['language'] : 'und', 'mainLibrary' => $content['library']['name'], - 'embedTypes' => $embedTypes, - 'authors' => json_decode(json_encode($content['metadata']['authors'], TRUE)), - 'source' => $content['metadata']['source'], - 'yearFrom' => $content['metadata']['yearFrom'], - 'yearTo' => $content['metadata']['yearTo'], - 'license' => $content['metadata']['license'], - 'licenseVersion' => $content['metadata']['licenseVersion'], - 'licenseExtras' => $content['metadata']['licenseExtras'], - 'changes' => json_decode(json_encode($content['metadata']['changes'], TRUE)), - 'authorComments' => $content['metadata']['authorComments'] + 'embedTypes' => $embedTypes ); + foreach(array('authors', 'source', 'license', 'licenseVersion', 'licenseExtras' ,'yearFrom', 'yearTo', 'changes', 'authorComments') as $field) { + if (isset($content['metadata'][$field])) { + $h5pJson[$field] = json_decode(json_encode($content['metadata'][$field], TRUE)); + } + } + // Remove all values that are not set foreach ($h5pJson as $key => $value) { if (!isset($value)) { From b28624ba8ef1d8db879ed8b781d6b9db7c9cdb89 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 26 Mar 2018 17:44:00 +0200 Subject: [PATCH 04/32] HFP-1905 Allow metadata as keyword for subcontent --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 659475c..23a125c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -3736,7 +3736,7 @@ class H5PContentValidator { 'type' => 'group', 'fields' => $library['semantics'], ), FALSE); - $validKeys = array('library', 'params', 'subContentId'); + $validKeys = array('library', 'params', 'subContentId', 'metadata'); if (isset($semantics->extraAttributes)) { $validKeys = array_merge($validKeys, $semantics->extraAttributes); } From 95d99d0ad37f6c58997fb36885e70039a88b3f16 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Tue, 3 Apr 2018 15:17:46 +0200 Subject: [PATCH 05/32] HFP-1905 Add update functionality for metadata --- js/h5p-content-upgrade-process.js | 51 ++++++++++++++++++++++++------- js/h5p-content-upgrade-worker.js | 7 +++-- js/h5p-content-upgrade.js | 26 ++++++++++------ 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/js/h5p-content-upgrade-process.js b/js/h5p-content-upgrade-process.js index e54dbb7..0f954ac 100644 --- a/js/h5p-content-upgrade-process.js +++ b/js/h5p-content-upgrade-process.js @@ -7,7 +7,7 @@ H5P.ContentUpgradeProcess = (function (Version) { * @class * @namespace H5P */ - function ContentUpgradeProcess(name, oldVersion, newVersion, params, id, loadLibrary, done) { + function ContentUpgradeProcess(name, oldVersion, newVersion, params, extras, id, loadLibrary, done) { var self = this; // Make params possible to work with @@ -24,20 +24,38 @@ H5P.ContentUpgradeProcess = (function (Version) { }); } + // Make extras possible to work with + for (var element in extras) { + if (extras.hasOwnProperty(element)) { + try { + extras[element] = JSON.parse(extras[element]); + if (!(extras[element] instanceof Object)) { + throw true; + } + } + catch (event) { + return done({ + type: 'errorExtrasBroken', + id: id + }); + } + } + } + self.loadLibrary = loadLibrary; - self.upgrade(name, oldVersion, newVersion, params, function (err, result) { + self.upgrade(name, oldVersion, newVersion, params, extras, function (err, result) { if (err) { return done(err); } - done(null, JSON.stringify(params)); + done(null, JSON.stringify(params), JSON.stringify(extras)); }); } /** * */ - ContentUpgradeProcess.prototype.upgrade = function (name, oldVersion, newVersion, params, done) { + ContentUpgradeProcess.prototype.upgrade = function (name, oldVersion, newVersion, params, extras, done) { var self = this; // Load library details and upgrade routines @@ -47,7 +65,7 @@ H5P.ContentUpgradeProcess = (function (Version) { } // Run upgrade routines on params - self.processParams(library, oldVersion, newVersion, params, function (err, params) { + self.processParams(library, oldVersion, newVersion, params, extras, function (err, params, extras) { if (err) { return done(err); } @@ -61,7 +79,7 @@ H5P.ContentUpgradeProcess = (function (Version) { next(err); }); }, function (err) { - done(err, params); + done(err, params, extras); }); }); }); @@ -77,7 +95,7 @@ H5P.ContentUpgradeProcess = (function (Version) { * @param {Object} params * @param {Function} next */ - ContentUpgradeProcess.prototype.processParams = function (library, oldVersion, newVersion, params, next) { + ContentUpgradeProcess.prototype.processParams = function (library, oldVersion, newVersion, params, extras, next) { if (H5PUpgrades[library.name] === undefined) { if (library.upgradesScript) { // Upgrades script should be loaded so the upgrades should be here. @@ -110,10 +128,11 @@ H5P.ContentUpgradeProcess = (function (Version) { var unnecessaryWrapper = (upgrade.contentUpgrade !== undefined ? upgrade.contentUpgrade : upgrade); try { - unnecessaryWrapper(params, function (err, upgradedParams) { + unnecessaryWrapper(params, function (err, upgradedParams, upgradedExtras) { params = upgradedParams; + extras = upgradedExtras; nextMinor(err); - }); + }, extras); } catch (err) { if (console && console.log) { @@ -127,7 +146,7 @@ H5P.ContentUpgradeProcess = (function (Version) { }, nextMajor); } }, function (err) { - next(err, params); + next(err, params, extras); }); }; @@ -168,11 +187,21 @@ H5P.ContentUpgradeProcess = (function (Version) { return done(); // Larger or same version that's available } + // Currently, we only use metadata as additional things that might need change + var extras = { + metadata: params.metadata + }; + // A newer version is available, upgrade params - return self.upgrade(availableLib[0], usedVer, availableVer, params.params, function (err, upgraded) { + return self.upgrade(availableLib[0], usedVer, availableVer, params.params, extras, function (err, upgraded, extras) { if (!err) { params.library = availableLib[0] + ' ' + availableVer.major + '.' + availableVer.minor; params.params = upgraded; + if (extras) { + if (extras.metadata) { + params.metadata = extras.metadata; + } + } } done(err, params); }); diff --git a/js/h5p-content-upgrade-worker.js b/js/h5p-content-upgrade-worker.js index 26ad038..af0be94 100644 --- a/js/h5p-content-upgrade-worker.js +++ b/js/h5p-content-upgrade-worker.js @@ -9,7 +9,7 @@ var libraryLoadedCallback; var messageHandlers = { newJob: function (job) { // Start new job - new H5P.ContentUpgradeProcess(job.name, new H5P.Version(job.oldVersion), new H5P.Version(job.newVersion), job.params, job.id, function loadLibrary(name, version, next) { + new H5P.ContentUpgradeProcess(job.name, new H5P.Version(job.oldVersion), new H5P.Version(job.newVersion), job.params, job.extras, job.id, function loadLibrary(name, version, next) { // TODO: Cache? postMessage({ action: 'loadLibrary', @@ -17,7 +17,7 @@ var messageHandlers = { version: version.toString() }); libraryLoadedCallback = next; - }, function done(err, result) { + }, function done(err, result, extras) { if (err) { // Return error postMessage({ @@ -33,7 +33,8 @@ var messageHandlers = { postMessage({ action: 'done', id: job.id, - params: result + params: result, + extras: extras }); }); }, diff --git a/js/h5p-content-upgrade.js b/js/h5p-content-upgrade.js index 9c1e4ce..564a0a8 100644 --- a/js/h5p-content-upgrade.js +++ b/js/h5p-content-upgrade.js @@ -116,7 +116,7 @@ // Register message handlers var messageHandlers = { done: function (result) { - self.workDone(result.id, result.params, this); + self.workDone(result.id, result.params, result.extras, this); }, error: function (error) { self.printError(error.err); @@ -184,7 +184,7 @@ self.token = inData.token; // Start processing - self.processBatch(inData.params); + self.processBatch(inData.params, {metadata: inData.metadata}); }); }; @@ -202,7 +202,7 @@ * * @param {Object} parameters */ - ContentUpgrade.prototype.processBatch = function (parameters) { + ContentUpgrade.prototype.processBatch = function (parameters, extras) { var self = this; // Track upgraded params @@ -210,6 +210,7 @@ // Track current batch self.parameters = parameters; + self.extras = extras; // Create id mapping self.ids = []; @@ -247,6 +248,11 @@ self.current++; self.working++; + // Rewrap metadata + if (self.extras.metadata) { + self.extras.metadata = self.extras.metadata[id]; + } + if (worker) { worker.postMessage({ action: 'newJob', @@ -254,11 +260,12 @@ name: info.library.name, oldVersion: info.library.version, newVersion: self.version.toString(), - params: self.parameters[id] + params: self.parameters[id], + extras: self.extras }); } else { - new H5P.ContentUpgradeProcess(info.library.name, new Version(info.library.version), self.version, self.parameters[id], id, function loadLibrary(name, version, next) { + new H5P.ContentUpgradeProcess(info.library.name, new Version(info.library.version), self.version, self.parameters[id], self.extras, id, function loadLibrary(name, version, next) { self.loadLibrary(name, version, function (err, library) { if (library.upgradesScript) { self.loadScript(library.upgradesScript, function (err) { @@ -273,13 +280,13 @@ } }); - }, function done(err, result) { + }, function done(err, result, extras) { if (err) { self.printError(err); return ; } - self.workDone(id, result); + self.workDone(id, result, extras); }); } }; @@ -287,7 +294,7 @@ /** * */ - ContentUpgrade.prototype.workDone = function (id, result, worker) { + ContentUpgrade.prototype.workDone = function (id, result, extras, worker) { var self = this; self.working--; @@ -302,7 +309,8 @@ self.nextBatch({ libraryId: self.version.libraryId, token: self.token, - params: JSON.stringify(self.upgraded) + params: JSON.stringify(self.upgraded), + extras: extras }); } }; From 83e3c58ba3fcafcb89a451bc8033836f42690cde Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Wed, 4 Apr 2018 15:46:30 +0200 Subject: [PATCH 06/32] HFP-1943 Include metadata information in "rights of use" popup Add copyright information of main content in popup Add copyright information of subcontent in popup HFP-1902 is intended to make the styling better --- js/h5p.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index 34a1223..d14001e 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -164,7 +164,7 @@ H5P.init = function (target) { if (displayOptions.frame) { // Special handling of copyrights if (displayOptions.copyright) { - var copyrights = H5P.getCopyrights(instance, library.params, contentId); + var copyrights = H5P.getCopyrights(instance, library.params, library.metadata, contentId); if (!copyrights) { displayOptions.copyright = false; } @@ -976,11 +976,13 @@ H5P.Dialog = function (name, title, content, $element) { * H5P instance to get copyright information for. * @param {Object} parameters * Parameters of the content instance. + * @param {Object} metadata + * Metadata of the content instance. * @param {number} contentId * Identifies the H5P content * @returns {string} Copyright information. */ -H5P.getCopyrights = function (instance, parameters, contentId) { +H5P.getCopyrights = function (instance, parameters, metadata, contentId) { var copyrights; if (instance.getCopyrights !== undefined) { @@ -999,6 +1001,11 @@ H5P.getCopyrights = function (instance, parameters, contentId) { H5P.findCopyrights(copyrights, parameters, contentId); } + var metadataCopyrights = H5P.buildMetadataCopyrights(metadata, instance.libraryInfo.machineName); + if (metadataCopyrights !== undefined) { + copyrights.addMediaInFront(metadataCopyrights); + } + if (copyrights !== undefined) { // Convert to string copyrights = copyrights.toString(); @@ -1017,6 +1024,7 @@ H5P.getCopyrights = function (instance, parameters, contentId) { * Used to insert thumbnails for images. */ H5P.findCopyrights = function (info, parameters, contentId) { + var lastContentTypeName = undefined; // Cycle through parameters for (var field in parameters) { if (!parameters.hasOwnProperty(field)) { @@ -1026,6 +1034,8 @@ H5P.findCopyrights = function (info, parameters, contentId) { /** * @deprecated This hack should be removed after 2017-11-01 * The code that was using this was removed by HFP-574 + * This note was seen on 2018-04-04, and consultation with + * higher authorities lead to keeping the code for now ;-) */ if (field === 'overrideSettings') { console.warn("The semantics field 'overrideSettings' is DEPRECATED and should not be used."); @@ -1035,11 +1045,21 @@ H5P.findCopyrights = function (info, parameters, contentId) { var value = parameters[field]; + // TODO: Get the real name of the content type + lastContentTypeName = (value.library) ? value.library.split(' ')[0] : lastContentTypeName; + if (value instanceof Array) { // Cycle through array H5P.findCopyrights(info, value, contentId); } else if (value instanceof Object) { + if (value.metadata) { + var metadataCopyrights = H5P.buildMetadataCopyrights(value.metadata, lastContentTypeName); + if (metadataCopyrights !== undefined) { + info.addMedia(metadataCopyrights); + } + } + // Check if object is a file with copyrights if (value.copyright === undefined || value.copyright.license === undefined || @@ -1061,6 +1081,34 @@ H5P.findCopyrights = function (info, parameters, contentId) { } }; +H5P.buildMetadataCopyrights = function (metadata, contentTypeName) { + if (metadata && metadata.license !== undefined && metadata.license !== 'U') { + var dataset = { + title: metadata.title, + author: (metadata.authors && metadata.authors.length > 0) ? metadata.authors.map(function(author) {return author.name + ' (' + author.role + ')';}).join(', ') : undefined, + source: metadata.source, + year: (metadata.yearFrom) ? (metadata.yearFrom + ((metadata.yearTo) ? '-' + metadata.yearTo: '')) : undefined, + license: metadata.license, + version: metadata.licenseVersion, + licenseExtras: metadata.licenseExtras, + changes: (metadata.changes && metadata.changes.length > 0) ? metadata.changes.map(function(change) { + return change.log + (change.author ? ', ' + change.author : '') + (change.date ? ', ' + change.date : ''); + }).join(' / ') : undefined + }; + + if (contentTypeName && contentTypeName.indexOf('H5P.') === 0) { + contentTypeName = contentTypeName.substr(4); + } + + return new H5P.MediaCopyright( + dataset, + {type: 'Content type', licenseExtras: 'License extras', changes: 'Changelog'}, + ['type', 'title', 'license', 'author', 'year', 'source', 'licenseExtras', 'changes'], + {type: contentTypeName} + ); + } +}; + /** * Display a dialog containing the embed code. * @@ -1180,6 +1228,17 @@ H5P.ContentCopyrights = function () { } }; + /** + * Add sub content in front. + * + * @param {H5P.MediaCopyright} newMedia + */ + this.addMediaInFront = function (newMedia) { + if (newMedia !== undefined) { + media.unshift(newMedia); + } + }; + /** * Add sub content. * From ef063ce5cb1395ef4805e5faa3cceae758faba93 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Thu, 5 Apr 2018 17:17:56 +0200 Subject: [PATCH 07/32] HFP-1905 Fix image in "rights of use" view --- js/h5p.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index d14001e..2f0ba32 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -164,7 +164,7 @@ H5P.init = function (target) { if (displayOptions.frame) { // Special handling of copyrights if (displayOptions.copyright) { - var copyrights = H5P.getCopyrights(instance, library.params, library.metadata, contentId); + var copyrights = H5P.getCopyrights(instance, library.params, contentId, library.metadata); if (!copyrights) { displayOptions.copyright = false; } @@ -982,12 +982,13 @@ H5P.Dialog = function (name, title, content, $element) { * Identifies the H5P content * @returns {string} Copyright information. */ -H5P.getCopyrights = function (instance, parameters, metadata, contentId) { +H5P.getCopyrights = function (instance, parameters, contentId, metadata) { var copyrights; if (instance.getCopyrights !== undefined) { try { // Use the instance's own copyright generator + console.log('getCopyrights() of', instance.libraryInfo.machineName); copyrights = instance.getCopyrights(); } catch (err) { @@ -1056,11 +1057,17 @@ H5P.findCopyrights = function (info, parameters, contentId) { if (value.metadata) { var metadataCopyrights = H5P.buildMetadataCopyrights(value.metadata, lastContentTypeName); if (metadataCopyrights !== undefined) { + if (value.params && value.params.contentName === 'Image' && value.params.file) { + var path = value.params.file.path; + var width = value.params.file.width; + var height = value.params.file.height; + metadataCopyrights.setThumbnail(new H5P.Thumbnail(H5P.getPath(path, contentId), width, height)); + } info.addMedia(metadataCopyrights); } } - // Check if object is a file with copyrights + // Check if object is a file with copyrights (old core) if (value.copyright === undefined || value.copyright.license === undefined || value.path === undefined || From fbc21f636820240aaeb5cbea46456aaed19c2ab3 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Thu, 5 Apr 2018 17:22:31 +0200 Subject: [PATCH 08/32] HFP-1905 Remove console output --- js/h5p.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/h5p.js b/js/h5p.js index 2f0ba32..599e59b 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -988,7 +988,6 @@ H5P.getCopyrights = function (instance, parameters, contentId, metadata) { if (instance.getCopyrights !== undefined) { try { // Use the instance's own copyright generator - console.log('getCopyrights() of', instance.libraryInfo.machineName); copyrights = instance.getCopyrights(); } catch (err) { From 3b38e273eb8c40bdd5dda391585692fb09fcbfc4 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Fri, 6 Apr 2018 17:11:33 +0200 Subject: [PATCH 09/32] HFP-1905 Bump minor core version number --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 23a125c..65e99d5 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -1797,7 +1797,7 @@ class H5PCore { public static $coreApi = array( 'majorVersion' => 1, - 'minorVersion' => 14 + 'minorVersion' => 15 ); public static $styles = array( 'styles/h5p.css', From 58597460f662234dfbe7d4d60385357e58ebad7b Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 9 Apr 2018 11:43:48 +0200 Subject: [PATCH 10/32] HFP-1905 Fix updating for scripts with old update functions "params" (and "extras", e.g. metadata) flow through each update function and are changed if necessary. Since "extras" was added later and old update functions don't return it, we need to ignore undefined values -- or change every single update function in all content types. --- js/h5p-content-upgrade-process.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/js/h5p-content-upgrade-process.js b/js/h5p-content-upgrade-process.js index 0f954ac..e440341 100644 --- a/js/h5p-content-upgrade-process.js +++ b/js/h5p-content-upgrade-process.js @@ -130,7 +130,15 @@ H5P.ContentUpgradeProcess = (function (Version) { try { unnecessaryWrapper(params, function (err, upgradedParams, upgradedExtras) { params = upgradedParams; - extras = upgradedExtras; + /** + * "params" (and "extras", e.g. metadata) flow through each update function and are changed + * if necessary. Since "extras" was added later and old update functions don't return + * it, we need to ignore undefined values here -- or change every single update function + * in all content types. + */ + if (upgradedExtras) { + extras = upgradedExtras; + } nextMinor(err); }, extras); } From 3deda27f9bcde2b4d85826846ef2d00d75f06c02 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Fri, 25 May 2018 18:38:42 +0200 Subject: [PATCH 11/32] HFP-1898 Move mocked semantics to backend --- h5p.classes.php | 233 ++++++++++++++++++++++++++++++++++++++++++++++++ js/h5p.js | 11 ++- 2 files changed, 242 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 65e99d5..bc48e66 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -3557,6 +3557,7 @@ class H5PContentValidator { if (isset($file->copyright)) { $this->validateGroup($file->copyright, $this->getCopyrightSemantics()); + // TODO: We'll need to do something here about getMetadataSemantics() if we change the widgets } } @@ -4106,6 +4107,238 @@ class H5PContentValidator { return $uri; } + public function getMetadataSemantics() { + static $semantics; + + $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( + (object) array( + 'name' => 'copyright', + 'type' => 'group', + 'label' => $this->h5pF->t('Copyright information'), + 'fields' => array( + (object) array( + 'name' => 'title', + 'type' => 'text', + 'label' => $this->h5pF->t('Title'), + 'placeholder' => 'La Gioconda' + ), + (object) array( + 'name' => 'license', + 'type' => 'select', + 'label' => $this->h5pF->t('License'), + 'default' => 'U', + 'options' => array( + (object) array( + 'value' => 'U', + 'label' => 'Undisclosed' + ), + (object) array( + 'value' => 'CC BY', + 'label' => 'Attribution', + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-SA', + 'label' => 'Attribution-ShareAlike', + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-ND', + 'label' => 'Attribution-NoDerivs', + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-NC', + 'label' => 'Attribution-NonCommercial', + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-NC-SA', + 'label' => 'Attribution-NonCommercial-ShareAlike', + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-NC-ND', + 'label' => 'Attribution-NonCommercial-NoDerivs', + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC0 1.0', + 'label' => 'Public Domain Dedication' + ), + (object) array( + 'value' => 'CC PDM', + 'label' => 'Public Domain Mark' + ), + (object) array( + 'value' => 'GNU GPL', + 'label' => 'General Public License v3' + ), + (object) array( + 'value' => 'PD', + 'label' => 'Public Domain' + ), + (object) array( + 'value' => 'ODC PDDL', + 'label' => 'Public Domain Dedication and Licence' + ), + (object) array( + 'value' => 'C', + 'label' => 'Copyright' + ) + ) + ), + (object) array( + 'name' => 'licenseVersion', + 'type' => 'select', + 'label' => $this->h5pF->t('License Version'), + 'options' => array(), + 'optional' => TRUE + ), + (object) array( + 'name' => 'yearFrom', + 'type' => 'text', + 'label' => $this->h5pF->t('Years (from-to)'), + 'placeholder' => '1991', + 'optional' => TRUE + ), + (object) array( + 'name' => 'yearTo', + 'type' => 'text', + 'label' => 'hiddenLabel', + 'placeholder' => '1992', + 'optional' => TRUE + ), + (object) array( + 'name' => 'source', + 'type' => 'text', + 'label' => 'Source', + 'placeholder' => 'https://', + 'optional' => TRUE, + 'regexp' => array( + 'pattern' => '^http[s]?://.+', + 'modifiers' => 'i' + ) + ) + ) + ), + (object) array( + 'name' => 'authorWidget', + 'type' => 'group', + 'fields'=> array( + (object) array( + 'label' => "Author's name", + 'name' => "authorName", + 'optional' => TRUE, + 'type' => "text" + ), + (object) array( + 'name' => 'authorRole', + 'type' => 'select', + 'label' => $this->h5pF->t("Author's role"), + 'default' => 'Originator', + 'options' => array( + (object) array( + 'value' => 'Editor', + 'label' => $this->h5pF->t('Editor') + ), + (object) array( + 'value' => 'Licensee', + 'label' => $this->h5pF->t('Licensee') + ), + (object) array( + 'value' => 'Originator', + 'label' => $this->h5pF->t('Originator') + ) + ) + ) + ) + ), + (object) array( + 'name' => 'licenseExtras', + 'type' => 'textarea', + 'label' => $this->h5pF->t('License Extras'), + 'optional' => TRUE, + 'description' => $this->h5pF->t('Any additional information about the license') + ), + (object) array( + 'name' => 'changeLog', + 'type' => 'group', + 'expanded' => FALSE, + 'label' => $this->h5pF->t('Change Log'), + 'fields' => array( + (object) array ( + 'name' => 'changeLogForm', + 'type' => 'group', + 'label' => $this->h5pF->t('Question'), + 'expanded' => TRUE, + 'fields' => array( + (object) array( + 'name' => 'date', + 'type' => 'text', + 'label' => $this->h5pF->t('Date'), + 'optional' => TRUE + ), + (object) array( + 'name' => 'author', + 'type' => 'text', + 'label' => $this->h5pF->t('Changed by'), + 'optional' => TRUE + ), + (object) array( + 'name' => 'log', + 'type' => 'textarea', + 'label' => $this->h5pF->t('Description of change'), + 'placeholder' => $this->h5pF->t('Add a description of your change'), + 'optional' => TRUE + ) + ) + ) + ) + ), + (object) array( + 'name' => 'authorComments', + 'label' => $this->h5pF->t('Additional Information'), + 'type' => 'group', + 'expanded' => FALSE, + 'fields' => array( + (object) array ( + 'name' => 'authorComments', + 'type' => 'textarea', + 'label' => $this->h5pF->t('Author comments'), + 'description' => $this->h5pF->t('Comments for the editor of the content (This text will not be published as a part of copyright info'), + 'optional' => TRUE + ) + ) + ) + ); + + return $semantics; + } + public function getCopyrightSemantics() { static $semantics; diff --git a/js/h5p.js b/js/h5p.js index 599e59b..390efe4 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1364,7 +1364,7 @@ H5P.MediaCopyright = function (copyright, labels, order, extraFields) { link = copyrightLicense.link.replace(':version', copyrightLicense.linkVersions ? copyrightLicense.linkVersions[version] : version); } else if (versionInfo && copyrightLicense.hasOwnProperty('link')) { - link = versionInfo.link + link = versionInfo.link; } if (link) { value = '' + value + ''; @@ -2150,6 +2150,10 @@ H5P.createTitle = function (rawTitle, maxLength) { link: 'http://creativecommons.org/licenses/by-nc-nd/:version/legalcode', versions: ccVersions }, + 'CC0 1.0': { + label: H5P.t('licenseCC010'), + link: 'https://creativecommons.org/publicdomain/zero/1.0/' + }, 'GNU GPL': { label: H5P.t('licenseGPL'), link: 'http://www.gnu.org/licenses/gpl-:version-standalone.html', @@ -2179,7 +2183,10 @@ H5P.createTitle = function (rawTitle, maxLength) { } }, 'ODC PDDL': 'Public Domain Dedication and Licence', - 'CC PDM': H5P.t('licensePDM'), + 'CC PDM': { + label: H5P.t('licensePDM'), + link: 'https://creativecommons.org/publicdomain/mark/1.0/' + }, 'C': H5P.t('licenseC'), }; From 00deb02aa7fddd38eaf9a12193b90073d1bf1f3c Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 28 May 2018 18:01:28 +0200 Subject: [PATCH 12/32] HFP-1897 Set author as default role, change placeholder text for change --- h5p.classes.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index bc48e66..9580125 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4259,8 +4259,12 @@ class H5PContentValidator { 'name' => 'authorRole', 'type' => 'select', 'label' => $this->h5pF->t("Author's role"), - 'default' => 'Originator', + 'default' => 'Author', 'options' => array( + (object) array( + 'value' => 'Editor', + 'label' => $this->h5pF->t('Author') + ), (object) array( 'value' => 'Editor', 'label' => $this->h5pF->t('Editor') @@ -4312,7 +4316,7 @@ class H5PContentValidator { 'name' => 'log', 'type' => 'textarea', 'label' => $this->h5pF->t('Description of change'), - 'placeholder' => $this->h5pF->t('Add a description of your change'), + 'placeholder' => $this->h5pF->t('Photo cropped, text changed, etc.'), 'optional' => TRUE ) ) From 47be831f4990a07325b0563c6b29b9ad3d5fa85f Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Tue, 29 May 2018 17:00:56 +0200 Subject: [PATCH 13/32] HFP-1897 Fix author as default role --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 9580125..9ef5ef5 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4262,7 +4262,7 @@ class H5PContentValidator { 'default' => 'Author', 'options' => array( (object) array( - 'value' => 'Editor', + 'value' => 'Author', 'label' => $this->h5pF->t('Author') ), (object) array( From a30a93e62ec5cb45e6e7b09bc750fe37cae33d09 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Tue, 29 May 2018 17:23:06 +0200 Subject: [PATCH 14/32] HFP-1897 Set correct field types and boundaries --- h5p.classes.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 9ef5ef5..44ea65d 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4220,16 +4220,20 @@ class H5PContentValidator { ), (object) array( 'name' => 'yearFrom', - 'type' => 'text', + 'type' => 'number', 'label' => $this->h5pF->t('Years (from-to)'), 'placeholder' => '1991', + 'min' => '-9999', + 'max' => '9999', 'optional' => TRUE ), (object) array( 'name' => 'yearTo', - 'type' => 'text', + 'type' => 'number', 'label' => 'hiddenLabel', 'placeholder' => '1992', + 'min' => '-9999', + 'max' => '9999', 'optional' => TRUE ), (object) array( From 8f45ea4d7920b1c85189fc3305db44247b749c7e Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Fri, 1 Jun 2018 15:45:09 +0200 Subject: [PATCH 15/32] HFP-1905 Fix finding copyright edge case bug --- js/h5p.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index 390efe4..ea21c78 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1024,7 +1024,7 @@ H5P.getCopyrights = function (instance, parameters, contentId, metadata) { * Used to insert thumbnails for images. */ H5P.findCopyrights = function (info, parameters, contentId) { - var lastContentTypeName = undefined; + var lastContentTypeName; // Cycle through parameters for (var field in parameters) { if (!parameters.hasOwnProperty(field)) { @@ -1045,8 +1045,12 @@ H5P.findCopyrights = function (info, parameters, contentId) { var value = parameters[field]; - // TODO: Get the real name of the content type - lastContentTypeName = (value.library) ? value.library.split(' ')[0] : lastContentTypeName; + if (value.library && typeof value.library === 'string') { + lastContentTypeName = value.library.split(' ')[0]; + } + else if (value.library && typeof value.library === 'object') { + lastContentTypeName = (value.library.library && typeof value.library.library === 'string') ? value.library.library.split(' ')[0] : lastContentTypeName; + } if (value instanceof Array) { // Cycle through array From 0fbc6ef5a8380ba1430dea92f931837ac1820c05 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Fri, 1 Jun 2018 17:44:21 +0200 Subject: [PATCH 16/32] HFP-1905 Fix potential undefined values --- js/h5p.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index ea21c78..6d63259 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1045,10 +1045,10 @@ H5P.findCopyrights = function (info, parameters, contentId) { var value = parameters[field]; - if (value.library && typeof value.library === 'string') { + if (value && value.library && typeof value.library === 'string') { lastContentTypeName = value.library.split(' ')[0]; } - else if (value.library && typeof value.library === 'object') { + else if (value && value.library && typeof value.library === 'object') { lastContentTypeName = (value.library.library && typeof value.library.library === 'string') ? value.library.library.split(' ')[0] : lastContentTypeName; } From ea722126ffc4020642d8062c6d66eb40f563440e Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 4 Jun 2018 15:44:04 +0200 Subject: [PATCH 17/32] HFP-1905 Fix property naming and validation defaults Fix property naming for more harmony (and peace in the world) Fix validation on uploading content by adding Author as a role --- h5p.classes.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 44ea65d..67a6a7b 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -624,7 +624,7 @@ class H5PValidator { 'author' => '/^.{1,255}$/', 'authors' => array( 'name' => '/^.{1,255}$/', - 'role' => '/^(Illustrator|Designer|Photographer)$/', + 'role' => '/^(Author|Illustrator|Designer|Photographer)$/', ), 'license' => '/^(CC BY|CC BY-SA|CC BY-ND|CC BY-NC|CC BY-NC-SA|CC BY-NC-ND|GNU GPL|PD|ODC PDDL|CC PDM|U|C|cc-by|cc-by-sa|cc-by-nd|cc-by-nc|cc-by-nc-sa|cc-by-nc-nd|pd|cr|MIT|GPL1|GPL2|GPL3|MPL|MPL2)$/', 'licenseVersion' => '/^(1.0|2.0|2.5|3.0|4.0)$/', @@ -4255,12 +4255,12 @@ class H5PContentValidator { 'fields'=> array( (object) array( 'label' => "Author's name", - 'name' => "authorName", + 'name' => "name", 'optional' => TRUE, 'type' => "text" ), (object) array( - 'name' => 'authorRole', + 'name' => 'role', 'type' => 'select', 'label' => $this->h5pF->t("Author's role"), 'default' => 'Author', From be77130fef33dc3ff6b9548cf18f5bc5b7497fb4 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Tue, 5 Jun 2018 08:54:12 +0200 Subject: [PATCH 18/32] HFP-1905 Require words for author roles --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 67a6a7b..47258ef 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -624,7 +624,7 @@ class H5PValidator { 'author' => '/^.{1,255}$/', 'authors' => array( 'name' => '/^.{1,255}$/', - 'role' => '/^(Author|Illustrator|Designer|Photographer)$/', + 'role' => '/^\w+$/', ), 'license' => '/^(CC BY|CC BY-SA|CC BY-ND|CC BY-NC|CC BY-NC-SA|CC BY-NC-ND|GNU GPL|PD|ODC PDDL|CC PDM|U|C|cc-by|cc-by-sa|cc-by-nd|cc-by-nc|cc-by-nc-sa|cc-by-nc-nd|pd|cr|MIT|GPL1|GPL2|GPL3|MPL|MPL2)$/', 'licenseVersion' => '/^(1.0|2.0|2.5|3.0|4.0)$/', From e179ec2934cd6cec539c277d12008fbf9b5a47e8 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Wed, 13 Jun 2018 16:41:49 +0200 Subject: [PATCH 19/32] HFP-2052 Make changes requested in UX review - Add link for source - Change URLs for licenses --- js/h5p.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index 631836d..dc50cd4 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1096,7 +1096,7 @@ H5P.buildMetadataCopyrights = function (metadata, contentTypeName) { var dataset = { title: metadata.title, author: (metadata.authors && metadata.authors.length > 0) ? metadata.authors.map(function(author) {return author.name + ' (' + author.role + ')';}).join(', ') : undefined, - source: metadata.source, + source: '' + metadata.source + '', year: (metadata.yearFrom) ? (metadata.yearFrom + ((metadata.yearTo) ? '-' + metadata.yearTo: '')) : undefined, license: metadata.license, version: metadata.licenseVersion, @@ -2136,32 +2136,32 @@ H5P.createTitle = function (rawTitle, maxLength) { 'U': H5P.t('licenseU'), 'CC BY': { label: H5P.t('licenseCCBY'), - link: 'http://creativecommons.org/licenses/by/:version/legalcode', + link: 'http://creativecommons.org/licenses/by/:version', versions: ccVersions }, 'CC BY-SA': { label: H5P.t('licenseCCBYSA'), - link: 'http://creativecommons.org/licenses/by-sa/:version/legalcode', + link: 'http://creativecommons.org/licenses/by-sa/:version', versions: ccVersions }, 'CC BY-ND': { label: H5P.t('licenseCCBYND'), - link: 'http://creativecommons.org/licenses/by-nd/:version/legalcode', + link: 'http://creativecommons.org/licenses/by-nd/:version', versions: ccVersions }, 'CC BY-NC': { label: H5P.t('licenseCCBYNC'), - link: 'http://creativecommons.org/licenses/by-nc/:version/legalcode', + link: 'http://creativecommons.org/licenses/by-nc/:version', versions: ccVersions }, 'CC BY-NC-SA': { label: H5P.t('licenseCCBYNCSA'), - link: 'http://creativecommons.org/licenses/by-nc-sa/:version/legalcode', + link: 'http://creativecommons.org/licenses/by-nc-sa/:version', versions: ccVersions }, 'CC BY-NC-ND': { label: H5P.t('licenseCCBYNCND'), - link: 'http://creativecommons.org/licenses/by-nc-nd/:version/legalcode', + link: 'http://creativecommons.org/licenses/by-nc-nd/:version', versions: ccVersions }, 'CC0 1.0': { From 17162f32effb253648231b60ecac550e54016c21 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Wed, 20 Jun 2018 16:25:27 +0200 Subject: [PATCH 20/32] HFP-2052 Fix undefined source --- js/h5p.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/h5p.js b/js/h5p.js index dc50cd4..5579751 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1096,7 +1096,7 @@ H5P.buildMetadataCopyrights = function (metadata, contentTypeName) { var dataset = { title: metadata.title, author: (metadata.authors && metadata.authors.length > 0) ? metadata.authors.map(function(author) {return author.name + ' (' + author.role + ')';}).join(', ') : undefined, - source: '' + metadata.source + '', + source: (metadata.source) ? '' + metadata.source + '' : undefined, year: (metadata.yearFrom) ? (metadata.yearFrom + ((metadata.yearTo) ? '-' + metadata.yearTo: '')) : undefined, license: metadata.license, version: metadata.licenseVersion, From 2a53b7bb7b11f1d89239c38e1a85661c183cd210 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Fri, 22 Jun 2018 13:45:59 +0200 Subject: [PATCH 21/32] HFP-2059 Accept objects as library options, too Compound content types should be able to deactivate the metadata button for their subcontent types. This should be achievable by amending the options property of a library field. The options array can not either contains strings with library names or objects with the property "name" (mandatory) and further properties, one of them being "hasmetadata" --- h5p.classes.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 09f15ed..2d1c5e9 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -3692,12 +3692,24 @@ class H5PContentValidator { $value = NULL; return; } - if (!in_array($value->library, $semantics->options)) { + + // Check for array of objects or array of strings + if (is_object($semantics->options[0])) { + $getLibraryNames = function ($item) { + return $item->name; + }; + $libraryNames = array_map($getLibraryNames, $semantics->options); + } + else { + $libraryNames = $semantics->options; + } + + if (!in_array($value->library, $libraryNames)) { $message = NULL; // Create an understandable error message: $machineNameArray = explode(' ', $value->library); $machineName = $machineNameArray[0]; - foreach ($semantics->options as $semanticsLibrary) { + foreach ($libraryNames as $semanticsLibrary) { $semanticsMachineNameArray = explode(' ', $semanticsLibrary); $semanticsMachineName = $semanticsMachineNameArray[0]; if ($machineName === $semanticsMachineName) { @@ -3741,6 +3753,7 @@ class H5PContentValidator { if (isset($semantics->extraAttributes)) { $validKeys = array_merge($validKeys, $semantics->extraAttributes); } + $this->filterParams($value, $validKeys); if (isset($value->subContentId) && ! preg_match('/^\{?[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\}?$/', $value->subContentId)) { unset($value->subContentId); From 8190fe1d42e0b8bbf91ff6378ebfc20d2a57d3d2 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 25 Jun 2018 11:31:09 +0200 Subject: [PATCH 22/32] HFP-1896 Fix metadata form error handling --- h5p.classes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 2d1c5e9..95a9264 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4234,7 +4234,7 @@ class H5PContentValidator { (object) array( 'name' => 'yearFrom', 'type' => 'number', - 'label' => $this->h5pF->t('Years (from-to)'), + 'label' => $this->h5pF->t('Years (from)'), 'placeholder' => '1991', 'min' => '-9999', 'max' => '9999', @@ -4243,7 +4243,7 @@ class H5PContentValidator { (object) array( 'name' => 'yearTo', 'type' => 'number', - 'label' => 'hiddenLabel', + 'label' => $this->h5pF->t('Years (to)'), 'placeholder' => '1992', 'min' => '-9999', 'max' => '9999', From d113809e80aa36f44ec56399fe4ed179e81c49bc Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 25 Jun 2018 14:14:13 +0200 Subject: [PATCH 23/32] HFP-1905 Fix source and link in copyright view --- js/h5p.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index 5579751..dd4716c 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1095,8 +1095,10 @@ H5P.buildMetadataCopyrights = function (metadata, contentTypeName) { if (metadata && metadata.license !== undefined && metadata.license !== 'U') { var dataset = { title: metadata.title, - author: (metadata.authors && metadata.authors.length > 0) ? metadata.authors.map(function(author) {return author.name + ' (' + author.role + ')';}).join(', ') : undefined, - source: (metadata.source) ? '' + metadata.source + '' : undefined, + author: (metadata.authors && metadata.authors.length > 0) ? metadata.authors.map(function(author) { + return (author.role) ? author.name + ' (' + author.role + ')' : author.name; + }).join(', ') : undefined, + source: metadata.source, year: (metadata.yearFrom) ? (metadata.yearFrom + ((metadata.yearTo) ? '-' + metadata.yearTo: '')) : undefined, license: metadata.license, version: metadata.licenseVersion, @@ -1415,6 +1417,9 @@ H5P.MediaCopyright = function (copyright, labels, order, extraFields) { if (fieldName === 'license') { humanValue = humanizeLicense(copyright.license, copyright.version); } + if (fieldName === 'source') { + humanValue = (humanValue) ? '' + humanValue + '' : undefined; + } list.add(new H5P.Field(getLabel(fieldName), humanValue)); } } From 4d286b0bdbf527b65a9be0d73453b3c34b05a4b9 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Mon, 25 Jun 2018 14:14:51 +0200 Subject: [PATCH 24/32] Fix HFP-1905 Add CC for creative commons license names --- h5p.classes.php | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 95a9264..303e2b5 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4166,61 +4166,61 @@ class H5PContentValidator { 'options' => array( (object) array( 'value' => 'U', - 'label' => 'Undisclosed' + 'label' => $this->h5pF->t('Undisclosed') ), (object) array( 'value' => 'CC BY', - 'label' => 'Attribution', + 'label' => $this->h5pF->t('CC Attribution'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-SA', - 'label' => 'Attribution-ShareAlike', + 'label' => $this->h5pF->t('CC Attribution-ShareAlike'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-ND', - 'label' => 'Attribution-NoDerivs', + 'label' => $this->h5pF->t('CC Attribution-NoDerivs'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC', - 'label' => 'Attribution-NonCommercial', + 'label' => $this->h5pF->t('CC Attribution-NonCommercial'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC-SA', - 'label' => 'Attribution-NonCommercial-ShareAlike', + 'label' => $this->h5pF->t('CC Attribution-NonCommercial-ShareAlike'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC-ND', - 'label' => 'Attribution-NonCommercial-NoDerivs', + 'label' => $this->h5pF->t('CC Attribution-NonCommercial-NoDerivs'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC0 1.0', - 'label' => 'Public Domain Dedication' + 'label' => $this->h5pF->t('CC Public Domain Dedication') ), (object) array( 'value' => 'CC PDM', - 'label' => 'Public Domain Mark' + 'label' => $this->h5pF->t('Public Domain Mark') ), (object) array( 'value' => 'GNU GPL', - 'label' => 'General Public License v3' + 'label' => $this->h5pF->t('General Public License v3') ), (object) array( 'value' => 'PD', - 'label' => 'Public Domain' + 'label' => $this->h5pF->t('Public Domain') ), (object) array( 'value' => 'ODC PDDL', - 'label' => 'Public Domain Dedication and Licence' + 'label' => $this->h5pF->t('Public Domain Dedication and Licence') ), (object) array( 'value' => 'C', - 'label' => 'Copyright' + 'label' => $this->h5pF->t('Copyright') ) ) ), @@ -4252,7 +4252,7 @@ class H5PContentValidator { (object) array( 'name' => 'source', 'type' => 'text', - 'label' => 'Source', + 'label' => $this->h5pF->t('Source'), 'placeholder' => 'https://', 'optional' => TRUE, 'regexp' => array( @@ -4267,7 +4267,7 @@ class H5PContentValidator { 'type' => 'group', 'fields'=> array( (object) array( - 'label' => "Author's name", + 'label' => $this->h5pF->t("Author's name"), 'name' => "name", 'optional' => TRUE, 'type' => "text" From b1446e8d60dd5ae4e7cf9a12aadc7029de29c216 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Mon, 25 Jun 2018 15:59:17 +0200 Subject: [PATCH 25/32] HFP-2027 Add copy paste helpers to core --- js/h5p.js | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/js/h5p.js b/js/h5p.js index ef56834..00dc019 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -2041,9 +2041,129 @@ H5P.createTitle = function (rawTitle, maxLength) { contentUserDataAjax(contentId, dataId, subContentId, undefined, null); }; + /** + * Prepares the content parameters for storing in the clipboard. + * + * @class + * @param {Object} parameters The parameters for the content to store + * @param {string} [genericProperty] If only part of the parameters are generic, which part + * @param {string} [specificKey] If the parameters are specific, what content type does it fit + * @returns {Object} Ready for the clipboard + */ + H5P.ClipboardItem = function (parameters, genericProperty, specificKey) { + this.specific = parameters; + + if (genericProperty && specificKey) { + this.from = specificKey; + if (parameters[genericProperty]) { + this.generic = genericProperty; + } + } + + if (window.H5PEditor && H5PEditor.contentId) { + this.contentId = H5PEditor.contentId; + } + }; + + /** + * Store item in the H5P Clipboard. + * + * @param {H5P.ClipboardItem|*} clipboardItem + */ + H5P.clipboardify = function (clipboardItem) { + if (!(clipboardItem instanceof H5P.ClipboardItem)) { + clipboardItem = new H5P.ClipboardItem(clipboardItem); + } + + localStorage.setItem('h5pClipboard', JSON.stringify(clipboardItem)); + + // Trigger an event so all 'Paste' buttons may be enabled. + H5P.externalDispatcher.trigger('datainclipboard', {reset: false}); + }; + + /** + * Get item from the H5P Clipboard. + * + * @return {Object} + */ + H5P.getClipboard = function () { + var clipboardData = localStorage.getItem('h5pClipboard'); + if (!clipboardData) { + return; + } + + // Try to parse clipboard dat + try { + clipboardData = JSON.parse(clipboardData); + } + catch (err) { + console.error('Unable to parse JSON from clipboard.', err); + return; + } + + // Update file URLs + H5P.updateFileUrls(clipboardData.specific, function (path) { + var isTmpFile = (path.substr(-4, 4) === '#tmp'); + if (!isTmpFile && clipboardData.contentId) { + // Comes from existing content + + if (H5PEditor.contentId) { + // .. to existing content + return '../' + clipboardData.contentId + '/' + path; + } + else { + // .. to new content + return (H5PEditor.contentRelUrl ? H5PEditor.contentRelUrl : '../content/') + clipboardData.contentId + '/' + path; + } + } + return path; // Will automatically be looked for in tmp folder + }); + + if (clipboardData.from === undefined) { + clipboardData.generic = clipboardData.specific; + } + else if (clipboardData.generic) { + clipboardData.generic = clipboardData.specific[clipboardData.generic]; + } + + if (clipboardData.generic) { + // Avoid multiple content with same ID + delete clipboardData.generic.subContentId; + } + + return clipboardData; + }; + + /** + * Update file URLs. Useful when copying content. + * + * @param {object} params Reference + * @param {function} handler Modifies the path to work when pasted + */ + H5P.updateFileUrls = function (params, handler) { + for (var prop in params) { + if (params.hasOwnProperty(prop) && params[prop] instanceof Object) { + var obj = params[prop]; + if (obj.path !== undefined && obj.mime !== undefined) { + obj.path = handler(obj.path); + } + else { + H5P.updateFileUrls(obj, handler); + } + } + } + }; + // Init H5P when page is fully loadded $(document).ready(function () { + window.addEventListener('storage', function (event) { + // Pick up clipboard changes from other tabs + if (event.key === 'h5pClipboard') { + H5P.externalDispatcher.trigger('datainclipboard', {reset: event.newValue === null}); + } + }); + var ccVersions = { 'default': '4.0', '4.0': H5P.t('licenseCC40'), From d963a23a159d1d18a6d0c5992951744b33a79273 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 26 Jun 2018 10:51:48 +0200 Subject: [PATCH 26/32] HFP-2074 Add optgroup to Creative Commons licenses in metadata dialog. --- h5p.classes.php | 78 ++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 303e2b5..b413920 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4169,42 +4169,48 @@ class H5PContentValidator { 'label' => $this->h5pF->t('Undisclosed') ), (object) array( - 'value' => 'CC BY', - 'label' => $this->h5pF->t('CC Attribution'), - 'versions' => $cc_versions - ), - (object) array( - 'value' => 'CC BY-SA', - 'label' => $this->h5pF->t('CC Attribution-ShareAlike'), - 'versions' => $cc_versions - ), - (object) array( - 'value' => 'CC BY-ND', - 'label' => $this->h5pF->t('CC Attribution-NoDerivs'), - 'versions' => $cc_versions - ), - (object) array( - 'value' => 'CC BY-NC', - 'label' => $this->h5pF->t('CC Attribution-NonCommercial'), - 'versions' => $cc_versions - ), - (object) array( - 'value' => 'CC BY-NC-SA', - 'label' => $this->h5pF->t('CC Attribution-NonCommercial-ShareAlike'), - 'versions' => $cc_versions - ), - (object) array( - 'value' => 'CC BY-NC-ND', - 'label' => $this->h5pF->t('CC Attribution-NonCommercial-NoDerivs'), - 'versions' => $cc_versions - ), - (object) array( - 'value' => 'CC0 1.0', - 'label' => $this->h5pF->t('CC Public Domain Dedication') - ), - (object) array( - 'value' => 'CC PDM', - 'label' => $this->h5pF->t('Public Domain Mark') + 'type' => 'optgroup', + 'label' => $this->h5pF->t('Creative Commons'), + 'options' => [ + (object) array( + 'value' => 'CC BY', + 'label' => $this->h5pF->t('CC Attribution'), + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-SA', + 'label' => $this->h5pF->t('CC Attribution-ShareAlike'), + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-ND', + 'label' => $this->h5pF->t('CC Attribution-NoDerivs'), + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-NC', + 'label' => $this->h5pF->t('CC Attribution-NonCommercial'), + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-NC-SA', + 'label' => $this->h5pF->t('CC Attribution-NonCommercial-ShareAlike'), + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC BY-NC-ND', + 'label' => $this->h5pF->t('CC Attribution-NonCommercial-NoDerivs'), + 'versions' => $cc_versions + ), + (object) array( + 'value' => 'CC0 1.0', + 'label' => $this->h5pF->t('CC Public Domain Dedication') + ), + (object) array( + 'value' => 'CC PDM', + 'label' => $this->h5pF->t('Public Domain Mark') + ), + ] ), (object) array( 'value' => 'GNU GPL', From d24fd0e66792e8a510c8616ed035bfec76b00e9a Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Tue, 26 Jun 2018 11:52:57 +0200 Subject: [PATCH 27/32] HFP-2072 Improve copy-paste API behavior --- js/h5p.js | 90 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 16 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index 00dc019..b09759b 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -2051,17 +2051,49 @@ H5P.createTitle = function (rawTitle, maxLength) { * @returns {Object} Ready for the clipboard */ H5P.ClipboardItem = function (parameters, genericProperty, specificKey) { - this.specific = parameters; + var self = this; - if (genericProperty && specificKey) { - this.from = specificKey; - if (parameters[genericProperty]) { - this.generic = genericProperty; + /** + * Set relative dimensions when params contains a file with a width and a height. + * Very useful to be compatible with wysiwyg editors. + * + * @private + */ + var setDimensionsFromFile = function () { + if (!self.generic) { + return; } + var params = self.specific[self.generic]; + if (!params.params.file || !params.params.file.width || !params.params.file.height) { + return; + } + + self.width = 20; // % + self.height = (params.params.file.height / params.params.file.width) * self.width; + } + + if (!genericProperty) { + genericProperty = 'action'; + parameters = { + action: parameters + }; + } + + self.specific = parameters; + + if (genericProperty && parameters[genericProperty]) { + self.generic = genericProperty; + } + if (specificKey) { + self.from = specificKey; } if (window.H5PEditor && H5PEditor.contentId) { - this.contentId = H5PEditor.contentId; + self.contentId = H5PEditor.contentId; + } + + if (!self.specific.width && !self.specific.height) { + setDimensionsFromFile(); } }; @@ -2077,16 +2109,40 @@ H5P.createTitle = function (rawTitle, maxLength) { localStorage.setItem('h5pClipboard', JSON.stringify(clipboardItem)); + // Clear cache + parsedClipboard = null; + // Trigger an event so all 'Paste' buttons may be enabled. H5P.externalDispatcher.trigger('datainclipboard', {reset: false}); }; /** - * Get item from the H5P Clipboard. + * This is a cache for pasted data to prevent parsing multiple times. + * @type {Object} + */ + var parsedClipboard = null; + + /** + * Retrieve parsed clipboard data. * * @return {Object} */ H5P.getClipboard = function () { + if (!parsedClipboard) { + parsedClipboard = parseClipboard(); + } + + return parsedClipboard; + } + + /** + * Get item from the H5P Clipboard. + * + * @private + * @param {boolean} [skipUpdateFileUrls] + * @return {Object} + */ + var parseClipboard = function () { var clipboardData = localStorage.getItem('h5pClipboard'); if (!clipboardData) { return; @@ -2102,7 +2158,7 @@ H5P.createTitle = function (rawTitle, maxLength) { } // Update file URLs - H5P.updateFileUrls(clipboardData.specific, function (path) { + updateFileUrls(clipboardData.specific, function (path) { var isTmpFile = (path.substr(-4, 4) === '#tmp'); if (!isTmpFile && clipboardData.contentId) { // Comes from existing content @@ -2119,14 +2175,11 @@ H5P.createTitle = function (rawTitle, maxLength) { return path; // Will automatically be looked for in tmp folder }); - if (clipboardData.from === undefined) { - clipboardData.generic = clipboardData.specific; - } - else if (clipboardData.generic) { - clipboardData.generic = clipboardData.specific[clipboardData.generic]; - } if (clipboardData.generic) { + // Use reference instead of key + clipboardData.generic = clipboardData.specific[clipboardData.generic]; + // Avoid multiple content with same ID delete clipboardData.generic.subContentId; } @@ -2137,10 +2190,11 @@ H5P.createTitle = function (rawTitle, maxLength) { /** * Update file URLs. Useful when copying content. * + * @private * @param {object} params Reference * @param {function} handler Modifies the path to work when pasted */ - H5P.updateFileUrls = function (params, handler) { + var updateFileUrls = function (params, handler) { for (var prop in params) { if (params.hasOwnProperty(prop) && params[prop] instanceof Object) { var obj = params[prop]; @@ -2148,7 +2202,7 @@ H5P.createTitle = function (rawTitle, maxLength) { obj.path = handler(obj.path); } else { - H5P.updateFileUrls(obj, handler); + updateFileUrls(obj, handler); } } } @@ -2160,6 +2214,10 @@ H5P.createTitle = function (rawTitle, maxLength) { window.addEventListener('storage', function (event) { // Pick up clipboard changes from other tabs if (event.key === 'h5pClipboard') { + // Clear cache + parsedClipboard = null; + + // Trigger an event so all 'Paste' buttons may be enabled. H5P.externalDispatcher.trigger('datainclipboard', {reset: event.newValue === null}); } }); From 9432d80b232568891b7524c502ddb07b27d0bb19 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Wed, 27 Jun 2018 15:59:34 +0200 Subject: [PATCH 28/32] HFP-2075 Don't require protocol for metadata source field --- h5p.classes.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 303e2b5..9c46c87 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4254,11 +4254,7 @@ class H5PContentValidator { 'type' => 'text', 'label' => $this->h5pF->t('Source'), 'placeholder' => 'https://', - 'optional' => TRUE, - 'regexp' => array( - 'pattern' => '^http[s]?://.+', - 'modifiers' => 'i' - ) + 'optional' => TRUE ) ) ), From 972c7a13f66012092e3e4db89b76ee7e85166991 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Thu, 28 Jun 2018 11:44:01 +0200 Subject: [PATCH 29/32] HFP-2074 Remove CC prefix in license names Now that the optgroup feature is in place, the prefix is obsolete --- h5p.classes.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 184082e..9d21c50 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -4174,37 +4174,37 @@ class H5PContentValidator { 'options' => [ (object) array( 'value' => 'CC BY', - 'label' => $this->h5pF->t('CC Attribution'), + 'label' => $this->h5pF->t('Attribution'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-SA', - 'label' => $this->h5pF->t('CC Attribution-ShareAlike'), + 'label' => $this->h5pF->t('Attribution-ShareAlike'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-ND', - 'label' => $this->h5pF->t('CC Attribution-NoDerivs'), + 'label' => $this->h5pF->t('Attribution-NoDerivs'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC', - 'label' => $this->h5pF->t('CC Attribution-NonCommercial'), + 'label' => $this->h5pF->t('Attribution-NonCommercial'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC-SA', - 'label' => $this->h5pF->t('CC Attribution-NonCommercial-ShareAlike'), + 'label' => $this->h5pF->t('Attribution-NonCommercial-ShareAlike'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC BY-NC-ND', - 'label' => $this->h5pF->t('CC Attribution-NonCommercial-NoDerivs'), + 'label' => $this->h5pF->t('Attribution-NonCommercial-NoDerivs'), 'versions' => $cc_versions ), (object) array( 'value' => 'CC0 1.0', - 'label' => $this->h5pF->t('CC Public Domain Dedication') + 'label' => $this->h5pF->t('Public Domain Dedication') ), (object) array( 'value' => 'CC PDM', From 14bcb913b77e38456df1f5f8430cc33fc02fb0b4 Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Thu, 28 Jun 2018 18:21:30 +0200 Subject: [PATCH 30/32] HFP-1905 Include metadata in findCopyrights --- js/h5p.js | 51 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/js/h5p.js b/js/h5p.js index 37259db..a92d24c 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -976,10 +976,10 @@ H5P.Dialog = function (name, title, content, $element) { * H5P instance to get copyright information for. * @param {Object} parameters * Parameters of the content instance. - * @param {Object} metadata - * Metadata of the content instance. * @param {number} contentId * Identifies the H5P content + * @param {Object} metadata + * Metadata of the content instance. * @returns {string} Copyright information. */ H5P.getCopyrights = function (instance, parameters, contentId, metadata) { @@ -1022,8 +1022,18 @@ H5P.getCopyrights = function (instance, parameters, contentId, metadata) { * To search for file objects in. * @param {number} contentId * Used to insert thumbnails for images. + * @param {Object} extras - Extras. + * @param {object} extras.metadata - Metadata + * @param {object} extras.machineName - Library name of some kind. + * Metadata of the content instance. */ -H5P.findCopyrights = function (info, parameters, contentId) { +H5P.findCopyrights = function (info, parameters, contentId, extras) { + // If extras are + if (extras) { + extras.params = parameters; + buildFromMetadata(extras, extras.machineName, contentId); + } + var lastContentTypeName; // Cycle through parameters for (var field in parameters) { @@ -1057,18 +1067,7 @@ H5P.findCopyrights = function (info, parameters, contentId) { H5P.findCopyrights(info, value, contentId); } else if (value instanceof Object) { - if (value.metadata) { - var metadataCopyrights = H5P.buildMetadataCopyrights(value.metadata, lastContentTypeName); - if (metadataCopyrights !== undefined) { - if (value.params && value.params.contentName === 'Image' && value.params.file) { - var path = value.params.file.path; - var width = value.params.file.width; - var height = value.params.file.height; - metadataCopyrights.setThumbnail(new H5P.Thumbnail(H5P.getPath(path, contentId), width, height)); - } - info.addMedia(metadataCopyrights); - } - } + buildFromMetadata(value, lastContentTypeName, contentId); // Check if object is a file with copyrights (old core) if (value.copyright === undefined || @@ -1089,6 +1088,21 @@ H5P.findCopyrights = function (info, parameters, contentId) { } } } + + function buildFromMetadata (data, name, contentId) { + if (data.metadata) { + const metadataCopyrights = H5P.buildMetadataCopyrights(data.metadata, name); + if (metadataCopyrights !== undefined) { + if (data.params && data.params.contentName === 'Image' && data.params.file) { + const path = data.params.file.path; + const width = data.params.file.width; + const height = data.params.file.height; + metadataCopyrights.setThumbnail(new H5P.Thumbnail(H5P.getPath(path, contentId), width, height)); + } + info.addMedia(metadataCopyrights); + } + } + } }; H5P.buildMetadataCopyrights = function (metadata, contentTypeName) { @@ -1108,8 +1122,11 @@ H5P.buildMetadataCopyrights = function (metadata, contentTypeName) { }).join(' / ') : undefined }; - if (contentTypeName && contentTypeName.indexOf('H5P.') === 0) { - contentTypeName = contentTypeName.substr(4); + if (contentTypeName) { + contentTypeName = contentTypeName + .split(' ')[0] + .replace(/^H5P\./, '') + .replace(/([a-z])([A-Z])/, '$1' + ' ' + '$2'); } return new H5P.MediaCopyright( From e241ec6963204bf019934ea39fab96637b4cf0be Mon Sep 17 00:00:00 2001 From: Oliver Tacke Date: Thu, 28 Jun 2018 18:36:58 +0200 Subject: [PATCH 31/32] HFP-1905 Fix for LibraryNames with many elements --- js/h5p.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/h5p.js b/js/h5p.js index a92d24c..1c73e70 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1126,7 +1126,7 @@ H5P.buildMetadataCopyrights = function (metadata, contentTypeName) { contentTypeName = contentTypeName .split(' ')[0] .replace(/^H5P\./, '') - .replace(/([a-z])([A-Z])/, '$1' + ' ' + '$2'); + .replace(/([a-z])([A-Z])/g, '$1' + ' ' + '$2'); } return new H5P.MediaCopyright( From 10aaa38844720d02e2dfdc4de3bd4add0a187b5e Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Tue, 3 Jul 2018 10:34:26 +0200 Subject: [PATCH 32/32] HFP-2027 Fix copy-paste icons --- fonts/h5p-core-18.eot | Bin 6532 -> 0 bytes fonts/h5p-core-18.svg | 52 --------------------------------------- fonts/h5p-core-18.ttf | Bin 6384 -> 0 bytes fonts/h5p-core-18.woff | Bin 6460 -> 0 bytes fonts/h5p-core-19.eot | Bin 0 -> 7408 bytes fonts/h5p-core-19.svg | 54 +++++++++++++++++++++++++++++++++++++++++ fonts/h5p-core-19.ttf | Bin 0 -> 7228 bytes fonts/h5p-core-19.woff | Bin 0 -> 7304 bytes styles/h5p.css | 10 ++++---- 9 files changed, 59 insertions(+), 57 deletions(-) delete mode 100755 fonts/h5p-core-18.eot delete mode 100755 fonts/h5p-core-18.svg delete mode 100755 fonts/h5p-core-18.ttf delete mode 100755 fonts/h5p-core-18.woff create mode 100644 fonts/h5p-core-19.eot create mode 100644 fonts/h5p-core-19.svg create mode 100644 fonts/h5p-core-19.ttf create mode 100644 fonts/h5p-core-19.woff diff --git a/fonts/h5p-core-18.eot b/fonts/h5p-core-18.eot deleted file mode 100755 index eba9d6cc9f06607fcbb05b2ecb599df2cc5c3071..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6532 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 diff --git a/fonts/h5p-core-18.svg b/fonts/h5p-core-18.svg deleted file mode 100755 index 13da36e..0000000 --- a/fonts/h5p-core-18.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - -{ - "fontFamily": "h5p", - "description": "Font generated by IcoMoon.", - "majorVersion": 1, - "minorVersion": 1, - "version": "Version 1.1", - "fontId": "h5p", - "psName": "h5p", - "subFamily": "Regular", - "fullName": "h5p" -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fonts/h5p-core-18.ttf b/fonts/h5p-core-18.ttf deleted file mode 100755 index 37f845e07c942ee71609208e7bb775764e297355..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6384 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 PBP&$QA9rW*|IGdyo!5`V diff --git a/fonts/h5p-core-19.eot b/fonts/h5p-core-19.eot new file mode 100644 index 0000000000000000000000000000000000000000..2348e291db555f2af7998c5b81e4f08dcc9383cb GIT binary patch literal 7408 zcma)B3y>VedG6;tc6VlX_A#@Md+g(GSGwmuZg+Lk>Fz+%oiM^O4#Gl!gbb&{*5ibP z40c3v28FT=*bp3yu@XDjv0Vn+P-+H1x4{*4a^a8l)MMLhe#frV@SVD3W%x$ zVX{m(sc!$Z@p?3_6@mF0(hWBr+VdOECKaJd2Jn;T~8((0< zD1U(v@A%CNdv9`nU;ic{nE}vSHv^%c;Qx&Bbtn(qeDK!W-$yckit;kb%LkTj+Ce{y)~=&k4{o*vboJmLJ`=>0?z z!al*i1QjoE_ZNFmoMG1wZ=qfslt3BznU##<1xU=LD?$RfeVI~UnEF0;Z zrB8Iuq76##ApPtv%pz!m4vJLkXOYhT_%uSkjINzkIyR|Z(JKrcnR@1#DSGz2pQAn@ z4}s@7#X~)lwmtUD)On)F^f>^EAF?9!uJezvJD@~PbXZ)JBuR$!k^&hdYkjjOw2>;c zk@Qu0a|2D4nyWFZIp|&U^MCkOe@?b;-MV9beqN>dQ%F~L3rfY5oFlh!&P>1m72Ts1 z`j^M9`YXEeDq1+Ut_jI66x=Mza5i>@nIMz0TXagT`T@*Z6aUEdlWYK6>*>7_TV9U5gP zQ|@K8+Pd+f;mw|BemAT?u2U`_*Tdh9^!Huem}rfb2ivh2CQ4}$ed2zM9*3hjAvcY1x zInip=-BeO5)wo#7g+jLL4VFiS-&L;Ua%RZ#yutPNuU`^|C>m6BzQ1Yr?oF5O-hJs8 zmIg;guCA29WX8PopkJzFhlZAfCMe?{)aCpHf&|8Ei7Ns7MH(x#@OyNm6vxfewq!B|L6l`op z2oLC)HANxiL7_WZaYh=_6JmBvCoU*V<)ENzW+YIG?Q!;7XzoXltcQ%N>jUN2f`DPubRk0{pfbx_tD%|>0>d~>2)sR1`kfw;g@lSNIhv`bjTB?p|T z23AGzZ}&k|3$-x+pL2$L?>!YZJi~B|?6?zi4AaOsn9XCGiuIV|M6EqWGFGfO2~+5X z+4*O6G!-G-(bH{(_;66;IF5Ml)RJh_ISU|%9_gxQyA6q@Lv zH7x(4RvMzEYPpG_REr9u1?#=lz~YCR>TV70p<1t@xSrO$!Isj9j<>7n(4q1jz5-Fz zzMzpY=rHgeu2U zHOG+yGV4jRh_>yf3r_+ITWi7L+F|)QukPl?vrJeSQ!C9u);1Ug1&bZKM%o6wRWK(h zG%81S)l?64)3j`nFf*2k4J~e)jF~ZCwWc(a)>qAts*7G&z24uOwnU`A5IcIvC2tlvg1}KqxJfv= zBHW^Sl_%f`)vHy9>r*d9_84hb$LA1DlJnK^W^=qc4=_15UTxneWkE*G?b}7nEJ%6P zb|H!)X1uLi-oBlkSY2r~-1$;aXZ!XylcC~ZhI${w17~<+V2v|0V911OYUVXhnJB*D&?cJPs&e9rvJE`K1p3^%4tbY ziIAuRJcVw}h>$!igt+OwuqP|RqzlzhJop&4fx9_^_?2_WAIk0&jAUcxlnJRzX<4Z^{#_1nwt3unUtRp)a-oi zg{V1aM&Gv$>*NX~LrAL&9v8N0vbeAe^Uls6Sh1L;68(W`eBCs^ZkUk|nYL}-cc(6Q zqlOm7(%dcKE$&nG?vs{wIA*IFwmO1PnkEmjpR$A4j}R=O?tWp#GFSE+-Tg>~9k|;t zruD3W2$eCW4V5Fys64BqOqaWWPY4)&!i6&C`$-bw8`#5$=5uH@h(((66hyBv zEOHfYuy<>lwp9+;_}yMaf|7+;j0v$+I7@d&oR_fIN#`XiVQr!sL`)2(4Lh&k$+#Ndx&&dpSKy{^54L_?;vrbp9hhOLzN1hQUTghIfvPj8Ga5SwsCG zAZDXEa;aEUl-N8E8g1v$7WBTyUq6&$fH9An9jOHy422a>Dle>n*7cXzEpj2ZN_jZft{^*A27|r>D*% zoFtf_PmDv)lCCLgv_Df{7Mbjw8$P2lAC47q}r*^4;Uj*u3ta35A#D(OP1 z?|GCb8pM1KQ?KEpu_-M%foEzuI4|iqzmh}?Lu^fG1U#MW+=U(Gj_jPs*ITk$~aYQuq01xfsoFCsIIoJ8FU7Fxr zc1}(~*_Ngq)x+W_=av@XQ(-OZ(4!aRr61mJMutCRIh`-k%Q}x)4kRu|dPBp-v(CuIp1LwQvNNF^raR7VBlpIQ6U3YOC(M9^d(> zbE1D@oWLrOflI^!Lab3I#~DgbPW{eoems%Wv~0e=icv2NkMx#Gu?8Ipg-&axrs=wd z{-0*crBY%%Uv0K-8X4*7(X?EDzPj;asC-7x=u0rCu>K+#Ilm3_rjf5=-Y(+?ZgC1^ znrtJx)UA%cDaP!m*=stOjznNFfPFhjIfGpY7SjzuDWAVt(#p+2*j3k})FJ7Yl-P5x z)#m1Euhq9~sZSQtuX%-nhu67R3+bPw3)5TbKU0)MB3+<=^cmZ6?9bToWaJGXcHLa9 z^Ft+z7HV^y{Ynt+Q}51;U!?hTp^#1_l&sD_)#qkdAzO5!N?z32?bvoaZrc|D=tYoa zvX3ug%^1WX4V;$=CdP9RA9#V|T<;))B;cNKwi~0$+wrQaIAFl)z@tt%ts3W`!MA}7 zR^^ZV15W}Bbr-uwgcI;9G0$)Q@TSIZOjg*{!>tca%-^#)Ro*#T-c~AYE069h&(=4V zt{lp5blr{lp|_Ve)@RH4`7#d5`SqFXWIhxPmA2$#gUQ)}%PW8^E5D^wxqM)QTS|Pp zH&>zAQYhbfmQM8=<<5)cOqRae%j$M4W{Y00GiCH9ERE-~S;Qqf(QD9WJNsjCp2WlL zm}znPyMQdq5SGPLiOz1#4yiTIprif1jwW!YK&UKL;MQ@(!*D%Jd$p*X4DJe=?ci94 z0~|a645K#KkXY^D(OpehN83|}YOHaO-_|)PUWmnGnu+D*P)_-*U|cvMJsgV1-m5b~ zZx{47>^H@u;x~8g`gL)dhdKVI1$|*@bE4iGD#lRt0ks@)tHpm?i-#gft#@6vj~npO zw`1wTSN}z+UN7yRrF?2X#=^;CWRmY-Kf+zodh#xe<_+(Xx+j8~Q^Y_juyIUb8+SPV zLQW;s$hDI5%c?RmKRtbYHkZp@KRrFa8op$5az{FoN$;4Pyrc_ft^zzUI<`s8#ip^* ziPbRsQ7(7g^vs-+k;9|p&CN_-m&=_y5=fba#7sJ!fyCKBBC98on@7hQ6Jw*B6Uk%( z@I(V}GNI;^K0x*}{BUJ{KQy4u$-%V-fF=@dH(<{IRPs$Z1t3*T*8D?p1Gj6x0vA|t z6Zbj^CFX zZ>rtFf2kUBUg3OJIfvLQxafTQIp9DPAdmStey`6vevx;KQfxoCfUX4gSO@qzc7~+M z1eqn*T=bb9_Dg}EthU{1D?+ z_v|$D$d$uS%RSMl|0H3h1VX;I=lR)-`T58AQ-~z^E&|^WJgDb?Ux32Y!=Lgc1+?Iu z4=6!FRYUo#AoLC-z<#<5xN}H94-yr~A4Pf)>GJ`Odp}Jlg9^^h!VCkdcV+p+2qSUm*Ncrr)nrpojlitIq>&) zVFCE%E-V2rbzu$glU+E3k46P}E-Fl5Tu=g-;nUbZbYTwsC%do!{L?Nh0e_$iYkHKi-%5-}0^ir{W#Edf~{?_beUC*T!mZ`~mMR e`}39z?_5|sc3|(3*MBj5%UYNp?$6SjzWxti^cHOZ literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-19.svg b/fonts/h5p-core-19.svg new file mode 100644 index 0000000..a808aa6 --- /dev/null +++ b/fonts/h5p-core-19.svg @@ -0,0 +1,54 @@ + + + + + + +{ + "fontFamily": "h5p-core-18", + "description": "Font generated by IcoMoon.", + "majorVersion": 1, + "minorVersion": 1, + "version": "Version 1.1", + "fontId": "h5p-core-18", + "psName": "h5p-core-18", + "subFamily": "Regular", + "fullName": "h5p-core-18" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/h5p-core-19.ttf b/fonts/h5p-core-19.ttf new file mode 100644 index 0000000000000000000000000000000000000000..729aea457e0ccf764dd3b5e51c77dc0e23046273 GIT binary patch literal 7228 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 literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-19.woff b/fonts/h5p-core-19.woff new file mode 100644 index 0000000000000000000000000000000000000000..be9ead2878e3737baf88c149e9a7a5bcf2916456 GIT binary patch literal 7304 zcma)B36va1d9JgMndzSCIlAZA*_}f>BkeiI&Wu)C?XE3pR<>mnh-GA9OBS}Y1|2I) z7B)mqgsu2lKERHNv5gXlA;7~1%*(+`9uPg_gc`uzs8Tep zm2Nt?=P+=$pnOuLzy9ILvBf<{74Dx|NHdS`(AzE)eoEvT{wT?0_X(zz2AG^_sOgG0{_0V#K+SM|Cs%7_KvLK z-Q~U4JK?4JQvC`)kzrmTDeAWxkQgDIX}_zN`uj$>bL0u`(q{2yrefsJ=bfMOO-h~OTC&~_grn1rrMoZ z+G$rS)d`A>k+rqjLL$jx(Y2N8_zfX0?iUeV-mhz+8``5I?T{HUz4XR4BjfB;%Dtjq zUpqN6y2bSL@6zzPh7B*z7EHh`;`j%)ol2^ zXw|2JZYT{V%B^M#Db>^&X;0R=sbn(MtxdL9!XrC&-1P^|=KYhBo&5jQsmY0jluMi4 z-kIh{o8N*u7!~AJ^y6KmN?Nd>YP-{}VBGj=y8m;bCAZO0X)UdzTUC69OO@7CyV-D4 zNv&MxVks92*{(NS85@0TrJBo`A>_#b~=y zMlVxd(ye!N^ly%~rzWW`-FB-pRVnKwt?ubsa)>HYm1}O(YqVR{sY+e1R!UK-NS$Fw z(35Vn(`eVL9VI}KJnj@7UUZ7|R-uVSsYm23SIr4icv8--rvEHy#1IDso0t>A1A1n4lsOZgBv!QIhHC3tBfg7bjTx6-slBQQXWh~;d1I|<#hbYhNS8W{((d2C~;5p$fVwcAL>N>wLe3f(Y!|7v;W z?(yBn4j(@DfR#3km=K2CEz(XZpHH!5B(`xabQyC-GMEP^V+d;86OEvlAF&P#{Tf}! zs9`yx8nv7+Kl*6z(R=POG}X8nw_=glU@A61;Nw3*uHz@!r%8t#Ag|CUG%-NySpFrg zJVML0N()1&l@vw`)_c2&#Sb+#+&bJttx-pD9j$xAZKV+%xvS~Wq4FKR0#VhzsF4Zi zFz_C(SJF~-7+$**XiE{WSWwM>RVy>J?kf@`IG=!2heB82>no~&r-ilG#Nr#EDKuNt zkeAU8+AmcujRB&kDGyqzHJXaEq*@xGb=bL@dZ5tNj@I_-{A7ICHRGlcF}3<)U5l6F z&Pd#f2x*u@n}$r!6voi(kmfdAN%x=su$8k+Cap9~+=S_wF$q%?rUWd@wp(%S3?`UL z$g`@JU?0fa!-kBnawOKJ(9Mi(WG#Vdasng!CsS7T%?JNXqjw4se ztS8M9+O}IRJP9mpjRl8mhvmn;hMSwrGGS#*t=xsItuP7-7CUyGv<-TjU`|qKRF3Ve zs~+m6Y1txSW-LiHD``txzNneH4TP{vND&d+ieDUzX=BLod>oC5s6cLMmM;G)Z)>*Z zU^rahr4p6Z%SG4}bZEW|B=ke2KRDOMqP<$-BvhgX*2*c32{{y(QQ;1lOt?c#HQ=BK^hKF+eW+S&<_M9OZ9U8vN(BO;hqcAc zmz;AEUR;MSrsK+oqw?J9BlP;-$LM75zo<@M_sNTb?wgxc5x|hMS3=AI6;H~lErgTV z-q&EMzK}~?2q%5E)ys|1_z!;Y{1ea_BQKIa;SF{T_Oa8L|3R9kNv#e~vw=<__O)GA zPWhp4SVgpeP{-Qu6Dk2CeHKgZ6)cBW@O@IsC+VP+ACgS}em{MPy3&-hlAabJ(ExZF z-I^02c~}T>^E+YLw}LPy*lEz}G9*q*O@b~Eo|XT7jeLX`*sXs2-axKYwyFi;7*kdB z5IjbK$8E7j+KgwR}Uw9#J#bh&cZK^INUd|W2w@St`+Qo5mMS^NWTVx!1I9^TE4xxeGP4FqY;n z32*VBs`sF@w8Jr5)v(nOgwiy5g#C~m#D0We3HA32%a*yk-{|j0s_ei$hB2#W4MeDn zF>9zVJ{k4R>L}9_eZVIKj6UIF8T0))65{LGV~FNmv>L=BP5E;5A`k`9YXXa0g&XYM z+MOWI_>mpGRA_`X3T*~4yQI;vsTLh0f8b>6`>Uy zS{P#Rq8PNo5%ZU^HdTBcKcOGq?iTB`?y&MBjA$?}qn zUZgNC!xI&*2})^U+%`k_!uqj;9xX7+m~QFrV8}4o*x2Zfv9U2q!y#*A2qc7Aku8T& z1Lz%Nqi37@np|=t841TZqcj#R4C{36_#88|P(Eonm^n(LmTqfiR4Xt}!D2_6idLb`=wAez9*@i}reudtVKsvX0<$O2LKCaI(gslMk?o@f~J zIZC~zkH)67>;#^v<>0)ex6ra$i{*sc5G!Yv@?5o~%%P4WzL;9OMNi~n zCt_JIaUzzZ5AO>Vtq0xf9P7c}_7TUTXCjV>h92gjeVp^-+a>2Z-?>v0oXg&+87SM* zw4-`h9Oc~7B77#SWgU9-qP+BD`_0Jcy_VDa6uqMNl;uF;iAX*)dR&TqkktG3bJ#KQ zorBj2!C?(eh*W|sZNIKBDe1aCb4m+Ga2dmB1!u85JAqTbI<2-FzU%Rwk2)v%C&nqP z0vWhOEFi=hb#k1e^wi96&KD*VIZewJhH4n~-qEpqxg2ZKu~6uYW@?(QYv}(OcA{KP zOcrXb_RV8s0|T0t8!FT`d;pct>KT0r<`mXn1|#RUW8O6KdCc1t+`uhPk<5~eZx5`?jH4MAzTa-E^{hShe;q`jATYtT= zd2?gBn10~d^79=GjF0Q4eoXSa`^z?w0L zLz*}*6HJWfAU^OS$GP4?1WCX>;cPcSmAB(HS8>3A)qzKya@uvyL4$7t8LY}5`v;x` z7#c2ij|eB=S7Kh=bl=A2uTEFlwWIC#PA%NODOK4qUfEhMZ>@~)sLVGul;1p3*x)mqVYx!K2X3L>M z?|C|tH!8iCE14{PyO-7NSj-lAuQy}l6PCtv*(~CcoyZ&X`QH9moG0;cJ7!v({uUt1 zGK6LERHC;_vqNglGw5i)ucIm4DG(~lRk(E=@i1Hu(_SknCxg3!Rwp>t;Q$8@0K=#c zHzig(cyw1&*3t3Qp&D!4Rb^yhcJ_vBE|HH4@29;}gxPiSbQ|WHJGGstGum zQ1eM2Ci@wFxQWDVG*##1;93Jf3kkOyux9`&`KFu#kg6r?{-L;u+qGYS3oN*a`#%y; z2qY*P(xp~$k`G!f)ynkiJFvy_A4B*cd@eV{T`q8jyh{-SjEjTrMffvP)nT~aRJ()! zR5j#+!uhPSi`Xl;=zZ-4;6M~0Pxv_gfX_R5iFblhY(Kbwt_1d22l!fcmZZrPnJ3p> z@|hm?OM#!PwL9p2S=LHr=nV?P{Q=Ha%YIdzwftoeILH+~wgY|mz86<0DTm&7RlVD& zM69BBlCo84+9{ak_|V{p85;7vXT8g|)ZY_Jr(;gqeZG+XAFpUd#)}^*PM8)us~qFV zY-F>Zj?to5q%6JaP_|UcE<4P@`W05%iDfdV-rM1O&Z3>wi{s-(J!|*AgYl|+cA9zO z&7)tIyQ4GzLBdK2gnV=Ni}RPh7oOtJB9f^8PW%g6K&a>czW{})hd=8}^5K3~2q-~G zRYUolAoNZoz<#X?#D2Z!xG(p2N2S+~<)_ z^wU$oJq#FoWjrC=#SbDXuR{d9kvvVlL=C!?KEc}Tk3~g1AS?1c^1Irg_CEcz{+Gs$ z#;44-`Fv<1^h~%L{u1gd{S@#AOGF7<9=%`aXEyna&!u?PKUS)S;?&6teV7CPP#+e6 zU+KdV@KPVv0DrCzhe#GN8-F|q6Brki0A|D{f7^#S@E_{K0`L#}umt>`KCA)$LLUyn zn%CdbIy`>U(viL6^|jaxw8&xnIdK!ZaD?pj|E5^mT{?7IVR7%Fy+`)kw)f`3+uvQd z;-;mmmzEAq;Bd7>4w2hPfh>ai5YiE{2j#uEZZ43wlXoM(!k2b6I2G^2wR?{oeaF(F zLVco6uJtP%CGYS_1$d$fQh&q#ydlF|_AVYfu;&PQ3&byyW4OxPLyo**EzA%1XX$5V F{|m*p3|#;K literal 0 HcmV?d00001 diff --git a/styles/h5p.css b/styles/h5p.css index f4324a7..e3ece5c 100644 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -3,11 +3,11 @@ /* Custom H5P font to use for icons. */ @font-face { font-family: 'h5p'; - src: url('../fonts/h5p-core-18.eot?cb8kvi'); - src: url('../fonts/h5p-core-18.eot?cb8kvi#iefix') format('embedded-opentype'), - url('../fonts/h5p-core-18.ttf?cb8kvi') format('truetype'), - url('../fonts/h5p-core-18.woff?cb8kvi') format('woff'), - url('../fonts/h5p-core-18.svg?cb8kvi#h5p') format('svg'); + src: url('../fonts/h5p-core-19.eot?cb8kvi'); + src: url('../fonts/h5p-core-19.eot?cb8kvi#iefix') format('embedded-opentype'), + url('../fonts/h5p-core-19.ttf?cb8kvi') format('truetype'), + url('../fonts/h5p-core-19.woff?cb8kvi') format('woff'), + url('../fonts/h5p-core-19.svg?cb8kvi#h5p') format('svg'); font-weight: normal; font-style: normal; }