Cosmetic refactoring of post_body.jsx
Этот коммит содержится в:
@@ -9,11 +9,11 @@ var formatText = require('../../static/js/marked/lib/marked.js');
|
|||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
componentWillReceiveProps: function(nextProps) {
|
componentWillReceiveProps: function(nextProps) {
|
||||||
var linkData = utils.extractLinks(nextProps.post.message);
|
var linkData = utils.extractLinks(nextProps.post.message);
|
||||||
this.setState({ links: linkData["links"], message: linkData["text"] });
|
this.setState({links: linkData.links, message: linkData.text});
|
||||||
},
|
},
|
||||||
getInitialState: function() {
|
getInitialState: function() {
|
||||||
var linkData = utils.extractLinks(this.props.post.message);
|
var linkData = utils.extractLinks(this.props.post.message);
|
||||||
return { links: linkData["links"], message: linkData["text"] };
|
return {links: linkData.links, message: linkData.text};
|
||||||
},
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
var post = this.props.post;
|
var post = this.props.post;
|
||||||
@@ -22,52 +22,51 @@ module.exports = React.createClass({
|
|||||||
var inner = utils.textToJsx(this.state.message);
|
var inner = utils.textToJsx(this.state.message);
|
||||||
var allowTextFormatting = config.AllowTextFormatting;
|
var allowTextFormatting = config.AllowTextFormatting;
|
||||||
|
|
||||||
var comment = "";
|
var comment = '';
|
||||||
var reply = "";
|
var postClass = '';
|
||||||
var postClass = "";
|
|
||||||
|
|
||||||
if (parentPost) {
|
if (parentPost) {
|
||||||
var profile = UserStore.getProfile(parentPost.user_id);
|
var profile = UserStore.getProfile(parentPost.user_id);
|
||||||
var apostrophe = "";
|
var apostrophe = '';
|
||||||
var name = "...";
|
var name = '...';
|
||||||
if (profile != null) {
|
if (profile != null) {
|
||||||
if (profile.username.slice(-1) === 's') {
|
if (profile.username.slice(-1) === 's') {
|
||||||
apostrophe = "'";
|
apostrophe = "'";
|
||||||
} else {
|
} else {
|
||||||
apostrophe = "'s";
|
apostrophe = "'s";
|
||||||
}
|
}
|
||||||
name = <a className="theme" onClick={function(){ utils.searchForTerm(profile.username); }}>{profile.username}</a>;
|
name = <a className='theme' onClick={utils.searchForTerm.bind(this, profile.username)}>{profile.username}</a>;
|
||||||
}
|
}
|
||||||
|
|
||||||
var message = ""
|
var message = '';
|
||||||
if(parentPost.message) {
|
if (parentPost.message) {
|
||||||
message = utils.replaceHtmlEntities(parentPost.message)
|
message = utils.replaceHtmlEntities(parentPost.message);
|
||||||
} else if (parentPost.filenames.length) {
|
} else if (parentPost.filenames.length) {
|
||||||
message = parentPost.filenames[0].split('/').pop();
|
message = parentPost.filenames[0].split('/').pop();
|
||||||
|
|
||||||
if (parentPost.filenames.length === 2) {
|
if (parentPost.filenames.length === 2) {
|
||||||
message += " plus 1 other file";
|
message += ' plus 1 other file';
|
||||||
} else if (parentPost.filenames.length > 2) {
|
} else if (parentPost.filenames.length > 2) {
|
||||||
message += " plus " + (parentPost.filenames.length - 1) + " other files";
|
message += ' plus ' + (parentPost.filenames.length - 1) + ' other files';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allowTextFormatting) {
|
if (allowTextFormatting) {
|
||||||
message = formatText(message, {sanitize: true, mangle: false, gfm: true, breaks: true, tables: false, smartypants: true, renderer: utils.customMarkedRenderer({disable: true})});
|
message = formatText(message, {sanitize: true, mangle: false, gfm: true, breaks: true, tables: false, smartypants: true, renderer: utils.customMarkedRenderer({disable: true})});
|
||||||
comment = (
|
comment = (
|
||||||
<p className="post-link">
|
<p className='post-link'>
|
||||||
<span>Commented on {name}{apostrophe} message: <a className="theme" onClick={this.props.handleCommentClick} dangerouslySetInnerHTML={{__html: message}} /></span>
|
<span>Commented on {name}{apostrophe} message: <a className='theme' onClick={this.props.handleCommentClick} dangerouslySetInnerHTML={{__html: message}} /></span>
|
||||||
</p>
|
</p>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
comment = (
|
comment = (
|
||||||
<p className="post-link">
|
<p className='post-link'>
|
||||||
<span>Commented on {name}{apostrophe} message: <a className="theme" onClick={this.props.handleCommentClick}>{message}</a></span>
|
<span>Commented on {name}{apostrophe} message: <a className='theme' onClick={this.props.handleCommentClick}>{message}</a></span>
|
||||||
</p>
|
</p>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
postClass += " post-comment";
|
postClass += ' post-comment';
|
||||||
}
|
}
|
||||||
|
|
||||||
var embed;
|
var embed;
|
||||||
@@ -75,22 +74,26 @@ module.exports = React.createClass({
|
|||||||
embed = utils.getEmbed(this.state.links[0]);
|
embed = utils.getEmbed(this.state.links[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var innerHolder = <p key={post.id + '_message'} className={postClass}><span>{inner}</span></p>;
|
||||||
|
if (allowTextFormatting) {
|
||||||
|
innerHolder = <div key={post.id + '_message'} className={postClass}><span>{inner}</span></div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileAttachmentHolder = '';
|
||||||
|
if (filenames && filenames.length > 0) {
|
||||||
|
fileAttachmentHolder = (<FileAttachmentList
|
||||||
|
filenames={filenames}
|
||||||
|
modalId={'view_image_modal_' + post.id}
|
||||||
|
channelId={post.channel_id}
|
||||||
|
userId={post.user_id} />);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="post-body">
|
<div className='post-body'>
|
||||||
{ comment }
|
{comment}
|
||||||
{allowTextFormatting ?
|
{innerHolder}
|
||||||
<div key={post.id+"_message"} className={postClass}><span>{inner}</span></div>
|
{fileAttachmentHolder}
|
||||||
:
|
{embed}
|
||||||
<p key={post.id+"_message"} className={postClass}><span>{inner}</span></p>
|
|
||||||
}
|
|
||||||
{ filenames && filenames.length > 0 ?
|
|
||||||
<FileAttachmentList
|
|
||||||
filenames={filenames}
|
|
||||||
modalId={"view_image_modal_" + post.id}
|
|
||||||
channelId={post.channel_id}
|
|
||||||
userId={post.user_id} />
|
|
||||||
: "" }
|
|
||||||
{ embed }
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -434,8 +434,9 @@ module.exports = React.createClass({
|
|||||||
var isLastComment = utils.isComment(post) && (i === 0 || posts[order[i-1]].root_id != post.root_id);
|
var isLastComment = utils.isComment(post) && (i === 0 || posts[order[i-1]].root_id != post.root_id);
|
||||||
|
|
||||||
var postKey = post.id;
|
var postKey = post.id;
|
||||||
if (post.lastEditDate != undefined)
|
if (post.lastEditDate) {
|
||||||
postKey += post.lastEditDate;
|
postKey += post.lastEditDate;
|
||||||
|
}
|
||||||
|
|
||||||
var postCtl = (
|
var postCtl = (
|
||||||
<Post ref={post.id} sameUser={sameUser} sameRoot={sameRoot} post={post} parentPost={parentPost} key={postKey}
|
<Post ref={post.id} sameUser={sameUser} sameRoot={sameRoot} post={post} parentPost={parentPost} key={postKey}
|
||||||
|
|||||||
@@ -286,8 +286,9 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
var rootPostKey = root_post.id
|
var rootPostKey = root_post.id
|
||||||
if (root_post.lastEditDate != undefined)
|
if (root_post.lastEditDate) {
|
||||||
rootPostKey += root_post.lastEditDate;
|
rootPostKey += root_post.lastEditDate;
|
||||||
|
}
|
||||||
|
|
||||||
var posts_array = [];
|
var posts_array = [];
|
||||||
|
|
||||||
@@ -295,8 +296,9 @@ module.exports = React.createClass({
|
|||||||
var cpost = post_list.posts[postId];
|
var cpost = post_list.posts[postId];
|
||||||
if (cpost.root_id == root_post.id) {
|
if (cpost.root_id == root_post.id) {
|
||||||
var cpostKey = cpost.id
|
var cpostKey = cpost.id
|
||||||
if (cpost.lastEditDate != undefined)
|
if (cpost.lastEditDate) {
|
||||||
cpostKey += cpost.lastEditDate;
|
cpostKey += cpost.lastEditDate;
|
||||||
|
}
|
||||||
|
|
||||||
cpost.cpostKey = cpostKey;
|
cpost.cpostKey = cpostKey;
|
||||||
posts_array.push(cpost);
|
posts_array.push(cpost);
|
||||||
|
|||||||
@@ -634,6 +634,8 @@ module.exports.textToJsx = function(textToChange, options) {
|
|||||||
}
|
}
|
||||||
if (!useTextFormatting && i !== lines.length - 1) {
|
if (!useTextFormatting && i !== lines.length - 1) {
|
||||||
inner.push(<br key={'br_' + i}/>);
|
inner.push(<br key={'br_' + i}/>);
|
||||||
|
} else if (useTextFormatting && !codeFlag && i < lines.length - 2) {
|
||||||
|
inner.push(<br key={'br_' + i}/>);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -194,18 +194,6 @@ Lexer.prototype.token = function(src, top, bq) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// top-level paragraph
|
|
||||||
if (top && (cap = this.rules.paragraph.exec(src))) {
|
|
||||||
src = src.substring(cap[0].length);
|
|
||||||
this.tokens.push({
|
|
||||||
type: 'paragraph',
|
|
||||||
text: cap[1].charAt(cap[1].length - 1) === '\n'
|
|
||||||
? cap[1].slice(0, -1)
|
|
||||||
: cap[1]
|
|
||||||
});
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// text
|
// text
|
||||||
if (cap = this.rules.text.exec(src)) {
|
if (cap = this.rules.text.exec(src)) {
|
||||||
// Top-level should never reach here.
|
// Top-level should never reach here.
|
||||||
@@ -240,7 +228,7 @@ var inline = {
|
|||||||
nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
|
nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
|
||||||
strong: /^\*((?:\*\*|[\s\S])+?)\*/,
|
strong: /^\*((?:\*\*|[\s\S])+?)\*/,
|
||||||
em: /^\b_((?:[^_]|__)+?)_\b/,
|
em: /^\b_((?:[^_]|__)+?)_\b/,
|
||||||
code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
|
code: /^(`{1})\s*([^\r?\n|\r]*?[^`])\s*\1(?!`)/,
|
||||||
br: /^ {2,}\n(?!\s*$)/,
|
br: /^ {2,}\n(?!\s*$)/,
|
||||||
del: noop,
|
del: noop,
|
||||||
text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
|
text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
|
||||||
@@ -394,13 +382,6 @@ InlineLexer.prototype.output = function(src) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// br
|
|
||||||
if (cap = this.rules.br.exec(src)) {
|
|
||||||
src = src.substring(cap[0].length);
|
|
||||||
out += this.renderer.br();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// text
|
// text
|
||||||
if (cap = this.rules.text.exec(src)) {
|
if (cap = this.rules.text.exec(src)) {
|
||||||
src = src.substring(cap[0].length);
|
src = src.substring(cap[0].length);
|
||||||
@@ -484,15 +465,6 @@ function Renderer(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Renderer.prototype.code = function(code, lang, escaped) {
|
Renderer.prototype.code = function(code, lang, escaped) {
|
||||||
return '<pre>' + code + '</pre>';
|
|
||||||
/*if (this.options.highlight) {
|
|
||||||
var out = this.options.highlight(code, lang);
|
|
||||||
if (out != null && out !== code) {
|
|
||||||
escaped = true;
|
|
||||||
code = out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lang) {
|
if (!lang) {
|
||||||
return '<pre><code>'
|
return '<pre><code>'
|
||||||
+ (escaped ? code : escape(code, true))
|
+ (escaped ? code : escape(code, true))
|
||||||
@@ -504,7 +476,7 @@ Renderer.prototype.code = function(code, lang, escaped) {
|
|||||||
+ escape(lang, true)
|
+ escape(lang, true)
|
||||||
+ '">'
|
+ '">'
|
||||||
+ (escaped ? code : escape(code, true))
|
+ (escaped ? code : escape(code, true))
|
||||||
+ '\n</code></pre>\n';*/
|
+ '\n</code></pre>\n';
|
||||||
};
|
};
|
||||||
|
|
||||||
Renderer.prototype.blockquote = function(quote) {
|
Renderer.prototype.blockquote = function(quote) {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user