mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-22 16:43:59 +01:00
* Optimize and fix autolink function (#1442) * Fix bug in autolink recursive fallback function
This commit is contained in:
parent
22295944df
commit
21290d4e80
1 changed files with 45 additions and 15 deletions
|
@ -1,15 +1,45 @@
|
|||
jQuery.fn.autolink = function() {
|
||||
(function () {
|
||||
var re = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-]*)?\??(?:[\-\+:=&;%@\.\w]*)#?(?:[\.\!\/\\\w]*))?)/g;
|
||||
return this.find('*').contents()
|
||||
.filter(function () { return this.nodeType === 3; })
|
||||
.each(function() {
|
||||
$(this).each(function() {
|
||||
if (re.test($(this).text()))
|
||||
$(this).replaceWith(
|
||||
$("<span />").html(
|
||||
this.nodeValue.replace(re, "<a href='$1'>$1</a>")
|
||||
function textNodesUnder(node) {
|
||||
var textNodes = [];
|
||||
if(typeof document.createTreeWalker === 'function') {
|
||||
// Efficient TreeWalker
|
||||
var currentNode, walker;
|
||||
walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false);
|
||||
while(currentNode = walker.nextNode()) {
|
||||
textNodes.push(currentNode);
|
||||
}
|
||||
} else {
|
||||
// Less efficient recursive function
|
||||
for(node = node.firstChild; node; node = node.nextSibling) {
|
||||
if(node.nodeType === 3) {
|
||||
textNodes.push(node);
|
||||
} else {
|
||||
textNodes = textNodes.concat(textNodesUnder(node));
|
||||
}
|
||||
}
|
||||
}
|
||||
return textNodes;
|
||||
}
|
||||
|
||||
function processNode(node) {
|
||||
re.lastIndex = 0;
|
||||
var results = re.exec(node.textContent);
|
||||
if(results !== null) {
|
||||
if($(node).parents().filter('pre>code').length === 0) {
|
||||
$(node).replaceWith(
|
||||
$('<span />').html(
|
||||
node.nodeValue.replace(re, '<a href="$1">$1</a>')
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.fn.autolink = function () {
|
||||
this.each(function () {
|
||||
textNodesUnder(this).forEach(processNode);
|
||||
});
|
||||
});
|
||||
};
|
||||
return this;
|
||||
};
|
||||
})();
|
||||
|
|
Loading…
Reference in a new issue