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)); }