2014-07-19 16:20:16 +04:00
|
|
|
|
var unidecode = require('unidecode'),
|
2015-09-23 13:54:56 +03:00
|
|
|
|
_ = require('lodash'),
|
2014-07-19 16:20:16 +04:00
|
|
|
|
utils,
|
2014-07-14 16:29:45 +04:00
|
|
|
|
getRandomInt;
|
|
|
|
|
|
2014-07-02 18:22:18 +04:00
|
|
|
|
/**
|
|
|
|
|
* Return a random int, used by `utils.uid()`
|
|
|
|
|
*
|
|
|
|
|
* @param {Number} min
|
|
|
|
|
* @param {Number} max
|
|
|
|
|
* @return {Number}
|
|
|
|
|
* @api private
|
|
|
|
|
*/
|
2014-07-14 16:29:45 +04:00
|
|
|
|
getRandomInt = function (min, max) {
|
2014-07-02 18:22:18 +04:00
|
|
|
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
2014-07-14 16:29:45 +04:00
|
|
|
|
};
|
2014-07-02 18:22:18 +04:00
|
|
|
|
|
2014-07-14 16:29:45 +04:00
|
|
|
|
utils = {
|
2014-07-28 17:19:49 +04:00
|
|
|
|
/**
|
|
|
|
|
* Timespans in seconds and milliseconds for better readability
|
|
|
|
|
*/
|
2015-05-08 17:54:12 +03:00
|
|
|
|
ONE_HOUR_S: 3600,
|
|
|
|
|
ONE_DAY_S: 86400,
|
|
|
|
|
ONE_YEAR_S: 31536000,
|
|
|
|
|
ONE_HOUR_MS: 3600000,
|
|
|
|
|
ONE_DAY_MS: 86400000,
|
|
|
|
|
ONE_WEEK_MS: 604800000,
|
|
|
|
|
ONE_MONTH_MS: 2628000000,
|
|
|
|
|
ONE_YEAR_MS: 31536000000,
|
2014-07-28 17:19:49 +04:00
|
|
|
|
|
2014-07-02 18:22:18 +04:00
|
|
|
|
/**
|
|
|
|
|
* Return a unique identifier with the given `len`.
|
|
|
|
|
*
|
|
|
|
|
* utils.uid(10);
|
|
|
|
|
* // => "FDaS435D2z"
|
|
|
|
|
*
|
|
|
|
|
* @param {Number} len
|
|
|
|
|
* @return {String}
|
|
|
|
|
* @api private
|
|
|
|
|
*/
|
|
|
|
|
uid: function (len) {
|
|
|
|
|
var buf = [],
|
|
|
|
|
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
|
|
|
|
|
charlen = chars.length,
|
|
|
|
|
i;
|
|
|
|
|
|
|
|
|
|
for (i = 1; i < len; i = i + 1) {
|
|
|
|
|
buf.push(chars[getRandomInt(0, charlen - 1)]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buf.join('');
|
2014-07-19 16:20:16 +04:00
|
|
|
|
},
|
2015-09-23 13:54:56 +03:00
|
|
|
|
safeString: function (string, options) {
|
|
|
|
|
options = options || {};
|
|
|
|
|
|
|
|
|
|
// Handle the £ symbol separately, since it needs to be removed before the unicode conversion.
|
2015-01-10 06:31:47 +03:00
|
|
|
|
string = string.replace(/£/g, '-');
|
2014-07-19 16:20:16 +04:00
|
|
|
|
|
|
|
|
|
// Remove non ascii characters
|
|
|
|
|
string = unidecode(string);
|
|
|
|
|
|
2016-01-05 19:52:23 +03:00
|
|
|
|
// Replace URL reserved chars: `@:/?#[]!$&()*+,;=` as well as `\%<>|^~£"{}` and \`
|
|
|
|
|
string = string.replace(/(\s|\.|@|:|\/|\?|#|\[|\]|!|\$|&|\(|\)|\*|\+|,|;|=|\\|%|<|>|\||\^|~|"|\{|\}|`|–|—)/g, '-')
|
2015-01-10 06:31:47 +03:00
|
|
|
|
// Remove apostrophes
|
|
|
|
|
.replace(/'/g, '')
|
2014-07-19 16:20:16 +04:00
|
|
|
|
// Make the whole thing lowercase
|
|
|
|
|
.toLowerCase();
|
|
|
|
|
|
2015-09-23 13:54:56 +03:00
|
|
|
|
// We do not need to make the following changes when importing data
|
|
|
|
|
if (!_.has(options, 'importing') || !options.importing) {
|
|
|
|
|
// Convert 2 or more dashes into a single dash
|
|
|
|
|
string = string.replace(/-+/g, '-')
|
|
|
|
|
// Remove trailing dash
|
|
|
|
|
.replace(/-$/, '')
|
|
|
|
|
// Remove any dashes at the beginning
|
|
|
|
|
.replace(/^-/, '');
|
|
|
|
|
}
|
2015-01-10 06:31:47 +03:00
|
|
|
|
|
|
|
|
|
// Handle whitespace at the beginning or end.
|
|
|
|
|
string = string.trim();
|
|
|
|
|
|
2014-07-19 16:20:16 +04:00
|
|
|
|
return string;
|
2014-12-01 18:59:49 +03:00
|
|
|
|
},
|
2015-03-15 00:50:00 +03:00
|
|
|
|
// The token is encoded URL safe by replacing '+' with '-', '\' with '_' and removing '='
|
2014-12-01 18:59:49 +03:00
|
|
|
|
// NOTE: the token is not encoded using valid base64 anymore
|
|
|
|
|
encodeBase64URLsafe: function (base64String) {
|
|
|
|
|
return base64String.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
|
|
|
},
|
|
|
|
|
// Decode url safe base64 encoding and add padding ('=')
|
|
|
|
|
decodeBase64URLsafe: function (base64String) {
|
|
|
|
|
base64String = base64String.replace(/-/g, '+').replace(/_/g, '/');
|
|
|
|
|
while (base64String.length % 4) {
|
|
|
|
|
base64String += '=';
|
|
|
|
|
}
|
|
|
|
|
return base64String;
|
2016-02-09 17:14:24 +03:00
|
|
|
|
},
|
|
|
|
|
redirect301: function redirect301(res, path) {
|
|
|
|
|
/*jslint unparam:true*/
|
|
|
|
|
res.set({'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S});
|
|
|
|
|
res.redirect(301, path);
|
2016-05-08 10:12:37 +03:00
|
|
|
|
},
|
|
|
|
|
|
2016-08-25 10:22:22 +03:00
|
|
|
|
readCSV: require('./read-csv'),
|
|
|
|
|
removeOpenRedirectFromUrl: require('./remove-open-redirect-from-url'),
|
2016-09-09 13:10:43 +03:00
|
|
|
|
zipFolder: require('./zip-folder'),
|
2016-09-09 13:23:47 +03:00
|
|
|
|
readThemes: require('./read-themes'),
|
2016-09-23 14:05:44 +03:00
|
|
|
|
generateAssetHash: require('./asset-hash'),
|
2016-10-13 15:54:44 +03:00
|
|
|
|
url: require('./url'),
|
2016-10-14 17:37:40 +03:00
|
|
|
|
tokens: require('./tokens'),
|
|
|
|
|
sequence: require('./sequence')
|
2014-07-02 18:22:18 +04:00
|
|
|
|
};
|
|
|
|
|
|
2014-09-10 08:06:24 +04:00
|
|
|
|
module.exports = utils;
|