Reputation: 25
I am using this script which detects youtube URLS pasted into the contenteditable div and replaces with the embedable code.
This works when plain text youtube URLS are pasted, but it doesn't detect or replace URLS that are pasted as clickable links.
How can i modify the code to replace both plain text youtube links and the clickable links that are pasted?
$.Redactor.fn.formatLinkify = function(protocol, convertLinks, convertImageLinks, convertVideoLinks)
{
var url1 = /(^|<|\s)(www\..+?\..+?)(\s|>|$)/g,
url2 = /(^|<|\s)(((https?|ftp):\/\/|mailto:).+?)(\s|>|$)/g,
urlImage = /(https?:\/\/.*\.(?:png|jpg|jpeg|gif))/gi,
urlYoutube = /.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
var childNodes = (this.$editor ? this.$editor.get(0) : this).childNodes, i = childNodes.length;
while (i--)
{
var n = childNodes[i];
if (n.nodeType === 3)
{
var html = n.nodeValue;
// youtube
if (convertVideoLinks && html && html.match(urlYoutube))
{
html = html.replace(urlYoutube, '<iframe width="560" height="315" src="//www.youtube.com/embed/$2" frameborder="0" allowfullscreen></iframe>');
$(n).after(html).remove();
}
// image
else if (convertImageLinks && html && html.match(urlImage))
{
html = html.replace(urlImage, '<img src="$1">');
$(n).after(html).remove();
}
// link
else if (convertLinks && html && (html.match(url1) || html.match(url2)))
{
html = html.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(url1, '$1<a href="' + protocol + '$2">$2</a>$3')
.replace(url2, '$1<a href="$2">$2</a>$5');
$(n).after(html).remove();
}
}
else if (n.nodeType === 1 && !/^(a|button|textarea)$/i.test(n.tagName))
{
$.Redactor.fn.formatLinkify.call(n, protocol, convertLinks, convertImageLinks, convertVideoLinks);
}
}
};
Upvotes: 1
Views: 524
Reputation: 16478
No links are processed since you exclude anchors (<a>
tags) from the recursive call in this line:
else if (n.nodeType === 1 && !/^(a|button|textarea)$/i.test(n.tagName))
You should allow them by changing the regular expression to
/^(button|textarea)$/i
or use some other condition that will ensure that links (or their href
property) are processed.
For example, if you encounter a link, you can test its href
property against the urlYoutube
regEx.
See this jsFiddle for more details.
Upvotes: 2