libzotero
Version:
javascript libZotero
311 lines (272 loc) • 7.43 kB
JavaScript
;
var log = require('./Log.js').Logger('libZotero:Utils');
var Utils = {
randomString: function randomString(len, chars) {
if (!chars) {
chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
}
if (!len) {
len = 8;
}
var randomstring = '';
for (var i = 0; i < len; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum, rnum + 1);
}
return randomstring;
},
getKey: function getKey() {
var baseString = '23456789ABCDEFGHIJKMNPQRSTUVWXZ';
return Utils.randomString(8, baseString);
},
slugify: function slugify(name) {
var slug = name.trim();
slug = slug.toLowerCase();
slug = slug.replace(/[^a-z0-9 ._-]/g, '');
slug = slug.replace(/\s/g, '_');
return slug;
},
prependAutocomplete: function prependAutocomplete(pre, source) {
log.debug('Zotero.utils.prependAutocomplete', 3);
log.debug('prepend match: ' + pre, 4);
var satisfy;
if (!source) {
log.warn('source is not defined');
}
if (pre === '') {
satisfy = source.slice(0);
return satisfy;
}
var plen = pre.length;
var plower = pre.toLowerCase();
satisfy = source.map(function (n) {
if (n.substr(0, plen).toLowerCase() == plower) {
return n;
} else {
return null;
}
});
return satisfy;
},
matchAnyAutocomplete: function matchAnyAutocomplete(pre, source) {
log.debug('Zotero.utils.matchAnyAutocomplete', 3);
log.debug('matchAny match: ' + pre, 4);
var satisfy;
if (!source) {
log.warn('source is not defined');
}
if (pre === '') {
satisfy = source.slice(0);
return satisfy;
}
var plower = pre.toLowerCase();
satisfy = source.map(function (n) {
if (n.toLowerCase().indexOf(plower) != -1) {
return n;
} else {
return null;
}
});
return satisfy;
},
libraryString: function libraryString(type, libraryID) {
var lstring = '';
if (type == 'user') lstring = 'u';else if (type == 'group') lstring = 'g';else if (type == 'publications') lstring = 'p';
lstring += libraryID;
return lstring;
},
parseLibString: function parseLibString(libraryString) {
var type;
var libraryID;
if (libraryString.charAt(0) == 'u') {
type = 'user';
} else if (libraryString.charAt(0) == 'g') {
type = 'group';
} else if (libraryString.charAt(0) == 'p') {
type = 'publications';
} else {
throw new Error('unexpected type character in libraryString');
}
libraryID = parseInt(libraryString.substring(1), 10);
if (isNaN(libraryID)) {
throw new Error('NaN libraryID');
}
return { libraryType: type, libraryID: libraryID };
},
//return true if retrieved more than lifetime minutes ago
stale: function stale(retrievedDate, lifetime) {
var now = Date.now(); //current local time
var elapsed = now.getTime() - retrievedDate.getTime();
if (elapsed / 60000 > lifetime) {
return true;
}
return false;
},
entityify: function entityify(str) {
var character = {
'<': '<',
'>': '>',
'&': '&',
'"': '"'
};
return str.replace(/[<>&"]/g, function (c) {
return character[c];
});
},
parseApiDate: function parseApiDate(datestr) {
//var parsems = Date.parse(datestr);
var re = /([0-9]+)-([0-9]+)-([0-9]+)T([0-9]+):([0-9]+):([0-9]+)Z/;
var matches = re.exec(datestr);
if (matches === null) {
log.debug('error parsing api date: ' + datestr, 2);
return null;
} else {
var date = new Date(Date.UTC(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]));
return date;
}
},
readCookie: function readCookie(name) {
var nameEQ = name + '=';
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1, c.length);
}if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
},
/**
* Translate common mimetypes to user friendly versions
*
* @param string $mimeType
* @return string
*/
translateMimeType: function translateMimeType(mimeType) {
switch (mimeType) {
case 'text/html':
return 'html';
case 'application/pdf':
case 'application/x-pdf':
case 'application/acrobat':
case 'applications/vnd.pdf':
case 'text/pdf':
case 'text/x-pdf':
return 'pdf';
case 'image/jpg':
case 'image/jpeg':
return 'jpg';
case 'image/gif':
return 'gif';
case 'application/msword':
case 'application/doc':
case 'application/vnd.msword':
case 'application/vnd.ms-word':
case 'application/winword':
case 'application/word':
case 'application/x-msw6':
case 'application/x-msword':
return 'doc';
case 'application/vnd.oasis.opendocument.text':
case 'application/x-vnd.oasis.opendocument.text':
return 'odt';
case 'video/flv':
case 'video/x-flv':
return 'flv';
case 'image/tif':
case 'image/tiff':
case 'image/x-tif':
case 'image/x-tiff':
case 'application/tif':
case 'application/x-tif':
case 'application/tiff':
case 'application/x-tiff':
return 'tiff';
case 'application/zip':
case 'application/x-zip':
case 'application/x-zip-compressed':
case 'application/x-compress':
case 'application/x-compressed':
case 'multipart/x-zip':
return 'zip';
case 'video/quicktime':
case 'video/x-quicktime':
return 'mov';
case 'video/avi':
case 'video/msvideo':
case 'video/x-msvideo':
return 'avi';
case 'audio/wav':
case 'audio/x-wav':
case 'audio/wave':
return 'wav';
case 'audio/aiff':
case 'audio/x-aiff':
case 'sound/aiff':
return 'aiff';
case 'text/plain':
return 'plain text';
case 'application/rtf':
return 'rtf';
default:
return mimeType;
}
},
/**
* Get the permissions a key has for a library
* if no key is passed use the currently set key for the library
*
* @param int|string $userID
* @param string $key
* @return array $keyPermissions
*/
getKeyPermissions: function getKeyPermissions(userID, key) {
if (!userID) {
return false;
}
if (!key) {
return false;
}
var urlconfig = { 'target': 'key', 'apiKey': key, 'libraryType': '' };
return Zotero.ajaxRequest(urlconfig).then(function (response) {
var keyObject = JSON.parse(response.data);
return keyObject;
});
},
/**
* Given a query string, parse keys/values into an object
**/
parseQuery: function parseQuery(query) {
log.debug('parseQuery');
log.debug(query);
var params = {};
var match;
var pl = /\+/g; // Regex for replacing addition symbol with a space
var search = /([^&=]+)=?([^&]*)/g;
var decode = function decode(s) {
return decodeURIComponent(s.replace(pl, ' '));
};
while (match = search.exec(query)) {
params[decode(match[1])] = decode(match[2]);
}
return params;
},
buildQuery: function buildQuery() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var q = '?';
for (var p in params) {
q += '&' + encodeURIComponent(p) + '=' + encodeURIComponent(params[p]);
}
return q;
},
//extract the section of a url between ? and #
querystring: function querystring(href) {
if (href.indexOf('?') == -1) {
return '';
}
var hashindex = href.indexOf('#') != -1 ? href.indexOf('#') : undefined;
var q = href.substring(href.indexOf('?') + 1, hashindex);
return q;
}
};
module.exports = Utils;