From 97475d6fac2601cd0f2a53769f88686b7535356f Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Wed, 14 Aug 2013 03:32:07 -0700 Subject: [PATCH] Better leading and trailing character removal. --- builds/4chan-X.user.js | 40 ++++++++++++++++++++------------ builds/crx/script.js | 40 ++++++++++++++++++++------------ src/Linkification/Linkify.coffee | 38 +++++++++++++++++------------- 3 files changed, 72 insertions(+), 46 deletions(-) diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 5278a3576..54f04af0f 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -4529,27 +4529,37 @@ return range; }, makeLink: function(range) { - var a, char, text, trim; + var a, char, i, text; text = range.toString(); - trim = function() { - if (!(range.endOffset < 1)) { - range.setEnd(range.endContainer, range.endOffset - 1); + i = 0; + while (/[(\[{<>]/.test(text.charAt(i))) { + i++; + } + if (i) { + text = text.slice(i); + while (range.startOffset + i >= range.startContainer.data.length) { + i--; } - return text = text.slice(0, -1); - }; - if (/[(\[{<]/.test(text.charAt(0))) { - text = text.slice(1); - if (range.startOffset !== range.startContainer.data.length) { - range.setStart(range.startContainer, range.startOffset + 1); + if (i) { + range.setStart(range.startContainer, range.startOffset + i); } } - while (/[)\]}>.,]/.test(char = text.charAt(text.length - 1))) { - if (/[.,]/.test(char) || (text.match(/[()\[\]{}<>]/g)).length % 2) { - trim(); - continue; + i = 0; + while (/[)\]}>.,]/.test(char = text.charAt(text.length - (1 + i)))) { + if (!(/[.,]/.test(char) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + break; + } + i++; + } + if (i) { + text = text.slice(0, -i); + while (range.endOffset > i) { + i--; + } + if (i) { + range.setEnd(range.endContainer, range.endOffset - i); } - break; } text = text.contains(':') ? text : (text.contains('@') ? 'mailto:' : 'http://') + text; a = $.el('a', { diff --git a/builds/crx/script.js b/builds/crx/script.js index e4316e09f..458fdd6ee 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -4538,27 +4538,37 @@ return range; }, makeLink: function(range) { - var a, char, text, trim; + var a, char, i, text; text = range.toString(); - trim = function() { - if (!(range.endOffset < 1)) { - range.setEnd(range.endContainer, range.endOffset - 1); + i = 0; + while (/[(\[{<>]/.test(text.charAt(i))) { + i++; + } + if (i) { + text = text.slice(i); + while (range.startOffset + i >= range.startContainer.data.length) { + i--; } - return text = text.slice(0, -1); - }; - if (/[(\[{<]/.test(text.charAt(0))) { - text = text.slice(1); - if (range.startOffset !== range.startContainer.data.length) { - range.setStart(range.startContainer, range.startOffset + 1); + if (i) { + range.setStart(range.startContainer, range.startOffset + i); } } - while (/[)\]}>.,]/.test(char = text.charAt(text.length - 1))) { - if (/[.,]/.test(char) || (text.match(/[()\[\]{}<>]/g)).length % 2) { - trim(); - continue; + i = 0; + while (/[)\]}>.,]/.test(char = text.charAt(text.length - (1 + i)))) { + if (!(/[.,]/.test(char) || (text.match(/[()\[\]{}<>]/g)).length % 2)) { + break; + } + i++; + } + if (i) { + text = text.slice(0, -i); + while (range.endOffset > i) { + i--; + } + if (i) { + range.setEnd(range.endContainer, range.endOffset - i); } - break; } text = text.contains(':') ? text : (text.contains('@') ? 'mailto:' : 'http://') + text; a = $.el('a', { diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee index a82258fdb..5017c71d2 100644 --- a/src/Linkification/Linkify.coffee +++ b/src/Linkification/Linkify.coffee @@ -2,7 +2,7 @@ Linkify = init: -> return if g.VIEW is 'catalog' or not Conf['Linkify'] - @regString = + @regString = ///( # http, magnet, ftp, etc (https?|mailto|git|magnet|ftp|irc):( @@ -105,23 +105,29 @@ Linkify = makeLink: (range) -> text = range.toString() - - trim = -> - range.setEnd range.endContainer, range.endOffset - 1 unless range.endOffset < 1 - text = text.slice 0, -1 - # Clean leading brackets - if /[(\[{<]/.test text.charAt 0 - text = text.slice 1 - unless range.startOffset is range.startContainer.data.length - range.setStart range.startContainer, range.startOffset + 1 - + # Clean leading brackets, > + i = 0 + i++ while /[(\[{<>]/.test text.charAt i + + if i + text = text.slice i + i-- while range.startOffset + i >= range.startContainer.data.length + + range.setStart range.startContainer, range.startOffset + i if i + # Clean hanging brackets, commas, periods - while /[)\]}>.,]/.test char = text.charAt text.length - 1 - if /[.,]/.test(char) or (text.match /[()\[\]{}<>]/g).length % 2 - trim() - continue - break + i = 0 + while /[)\]}>.,]/.test char = text.charAt text.length - (1 + i) + break unless /[.,]/.test(char) or (text.match /[()\[\]{}<>]/g).length % 2 + i++ + + if i + text = text.slice 0, -i + i-- while range.endOffset > i + + if i + range.setEnd range.endContainer, range.endOffset - i # This is the only piece of code left based on Anthony Lieuallen's Linkify text =