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) {