diff options
author | Christopher Speller <crspeller@gmail.com> | 2015-08-14 15:13:04 -0400 |
---|---|---|
committer | Christopher Speller <crspeller@gmail.com> | 2015-08-14 15:13:04 -0400 |
commit | 9036dd99aa8ba2d9cdd6066a833862bbd9e2653a (patch) | |
tree | 41a18a9bcbbcc7cd961cc424878ac37aade5c288 /web/react/utils | |
parent | b9aef9f2a6b90663cb7ba4ff9e42560c145b631d (diff) | |
parent | 26a8e19a357aee9e1b39623e604ce92bdfaa00df (diff) | |
download | chat-9036dd99aa8ba2d9cdd6066a833862bbd9e2653a.tar.gz chat-9036dd99aa8ba2d9cdd6066a833862bbd9e2653a.tar.bz2 chat-9036dd99aa8ba2d9cdd6066a833862bbd9e2653a.zip |
Merge pull request #382 from mattermost/revert-360-mm-375d
Revert "MM-375 Adds text formatting features using a modified version…
Diffstat (limited to 'web/react/utils')
-rw-r--r-- | web/react/utils/utils.jsx | 308 |
1 files changed, 79 insertions, 229 deletions
diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx index a903ca063..7591c138f 100644 --- a/web/react/utils/utils.jsx +++ b/web/react/utils/utils.jsx @@ -9,7 +9,6 @@ var ActionTypes = Constants.ActionTypes; var AsyncClient = require('./async_client.jsx'); var client = require('./client.jsx'); var Autolinker = require('autolinker'); -var formatText = require('../../static/js/marked/lib/marked.js'); module.exports.isEmail = function(email) { var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/; @@ -96,32 +95,33 @@ module.exports.getCookie = function(name) { if (parts.length == 2) return parts.pop().split(";").shift(); } + module.exports.notifyMe = function(title, body, channel) { - if ('Notification' in window && Notification.permission !== 'denied') { - Notification.requestPermission(function(permission) { - if (Notification.permission !== permission) { - Notification.permission = permission; - } + if ("Notification" in window && Notification.permission !== 'denied') { + Notification.requestPermission(function (permission) { + if (Notification.permission !== permission) { + Notification.permission = permission; + } - if (permission === 'granted') { - var notification = new Notification(title, - {body: body, tag: body, icon: '/static/images/icon50x50.gif'} - ); - notification.onclick = function() { - window.focus(); - if (channel) { - module.exports.switchChannel(channel); - } else { - window.location.href = '/'; - } - }; - setTimeout(function() { - notification.close(); - }, 5000); - } - }); - } -}; + if (permission === "granted") { + var notification = new Notification(title, + { body: body, tag: body, icon: '/static/images/icon50x50.gif' } + ); + notification.onclick = function() { + window.focus(); + if (channel) { + module.exports.switchChannel(channel); + } else { + window.location.href = "/"; + } + }; + setTimeout(function(){ + notification.close(); + }, 5000); + } + }); + } +} module.exports.ding = function() { var audio = new Audio('/static/images/ding.mp3'); @@ -385,262 +385,112 @@ module.exports.searchForTerm = function(term) { }); } -/* Options: - - disable: Parses out *'s and other format specifiers in the text, but doesn't convert to html -*/ -module.exports.customMarkedRenderer = function(options) { - var customTextRenderer = new formatText.Renderer(); - if (options && options.disable) { - customTextRenderer.paragraph = function(text) { - return text + ' '; - }; - customTextRenderer.strong = function(text) { - return text; - }; - customTextRenderer.em = function(text) { - return text; - }; - customTextRenderer.codespan = function(code) { - return code; - }; - customTextRenderer.link = function(href) { - return href; - }; - customTextRenderer.image = function(href) { - return href; - }; - } else { - customTextRenderer.link = function(href) { - return href; - }; - customTextRenderer.image = function(href) { - return href; - }; - } - return customTextRenderer; -}; - -var puncStartRegex = /^((?![@#])[^A-Za-z0-9_<>])+/g; -var puncEndRegex = /([^A-Za-z0-9_<>])+$/g; -var startTagRegex = /(<\s*\w.*?>)+/g; -var endTagRegex = /(<\s*\/\s*\w\s*.*?>|<\s*br\s*>)+/g; +var oldExplicitMentionRegex = /(?:<mention>)([\s\S]*?)(?:<\/mention>)/g; +var puncStartRegex = /^((?![@#])\W)+/g; +var puncEndRegex = /(\W)+$/g; -module.exports.textToJsx = function(textToChange, options) { - var useTextFormatting = config.AllowTextFormatting && (!options || !options.noTextFormatting); - var text = textToChange; +module.exports.textToJsx = function(text, options) { - if (useTextFormatting) { - text = formatText(text, {sanitize: true, mangle: false, gfm: true, breaks: true, tables: false, smartypants: true, renderer: module.exports.customMarkedRenderer()}); + if (options && options['singleline']) { + var repRegex = new RegExp("\n", "g"); + text = text.replace(repRegex, " "); } - if (options && options.singleline) { - var repRegex = new RegExp('\n', 'g'); - text = text.replace(repRegex, ' '); + var searchTerm = "" + if (options && options['searchTerm']) { + searchTerm = options['searchTerm'].toLowerCase() } - var searchTerm = ''; - if (options && options.searchTerm) { - searchTerm = options.searchTerm.toLowerCase(); - } - - var mentionClass = 'mention-highlight'; - if (options && options.noMentionHighlight) { - mentionClass = ''; + var mentionClass = "mention-highlight"; + if (options && options['noMentionHighlight']) { + mentionClass = ""; } var inner = []; - var codeFlag = false; - var codeString = ''; // Function specific regex var hashRegex = /^href="#[^"]+"|(#[A-Za-z]+[A-Za-z0-9_\-]*[A-Za-z0-9])$/g; var implicitKeywords = UserStore.getCurrentMentionKeys(); - var lines = text.split('\n'); + var lines = text.split("\n"); for (var i = 0; i < lines.length; i++) { var line = lines[i]; - var words = line.split(' '); - var highlightSearchClass = ''; + var words = line.split(" "); + var highlightSearchClass = ""; for (var z = 0; z < words.length; z++) { var word = words[z]; - var trimWord; - if (useTextFormatting) { - trimWord = word.replace(endTagRegex, '').replace(startTagRegex, '').replace(puncStartRegex, '').replace(puncEndRegex, '').trim(); - } else { - trimWord = word.replace(puncStartRegex, '').replace(puncEndRegex, '').trim(); - } + var trimWord = word.replace(puncStartRegex, '').replace(puncEndRegex, '').trim(); var mentionRegex = /^(?:@)([a-z0-9_]+)$/gi; // looks loop invariant but a weird JS bug needs it to be redefined here var explicitMention = mentionRegex.exec(trimWord); - var mClass; - - var prefix = ''; - var suffix = ''; - var prefixSpan = null; - var suffixSpan = <span key={word + i + z + 'suf_span'}> </span>; - if (useTextFormatting) { - if (word.match(startTagRegex)) { - prefix += word.match(startTagRegex); - } - if (word.replace(startTagRegex, '').match(puncStartRegex)) { - prefix += word.replace(startTagRegex, '').match(puncStartRegex); - } - - if (word.match(endTagRegex)) { - suffix += word.match(endTagRegex); - } - if (word.replace(endTagRegex, '').match(puncEndRegex)) { - suffix += word.replace(endTagRegex, '').match(puncEndRegex); - } - if (prefix) { - prefixSpan = <span key={word + i + z + 'pre_span'}><span dangerouslySetInnerHTML={{__html: prefix}} /></span>; - } - if (suffix) { - suffixSpan = <span key={word + i + z + 'suf_span'}><span dangerouslySetInnerHTML={{__html: suffix}} /> </span>; - } - } else { - prefix = word.match(puncStartRegex); - suffix = word.match(puncEndRegex); - if (prefix) { - prefixSpan = <span key={word + i + z + 'pre_span'}>{prefix}</span>; - } - if (suffix) { - suffixSpan = <span key={word + i + z + 'suf_span'}>{suffix} </span>; - } - } + if ((trimWord.toLowerCase().indexOf(searchTerm) > -1 || word.toLowerCase().indexOf(searchTerm) > -1) && searchTerm != "") { - if ((trimWord.toLowerCase().indexOf(searchTerm) > -1 || word.toLowerCase().indexOf(searchTerm) > -1) && searchTerm !== '') { - highlightSearchClass = ' search-highlight'; + highlightSearchClass = " search-highlight"; } - if (useTextFormatting && (codeFlag || word.indexOf('<code>') !== -1)) { - codeString += word + ' '; - codeFlag = true; - - if (word.indexOf('</code>') !== -1) { - inner.push(<span key={word + i + z + '_span'} className={highlightSearchClass} dangerouslySetInnerHTML={{__html: codeString}} />); - codeString = ''; - codeFlag = false; - } - } else if (explicitMention && - (UserStore.getProfileByUsername(explicitMention[1]) || - Constants.SPECIAL_MENTIONS.indexOf(explicitMention[1]) !== -1)) { + if (explicitMention && + (UserStore.getProfileByUsername(explicitMention[1]) || + Constants.SPECIAL_MENTIONS.indexOf(explicitMention[1]) !== -1)) + { var name = explicitMention[1]; - // do both a non-case sensitive and case senstive check - mClass = ''; - if (implicitKeywords.indexOf('@' + name.toLowerCase()) !== -1 || implicitKeywords.indexOf('@' + name) !== -1) { - mClass = mentionClass; - } + var mClass = implicitKeywords.indexOf('@'+name.toLowerCase()) !== -1 || implicitKeywords.indexOf('@'+name) !== -1 ? mentionClass : ""; + + var suffix = word.match(puncEndRegex); + var prefix = word.match(puncStartRegex); if (searchTerm === name) { - highlightSearchClass = ' search-highlight'; + highlightSearchClass = " search-highlight"; } - if (useTextFormatting) { - if (prefixSpan) { - inner.push(prefixSpan); - } - inner.push(<span key={word + i + z + 'word_span'}><a className={mClass + highlightSearchClass + ' mention-link'} key={name + i + z + '_link'} href='#' onClick={function(value) { return function() { module.exports.searchForTerm(value); } }(name)}>{'@' + name}</a></span>); - if (suffixSpan) { - inner.push(suffixSpan); - } - } else { - inner.push(<span key={name + i + z + '_span'}>{prefix}<a className={mClass + highlightSearchClass + ' mention-link'} key={name + i + z + '_link'} href='#' onClick={function(value) { return function() { module.exports.searchForTerm(value); } }(name)}>@{name}</a>{suffix} </span>); - } + inner.push(<span key={name+i+z+"_span"}>{prefix}<a className={mClass + highlightSearchClass + " mention-link"} key={name+i+z+"_link"} href="#" onClick={function(value) { return function() { module.exports.searchForTerm(value); } }(name)}>@{name}</a>{suffix} </span>); } else if (testUrlMatch(word).length) { var match = testUrlMatch(word)[0]; var link = match.link; - prefix = word.substring(0, word.indexOf(match.text)); - suffix = word.substring(word.indexOf(match.text) + match.text.length); - if (prefix) { - prefixSpan = <span key={word + i + z + 'pre_span'}><span dangerouslySetInnerHTML={{__html: prefix}} /></span>; - } - if (suffix) { - suffixSpan = <span key={word + i + z + 'suf_span'}><span dangerouslySetInnerHTML={{__html: suffix}} /> </span>; - } else { - suffixSpan = <span key={word + i + z + 'suf_span'}> </span>; - } + var prefix = word.substring(0,word.indexOf(match.text)); + var suffix = word.substring(word.indexOf(match.text)+match.text.length); + + inner.push(<span key={word+i+z+"_span"}>{prefix}<a key={word+i+z+"_link"} className={"theme" + highlightSearchClass} target="_blank" href={link}>{match.text}</a>{suffix} </span>); - if (useTextFormatting) { - if (prefixSpan) { - inner.push(prefixSpan); - } - inner.push(<span key={word + i + z + '_span'}><a key={name + i + z + '_link'} className={'theme' + highlightSearchClass} target='_blank' href={link}>{match.text}</a></span>); - if (suffixSpan) { - inner.push(suffixSpan); - } - } else { - inner.push(<span key={word + i + z + '_span'}>{prefix}<a key={word + i + z + '_link'} className={'theme' + highlightSearchClass} target='_blank' href={link}>{match.text}</a>{suffix} </span>); - } } else if (trimWord.match(hashRegex)) { - mClass = ''; - if (implicitKeywords.indexOf(trimWord) !== -1 || implicitKeywords.indexOf(trimWord.toLowerCase()) !== -1) { - mClass = mentionClass; - } + var suffix = word.match(puncEndRegex); + var prefix = word.match(puncStartRegex); + var mClass = implicitKeywords.indexOf(trimWord) !== -1 || implicitKeywords.indexOf(trimWord.toLowerCase()) !== -1 ? mentionClass : ""; if (searchTerm === trimWord.substring(1).toLowerCase() || searchTerm === trimWord.toLowerCase()) { - highlightSearchClass = ' search-highlight'; + highlightSearchClass = " search-highlight"; } - if (useTextFormatting) { - if (prefixSpan) { - inner.push(prefixSpan); - } - inner.push(<span key={word + i + z + '_span'}><a key={word + i + z + '_hash'} className={'theme ' + mClass + highlightSearchClass} href='#' onClick={function(value) { return function() { module.exports.searchForTerm(value); } }(trimWord)}>{trimWord}</a></span>); - if (suffixSpan) { - inner.push(suffixSpan); - } - } else { - inner.push(<span key={word + i + z + '_span'}>{prefix}<a key={word + i + z + '_hash'} className={'theme ' + mClass + highlightSearchClass} href='#' onClick={function(value) { return function() { module.exports.searchForTerm(value); } }(trimWord)}>{trimWord}</a>{suffix} </span>); - } + inner.push(<span key={word+i+z+"_span"}>{prefix}<a key={word+i+z+"_hash"} className={"theme " + mClass + highlightSearchClass} href="#" onClick={function(value) { return function() { module.exports.searchForTerm(value); } }(trimWord)}>{trimWord}</a>{suffix} </span>); + } else if (implicitKeywords.indexOf(trimWord) !== -1 || implicitKeywords.indexOf(trimWord.toLowerCase()) !== -1) { + var suffix = word.match(puncEndRegex); + var prefix = word.match(puncStartRegex); + if (trimWord.charAt(0) === '@') { if (searchTerm === trimWord.substring(1).toLowerCase()) { - highlightSearchClass = ' search-highlight'; - } - if (useTextFormatting) { - if (prefixSpan) { - inner.push(prefixSpan); - } - inner.push(<span key={word + i + z + '_span'}><a className={mentionClass + highlightSearchClass} key={name + i + z + '_link'} href='#'>{trimWord}</a></span>); - if (suffixSpan) { - inner.push(suffixSpan); - } - } else { - inner.push(<span key={word + i + z + '_span'}>{prefix}<a className={mentionClass + highlightSearchClass} key={name + i + z + '_link'} href='#'>{trimWord}</a>{suffix} </span>); - } - } else if (useTextFormatting) { - if (prefixSpan) { - inner.push(prefixSpan); - } - inner.push(<span key={word + i + z + '_span'}><span className={mentionClass + highlightSearchClass}>{trimWord}</span></span>); - if (suffixSpan) { - inner.push(suffixSpan); + highlightSearchClass = " search-highlight"; } + inner.push(<span key={word+i+z+"_span"} key={name+i+z+"_span"}>{prefix}<a className={mentionClass + highlightSearchClass} key={name+i+z+"_link"} href="#">{trimWord}</a>{suffix} </span>); } else { - inner.push(<span key={word + i + z + '_span'}>{prefix}<span className={mentionClass + highlightSearchClass}>{module.exports.replaceHtmlEntities(trimWord)}</span>{suffix} </span>); - } - } else if (word !== '') { - if (useTextFormatting) { - inner.push(<span key={word + i + z + '_span'} className={highlightSearchClass} dangerouslySetInnerHTML={{__html: word + ' '}} />); - } else { - inner.push(<span key={word + i + z + '_span'}><span className={highlightSearchClass}>{module.exports.replaceHtmlEntities(word)}</span> </span>); + inner.push(<span key={word+i+z+"_span"}>{prefix}<span className={mentionClass + highlightSearchClass}>{module.exports.replaceHtmlEntities(trimWord)}</span>{suffix} </span>); } + + } else if (word === "") { + // if word is empty dont include a span + } else { + inner.push(<span key={word+i+z+"_span"}><span className={highlightSearchClass}>{module.exports.replaceHtmlEntities(word)}</span> </span>); } - highlightSearchClass = ''; - } - if (!useTextFormatting && i !== lines.length - 1) { - inner.push(<br key={'br_' + i}/>); - } else if (useTextFormatting && !codeFlag && i < lines.length - 2) { - inner.push(<br key={'br_' + i}/>); + highlightSearchClass = ""; } + if (i != lines.length-1) + inner.push(<br key={"br_"+i+z}/>); } return inner; -}; +} module.exports.getFileType = function(ext) { ext = ext.toLowerCase(); |