gregjacobs / Autolinker.js

Utility to Automatically Link URLs, Email Addresses, Phone Numbers, Twitter handles, and Hashtags in a given block of text/HTML
MIT License
1.48k stars 238 forks source link

URLs preceding   break. Expected? #47

Closed biscoe916 closed 10 years ago

biscoe916 commented 10 years ago

A div's innerHTML:

https://www.google.com 

This code:

Autolinker.link(div.innerHTML); 

Returns:

"<a href="https://www.google.com&nbsp" target="_blank">google.com&nbsp</a>;"

In my application users enter text in a contentEditable div, and in chrome (and probably other browsers) every other space is converted to a non-breaking space. On submit, I run the Autolinker, and urls right before a non-breaking space are malformed. I assume the Autolinker thinks it's part of a query string.

gregjacobs commented 10 years ago

Hmm, yikes, I'm not sure that this one is solvable in a general sense. It's especially a problem if the text is something like: "https://www.google.com/search?q=asdf&nbsp;". The &nbsp part will definitely be treated as a query string parameter, and we wouldn't be able to say that &nbsp isn't a valid parameter..

I may have to close this one out (unless you have any other ideas!), but what I would recommend for your case is to preprocess the text by removing all &nbsp;s before autolinking with something like:

text = text.replace( /&nbsp;/g, ' ' );

Of course, then you have the problem of if users entered multiple spaces, and they need to be represented properly on the HTML page. In that case, replace all double spaces generated by the first statement with a space + &nbsp;

text = text.replace( /&nbsp;/g, ' ' );
text = text.replace( / {2}/g, ' &nbsp;' );

This will convert the text "&nbsp;&nbsp;&nbsp;&nbsp;" into " &nbsp; &nbsp;", and should display the expected output. Give that a try and then autolink, and let me know how it goes :)