157 lines
6.3 KiB
JavaScript
157 lines
6.3 KiB
JavaScript
|
/**
|
||
|
* This program is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License
|
||
|
* as published by the Free Software Foundation; under version 2
|
||
|
* of the License (non-upgradable).
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*
|
||
|
* Copyright (c) 2015 (original work) Open Assessment Technologies SA ;
|
||
|
*/
|
||
|
define([
|
||
|
'jquery',
|
||
|
'lodash',
|
||
|
'taoQtiItem/qtiItem/core/Loader',
|
||
|
'taoQtiItem/qtiCreator/model/Item',
|
||
|
'taoQtiItem/qtiCreator/model/qtiClasses',
|
||
|
'taoQtiItem/qtiItem/helper/itemScore',
|
||
|
'util/url',
|
||
|
'core/dataProvider/request',
|
||
|
], function ($, _, Loader, Item, qtiClasses, itemScoreHelper, urlUtil, request) {
|
||
|
"use strict";
|
||
|
var _generateIdentifier = function _generateIdentifier(uri) {
|
||
|
var pos = uri.lastIndexOf('#');
|
||
|
return uri.substr(pos + 1);
|
||
|
};
|
||
|
|
||
|
const decodeHtml = function (str) {
|
||
|
const map = {
|
||
|
'&': '&',
|
||
|
'<': '<',
|
||
|
'>': '>',
|
||
|
'"': '"',
|
||
|
''': "'"
|
||
|
};
|
||
|
return str.replace(/&|<|>|"|'/g, function(m) {
|
||
|
return map[m];
|
||
|
});
|
||
|
};
|
||
|
|
||
|
var qtiNamespace = 'http://www.imsglobal.org/xsd/imsqti_v2p2';
|
||
|
|
||
|
var qtiSchemaLocation = {
|
||
|
'http://www.imsglobal.org/xsd/imsqti_v2p2': 'http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd'
|
||
|
};
|
||
|
|
||
|
const languagesUrl = urlUtil.route('index', 'Languages', 'tao');
|
||
|
|
||
|
var creatorLoader = {
|
||
|
loadItem: function loadItem(config, callback) {
|
||
|
|
||
|
if (config.uri) {
|
||
|
const langList = request(languagesUrl);
|
||
|
// request doesn't handle empty response with 200 code. See: core/request.js:240
|
||
|
const itemRdf = request(config.itemDataUrl, { uri: config.uri }).catch(d => d)
|
||
|
|
||
|
Promise.all([langList, itemRdf]).then(([languagesList, data]) => {
|
||
|
var loader, itemData, newItem;
|
||
|
|
||
|
if (data.itemData) {
|
||
|
for (const response in data.itemData.responses) {
|
||
|
const newObject = {};
|
||
|
for (const mapKey in data.itemData.responses[response].mapping) {
|
||
|
newObject[decodeHtml(mapKey)] = data.itemData.responses[response].mapping[mapKey];
|
||
|
}
|
||
|
data.itemData.responses[response].mapping = newObject;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (data.itemData && data.itemData.qtiClass === 'assessmentItem') {
|
||
|
|
||
|
loader = new Loader().setClassesLocation(qtiClasses);
|
||
|
itemData = data.itemData;
|
||
|
|
||
|
loader.loadItemData(itemData, function (loadedItem) {
|
||
|
var namespaces;
|
||
|
|
||
|
//hack to fix #2652
|
||
|
if (loadedItem.isEmpty()) {
|
||
|
loadedItem.body('');
|
||
|
}
|
||
|
|
||
|
// convert item to current QTI version
|
||
|
namespaces = loadedItem.getNamespaces();
|
||
|
namespaces[''] = qtiNamespace;
|
||
|
loadedItem.setNamespaces(namespaces);
|
||
|
loadedItem.setSchemaLocations(qtiSchemaLocation);
|
||
|
|
||
|
//add languages list to the item
|
||
|
if (languagesList) {
|
||
|
loadedItem.data('languagesList', languagesList);
|
||
|
}
|
||
|
|
||
|
const { responseProcessing: { processingType } = {} } = loadedItem
|
||
|
if (!config.perInteractionRp && processingType === 'templateDriven') {
|
||
|
const {
|
||
|
responses = {},
|
||
|
responseProcessing: {
|
||
|
data,
|
||
|
responseRules = [],
|
||
|
} = {},
|
||
|
} = itemData
|
||
|
const responseIdentifiers = []
|
||
|
|
||
|
_.forOwn(responses, ({ identifier }) => {
|
||
|
responseIdentifiers.push(identifier)
|
||
|
});
|
||
|
|
||
|
const itemScoreRP = itemScoreHelper(responseIdentifiers);
|
||
|
if (responseRules.some((responseRule) => _.isEqual(responseRule, itemScoreRP))) {
|
||
|
loadedItem.responseProcessing.setProcessingType('custom', data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
callback(loadedItem, this.getLoadedClasses());
|
||
|
});
|
||
|
} else {
|
||
|
|
||
|
newItem = new Item().id(_generateIdentifier(config.uri)).attr('title', config.label);
|
||
|
|
||
|
newItem.createResponseProcessing();
|
||
|
|
||
|
//set default namespaces
|
||
|
newItem.setNamespaces({
|
||
|
'': qtiNamespace,
|
||
|
'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
|
||
|
'm': 'http://www.w3.org/1998/Math/MathML'
|
||
|
});//note : always add math element : since it has become difficult to know when a math element has been added to the item
|
||
|
|
||
|
//set default schema location
|
||
|
newItem.setSchemaLocations(qtiSchemaLocation);
|
||
|
|
||
|
//tag the item as a new one
|
||
|
newItem.data('new', true);
|
||
|
|
||
|
//add languages list to the item
|
||
|
if (languagesList) {
|
||
|
newItem.data('languagesList', languagesList);
|
||
|
}
|
||
|
|
||
|
callback(newItem);
|
||
|
}
|
||
|
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
return creatorLoader;
|
||
|
});
|