From 291692f847e38be7420c04d9adfd03e4f9cffdd1 Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Sun, 4 Aug 2013 14:02:46 -0700 Subject: [PATCH] Fix multiple links in the same text node --- builds/appchan-x.user.js | 54 +++++++++++++++++++++----------- builds/crx/script.js | 54 +++++++++++++++++++++----------- src/Linkification/Linkify.coffee | 48 +++++++++++++++++----------- 3 files changed, 100 insertions(+), 56 deletions(-) diff --git a/builds/appchan-x.user.js b/builds/appchan-x.user.js index 95040c1a7..09209d1c4 100644 --- a/builds/appchan-x.user.js +++ b/builds/appchan-x.user.js @@ -6607,7 +6607,7 @@ }); }, node: function() { - var data, embedder, i, len, match, node, range, snapshot, _i, _j, _len, _len1, _ref, _ref1; + var data, embedder, i, len, node, range, snapshot, _i, _j, _len, _len1, _ref, _ref1; if (this.isClone && Conf['Embedding']) { _ref = $$('.embedder', this.nodes.comment); @@ -6623,8 +6623,9 @@ while (++i < len) { node = snapshot.snapshotItem(i); data = node.data; - if (match = data.match(Linkify.regString)) { - Linkify.gatherLinks(match, node, this); + if (Linkify.regString.test(data)) { + Linkify.regString.lastIndex = 0; + Linkify.gatherLinks(node, this); } } if (!(Conf['Embedding'] || Conf['Link Title'])) { @@ -6643,26 +6644,41 @@ } } }, - gatherLinks: function(match, node, post) { - var data, i, len, len2, link, next, range, result; + gatherLinks: function(node, post) { + var data, index, len, len2, len3, link, links, match, range, _i, _len, _ref; - i = 0; - len = match.length; data = node.data; - while ((link = match[i++]) && i > len) { + len = data.length; + links = []; + while ((match = Linkify.regString.exec(data))) { + index = match.index; + link = match[0]; + len2 = index + link.length; + if ((len3 = len - len2) === 0) { + break; + } range = document.createRange(); - range.setStart(node, len2 = data.indexOf(link)); - range.setEnd(node, len2 + link.length); + range.setStart(node, index); + range.setEnd(node, len2); + links.push(range); + } + if (match) { + Linkify.seek(match, node, post); + } + _ref = links.reverse(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + range = _ref[_i]; Linkify.makeLink(range, post); } + }, + seek: function(match, node, post) { + var data, index, link, next, range, result; + + index = match.index; + link = match[0]; range = document.createRange(); - range.setStart(node, len = data.indexOf(link)); - if ((data.length - (len += link.length)) > 0) { - range.setEnd(node, len); - Linkify.makeLink(range, post); - return; - } - while ((next = node.nextSibling) && next.nodeName.toLowerCase() !== 'br') { + range.setStart(node, index); + while ((next = node.nextSibling) && next.nodeName !== 'BR') { node = next; data = node.data; if (result = /[\s'"]/.exec(data)) { @@ -6670,12 +6686,12 @@ } } if (range.collapsed) { - if (node.nodeName.toLowerCase() === 'wbr') { + if (node.nodeName === 'WBR') { node = node.previousSibling; } range.setEnd(node, node.length); } - Linkify.makeLink(range, post); + return Linkify.makeLink(range, post); }, makeLink: function(range, post) { var a, link; diff --git a/builds/crx/script.js b/builds/crx/script.js index b4c810db4..e682f1640 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -6610,7 +6610,7 @@ }); }, node: function() { - var data, embedder, i, len, match, node, range, snapshot, _i, _j, _len, _len1, _ref, _ref1; + var data, embedder, i, len, node, range, snapshot, _i, _j, _len, _len1, _ref, _ref1; if (this.isClone && Conf['Embedding']) { _ref = $$('.embedder', this.nodes.comment); @@ -6626,8 +6626,9 @@ while (++i < len) { node = snapshot.snapshotItem(i); data = node.data; - if (match = data.match(Linkify.regString)) { - Linkify.gatherLinks(match, node, this); + if (Linkify.regString.test(data)) { + Linkify.regString.lastIndex = 0; + Linkify.gatherLinks(node, this); } } if (!(Conf['Embedding'] || Conf['Link Title'])) { @@ -6646,26 +6647,41 @@ } } }, - gatherLinks: function(match, node, post) { - var data, i, len, len2, link, next, range, result; + gatherLinks: function(node, post) { + var data, index, len, len2, len3, link, links, match, range, _i, _len, _ref; - i = 0; - len = match.length; data = node.data; - while ((link = match[i++]) && i > len) { + len = data.length; + links = []; + while ((match = Linkify.regString.exec(data))) { + index = match.index; + link = match[0]; + len2 = index + link.length; + if ((len3 = len - len2) === 0) { + break; + } range = document.createRange(); - range.setStart(node, len2 = data.indexOf(link)); - range.setEnd(node, len2 + link.length); + range.setStart(node, index); + range.setEnd(node, len2); + links.push(range); + } + if (match) { + Linkify.seek(match, node, post); + } + _ref = links.reverse(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + range = _ref[_i]; Linkify.makeLink(range, post); } + }, + seek: function(match, node, post) { + var data, index, link, next, range, result; + + index = match.index; + link = match[0]; range = document.createRange(); - range.setStart(node, len = data.indexOf(link)); - if ((data.length - (len += link.length)) > 0) { - range.setEnd(node, len); - Linkify.makeLink(range, post); - return; - } - while ((next = node.nextSibling) && next.nodeName.toLowerCase() !== 'br') { + range.setStart(node, index); + while ((next = node.nextSibling) && next.nodeName !== 'BR') { node = next; data = node.data; if (result = /[\s'"]/.exec(data)) { @@ -6673,12 +6689,12 @@ } } if (range.collapsed) { - if (node.nodeName.toLowerCase() === 'wbr') { + if (node.nodeName === 'WBR') { node = node.previousSibling; } range.setEnd(node, node.length); } - Linkify.makeLink(range, post); + return Linkify.makeLink(range, post); }, makeLink: function(range, post) { var a, link; diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee index 42636c3ff..98a12deed 100644 --- a/src/Linkification/Linkify.coffee +++ b/src/Linkification/Linkify.coffee @@ -46,8 +46,9 @@ Linkify = node = snapshot.snapshotItem i data = node.data - if match = data.match Linkify.regString - Linkify.gatherLinks match, node, @ + if Linkify.regString.test data + Linkify.regString.lastIndex = 0 + Linkify.gatherLinks node, @ return unless Conf['Embedding'] or Conf['Link Title'] @@ -58,38 +59,49 @@ Linkify = return - gatherLinks: (match, node, post) -> - i = 0 - len = match.length - data = node.data + gatherLinks: (node, post) -> + {data} = node + len = data.length + links = [] + + while (match = Linkify.regString.exec data) + {index} = match + link = match[0] + len2 = index + link.length + + break if (len3 = len - len2) is 0 - while (link = match[i++]) and i > len range = document.createRange(); - range.setStart node, len2 = data.indexOf link - range.setEnd node, len2 + link.length + range.setStart node, index + range.setEnd node, len2 + links.push range + + if match + Linkify.seek match, node, post + + for range in links.reverse() Linkify.makeLink range, post + return + + seek: (match, node, post) -> + {index} = match + link = match[0] range = document.createRange() - range.setStart node, len = data.indexOf link + range.setStart node, index - if (data.length - (len += link.length)) > 0 - range.setEnd node, len - Linkify.makeLink range, post - return - - while (next = node.nextSibling) and next.nodeName.toLowerCase() isnt 'br' + while (next = node.nextSibling) and next.nodeName isnt 'BR' node = next data = node.data if result = /[\s'"]/.exec data range.setEnd node, result.index if range.collapsed - if node.nodeName.toLowerCase() is 'wbr' + if node.nodeName is 'WBR' node = node.previousSibling range.setEnd node, node.length Linkify.makeLink range, post - return makeLink: (range, post) -> link = range.toString()