Merge "Check for overlapping pattern matches"
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
index f530331..7feaa51 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
@@ -47,6 +47,10 @@
           match: '(I[0-9a-f]{8,40})',
           link: '#/q/$1'
         },
+        changeid2: {
+          match: 'Change-Id: +(I[0-9a-f]{8,40})',
+          link: '#/q/$1'
+        },
         googlesearch: {
           match: 'google:(.+)',
           link: 'https://bing.com/search?q=$1',  // html should supercede link.
@@ -151,7 +155,6 @@
       assert.equal(bugLinkEl.textContent, 'Issue 3650');
     });
 
-
     test('html field in link config', function() {
       element.content = 'google:do a barrel roll';
       var linkEl = element.$.output.childNodes[0];
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
index 5e1ff62..303a9cc 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
@@ -93,12 +93,31 @@
   if (!text) {
     return;
   }
-  this.addItem(text, href, null, position, length, outputArray);
+  if (!this.hasOverlap(position, length, outputArray)) {
+    this.addItem(text, href, null, position, length, outputArray);
+  }
 };
 
 GrLinkTextParser.prototype.addHTML =
     function(html, position, length, outputArray) {
-  this.addItem(null, null, html, position, length, outputArray);
+  if (!this.hasOverlap(position, length, outputArray)) {
+    this.addItem(null, null, html, position, length, outputArray);
+  }
+};
+
+GrLinkTextParser.prototype.hasOverlap =
+    function(position, length, outputArray) {
+  var endPosition = position + length;
+  for (var i = 0; i < outputArray.length; i++) {
+    var arrayItemStart = outputArray[i].position;
+    var arrayItemEnd = outputArray[i].position + outputArray[i].length;
+    if ((position >= arrayItemStart && position < arrayItemEnd) ||
+      (endPosition > arrayItemStart && endPosition <= arrayItemEnd) ||
+      (position === arrayItemStart && position === arrayItemEnd)) {
+          return true;
+    }
+  }
+  return false;
 };
 
 GrLinkTextParser.prototype.parse = function(text) {