summaryrefslogtreecommitdiffstats
path: root/web/react/utils/utils.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'web/react/utils/utils.jsx')
-rw-r--r--web/react/utils/utils.jsx308
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();