From d96e312a70bea43948d8bcbe1e68085a75b4c964 Mon Sep 17 00:00:00 2001 From: zodiac Date: Wed, 8 Jul 2009 17:08:47 +0000 Subject: [PATCH] More fine tuning of the regular expressions that detect URLs. We now allow '.' and ',' in URLs, as long as they are not at the very end of the URL, where they would probably be part of the enclosing sentence and not actually part of the URL. git-svn-id: https://shellinabox.googlecode.com/svn/trunk@143 0da03de8-d603-11dd-86c2-0f8696b7b6f9 --- ChangeLog | 5 +++++ config.h | 2 +- configure | 2 +- configure.ac | 2 +- demo/vt100.js | 18 +++++++++--------- shellinabox/shell_in_a_box.js | 2 +- shellinabox/vt100.js | 18 +++++++++--------- shellinabox/vt100.jspp | 16 ++++++++-------- 8 files changed, 35 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index bb51848..b5ff00c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,11 @@ * Optionally compress large responses, if the browser accepts deflate compression. This mainly improves start up time. + * More fine tuning of the regular expressions that detect URLs. + We now allow '.' and ',' in URLs, as long as they are not at the + very end of the URL, where they would probably be part of the + enclosing sentence and not actually part of the URL. + 2009-07-06 Markus Gutschke * Making it easier to host the terminal on non-root URLs by always diff --git a/config.h b/config.h index f9069c0..d9f85ae 100644 --- a/config.h +++ b/config.h @@ -135,7 +135,7 @@ #define STDC_HEADERS 1 /* Most recent revision number in the version control system */ -#define VCS_REVISION "142" +#define VCS_REVISION "143" /* Version number of package */ #define VERSION "2.9" diff --git a/configure b/configure index 69d43a8..3b32222 100755 --- a/configure +++ b/configure @@ -2037,7 +2037,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -VCS_REVISION=142 +VCS_REVISION=143 cat >>confdefs.h <<_ACEOF diff --git a/configure.ac b/configure.ac index 74ed798..69b5cef 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ AC_PREREQ(2.57) dnl This is the one location where the authoritative version number is stored AC_INIT(shellinabox, 2.9, markus@shellinabox.com) -VCS_REVISION=142 +VCS_REVISION=143 AC_SUBST(VCS_REVISION) AC_DEFINE_UNQUOTED(VCS_REVISION, "${VCS_REVISION}", [Most recent revision number in the version control system]) diff --git a/demo/vt100.js b/demo/vt100.js index c55451b..c2b6d00 100644 --- a/demo/vt100.js +++ b/demo/vt100.js @@ -104,7 +104,7 @@ function VT100(container) { '(?:http|https|ftp)://' + // Optionally allow username and passwords. - '(?:[^:@/ ]*(?::[^@/ ]*)?@)?' + + '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostname. '(?:[1-9][0-9]{0,2}(?:[.][1-9][0-9]{0,2}){3}|' + @@ -115,12 +115,12 @@ function VT100(container) { '(?::[1-9][0-9]*)?' + // Path. - '(?:/[^/,.) ]*)*|' + + '(?:/(?:(?![/ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)*|' + (linkifyURLs <= 1 ? '' : // Also support URLs without a protocol (assume "http"). // Optional username and password. - '(?:[^:@/ ]*(?::[^@/ ]*)?@)?' + + '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostnames must end with a well-known top-level domain or must be // numeric. @@ -146,7 +146,7 @@ function VT100(container) { '(?::[1-9][0-9]{0,4})?' + // Path. - '(?:/[^/,.) ]*)*|') + + '(?:/(?:(?![/ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)*|') + // In addition, support e-mail address. Optionally, recognize "mailto:" '(?:mailto:)' + (linkifyURLs <= 1 ? '' : '?') + @@ -171,7 +171,7 @@ function VT100(container) { 'yu|za|zm|zw|arpa)(?![a-zA-Z0-9])|[Xx][Nn]--[-a-zA-Z0-9]+)' + // Optional arguments - '(?:[?][^/,.) ]+)?'); + '(?:[?](?:(?![ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)?'); } this.initializeElements(container); this.initializeAnsiColors(); @@ -980,7 +980,7 @@ VT100.prototype.truncateLines = function(width) { if (line.tagName == 'DIV') { var x = 0; - // Traverse current line and truncate if once we saw "width" characters + // Traverse current line and truncate it once we saw "width" characters for (var span = line.firstChild; span; span = span.nextSibling) { var s = this.getTextContent(span); @@ -1000,7 +1000,7 @@ VT100.prototype.truncateLines = function(width) { // Scan backwards looking for first non-space character var s = this.getTextContent(span); for (var i = s.length; i--; ) { - if (s.charAt(i) != ' ') { + if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') { if (i+1 != s.length) { this.setTextContent(s.substr(0, i+1)); } @@ -1253,7 +1253,7 @@ VT100.prototype.putString = function(x, y, text, style) { // Scan backwards looking for first non-space character s = this.getTextContent(span); for (var i = s.length; i--; ) { - if (s.charAt(i) != ' ') { + if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') { if (i+1 != s.length) { this.setTextContent(s.substr(0, i+1)); } @@ -1693,7 +1693,7 @@ VT100.prototype.toggleBell = function() { }; VT100.prototype.about = function() { - alert("VT100 Terminal Emulator " + "2.9 (revision 142)" + + alert("VT100 Terminal Emulator " + "2.9 (revision 143)" + "\nCopyright 2008-2009 by Markus Gutschke\n" + "For more information check http://shellinabox.com"); }; diff --git a/shellinabox/shell_in_a_box.js b/shellinabox/shell_in_a_box.js index 542b657..2e169dc 100644 --- a/shellinabox/shell_in_a_box.js +++ b/shellinabox/shell_in_a_box.js @@ -355,7 +355,7 @@ ShellInABox.prototype.extendContextMenu = function(entries, actions) { }; ShellInABox.prototype.about = function() { - alert("Shell In A Box version " + "2.9 (revision 142)" + + alert("Shell In A Box version " + "2.9 (revision 143)" + "\nCopyright 2008-2009 by Markus Gutschke\n" + "For more information check http://shellinabox.com" + (typeof serverSupportsSSL != 'undefined' && serverSupportsSSL ? diff --git a/shellinabox/vt100.js b/shellinabox/vt100.js index c55451b..c2b6d00 100644 --- a/shellinabox/vt100.js +++ b/shellinabox/vt100.js @@ -104,7 +104,7 @@ function VT100(container) { '(?:http|https|ftp)://' + // Optionally allow username and passwords. - '(?:[^:@/ ]*(?::[^@/ ]*)?@)?' + + '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostname. '(?:[1-9][0-9]{0,2}(?:[.][1-9][0-9]{0,2}){3}|' + @@ -115,12 +115,12 @@ function VT100(container) { '(?::[1-9][0-9]*)?' + // Path. - '(?:/[^/,.) ]*)*|' + + '(?:/(?:(?![/ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)*|' + (linkifyURLs <= 1 ? '' : // Also support URLs without a protocol (assume "http"). // Optional username and password. - '(?:[^:@/ ]*(?::[^@/ ]*)?@)?' + + '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostnames must end with a well-known top-level domain or must be // numeric. @@ -146,7 +146,7 @@ function VT100(container) { '(?::[1-9][0-9]{0,4})?' + // Path. - '(?:/[^/,.) ]*)*|') + + '(?:/(?:(?![/ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)*|') + // In addition, support e-mail address. Optionally, recognize "mailto:" '(?:mailto:)' + (linkifyURLs <= 1 ? '' : '?') + @@ -171,7 +171,7 @@ function VT100(container) { 'yu|za|zm|zw|arpa)(?![a-zA-Z0-9])|[Xx][Nn]--[-a-zA-Z0-9]+)' + // Optional arguments - '(?:[?][^/,.) ]+)?'); + '(?:[?](?:(?![ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)?'); } this.initializeElements(container); this.initializeAnsiColors(); @@ -980,7 +980,7 @@ VT100.prototype.truncateLines = function(width) { if (line.tagName == 'DIV') { var x = 0; - // Traverse current line and truncate if once we saw "width" characters + // Traverse current line and truncate it once we saw "width" characters for (var span = line.firstChild; span; span = span.nextSibling) { var s = this.getTextContent(span); @@ -1000,7 +1000,7 @@ VT100.prototype.truncateLines = function(width) { // Scan backwards looking for first non-space character var s = this.getTextContent(span); for (var i = s.length; i--; ) { - if (s.charAt(i) != ' ') { + if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') { if (i+1 != s.length) { this.setTextContent(s.substr(0, i+1)); } @@ -1253,7 +1253,7 @@ VT100.prototype.putString = function(x, y, text, style) { // Scan backwards looking for first non-space character s = this.getTextContent(span); for (var i = s.length; i--; ) { - if (s.charAt(i) != ' ') { + if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') { if (i+1 != s.length) { this.setTextContent(s.substr(0, i+1)); } @@ -1693,7 +1693,7 @@ VT100.prototype.toggleBell = function() { }; VT100.prototype.about = function() { - alert("VT100 Terminal Emulator " + "2.9 (revision 142)" + + alert("VT100 Terminal Emulator " + "2.9 (revision 143)" + "\nCopyright 2008-2009 by Markus Gutschke\n" + "For more information check http://shellinabox.com"); }; diff --git a/shellinabox/vt100.jspp b/shellinabox/vt100.jspp index 7c3e3e9..b7a1765 100644 --- a/shellinabox/vt100.jspp +++ b/shellinabox/vt100.jspp @@ -104,7 +104,7 @@ function VT100(container) { '(?:http|https|ftp)://' + // Optionally allow username and passwords. - '(?:[^:@/ ]*(?::[^@/ ]*)?@)?' + + '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostname. '(?:[1-9][0-9]{0,2}(?:[.][1-9][0-9]{0,2}){3}|' + @@ -115,12 +115,12 @@ function VT100(container) { '(?::[1-9][0-9]*)?' + // Path. - '(?:/[^/,.) ]*)*|' + + '(?:/(?:(?![/ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)*|' + (linkifyURLs <= 1 ? '' : // Also support URLs without a protocol (assume "http"). // Optional username and password. - '(?:[^:@/ ]*(?::[^@/ ]*)?@)?' + + '(?:[^:@/ \u00A0]*(?::[^@/ \u00A0]*)?@)?' + // Hostnames must end with a well-known top-level domain or must be // numeric. @@ -146,7 +146,7 @@ function VT100(container) { '(?::[1-9][0-9]{0,4})?' + // Path. - '(?:/[^/,.) ]*)*|') + + '(?:/(?:(?![/ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)*|') + // In addition, support e-mail address. Optionally, recognize "mailto:" '(?:mailto:)' + (linkifyURLs <= 1 ? '' : '?') + @@ -171,7 +171,7 @@ function VT100(container) { 'yu|za|zm|zw|arpa)(?![a-zA-Z0-9])|[Xx][Nn]--[-a-zA-Z0-9]+)' + // Optional arguments - '(?:[?][^/,.) ]+)?'); + '(?:[?](?:(?![ \u00A0]|[,.)][ \u00A0]|[,.)]$).)*)?'); } this.initializeElements(container); this.initializeAnsiColors(); @@ -980,7 +980,7 @@ VT100.prototype.truncateLines = function(width) { if (line.tagName == 'DIV') { var x = 0; - // Traverse current line and truncate if once we saw "width" characters + // Traverse current line and truncate it once we saw "width" characters for (var span = line.firstChild; span; span = span.nextSibling) { var s = this.getTextContent(span); @@ -1000,7 +1000,7 @@ VT100.prototype.truncateLines = function(width) { // Scan backwards looking for first non-space character var s = this.getTextContent(span); for (var i = s.length; i--; ) { - if (s.charAt(i) != ' ') { + if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') { if (i+1 != s.length) { this.setTextContent(s.substr(0, i+1)); } @@ -1253,7 +1253,7 @@ VT100.prototype.putString = function(x, y, text, style) { // Scan backwards looking for first non-space character s = this.getTextContent(span); for (var i = s.length; i--; ) { - if (s.charAt(i) != ' ') { + if (s.charAt(i) != ' ' && s.charAt(i) != '\u00A0') { if (i+1 != s.length) { this.setTextContent(s.substr(0, i+1)); }