Prevent an args-out-of-range error during login/out
[riece] / lisp / riece-url.el
index 6b27fcf..3e09af4 100644 (file)
@@ -1,4 +1,4 @@
-;;; riece-url.el --- collect URL in IRC buffers
+;;; riece-url.el --- collect URL in IRC buffers -*- lexical-binding: t -*-
 ;; Copyright (C) 1998-2003 Daiki Ueno
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
@@ -19,8 +19,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
@@ -30,6 +30,7 @@
 
 (require 'riece-options)
 (require 'riece-menu)                  ;riece-menu-items
+(require 'easymenu)
 
 (autoload 'browse-url "browse-url")
 (defvar browse-url-browser-function)
   :prefix "riece-"
   :group 'riece)
 
-(defcustom riece-url-regexp  "\\b\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\):\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?[-a-zA-Z0-9_=?#$@~`%&*+|\\/.,;]*[-a-zA-Z0-9_=#$@~`%&*+|\\/;]"
+;; the default value was copied from gnus-button-url-regexp
+(defcustom riece-url-regexp
+  (concat
+   "\\b\\(\\(www\\.\\|\\(s?https?\\|ftp\\|file\\|gopher\\|"
+   "nntp\\|news\\|telnet\\|wais\\|mailto\\|info\\):\\)"
+   "\\(//[-a-z0-9_.]+:[0-9]*\\)?"
+   (if (string-match "[[:digit:]]" "1") ;; Support POSIX?
+       (let ((chars "-a-z0-9_=#$@~%&*+\\/[:word:]")
+            (punct "!?:;.,"))
+        (concat
+         "\\(?:"
+         ;; Match paired parentheses, e.g. in Wikipedia URLs:
+         ;; http://thread.gmane.org/47B4E3B2.3050402@gmail.com
+         "[" chars punct "]+" "(" "[" chars punct "]+" "[" chars "]*)" "[" chars "]*"
+         "\\|"
+         "[" chars punct     "]+" "[" chars "]"
+         "\\)"))
+     (concat ;; XEmacs 21.4 doesn't support POSIX.
+      "\\([-a-z0-9_=!?#$@~%&*+\\/:;.,]\\|\\w\\)+"
+      "\\([-a-z0-9_=#$@~%&*+\\/]\\|\\w\\)"))
+   "\\)")
   "Regular expression that matches URLs."
   :group 'riece-url
   :type 'regexp)
@@ -59,8 +80,6 @@ This maps a string \"Bug#12345\" to a URL
 (defvar riece-urls nil
   "A list of URL which appears in Riece buffers.")
 
-(defvar riece-url-enabled nil)
-
 (defconst riece-url-description
   "Collect URL in IRC buffers.")
 
@@ -106,10 +125,11 @@ This maps a string \"Bug#12345\" to a URL
 
 (defun riece-command-browse-url (&optional url)
   (interactive
-   (list (completing-read "Open URL: " (mapcar #'list riece-urls))))
+   (list (completing-read (riece-mcat "Open URL: ")
+                         (mapcar #'list riece-urls))))
   (browse-url url))
 
-(defun riece-url-create-menu (menu)
+(defun riece-url-create-menu (_menu)
   (mapcar (lambda (url)
            (vector url (list 'browse-url url)))
          riece-urls))
@@ -125,7 +145,10 @@ This maps a string \"Bug#12345\" to a URL
 (defun riece-url-command-mode-hook ()
   (easy-menu-add-item
    nil (list (car riece-menu-items))
-   '("Open URL..." :filter riece-url-create-menu)))
+   (list (if (featurep 'xemacs)
+            "Open URL..."
+          (riece-mcat "Open URL..."))
+        :filter 'riece-url-create-menu)))
 
 (defun riece-url-insinuate ()
   (add-hook 'riece-after-insert-functions 'riece-url-scan-region)
@@ -135,17 +158,20 @@ This maps a string \"Bug#12345\" to a URL
                t)))
 
 (defun riece-url-uninstall ()
+  (easy-menu-remove-item
+   nil (list (car riece-menu-items))
+   (if (featurep 'xemacs)
+       "Open URL..."
+     (riece-mcat "Open URL...")))
   (remove-hook 'riece-after-insert-functions 'riece-url-scan-region)
   (remove-hook 'riece-command-mode-hook
               'riece-url-command-mode-hook))
 
 (defun riece-url-enable ()
-  (define-key riece-dialogue-mode-map "U" 'riece-command-browse-url)
-  (setq riece-url-enabled t))
+  (define-key riece-dialogue-mode-map "U" 'riece-command-browse-url))
 
 (defun riece-url-disable ()
-  (define-key riece-dialogue-mode-map "U" nil)
-  (setq riece-url-enabled nil))
+  (define-key riece-dialogue-mode-map "U" nil))
 
 (provide 'riece-url)