From b4ab213a87a3a77e9d95009542d75dde1b2dc3bc 2012-10-03 20:51:18 From: Erik M. Bray Date: 2012-10-03 20:51:18 Subject: [PATCH] Locate URLs in text output and convert them to hyperlinks. --- diff --git a/IPython/frontend/html/notebook/static/js/outputarea.js b/IPython/frontend/html/notebook/static/js/outputarea.js index 9618a6e..89cdcf3 100644 --- a/IPython/frontend/html/notebook/static/js/outputarea.js +++ b/IPython/frontend/html/notebook/static/js/outputarea.js @@ -379,8 +379,10 @@ var IPython = (function (IPython) { OutputArea.prototype.append_text = function (data, element, extra_class) { var toinsert = $("
").addClass("box-flex1 output_subarea output_text"); // escape ANSI & HTML specials in plaintext: + data = utils.wrapUrls(data); data = utils.fixConsole(data); data = utils.fixCarriageReturn(data); + data = utils.autoLinkUrls(data); if (extra_class){ toinsert.addClass(extra_class); } diff --git a/IPython/frontend/html/notebook/static/js/utils.js b/IPython/frontend/html/notebook/static/js/utils.js index 9dfa478..bd79be8 100644 --- a/IPython/frontend/html/notebook/static/js/utils.js +++ b/IPython/frontend/html/notebook/static/js/utils.js @@ -83,6 +83,24 @@ IPython.utils = (function (IPython) { return txt; } + // Locate URLs in plain text and wrap them in spaces so that they can be + // better picked out by autoLinkUrls even after the text has been + // converted to HTML + function wrapUrls(txt) { + // Note this regexp is a modified version of one from + // Markdown.Converter For now it only supports http(s) and ftp URLs, + // but could easily support others (though file:// should maybe be + // avoided) + var url_re = /(^|\W)(https?|ftp)(:\/\/[-A-Z0-9+&@#\/%?=~_|\[\]\(\)!:,\.;]*[-A-Z0-9+&@#\/%=~_|\[\]])($|\W)/gi; + return txt.replace(url_re, "$1 $2$3 $4"); + } + + // Locate a URL with spaces around it and convert that to a anchor tag + function autoLinkUrls(txt) { + return txt.replace(/ ((https?|ftp):[^'">\s]+) /gi, + "$1"); + } + grow = function(element) { // Grow the cell by hand. This is used upon reloading from JSON, when the // autogrow handler is not called. @@ -143,6 +161,8 @@ IPython.utils = (function (IPython) { keycodes : keycodes, grow : grow, fixCarriageReturn : fixCarriageReturn, + wrapUrls : wrapUrls, + autoLinkUrls : autoLinkUrls, points_to_pixels : points_to_pixels };