Merge pull request #1213 from mattermost/plt-836

PLT-836 Prevent markdown styled links from embedding gifs
Этот коммит содержится в:
Corey Hulen
2015-10-28 14:44:53 -07:00
родитель 89f67cd11d 46613a1679
Коммит 5f2e01a938
2 изменённых файлов: 46 добавлений и 30 удалений

Просмотреть файл

@@ -297,7 +297,7 @@ export default class PostBody extends React.Component {
} }
let embed; let embed;
if (filenames.length === 0 && this.state.links) { if (filenames.length === 0 && this.state.links && this.state.links.length > 0) {
embed = this.createEmbed(this.state.links[0]); embed = this.createEmbed(this.state.links[0]);
} }

Просмотреть файл

@@ -231,46 +231,62 @@ export function getTimestamp() {
return Date.now(); return Date.now();
} }
function testUrlMatch(text) { // extracts links not styled by Markdown
var urlMatcher = new Autolinker.matchParser.MatchParser({ export function extractLinks(text) {
const urlMatcher = new Autolinker.matchParser.MatchParser({
urls: true, urls: true,
emails: false, emails: false,
twitter: false, twitter: false,
phone: false, phone: false,
hashtag: false hashtag: false
}); });
var result = []; const links = [];
function replaceFn(match) { let replaceText = text;
var linkData = {};
var matchText = match.getMatchedText();
linkData.text = matchText; // pull out the Markdown code blocks
if (matchText.trim().indexOf('http') === 0) { const codeBlocks = [];
linkData.link = matchText; const splitText = replaceText.split('`'); // also handles ```
} else { for (let i = 1; i < splitText.length; i += 2) {
linkData.link = 'http://' + matchText; if (splitText[i].trim() !== '') {
codeBlocks.push(splitText[i]);
}
}
function replaceFn(match) {
let link = '';
const matchText = match.getMatchedText();
const tempText = replaceText;
const start = replaceText.indexOf(matchText);
const end = start + matchText.length;
replaceText = replaceText.substring(0, start) + replaceText.substring(end);
// if it's a Markdown link, just skip it
if (start > 1) {
if (tempText.charAt(start - 2) === ']' && tempText.charAt(start - 1) === '(' && tempText.charAt(end) === ')') {
return;
}
} }
result.push(linkData); // if it's in a Markdown code block, skip it
for (const i in codeBlocks) {
if (codeBlocks[i].indexOf(matchText) === 0) {
codeBlocks[i] = codeBlocks[i].replace(matchText, '');
return;
}
}
if (matchText.trim().indexOf('http') === 0) {
link = matchText;
} else {
link = 'http://' + matchText;
}
links.push(link);
} }
urlMatcher.replace(text, replaceFn, this); urlMatcher.replace(text, replaceFn, this);
return result; return {links, text};
}
export function extractLinks(text) {
var repRegex = new RegExp('<br>', 'g');
var matches = testUrlMatch(text.replace(repRegex, '\n'));
if (!matches.length) {
return {links: null, text: text};
}
var links = [];
for (var i = 0; i < matches.length; i++) {
links.push(matches[i].link);
}
return {links: links, text: text};
} }
export function escapeRegExp(string) { export function escapeRegExp(string) {