Browse Source

Merge pull request #266 from slr/tasty-fixes-10-II-ampersand-strikes-back

fix of post formatting
master
miguelfreitas 9 years ago
parent
commit
09135eaaf9
  1. 77
      js/twister_formatpost.js

77
js/twister_formatpost.js

@ -198,33 +198,32 @@ function dmDataToConversationItem(dmData, localUser, remoteUser) {
// convert message text to html, featuring @users and links formating. // convert message text to html, featuring @users and links formating.
function htmlFormatMsg(msg, mentions) { function htmlFormatMsg(msg, mentions) {
function getStrStart(str, i, stopChars) { function getStrStart(str, startPoint, stopChars, stopCharsTrailing) {
for (; i > -1; i--) { for (var i = startPoint; i > -1; i--) {
if (stopChars.indexOf(str[i]) > -1) if (stopChars.indexOf(str[i]) > -1)
return i + 1; break;
} }
return 0; for (i += 1; i < startPoint + 1; i++) {
if (stopCharsTrailing.indexOf(str[i]) === -1)
break;
} }
function getStrEnd(str, i, stopChars) { return i;
for (; i < str.length; i++) {
if (stopChars.indexOf(str[i]) > -1)
return i - 1;
} }
return str.length; function getStrEnd(str, startPoint, stopChars, stopCharsTrailing) {
for (var i = startPoint; i < str.length; i++) {
if (stopChars.indexOf(str[i]) > -1)
break;
} }
function extractStr(str, startPoint, endPoint, stopChars) { for (i -= 1; i > startPoint - 1; i--) {
for (var i = endPoint; i > startPoint - 1; i--) { if (stopCharsTrailing.indexOf(str[i]) === -1)
if (stopChars.indexOf(str[i]) === -1) {
endPoint = i;
break; break;
} }
}
return str.slice(startPoint, endPoint + 1); return i;
} }
function htmlSplitCounter(str) { function htmlSplitCounter(str) {
@ -237,8 +236,9 @@ function htmlFormatMsg(msg, mentions) {
var stopCharsTrailing = '/\\.,:;?!*%\'"[](){}^|«»…\u201C\u201D\u2026\u2014\u4E00\u3002\uFF0C\uFF1A\uFF1F\uFF01\u3010\u3011'; var stopCharsTrailing = '/\\.,:;?!*%\'"[](){}^|«»…\u201C\u201D\u2026\u2014\u4E00\u3002\uFF0C\uFF1A\uFF1F\uFF01\u3010\u3011';
var stopCharsTrailingUrl = stopCharsTrailing.slice(1); var stopCharsTrailingUrl = stopCharsTrailing.slice(1);
var whiteSpaces = ' \f\n\r\t\v\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000'; var whiteSpaces = ' \f\n\r\t\v\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000';
var stopCharsRight = '>' + whiteSpaces;
var stopCharsLeft = '<' + whiteSpaces; var stopCharsLeft = '<' + whiteSpaces;
var stopCharsRight = '>' + whiteSpaces;
var stopCharsRightHashtags = stopCharsRight + stopCharsTrailing;
var j, str, strEncoded; var j, str, strEncoded;
var html = []; var html = [];
@ -247,7 +247,9 @@ function htmlFormatMsg(msg, mentions) {
for (var i = 0; i < msg.length - 7; i++) { for (var i = 0; i < msg.length - 7; i++) {
if (msg.slice(i, i + 4).toLowerCase() === 'http') { if (msg.slice(i, i + 4).toLowerCase() === 'http') {
if (msg.slice(i + 4, i + 7) === '://' && stopCharsRight.indexOf(msg[i + 7]) === -1) { if (msg.slice(i + 4, i + 7) === '://' && stopCharsRight.indexOf(msg[i + 7]) === -1) {
str = extractStr(msg, i, getStrEnd(msg, i + 7, stopCharsRight), stopCharsTrailingUrl); j = getStrEnd(msg, i + 7, stopCharsRight, stopCharsTrailingUrl);
if (j > i + 6) {
str = msg.slice(i, j + 1);
// FIXME we're trying to not interact with DOM, coz' we want to run really fast [to hell of RegExps] // FIXME we're trying to not interact with DOM, coz' we want to run really fast [to hell of RegExps]
// FIXME actually we should avoid it by dropping a template idea and construct html right here // FIXME actually we should avoid it by dropping a template idea and construct html right here
html.push($('#external-page-link-template')[0].outerHTML html.push($('#external-page-link-template')[0].outerHTML
@ -259,8 +261,11 @@ function htmlFormatMsg(msg, mentions) {
strEncoded = '>' + (html.length - 1).toString() + '<'; strEncoded = '>' + (html.length - 1).toString() + '<';
msg = msg.slice(0, i) + strEncoded + msg.slice(i + str.length); msg = msg.slice(0, i) + strEncoded + msg.slice(i + str.length);
i = i + strEncoded.length - 1; i = i + strEncoded.length - 1;
}
} else if (msg.slice(i + 4, i + 8).toLowerCase() === 's://' && stopCharsRight.indexOf(msg[i + 8]) === -1) { } else if (msg.slice(i + 4, i + 8).toLowerCase() === 's://' && stopCharsRight.indexOf(msg[i + 8]) === -1) {
str = extractStr(msg, i, getStrEnd(msg, i + 8, stopCharsRight), stopCharsTrailingUrl); j = getStrEnd(msg, i + 8, stopCharsRight, stopCharsTrailingUrl);
if (j > i + 7) {
str = msg.slice(i, j + 1);
html.push($('#external-page-link-template')[0].outerHTML html.push($('#external-page-link-template')[0].outerHTML
.replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id') .replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id')
//.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href') //.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href')
@ -273,12 +278,16 @@ function htmlFormatMsg(msg, mentions) {
} }
} }
} }
}
for (var i = 1; i < msg.length - 1; i++) { for (var i = 1; i < msg.length - 1; i++) {
if (msg[i] === '@' && stopCharsLeft.indexOf(msg[i - 1]) === -1 if (msg[i] === '@' && stopCharsLeft.indexOf(msg[i - 1]) === -1
&& stopCharsTrailing.indexOf(msg[i - 1]) === -1 && stopCharsRight.indexOf(msg[i + 1]) === -1) { && stopCharsTrailing.indexOf(msg[i - 1]) === -1 && stopCharsRight.indexOf(msg[i + 1]) === -1) {
j = getStrStart(msg, i, stopCharsLeft); j = getStrStart(msg, i - 1, stopCharsLeft, stopCharsTrailing);
str = extractStr(msg, j, getStrEnd(msg, i + 1, stopCharsRight), stopCharsTrailing); if (j < i) {
var k = getStrEnd(msg, i + 1, stopCharsRight, stopCharsTrailing);
if (k > i) {
str = msg.slice(j, k + 1);
html.push($('#external-page-link-template')[0].outerHTML html.push($('#external-page-link-template')[0].outerHTML
.replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id') .replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id')
//.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href') //.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href')
@ -290,6 +299,8 @@ function htmlFormatMsg(msg, mentions) {
i = j + strEncoded.length - 1; i = j + strEncoded.length - 1;
} }
} }
}
}
for (var i = 0; i < msg.length - 1; i++) { for (var i = 0; i < msg.length - 1; i++) {
if (msg[i] === '@' && mentionsChars.indexOf(msg[i + 1].toLowerCase()) > -1) { if (msg[i] === '@' && mentionsChars.indexOf(msg[i + 1].toLowerCase()) > -1) {
@ -312,9 +323,10 @@ function htmlFormatMsg(msg, mentions) {
} }
for (var i = 0; i < msg.length - 1; i++) { for (var i = 0; i < msg.length - 1; i++) {
j = i + 1; if (msg[i] === '#' && msg[i + 1] !== '#' && stopCharsRight.indexOf(msg[i + 1]) === -1) {
if (msg[i] === '#' && msg[j] !== '#' && stopCharsRight.indexOf(msg[j]) === -1) { j = getStrEnd(msg, i + 1, stopCharsRightHashtags, stopCharsTrailing);
str = extractStr(msg, j, getStrEnd(msg, j, '/' + stopCharsRight), stopCharsTrailing); if (j > i) {
str = msg.slice(i + 1, j + 1);
html.push($('#hashtag-link-template')[0].outerHTML html.push($('#hashtag-link-template')[0].outerHTML
.replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id') .replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id')
//.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href') //.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href')
@ -326,17 +338,23 @@ function htmlFormatMsg(msg, mentions) {
i = i + strEncoded.length - 1; i = i + strEncoded.length - 1;
} }
} }
}
msg = msg msg = msg
.replace(/\(\d{1,2}\/\d{1,2}\)$/, htmlSplitCounter) .replace(/\(\d{1,2}\/\d{1,2}\)$/, htmlSplitCounter)
.replace(/&(?!lt;|gt;|quot;|apos;)/g, '&amp;') // FIXME in many cases there is no need to escape ampersand in HTML 5 .replace(/&(?!lt;|gt;)/g, '&amp;') // FIXME in many cases there is no need to escape ampersand in HTML 5
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;')
; ;
for (var i = 0; i < msg.length - 2; i++) { for (var i = 0; i < msg.length - 2; i++) {
if (msg[i] === '>') { if (msg[i] === '>') {
j = getStrEnd(msg, i + 2, '<'); for (var j = i + 2; j < msg.length; j++) {
str = html[parseInt(msg.slice(i + 1, j + 1))]; if (msg[j] === '<')
msg = msg.slice(0, i) + str + msg.slice(j + 2); break;
}
str = html[parseInt(msg.slice(i + 1, j))];
msg = msg.slice(0, i) + str + msg.slice(j + 1);
i = i + str.length - 1; i = i + str.length - 1;
} }
} }
@ -373,8 +391,9 @@ function escapeHtmlEntities(str) {
//.replace(/&/g, '&amp;') we do it not here //.replace(/&/g, '&amp;') we do it not here
.replace(/</g, '&lt;') .replace(/</g, '&lt;')
.replace(/>/g, '&gt;') .replace(/>/g, '&gt;')
.replace(/"/g, '&quot;') //.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;'); //.replace(/'/g, '&apos;')
;
} }
function reverseHtmlEntities(str) { function reverseHtmlEntities(str) {

Loading…
Cancel
Save