mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-29 18:16:17 +01:00
Remove string.js dependency
This commit is contained in:
@@ -90,7 +90,6 @@
|
|||||||
"socket.io-redis": "5.2.0",
|
"socket.io-redis": "5.2.0",
|
||||||
"socketio-wildcard": "2.0.0",
|
"socketio-wildcard": "2.0.0",
|
||||||
"spdx-license-list": "^3.0.1",
|
"spdx-license-list": "^3.0.1",
|
||||||
"string": "^3.3.3",
|
|
||||||
"toobusy-js": "^0.5.1",
|
"toobusy-js": "^0.5.1",
|
||||||
"uglify-js": "^3.1.3",
|
"uglify-js": "^3.1.3",
|
||||||
"validator": "9.0.0",
|
"validator": "9.0.0",
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
(function (factory) {
|
(function (factory) {
|
||||||
if (typeof module === 'object' && module.exports) {
|
if (typeof module === 'object' && module.exports) {
|
||||||
var relative_path = require('nconf').get('relative_path');
|
var relative_path = require('nconf').get('relative_path');
|
||||||
module.exports = factory(require('../utils'), require('benchpressjs'), require('string'), relative_path);
|
module.exports = factory(require('../utils'), require('benchpressjs'), relative_path);
|
||||||
} else if (typeof define === 'function' && define.amd) {
|
} else if (typeof define === 'function' && define.amd) {
|
||||||
define('helpers', ['benchpress', 'string'], function (Benchpress, string) {
|
define('helpers', ['benchpress'], function (Benchpress) {
|
||||||
return factory(utils, Benchpress, string, config.relative_path);
|
return factory(utils, Benchpress, config.relative_path);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}(function (utils, Benchpress, S, relative_path) {
|
}(function (utils, Benchpress, relative_path) {
|
||||||
var helpers = {
|
var helpers = {
|
||||||
displayMenuItem: displayMenuItem,
|
displayMenuItem: displayMenuItem,
|
||||||
buildMetaTag: buildMetaTag,
|
buildMetaTag: buildMetaTag,
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function stripTags(str) {
|
function stripTags(str) {
|
||||||
return S(String(str)).stripTags().s;
|
return utils.stripHTMLTags(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateCategoryBackground(category) {
|
function generateCategoryBackground(category) {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -10,8 +10,8 @@
|
|||||||
}
|
}
|
||||||
if (typeof define === 'function' && define.amd) {
|
if (typeof define === 'function' && define.amd) {
|
||||||
// AMD. Register as a named module
|
// AMD. Register as a named module
|
||||||
define('translator', ['string'], function (string) {
|
define('translator', [], function () {
|
||||||
return factory(string, loadClient, warn);
|
return factory(utils, loadClient, warn);
|
||||||
});
|
});
|
||||||
} else if (typeof module === 'object' && module.exports) {
|
} else if (typeof module === 'object' && module.exports) {
|
||||||
// Node
|
// Node
|
||||||
@@ -37,15 +37,23 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = factory(require('string'), loadServer, warn);
|
module.exports = factory(require('../utils'), loadServer, warn);
|
||||||
}());
|
}());
|
||||||
} else {
|
|
||||||
window.translator = factory(window.string, loadClient, warn);
|
|
||||||
}
|
}
|
||||||
}(function (string, load, warn) {
|
}(function (utils, load, warn) {
|
||||||
var assign = Object.assign || jQuery.extend;
|
var assign = Object.assign || jQuery.extend;
|
||||||
function classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
function classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
function escapeHTML(str) {
|
||||||
|
return utils.decodeHTMLEntities(
|
||||||
|
String(str)
|
||||||
|
.replace(/[\s\xa0]+/g, ' ')
|
||||||
|
.replace(/^\s+|\s+$/g, '')
|
||||||
|
).replace(/[<>]/g, function (c) {
|
||||||
|
return c === '<' ? '<' : '>';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
var Translator = (function () {
|
var Translator = (function () {
|
||||||
/**
|
/**
|
||||||
* Construct a new Translator object
|
* Construct a new Translator object
|
||||||
@@ -284,9 +292,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
var argsToTranslate = args.map(function (arg) {
|
var argsToTranslate = args.map(function (arg) {
|
||||||
return string(arg).collapseWhitespace().decodeHTMLEntities().escapeHTML().s.replace(/&/g, '&');
|
return self.translate(escapeHTML(arg));
|
||||||
}).map(function (arg) {
|
|
||||||
return self.translate(arg);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.all(argsToTranslate).then(function (translatedArgs) {
|
return Promise.all(argsToTranslate).then(function (translatedArgs) {
|
||||||
@@ -539,12 +545,13 @@
|
|||||||
return cb('');
|
return cb('');
|
||||||
}
|
}
|
||||||
|
|
||||||
Translator.create(lang).translate(text).catch(function (err) {
|
return Translator.create(lang).translate(text).then(function (output) {
|
||||||
|
if (cb) {
|
||||||
|
setTimeout(cb, 0, output);
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}, function (err) {
|
||||||
warn('Translation failed: ' + err.stack);
|
warn('Translation failed: ' + err.stack);
|
||||||
}).then(function (output) {
|
|
||||||
cb(output);
|
|
||||||
}).catch(function (err) {
|
|
||||||
console.error(err);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,279 @@
|
|||||||
window.utils = factory(window.XRegExp);
|
window.utils = factory(window.XRegExp);
|
||||||
}
|
}
|
||||||
}(function (XRegExp) {
|
}(function (XRegExp) {
|
||||||
|
var freeze = Object.freeze || function (obj) { return obj; };
|
||||||
|
|
||||||
|
// add default escape function for escaping HTML entities
|
||||||
|
var escapeCharMap = freeze({
|
||||||
|
'&': '&',
|
||||||
|
'<': '<',
|
||||||
|
'>': '>',
|
||||||
|
'"': '"',
|
||||||
|
"'": ''',
|
||||||
|
'`': '`',
|
||||||
|
'=': '=',
|
||||||
|
});
|
||||||
|
function replaceChar(c) {
|
||||||
|
return escapeCharMap[c];
|
||||||
|
}
|
||||||
|
var escapeChars = /[&<>"'`=]/g;
|
||||||
|
|
||||||
|
var HTMLEntities = freeze({
|
||||||
|
amp: '&',
|
||||||
|
gt: '>',
|
||||||
|
lt: '<',
|
||||||
|
quot: '"',
|
||||||
|
apos: "'",
|
||||||
|
AElig: 198,
|
||||||
|
Aacute: 193,
|
||||||
|
Acirc: 194,
|
||||||
|
Agrave: 192,
|
||||||
|
Aring: 197,
|
||||||
|
Atilde: 195,
|
||||||
|
Auml: 196,
|
||||||
|
Ccedil: 199,
|
||||||
|
ETH: 208,
|
||||||
|
Eacute: 201,
|
||||||
|
Ecirc: 202,
|
||||||
|
Egrave: 200,
|
||||||
|
Euml: 203,
|
||||||
|
Iacute: 205,
|
||||||
|
Icirc: 206,
|
||||||
|
Igrave: 204,
|
||||||
|
Iuml: 207,
|
||||||
|
Ntilde: 209,
|
||||||
|
Oacute: 211,
|
||||||
|
Ocirc: 212,
|
||||||
|
Ograve: 210,
|
||||||
|
Oslash: 216,
|
||||||
|
Otilde: 213,
|
||||||
|
Ouml: 214,
|
||||||
|
THORN: 222,
|
||||||
|
Uacute: 218,
|
||||||
|
Ucirc: 219,
|
||||||
|
Ugrave: 217,
|
||||||
|
Uuml: 220,
|
||||||
|
Yacute: 221,
|
||||||
|
aacute: 225,
|
||||||
|
acirc: 226,
|
||||||
|
aelig: 230,
|
||||||
|
agrave: 224,
|
||||||
|
aring: 229,
|
||||||
|
atilde: 227,
|
||||||
|
auml: 228,
|
||||||
|
ccedil: 231,
|
||||||
|
eacute: 233,
|
||||||
|
ecirc: 234,
|
||||||
|
egrave: 232,
|
||||||
|
eth: 240,
|
||||||
|
euml: 235,
|
||||||
|
iacute: 237,
|
||||||
|
icirc: 238,
|
||||||
|
igrave: 236,
|
||||||
|
iuml: 239,
|
||||||
|
ntilde: 241,
|
||||||
|
oacute: 243,
|
||||||
|
ocirc: 244,
|
||||||
|
ograve: 242,
|
||||||
|
oslash: 248,
|
||||||
|
otilde: 245,
|
||||||
|
ouml: 246,
|
||||||
|
szlig: 223,
|
||||||
|
thorn: 254,
|
||||||
|
uacute: 250,
|
||||||
|
ucirc: 251,
|
||||||
|
ugrave: 249,
|
||||||
|
uuml: 252,
|
||||||
|
yacute: 253,
|
||||||
|
yuml: 255,
|
||||||
|
copy: 169,
|
||||||
|
reg: 174,
|
||||||
|
nbsp: 160,
|
||||||
|
iexcl: 161,
|
||||||
|
cent: 162,
|
||||||
|
pound: 163,
|
||||||
|
curren: 164,
|
||||||
|
yen: 165,
|
||||||
|
brvbar: 166,
|
||||||
|
sect: 167,
|
||||||
|
uml: 168,
|
||||||
|
ordf: 170,
|
||||||
|
laquo: 171,
|
||||||
|
not: 172,
|
||||||
|
shy: 173,
|
||||||
|
macr: 175,
|
||||||
|
deg: 176,
|
||||||
|
plusmn: 177,
|
||||||
|
sup1: 185,
|
||||||
|
sup2: 178,
|
||||||
|
sup3: 179,
|
||||||
|
acute: 180,
|
||||||
|
micro: 181,
|
||||||
|
para: 182,
|
||||||
|
middot: 183,
|
||||||
|
cedil: 184,
|
||||||
|
ordm: 186,
|
||||||
|
raquo: 187,
|
||||||
|
frac14: 188,
|
||||||
|
frac12: 189,
|
||||||
|
frac34: 190,
|
||||||
|
iquest: 191,
|
||||||
|
times: 215,
|
||||||
|
divide: 247,
|
||||||
|
'OElig;': 338,
|
||||||
|
'oelig;': 339,
|
||||||
|
'Scaron;': 352,
|
||||||
|
'scaron;': 353,
|
||||||
|
'Yuml;': 376,
|
||||||
|
'fnof;': 402,
|
||||||
|
'circ;': 710,
|
||||||
|
'tilde;': 732,
|
||||||
|
'Alpha;': 913,
|
||||||
|
'Beta;': 914,
|
||||||
|
'Gamma;': 915,
|
||||||
|
'Delta;': 916,
|
||||||
|
'Epsilon;': 917,
|
||||||
|
'Zeta;': 918,
|
||||||
|
'Eta;': 919,
|
||||||
|
'Theta;': 920,
|
||||||
|
'Iota;': 921,
|
||||||
|
'Kappa;': 922,
|
||||||
|
'Lambda;': 923,
|
||||||
|
'Mu;': 924,
|
||||||
|
'Nu;': 925,
|
||||||
|
'Xi;': 926,
|
||||||
|
'Omicron;': 927,
|
||||||
|
'Pi;': 928,
|
||||||
|
'Rho;': 929,
|
||||||
|
'Sigma;': 931,
|
||||||
|
'Tau;': 932,
|
||||||
|
'Upsilon;': 933,
|
||||||
|
'Phi;': 934,
|
||||||
|
'Chi;': 935,
|
||||||
|
'Psi;': 936,
|
||||||
|
'Omega;': 937,
|
||||||
|
'alpha;': 945,
|
||||||
|
'beta;': 946,
|
||||||
|
'gamma;': 947,
|
||||||
|
'delta;': 948,
|
||||||
|
'epsilon;': 949,
|
||||||
|
'zeta;': 950,
|
||||||
|
'eta;': 951,
|
||||||
|
'theta;': 952,
|
||||||
|
'iota;': 953,
|
||||||
|
'kappa;': 954,
|
||||||
|
'lambda;': 955,
|
||||||
|
'mu;': 956,
|
||||||
|
'nu;': 957,
|
||||||
|
'xi;': 958,
|
||||||
|
'omicron;': 959,
|
||||||
|
'pi;': 960,
|
||||||
|
'rho;': 961,
|
||||||
|
'sigmaf;': 962,
|
||||||
|
'sigma;': 963,
|
||||||
|
'tau;': 964,
|
||||||
|
'upsilon;': 965,
|
||||||
|
'phi;': 966,
|
||||||
|
'chi;': 967,
|
||||||
|
'psi;': 968,
|
||||||
|
'omega;': 969,
|
||||||
|
'thetasym;': 977,
|
||||||
|
'upsih;': 978,
|
||||||
|
'piv;': 982,
|
||||||
|
'ensp;': 8194,
|
||||||
|
'emsp;': 8195,
|
||||||
|
'thinsp;': 8201,
|
||||||
|
'zwnj;': 8204,
|
||||||
|
'zwj;': 8205,
|
||||||
|
'lrm;': 8206,
|
||||||
|
'rlm;': 8207,
|
||||||
|
'ndash;': 8211,
|
||||||
|
'mdash;': 8212,
|
||||||
|
'lsquo;': 8216,
|
||||||
|
'rsquo;': 8217,
|
||||||
|
'sbquo;': 8218,
|
||||||
|
'ldquo;': 8220,
|
||||||
|
'rdquo;': 8221,
|
||||||
|
'bdquo;': 8222,
|
||||||
|
'dagger;': 8224,
|
||||||
|
'Dagger;': 8225,
|
||||||
|
'bull;': 8226,
|
||||||
|
'hellip;': 8230,
|
||||||
|
'permil;': 8240,
|
||||||
|
'prime;': 8242,
|
||||||
|
'Prime;': 8243,
|
||||||
|
'lsaquo;': 8249,
|
||||||
|
'rsaquo;': 8250,
|
||||||
|
'oline;': 8254,
|
||||||
|
'frasl;': 8260,
|
||||||
|
'euro;': 8364,
|
||||||
|
'image;': 8465,
|
||||||
|
'weierp;': 8472,
|
||||||
|
'real;': 8476,
|
||||||
|
'trade;': 8482,
|
||||||
|
'alefsym;': 8501,
|
||||||
|
'larr;': 8592,
|
||||||
|
'uarr;': 8593,
|
||||||
|
'rarr;': 8594,
|
||||||
|
'darr;': 8595,
|
||||||
|
'harr;': 8596,
|
||||||
|
'crarr;': 8629,
|
||||||
|
'lArr;': 8656,
|
||||||
|
'uArr;': 8657,
|
||||||
|
'rArr;': 8658,
|
||||||
|
'dArr;': 8659,
|
||||||
|
'hArr;': 8660,
|
||||||
|
'forall;': 8704,
|
||||||
|
'part;': 8706,
|
||||||
|
'exist;': 8707,
|
||||||
|
'empty;': 8709,
|
||||||
|
'nabla;': 8711,
|
||||||
|
'isin;': 8712,
|
||||||
|
'notin;': 8713,
|
||||||
|
'ni;': 8715,
|
||||||
|
'prod;': 8719,
|
||||||
|
'sum;': 8721,
|
||||||
|
'minus;': 8722,
|
||||||
|
'lowast;': 8727,
|
||||||
|
'radic;': 8730,
|
||||||
|
'prop;': 8733,
|
||||||
|
'infin;': 8734,
|
||||||
|
'ang;': 8736,
|
||||||
|
'and;': 8743,
|
||||||
|
'or;': 8744,
|
||||||
|
'cap;': 8745,
|
||||||
|
'cup;': 8746,
|
||||||
|
'int;': 8747,
|
||||||
|
'there4;': 8756,
|
||||||
|
'sim;': 8764,
|
||||||
|
'cong;': 8773,
|
||||||
|
'asymp;': 8776,
|
||||||
|
'ne;': 8800,
|
||||||
|
'equiv;': 8801,
|
||||||
|
'le;': 8804,
|
||||||
|
'ge;': 8805,
|
||||||
|
'sub;': 8834,
|
||||||
|
'sup;': 8835,
|
||||||
|
'nsub;': 8836,
|
||||||
|
'sube;': 8838,
|
||||||
|
'supe;': 8839,
|
||||||
|
'oplus;': 8853,
|
||||||
|
'otimes;': 8855,
|
||||||
|
'perp;': 8869,
|
||||||
|
'sdot;': 8901,
|
||||||
|
'lceil;': 8968,
|
||||||
|
'rceil;': 8969,
|
||||||
|
'lfloor;': 8970,
|
||||||
|
'rfloor;': 8971,
|
||||||
|
'lang;': 9001,
|
||||||
|
'rang;': 9002,
|
||||||
|
'loz;': 9674,
|
||||||
|
'spades;': 9824,
|
||||||
|
'clubs;': 9827,
|
||||||
|
'hearts;': 9829,
|
||||||
|
'diams;': 9830,
|
||||||
|
});
|
||||||
|
|
||||||
var utils = {
|
var utils = {
|
||||||
generateUUID: function () {
|
generateUUID: function () {
|
||||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||||
@@ -33,6 +306,35 @@
|
|||||||
return v.toString(16);
|
return v.toString(16);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// https://github.com/substack/node-ent/blob/master/index.js
|
||||||
|
decodeHTMLEntities: function (html) {
|
||||||
|
return String(html)
|
||||||
|
.replace(/&#(\d+);?/g, function (_, code) {
|
||||||
|
return String.fromCharCode(code);
|
||||||
|
})
|
||||||
|
.replace(/&#[xX]([A-Fa-f0-9]+);?/g, function (_, hex) {
|
||||||
|
return String.fromCharCode(parseInt(hex, 16));
|
||||||
|
})
|
||||||
|
.replace(/&([^;\W]+;?)/g, function (m, e) {
|
||||||
|
var ee = e.replace(/;$/, '');
|
||||||
|
var target = HTMLEntities[e] || (e.match(/;$/) && HTMLEntities[ee]);
|
||||||
|
|
||||||
|
if (typeof target === 'number') {
|
||||||
|
return String.fromCharCode(target);
|
||||||
|
} else if (typeof target === 'string') {
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// https://github.com/jprichardson/string.js/blob/master/lib/string.js
|
||||||
|
stripHTMLTags: function (str, tags) {
|
||||||
|
var pattern = (tags || ['']).map(function (tag) {
|
||||||
|
return utils.escapeRegexChars(tag);
|
||||||
|
}).join('|');
|
||||||
|
return String(str).replace(new RegExp('</?(?:' + pattern + ')[^<>]*>', 'gi'), '');
|
||||||
|
},
|
||||||
|
|
||||||
invalidUnicodeChars: XRegExp('[^\\p{L}\\s\\d\\-_]', 'g'),
|
invalidUnicodeChars: XRegExp('[^\\p{L}\\s\\d\\-_]', 'g'),
|
||||||
invalidLatinChars: /[^\w\s\d\-_]/g,
|
invalidLatinChars: /[^\w\s\d\-_]/g,
|
||||||
@@ -232,8 +534,15 @@
|
|||||||
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
|
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
|
||||||
},
|
},
|
||||||
|
|
||||||
escapeHTML: function (raw) {
|
escapeHTML: function (str) {
|
||||||
return raw.replace(/&/gm, '&').replace(/</gm, '<').replace(/>/gm, '>');
|
if (str == null) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (!str) {
|
||||||
|
return String(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.toString().replace(escapeChars, replaceChar);
|
||||||
},
|
},
|
||||||
|
|
||||||
isAndroidBrowser: function () {
|
isAndroidBrowser: function () {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
var nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var S = require('string');
|
|
||||||
|
|
||||||
var user = require('../../user');
|
var user = require('../../user');
|
||||||
var posts = require('../../posts');
|
var posts = require('../../posts');
|
||||||
@@ -13,6 +12,7 @@ var helpers = require('../helpers');
|
|||||||
var pagination = require('../../pagination');
|
var pagination = require('../../pagination');
|
||||||
var messaging = require('../../messaging');
|
var messaging = require('../../messaging');
|
||||||
var translator = require('../../translator');
|
var translator = require('../../translator');
|
||||||
|
var utils = require('../../utils');
|
||||||
|
|
||||||
var profileController = module.exports;
|
var profileController = module.exports;
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ profileController.get = function (req, res, callback) {
|
|||||||
userData.profileviews = 1;
|
userData.profileviews = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var plainAboutMe = userData.aboutme ? S(userData.aboutme).decodeHTMLEntities().stripTags().s : '';
|
var plainAboutMe = userData.aboutme ? utils.stripHTMLTags(utils.decodeHTMLEntities(userData.aboutme)) : '';
|
||||||
|
|
||||||
res.locals.metaTags = [
|
res.locals.metaTags = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var S = require('string');
|
|
||||||
var nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
|
|
||||||
var user = require('../user');
|
var user = require('../user');
|
||||||
@@ -217,7 +216,7 @@ function addTags(topicData, req, res) {
|
|||||||
var postAtIndex = findPost(Math.max(0, req.params.post_index - 1));
|
var postAtIndex = findPost(Math.max(0, req.params.post_index - 1));
|
||||||
|
|
||||||
if (postAtIndex && postAtIndex.content) {
|
if (postAtIndex && postAtIndex.content) {
|
||||||
description = S(postAtIndex.content).decodeHTMLEntities().stripTags().s;
|
description = utils.stripHTMLTags(utils.decodeHTMLEntities(postAtIndex.content));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (description.length > 255) {
|
if (description.length > 255) {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var S = require('string');
|
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
var validator = require('validator');
|
var validator = require('validator');
|
||||||
|
|
||||||
@@ -660,7 +659,7 @@ Flags.notify = function (flagObj, uid, callback) {
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
var title = S(results.title).decodeHTMLEntities().s;
|
var title = utils.decodeHTMLEntities(results.title);
|
||||||
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
||||||
|
|
||||||
notifications.create({
|
notifications.create({
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var S = require('string');
|
|
||||||
var validator = require('validator');
|
var validator = require('validator');
|
||||||
|
|
||||||
var db = require('./database');
|
var db = require('./database');
|
||||||
@@ -215,7 +214,7 @@ Messaging.getTeaser = function (uid, roomId, callback) {
|
|||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
if (teaser.content) {
|
if (teaser.content) {
|
||||||
teaser.content = S(teaser.content).stripTags().decodeHTMLEntities().s;
|
teaser.content = utils.stripHTMLTags(utils.decodeHTMLEntities(teaser.content));
|
||||||
teaser.content = validator.escape(String(teaser.content));
|
teaser.content = validator.escape(String(teaser.content));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var S = require('string');
|
|
||||||
|
|
||||||
var db = require('../database');
|
var db = require('../database');
|
||||||
var user = require('../user');
|
var user = require('../user');
|
||||||
@@ -73,7 +72,7 @@ module.exports = function (Messaging) {
|
|||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
message.content = result;
|
message.content = result;
|
||||||
message.cleanedContent = S(result).stripTags().decodeHTMLEntities().s;
|
message.cleanedContent = utils.stripHTMLTags(utils.decodeHTMLEntities(result));
|
||||||
next(null, message);
|
next(null, message);
|
||||||
});
|
});
|
||||||
}, next);
|
}, next);
|
||||||
|
|||||||
@@ -72,7 +72,6 @@ JS.scripts = {
|
|||||||
'public/src/modules/alerts.js',
|
'public/src/modules/alerts.js',
|
||||||
'public/src/modules/taskbar.js',
|
'public/src/modules/taskbar.js',
|
||||||
'public/src/modules/helpers.js',
|
'public/src/modules/helpers.js',
|
||||||
'public/src/modules/string.js',
|
|
||||||
'public/src/modules/flags.js',
|
'public/src/modules/flags.js',
|
||||||
'public/src/modules/storage.js',
|
'public/src/modules/storage.js',
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ var async = require('async');
|
|||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
var cron = require('cron').CronJob;
|
var cron = require('cron').CronJob;
|
||||||
var nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
var S = require('string');
|
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
|
|
||||||
var db = require('./database');
|
var db = require('./database');
|
||||||
@@ -56,7 +55,7 @@ Notifications.getMultiple = function (nids, callback) {
|
|||||||
notification.datetimeISO = utils.toISOString(notification.datetime);
|
notification.datetimeISO = utils.toISOString(notification.datetime);
|
||||||
|
|
||||||
if (notification.bodyLong) {
|
if (notification.bodyLong) {
|
||||||
notification.bodyLong = S(notification.bodyLong).escapeHTML().s;
|
notification.bodyLong = utils.escapeHTML(notification.bodyLong);
|
||||||
}
|
}
|
||||||
|
|
||||||
notification.user = usersData[index];
|
notification.user = usersData[index];
|
||||||
@@ -470,7 +469,7 @@ Notifications.merge = function (notifications, callback) {
|
|||||||
});
|
});
|
||||||
var numUsers = usernames.length;
|
var numUsers = usernames.length;
|
||||||
|
|
||||||
var title = S(notifications[modifyIndex].topicTitle || '').decodeHTMLEntities().s;
|
var title = utils.decodeHTMLEntities(notifications[modifyIndex].topicTitle || '');
|
||||||
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
||||||
titleEscaped = titleEscaped ? (', ' + titleEscaped) : '';
|
titleEscaped = titleEscaped ? (', ' + titleEscaped) : '';
|
||||||
|
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ var async = require('async');
|
|||||||
var nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
var url = require('url');
|
var url = require('url');
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
var S = require('string');
|
|
||||||
|
|
||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
var cache = require('./cache');
|
var cache = require('./cache');
|
||||||
var plugins = require('../plugins');
|
var plugins = require('../plugins');
|
||||||
var translator = require('../translator');
|
var translator = require('../translator');
|
||||||
|
var utils = require('../utils');
|
||||||
|
|
||||||
module.exports = function (Posts) {
|
module.exports = function (Posts) {
|
||||||
Posts.urlRegex = {
|
Posts.urlRegex = {
|
||||||
@@ -82,7 +82,6 @@ module.exports = function (Posts) {
|
|||||||
|
|
||||||
function sanitizeSignature(signature) {
|
function sanitizeSignature(signature) {
|
||||||
signature = translator.escape(signature);
|
signature = translator.escape(signature);
|
||||||
var string = S(signature);
|
|
||||||
var tagsToStrip = [];
|
var tagsToStrip = [];
|
||||||
|
|
||||||
if (parseInt(meta.config['signatures:disableLinks'], 10) === 1) {
|
if (parseInt(meta.config['signatures:disableLinks'], 10) === 1) {
|
||||||
@@ -93,6 +92,6 @@ module.exports = function (Posts) {
|
|||||||
tagsToStrip.push('img');
|
tagsToStrip.push('img');
|
||||||
}
|
}
|
||||||
|
|
||||||
return tagsToStrip.length ? string.stripTags.apply(string, tagsToStrip).s : signature;
|
return utils.stripHTMLTags(signature, tagsToStrip);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var validator = require('validator');
|
var validator = require('validator');
|
||||||
var S = require('string');
|
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
|
|
||||||
var topics = require('../topics');
|
var topics = require('../topics');
|
||||||
@@ -144,8 +143,7 @@ module.exports = function (Posts) {
|
|||||||
|
|
||||||
function stripTags(content) {
|
function stripTags(content) {
|
||||||
if (content) {
|
if (content) {
|
||||||
var s = S(content);
|
return utils.stripHTMLTags(content, utils.stripTags);
|
||||||
return s.stripTags.apply(s, utils.stripTags).s;
|
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
var S = require('string');
|
|
||||||
|
|
||||||
var db = require('../database');
|
var db = require('../database');
|
||||||
var websockets = require('./index');
|
var websockets = require('./index');
|
||||||
@@ -12,6 +11,7 @@ var topics = require('../topics');
|
|||||||
var privileges = require('../privileges');
|
var privileges = require('../privileges');
|
||||||
var notifications = require('../notifications');
|
var notifications = require('../notifications');
|
||||||
var plugins = require('../plugins');
|
var plugins = require('../plugins');
|
||||||
|
var utils = require('../utils');
|
||||||
|
|
||||||
var SocketHelpers = {};
|
var SocketHelpers = {};
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ SocketHelpers.sendNotificationToPostOwner = function (pid, fromuid, command, not
|
|||||||
}, next);
|
}, next);
|
||||||
},
|
},
|
||||||
function (results, next) {
|
function (results, next) {
|
||||||
var title = S(results.topicTitle).decodeHTMLEntities().s;
|
var title = utils.decodeHTMLEntities(results.topicTitle);
|
||||||
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
||||||
|
|
||||||
notifications.create({
|
notifications.create({
|
||||||
@@ -151,7 +151,7 @@ SocketHelpers.sendNotificationToTopicOwner = function (tid, fromuid, command, no
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ownerUid = results.topicData.uid;
|
ownerUid = results.topicData.uid;
|
||||||
var title = S(results.topicData.title).decodeHTMLEntities().s;
|
var title = utils.decodeHTMLEntities(results.topicData.title);
|
||||||
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
||||||
|
|
||||||
notifications.create({
|
notifications.create({
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
var async = require('async');
|
var async = require('async');
|
||||||
var validator = require('validator');
|
var validator = require('validator');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var S = require('string');
|
|
||||||
|
|
||||||
var posts = require('../../posts');
|
var posts = require('../../posts');
|
||||||
var groups = require('../../groups');
|
var groups = require('../../groups');
|
||||||
var events = require('../../events');
|
var events = require('../../events');
|
||||||
var meta = require('../../meta');
|
var meta = require('../../meta');
|
||||||
|
var utils = require('../../utils');
|
||||||
var websockets = require('../index');
|
var websockets = require('../index');
|
||||||
|
|
||||||
module.exports = function (SocketPosts) {
|
module.exports = function (SocketPosts) {
|
||||||
@@ -20,7 +20,7 @@ module.exports = function (SocketPosts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Trim and remove HTML (latter for composers that send in HTML, like redactor)
|
// Trim and remove HTML (latter for composers that send in HTML, like redactor)
|
||||||
var contentLen = S(data.content).stripTags().s.trim().length;
|
var contentLen = utils.stripHTMLTags(data.content).trim().length;
|
||||||
|
|
||||||
if (data.title && data.title.length < parseInt(meta.config.minimumTitleLength, 10)) {
|
if (data.title && data.title.length < parseInt(meta.config.minimumTitleLength, 10)) {
|
||||||
return callback(new Error('[[error:title-too-short, ' + meta.config.minimumTitleLength + ']]'));
|
return callback(new Error('[[error:title-too-short, ' + meta.config.minimumTitleLength + ']]'));
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
var async = require('async');
|
var async = require('async');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var validator = require('validator');
|
var validator = require('validator');
|
||||||
var S = require('string');
|
|
||||||
var db = require('../database');
|
var db = require('../database');
|
||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var plugins = require('../plugins');
|
var plugins = require('../plugins');
|
||||||
@@ -343,7 +343,7 @@ module.exports = function (Topics) {
|
|||||||
function check(item, min, max, minError, maxError, callback) {
|
function check(item, min, max, minError, maxError, callback) {
|
||||||
// Trim and remove HTML (latter for composers that send in HTML, like redactor)
|
// Trim and remove HTML (latter for composers that send in HTML, like redactor)
|
||||||
if (typeof item === 'string') {
|
if (typeof item === 'string') {
|
||||||
item = S(item).stripTags().s.trim();
|
item = utils.stripHTMLTags(item).trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item === null || item === undefined || item.length < parseInt(min, 10)) {
|
if (item === null || item === undefined || item.length < parseInt(min, 10)) {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var S = require('string');
|
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
|
|
||||||
var db = require('../database');
|
var db = require('../database');
|
||||||
@@ -13,6 +12,7 @@ var privileges = require('../privileges');
|
|||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
var emailer = require('../emailer');
|
var emailer = require('../emailer');
|
||||||
var plugins = require('../plugins');
|
var plugins = require('../plugins');
|
||||||
|
var utils = require('../utils');
|
||||||
|
|
||||||
module.exports = function (Topics) {
|
module.exports = function (Topics) {
|
||||||
Topics.toggleFollow = function (tid, uid, callback) {
|
Topics.toggleFollow = function (tid, uid, callback) {
|
||||||
@@ -214,7 +214,7 @@ module.exports = function (Topics) {
|
|||||||
title = postData.topic.title;
|
title = postData.topic.title;
|
||||||
|
|
||||||
if (title) {
|
if (title) {
|
||||||
title = S(title).decodeHTMLEntities().s;
|
title = utils.decodeHTMLEntities(title);
|
||||||
titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var S = require('string');
|
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
|
|
||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
@@ -91,8 +90,7 @@ module.exports = function (Topics) {
|
|||||||
if (tidToPost[topic.tid]) {
|
if (tidToPost[topic.tid]) {
|
||||||
tidToPost[topic.tid].index = meta.config.teaserPost === 'first' ? 1 : counts[index];
|
tidToPost[topic.tid].index = meta.config.teaserPost === 'first' ? 1 : counts[index];
|
||||||
if (tidToPost[topic.tid].content) {
|
if (tidToPost[topic.tid].content) {
|
||||||
var s = S(tidToPost[topic.tid].content);
|
tidToPost[topic.tid].content = utils.stripHTMLTags(tidToPost[topic.tid].content, utils.stripTags);
|
||||||
tidToPost[topic.tid].content = s.stripTags.apply(s, utils.stripTags).s;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tidToPost[topic.tid];
|
return tidToPost[topic.tid];
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
var S = require('string');
|
|
||||||
|
|
||||||
var db = require('../database');
|
var db = require('../database');
|
||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
var notifications = require('../notifications');
|
var notifications = require('../notifications');
|
||||||
var privileges = require('../privileges');
|
var privileges = require('../privileges');
|
||||||
|
var utils = require('../utils');
|
||||||
|
|
||||||
var UserNotifications = module.exports;
|
var UserNotifications = module.exports;
|
||||||
|
|
||||||
@@ -281,7 +281,7 @@ UserNotifications.sendTopicNotificationToFollowers = function (uid, topicData, p
|
|||||||
|
|
||||||
var title = topicData.title;
|
var title = topicData.title;
|
||||||
if (title) {
|
if (title) {
|
||||||
title = S(title).decodeHTMLEntities().s;
|
title = utils.decodeHTMLEntities(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
notifications.create({
|
notifications.create({
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var S = require('string');
|
|
||||||
|
|
||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
@@ -61,7 +60,7 @@ module.exports = function (User) {
|
|||||||
} else if (field === 'fullname') {
|
} else if (field === 'fullname') {
|
||||||
return updateFullname(updateUid, data.fullname, next);
|
return updateFullname(updateUid, data.fullname, next);
|
||||||
} else if (field === 'signature') {
|
} else if (field === 'signature') {
|
||||||
data[field] = S(data[field]).stripTags().s;
|
data[field] = utils.stripHTMLTags(data[field]);
|
||||||
}
|
}
|
||||||
|
|
||||||
User.setUserField(updateUid, field, data[field], next);
|
User.setUserField(updateUid, field, data[field], next);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var string = require('string');
|
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
|||||||
@@ -16,6 +16,28 @@ describe('Utility Methods', function () {
|
|||||||
var $ = global.$;
|
var $ = global.$;
|
||||||
global.window = window;
|
global.window = window;
|
||||||
|
|
||||||
|
// https://github.com/jprichardson/string.js/blob/master/test/string.test.js
|
||||||
|
it('should decode HTML entities', function (done) {
|
||||||
|
assert.strictEqual(
|
||||||
|
utils.decodeHTMLEntities('Ken Thompson & Dennis Ritchie'),
|
||||||
|
'Ken Thompson & Dennis Ritchie'
|
||||||
|
);
|
||||||
|
assert.strictEqual(
|
||||||
|
utils.decodeHTMLEntities('3 < 4'),
|
||||||
|
'3 < 4'
|
||||||
|
);
|
||||||
|
assert.strictEqual(
|
||||||
|
utils.decodeHTMLEntities('http://'),
|
||||||
|
'http://'
|
||||||
|
);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
it('should strip HTML tags', function (done) {
|
||||||
|
assert.strictEqual(utils.stripHTMLTags('<p>just <b>some</b> text</p>'), 'just some text');
|
||||||
|
assert.strictEqual(utils.stripHTMLTags('<p>just <b>some</b> text</p>', ['p']), 'just <b>some</b> text');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
it('should preserve case if requested', function (done) {
|
it('should preserve case if requested', function (done) {
|
||||||
var slug = utils.slugify('UPPER CASE', true);
|
var slug = utils.slugify('UPPER CASE', true);
|
||||||
assert.equal(slug, 'UPPER-CASE');
|
assert.equal(slug, 'UPPER-CASE');
|
||||||
|
|||||||
Reference in New Issue
Block a user