diff --git a/client/js/libs/handlebars/parse.js b/client/js/libs/handlebars/parse.js index fdf32bdc..0bccaa1d 100644 --- a/client/js/libs/handlebars/parse.js +++ b/client/js/libs/handlebars/parse.js @@ -2,6 +2,7 @@ const Handlebars = require("handlebars/runtime"); const parseStyle = require("./ircmessageparser/parseStyle"); +const anyIntersection = require("./ircmessageparser/anyIntersection"); const findChannels = require("./ircmessageparser/findChannels"); const findLinks = require("./ircmessageparser/findLinks"); const findEmoji = require("./ircmessageparser/findEmoji"); @@ -66,7 +67,15 @@ module.exports = function parse(text) { const parts = channelParts .concat(linkParts) .concat(emojiParts) - .sort((a, b) => a.start - b.start); + .sort((a, b) => a.start - b.start || b.end - a.end) + .reduce((prev, curr) => { + const intersection = prev.some((p) => anyIntersection(p, curr)); + + if (intersection) { + return prev; + } + return prev.concat([curr]); + }, []); // Merge the styling information with the channels / URLs / text objects and // generate HTML strings with the resulting fragments diff --git a/test/client/js/libs/handlebars/parse.js b/test/client/js/libs/handlebars/parse.js index 10d7eac0..2c08f8f2 100644 --- a/test/client/js/libs/handlebars/parse.js +++ b/test/client/js/libs/handlebars/parse.js @@ -312,7 +312,6 @@ describe("parse Handlebars helper", () => { const testCases = [{ input: "http://example.com/#hash", expected: - "" + "" + "http://example.com/#hash" + "", @@ -333,4 +332,15 @@ describe("parse Handlebars helper", () => { "Channel: ##channel" ); }); + + it("should handle overlapping parts by using first starting", () => { + const input = "#test-https://example.com"; + const actual = parse(input); + + expect(actual).to.equal( + "" + + "#test-https://example.com" + + "" + ); + }); });