const Entities = require('html-entities').AllHtmlEntities; const htmlentities = new Entities().encode; // Imported from models/Resource.js const FetchStatuses = { FETCH_STATUS_IDLE: 0, FETCH_STATUS_STARTED: 1, FETCH_STATUS_DONE: 2, FETCH_STATUS_ERROR: 3, }; const utils = {}; utils.getAttr = function(attrs, name, defaultValue = null) { for (let i = 0; i < attrs.length; i++) { if (attrs[i][0] === name) return attrs[i].length > 1 ? attrs[i][1] : null; } return defaultValue; }; utils.notDownloadedResource = function() { return ` `; }; utils.notDownloadedImage = function() { // https://github.com/ForkAwesome/Fork-Awesome/blob/master/src/icons/svg/file-image-o.svg // Height changed to 1795 return ` `; }; utils.notDownloadedFile = function() { // https://github.com/ForkAwesome/Fork-Awesome/blob/master/src/icons/svg/file-o.svg return ` `; }; utils.errorImage = function() { // https://github.com/ForkAwesome/Fork-Awesome/blob/master/src/icons/svg/times-circle.svg return ` `; }; utils.loaderImage = function() { // https://github.com/ForkAwesome/Fork-Awesome/blob/master/src/icons/svg/hourglass-half.svg return ` `; }; utils.resourceStatusImage = function(status) { if (status === 'notDownloaded') return utils.notDownloadedResource(); return utils.resourceStatusFile(status); }; utils.resourceStatusFile = function(status) { if (status === 'notDownloaded') return utils.notDownloadedResource(); if (status === 'downloading') return utils.loaderImage(); if (status === 'encrypted') return utils.loaderImage(); if (status === 'error') return utils.errorImage(); throw new Error(`Unknown status: ${status}`); }; utils.resourceStatusIndex = function(status) { if (status === 'error') return -1; if (status === 'notDownloaded') return 0; if (status === 'downloading') return 1; if (status === 'encrypted') return 2; if (status === 'ready') return 10; throw new Error(`Unknown status: ${status}`); }; utils.resourceStatusName = function(index) { if (index === -1) return 'error'; if (index === 0) return 'notDownloaded'; if (index === 1) return 'downloading'; if (index === 2) return 'encrypted'; if (index === 10) return 'ready'; throw new Error(`Unknown index: ${index}`); }; utils.resourceStatus = function(ResourceModel, resourceInfo) { if (!ResourceModel) return 'ready'; let resourceStatus = 'ready'; if (resourceInfo) { const resource = resourceInfo.item; const localState = resourceInfo.localState; if (localState.fetch_status === FetchStatuses.FETCH_STATUS_IDLE) { resourceStatus = 'notDownloaded'; } else if (localState.fetch_status === FetchStatuses.FETCH_STATUS_STARTED) { resourceStatus = 'downloading'; } else if (localState.fetch_status === FetchStatuses.FETCH_STATUS_DONE) { if (resource.encryption_blob_encrypted || resource.encryption_applied) { resourceStatus = 'encrypted'; } } } else { resourceStatus = 'notDownloaded'; } return resourceStatus; }; utils.imageReplacement = function(ResourceModel, src, resources, resourceBaseUrl) { if (!ResourceModel) return null; if (!ResourceModel.isResourceUrl(src)) return null; const resourceId = ResourceModel.urlToId(src); const result = resources[resourceId]; const resource = result ? result.item : null; const resourceStatus = utils.resourceStatus(ResourceModel, result); if (resourceStatus !== 'ready') { const icon = utils.resourceStatusImage(resourceStatus); return `
` + `` + '
'; } const mime = resource.mime ? resource.mime.toLowerCase() : ''; if (ResourceModel.isSupportedImageMimeType(mime)) { let newSrc = `./${ResourceModel.filename(resource)}`; if (resourceBaseUrl) newSrc = resourceBaseUrl + newSrc; newSrc += `?t=${resource.updated_time}`; return { 'data-resource-id': resource.id, src: newSrc, }; } return null; }; module.exports = utils;