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" +
+ ""
+ );
+ });
});