diff --git a/js/mobile_abstract.js b/js/mobile_abstract.js index 2c1bcb6..bc165c1 100644 --- a/js/mobile_abstract.js +++ b/js/mobile_abstract.js @@ -506,13 +506,13 @@ function filterLang(string) { // before detection attempts we cut out any mentions and links, and replace _ with space langFilterSubj = string.replace(/@\S\w*|https?:\/\/\S*/g, '').replace(/_+/g, ' ') // cut out common frequently used words FIXME I believe there is a list of similar international stuff somewhere outside which is waiting for us, we should just find it - .replace(/\btwister|github|google|twitter\b/g, '') + .replace(/\btwister|tox|github|linux|ubuntu|debian|windows|google|twitter|facebook|microsoft|ping|pong|email|javascript\b/ig, '') // replace zero-width word boundaries, such as between letters from different alphabets [or other symbols], with spaces // FIXME not so good idea because 'Za pomocą białej listy' may turn into 'Za pomoc ą bia ł ej listy' for e.g. // FIXME but first one was recognized as 'hrv' and second as 'pol' and you know it's 'pol' actually .replace(/\b/g, ' ') // cut out some more symbols - .replace(/[#\[\]\(\)\{\}\-\+\=\^\:\;\\\/0-9]/g, '') + .replace(/[#<>\.,:;\?\!\*\[\]\(\)\{\}\-\+\=\^\\\/0-9\u201C\u201D\u2026\u2014\u4E00\u3002\uFF0C\uFF1A\uFF1F\uFF01\u3010\u3011]/g, '') // unicode escaped stuff is '“”…—一。,:?!【】' // clear unwanted spaces .replace(/\s+/g, ' ').trim(); diff --git a/js/twister_formatpost.js b/js/twister_formatpost.js index 45c4f65..c962a71 100644 --- a/js/twister_formatpost.js +++ b/js/twister_formatpost.js @@ -183,60 +183,73 @@ function htmlFormatMsg(msg, mentions) { function htmlMention(str, pre) { str = str.replace(new RegExp(['^', pre, '@'].join('')), '').toLowerCase(); - mentions.push(str); // FIXME feel the scope + mentions.push(str); // FIXME feel the pain of the scope chain // 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 - return $('#msg-user-link-template')[0].outerHTML + html.push($('#msg-user-link-template')[0].outerHTML .replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id') //.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href') - .replace(/]*?\bclass\s*=\s*"(?=[^"]*?\bopen-profile-modal\b))/ig, [pre, ']*?\bclass\s*=\s*"(?=[^"]*?\bopen-profile-modal\b))/ig, [']*?\bclass\s*=\s*"(?=[^"]*?\bopen-profile-modal\b))[^]*?>)[^]*?(<\/a>)/ig, [pre, '$1@', str, '$2'].join('')) // $().closest('a.open-profile-modal').text('@'+username) - ; + ); + + return ['>', html.length - 1, '<'].join(''); } function htmlHashtag(str, pre) { str = str.replace(new RegExp(['^', pre, '#'].join('')), ''); - return $('#hashtag-link-template')[0].outerHTML + html.push($('#hashtag-link-template')[0].outerHTML .replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id') //.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href') .replace(/]*?\bclass\s*=\s*"(?=[^"]*?\bopen-hashtag-modal\b))/ig, [']*?\bclass\s*=\s*"(?=[^"]*?\bopen-hashtag-modal\b))[^]*?>)[^]*?(<\/a>)/ig, [pre, '$1#', str, '$2'].join('')) // $().closest('a.open-profile-modal').text('#'+hashtag) - ; + ); + + return ['>', html.length - 1, '<'].join(''); } function htmlHttp(str) { - return $('#external-page-link-template')[0].outerHTML + html.push($('#external-page-link-template')[0].outerHTML .replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id') //.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href') .replace(/)[^]*?(<\/a>)/ig, ['$1', str, '$2'].join('')) // $().closest('a').text(url) - ; + ); + + return ['>', html.length - 1, '<'].join(''); } - function htmlEmail(str) { - return $('#external-page-link-template')[0].outerHTML + function htmlEmail(str, pre) { + str = str.replace(new RegExp(['^', pre].join('')), ''); + + html.push($('#external-page-link-template')[0].outerHTML .replace(/\bid\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('id') //.replace(/\bhref\s*=\s*"[^]*?"+/ig, '') // $().removeAttr('href') .replace(/)[^]*?(<\/a>)/ig, ['$1', str, '$2'].join('')) // $().closest('a').text(url) - ; + .replace(/()[^]*?(<\/a>)/ig, [pre, '$1', str, '$2'].join('')) // $().closest('a').text(url) + ); + + return ['>', html.length - 1, '<'].join(''); } function htmlSplitCounter(str) { - return ['', str, ''].join(''); + html.push(['', str, ''].join('')); + + return ['>', html.length - 1, '<'].join(''); } - msg = escapeHtmlEntities(msg) - .replace(/(^|\s|\w)@\S\w*/g, htmlMention) - .replace(/(^|\s|\w)#\S\w*/g, htmlHashtag) - .replace(/\bhttps?:\/\/\S+/ig, htmlHttp) - .replace(/\S+@\S+\.\S+/g, htmlEmail) - .replace(/\(\d{1,2}\/\d{1,2}\)$/, htmlSplitCounter) - ; + var html = []; - return _formatText(msg); + return _formatText(escapeHtmlEntities(msg) + .replace(/(^|[^\/]\B(?!\S*:\/\/\S*@))@\w+\b/g, htmlMention) + .replace(/(^|[^<\/]\B(?!\S*:\/\/\S*#))#[^#\\\/\.,:;\?\!\*\[\]\(\)\{\}\-\+\=\^\|%'"\u201C\u201D\u2026\u2014\u4E00\u3002\uFF0C\uFF1A\uFF1F\uFF01\u3010\u3011>\s]+/g, htmlHashtag) // unicode escaped stuff is '“”…—一。,:?!【】' for our chinese friends + .replace(/\bhttps?:\/\/\S[^>\s]+/ig, htmlHttp) + .replace(/([^<\/])\b(?!\S*:\/\/\S*@)\S+@\S+\.\S[^>\s]+/g, htmlEmail) + .replace(/\(\d{1,2}\/\d{1,2}\)$/, htmlSplitCounter) + .replace(/>(\d+)