annotate lisp/url/url-util.el @ 92420:12e9e4bb410b

(iconsrcdir): New variable. (install-etc, mkdir): Use $iconsrcdir. Handle the `scalable' icon directory.
author Glenn Morris <rgm@gnu.org>
date Mon, 03 Mar 2008 02:26:30 +0000
parents b7d3823f3c26
children 8259d0d8e107
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1 ;;; url-util.el --- Miscellaneous helper routines for URL library
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
2
64748
875dcc490074 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64084
diff changeset
3 ;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004,
79720
9c0b3f269b92 Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 79558
diff changeset
4 ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
5
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
6 ;; Author: Bill Perry <wmperry@gnu.org>
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
7 ;; Keywords: comm, data, processes
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
8
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
9 ;; This file is part of GNU Emacs.
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
10 ;;
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
78222
8932997d0b62 Switch license to GPLv3 or later.
Glenn Morris <rgm@gnu.org>
parents: 75347
diff changeset
13 ;; the Free Software Foundation; either version 3, or (at your option)
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
14 ;; any later version.
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
15 ;;
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
19 ;; GNU General Public License for more details.
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
20 ;;
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
21 ;; You should have received a copy of the GNU General Public License
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62400
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62400
diff changeset
24 ;; Boston, MA 02110-1301, USA.
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
25
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
26 ;;; Commentary:
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
27
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
28 ;;; Code:
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
29
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
30 (require 'url-parse)
92401
b7d3823f3c26 Require cl when compiling.
Andreas Schwab <schwab@suse.de>
parents: 92305
diff changeset
31 (eval-when-compile (require 'cl))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
32 (autoload 'timezone-parse-date "timezone")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
33 (autoload 'timezone-make-date-arpa-standard "timezone")
54803
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
34 (autoload 'mail-header-extract "mailheader")
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
35
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
36 (defvar url-parse-args-syntax-table
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
37 (copy-syntax-table emacs-lisp-mode-syntax-table)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
38 "A syntax table for parsing sgml attributes.")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
39
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
40 (modify-syntax-entry ?' "\"" url-parse-args-syntax-table)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
41 (modify-syntax-entry ?` "\"" url-parse-args-syntax-table)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
42 (modify-syntax-entry ?{ "(" url-parse-args-syntax-table)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
43 (modify-syntax-entry ?} ")" url-parse-args-syntax-table)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
44
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
45 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
46 (defcustom url-debug nil
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
47 "*What types of debug messages from the URL library to show.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
48 Debug messages are logged to the *URL-DEBUG* buffer.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
49
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
50 If t, all messages will be logged.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
51 If a number, all messages will be logged, as well shown via `message'.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
52 If a list, it is a list of the types of messages to be logged."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
53 :type '(choice (const :tag "none" nil)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
54 (const :tag "all" t)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
55 (checklist :tag "custom"
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
56 (const :tag "HTTP" :value http)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
57 (const :tag "DAV" :value dav)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
58 (const :tag "General" :value retrieval)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
59 (const :tag "Filename handlers" :value handlers)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
60 (symbol :tag "Other")))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
61 :group 'url-hairy)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
62
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
63 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
64 (defun url-debug (tag &rest args)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
65 (if quit-flag
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
66 (error "Interrupted!"))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
67 (if (or (eq url-debug t)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
68 (numberp url-debug)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
69 (and (listp url-debug) (memq tag url-debug)))
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
70 (with-current-buffer (get-buffer-create "*URL-DEBUG*")
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
71 (goto-char (point-max))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
72 (insert (symbol-name tag) " -> " (apply 'format args) "\n")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
73 (if (numberp url-debug)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
74 (apply 'message args)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
75
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
76 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
77 (defun url-parse-args (str &optional nodowncase)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
78 ;; Return an assoc list of attribute/value pairs from an RFC822-type string
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
79 (let (
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
80 name ; From name=
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
81 value ; its value
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
82 results ; Assoc list of results
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
83 name-pos ; Start of XXXX= position
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
84 val-pos ; Start of value position
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
85 st
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
86 nd
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
87 )
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
88 (save-excursion
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
89 (save-restriction
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
90 (set-buffer (get-buffer-create " *urlparse-temp*"))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
91 (set-syntax-table url-parse-args-syntax-table)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
92 (erase-buffer)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
93 (insert str)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
94 (setq st (point-min)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
95 nd (point-max))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
96 (set-syntax-table url-parse-args-syntax-table)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
97 (narrow-to-region st nd)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
98 (goto-char (point-min))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
99 (while (not (eobp))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
100 (skip-chars-forward "; \n\t")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
101 (setq name-pos (point))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
102 (skip-chars-forward "^ \n\t=;")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
103 (if (not nodowncase)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
104 (downcase-region name-pos (point)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
105 (setq name (buffer-substring name-pos (point)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
106 (skip-chars-forward " \t\n")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
107 (if (/= (or (char-after (point)) 0) ?=) ; There is no value
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
108 (setq value nil)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
109 (skip-chars-forward " \t\n=")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
110 (setq val-pos (point)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
111 value
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
112 (cond
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
113 ((or (= (or (char-after val-pos) 0) ?\")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
114 (= (or (char-after val-pos) 0) ?'))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
115 (buffer-substring (1+ val-pos)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
116 (condition-case ()
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
117 (prog2
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
118 (forward-sexp 1)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
119 (1- (point))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
120 (skip-chars-forward "\""))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
121 (error
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
122 (skip-chars-forward "^ \t\n")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
123 (point)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
124 (t
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
125 (buffer-substring val-pos
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
126 (progn
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
127 (skip-chars-forward "^;")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
128 (skip-chars-backward " \t")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
129 (point)))))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
130 (setq results (cons (cons name value) results))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
131 (skip-chars-forward "; \n\t"))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
132 results))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
133
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
134 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
135 (defun url-insert-entities-in-string (string)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
136 "Convert HTML markup-start characters to entity references in STRING.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
137 Also replaces the \" character, so that the result may be safely used as
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
138 an attribute value in a tag. Returns a new string with the result of the
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
139 conversion. Replaces these characters as follows:
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
140 & ==> &amp;
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
141 < ==> &lt;
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
142 > ==> &gt;
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
143 \" ==> &quot;"
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
144 (if (string-match "[&<>\"]" string)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
145 (save-excursion
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
146 (set-buffer (get-buffer-create " *entity*"))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
147 (erase-buffer)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
148 (buffer-disable-undo (current-buffer))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
149 (insert string)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
150 (goto-char (point-min))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
151 (while (progn
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
152 (skip-chars-forward "^&<>\"")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
153 (not (eobp)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
154 (insert (cdr (assq (char-after (point))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
155 '((?\" . "&quot;")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
156 (?& . "&amp;")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
157 (?< . "&lt;")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
158 (?> . "&gt;")))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
159 (delete-char 1))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
160 (buffer-string))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
161 string))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
162
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
163 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
164 (defun url-normalize-url (url)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
165 "Return a 'normalized' version of URL.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
166 Strips out default port numbers, etc."
72218
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
167 (let (type data retval)
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
168 (setq data (url-generic-parse-url url)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
169 type (url-type data))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
170 (if (member type '("www" "about" "mailto" "info"))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
171 (setq retval url)
83823
dd2bcc6758a0 * url-parse.el (url): Use defstruct rather than macros. Update all callers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78222
diff changeset
172 (setf (url-target data) nil)
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
173 (setq retval (url-recreate-url data)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
174 retval))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
175
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
176 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
177 (defun url-lazy-message (&rest args)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
178 "Just like `message', but is a no-op if called more than once a second.
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
179 Will not do anything if `url-show-status' is nil."
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
180 (if (or (null url-show-status)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
181 (active-minibuffer-window)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
182 (= url-lazy-message-time
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
183 (setq url-lazy-message-time (nth 1 (current-time)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
184 nil
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
185 (apply 'message args)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
186
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
187 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
188 (defun url-get-normalized-date (&optional specified-time)
92305
76175fc0a2f9 (url-get-normalized-date): Simplify
Teodor Zlatanov <tzz@lifelogs.com>
parents: 87649
diff changeset
189 "Return a 'real' date string that most HTTP servers can understand."
76175fc0a2f9 (url-get-normalized-date): Simplify
Teodor Zlatanov <tzz@lifelogs.com>
parents: 87649
diff changeset
190 (let ((system-time-locale "C"))
76175fc0a2f9 (url-get-normalized-date): Simplify
Teodor Zlatanov <tzz@lifelogs.com>
parents: 87649
diff changeset
191 (format-time-string "%a, %d %b %Y %T GMT"
76175fc0a2f9 (url-get-normalized-date): Simplify
Teodor Zlatanov <tzz@lifelogs.com>
parents: 87649
diff changeset
192 (or specified-time (current-time)) t)))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
193
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
194 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
195 (defun url-eat-trailing-space (x)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
196 "Remove spaces/tabs at the end of a string."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
197 (let ((y (1- (length x)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
198 (skip-chars (list ? ?\t ?\n)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
199 (while (and (>= y 0) (memq (aref x y) skip-chars))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
200 (setq y (1- y)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
201 (substring x 0 (1+ y))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
202
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
203 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
204 (defun url-strip-leading-spaces (x)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
205 "Remove spaces at the front of a string."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
206 (let ((y (1- (length x)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
207 (z 0)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
208 (skip-chars (list ? ?\t ?\n)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
209 (while (and (<= z y) (memq (aref x z) skip-chars))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
210 (setq z (1+ z)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
211 (substring x z nil)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
212
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
213 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
214 (defun url-pretty-length (n)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
215 (cond
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
216 ((< n 1024)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
217 (format "%d bytes" n))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
218 ((< n (* 1024 1024))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
219 (format "%dk" (/ n 1024.0)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
220 (t
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
221 (format "%2.2fM" (/ n (* 1024 1024.0))))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
222
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
223 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
224 (defun url-display-percentage (fmt perc &rest args)
74135
e125bce98ce9 (url-display-percentage): Only show a message if `url-show-status' is non-nil.
Magnus Henoch <mange@freemail.hu>
parents: 72218
diff changeset
225 (when url-show-status
e125bce98ce9 (url-display-percentage): Only show a message if `url-show-status' is non-nil.
Magnus Henoch <mange@freemail.hu>
parents: 72218
diff changeset
226 (if (null fmt)
e125bce98ce9 (url-display-percentage): Only show a message if `url-show-status' is non-nil.
Magnus Henoch <mange@freemail.hu>
parents: 72218
diff changeset
227 (if (fboundp 'clear-progress-display)
e125bce98ce9 (url-display-percentage): Only show a message if `url-show-status' is non-nil.
Magnus Henoch <mange@freemail.hu>
parents: 72218
diff changeset
228 (clear-progress-display))
e125bce98ce9 (url-display-percentage): Only show a message if `url-show-status' is non-nil.
Magnus Henoch <mange@freemail.hu>
parents: 72218
diff changeset
229 (if (and (fboundp 'progress-display) perc)
e125bce98ce9 (url-display-percentage): Only show a message if `url-show-status' is non-nil.
Magnus Henoch <mange@freemail.hu>
parents: 72218
diff changeset
230 (apply 'progress-display fmt perc args)
e125bce98ce9 (url-display-percentage): Only show a message if `url-show-status' is non-nil.
Magnus Henoch <mange@freemail.hu>
parents: 72218
diff changeset
231 (apply 'message fmt args)))))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
232
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
233 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
234 (defun url-percentage (x y)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
235 (if (fboundp 'float)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
236 (round (* 100 (/ x (float y))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
237 (/ (* x 100) y)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
238
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
239 ;;;###autoload
79064
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
240 (defun url-file-directory (file)
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
241 "Return the directory part of FILE, for a URL."
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
242 (cond
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
243 ((null file) "")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
244 ((string-match (eval-when-compile (regexp-quote "?")) file)
79064
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
245 (file-name-directory (substring file 0 (match-beginning 0))))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
246 (t (file-name-directory file))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
247
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
248 ;;;###autoload
79064
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
249 (defun url-file-nondirectory (file)
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
250 "Return the nondirectory part of FILE, for a URL."
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
251 (cond
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
252 ((null file) "")
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
253 ((string-match (eval-when-compile (regexp-quote "?")) file)
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
254 (file-name-nondirectory (substring file 0 (match-beginning 0))))
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
255 (t (file-name-nondirectory file))))
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
256
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
257 ;;;###autoload
65312
915d671fef52 *** empty log message ***
Chong Yidong <cyd@stupidchicken.com>
parents: 64748
diff changeset
258 (defun url-parse-query-string (query &optional downcase allow-newlines)
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
259 (let (retval pairs cur key val)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
260 (setq pairs (split-string query "&"))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
261 (while pairs
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
262 (setq cur (car pairs)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
263 pairs (cdr pairs))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
264 (if (not (string-match "=" cur))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
265 nil ; Grace
65312
915d671fef52 *** empty log message ***
Chong Yidong <cyd@stupidchicken.com>
parents: 64748
diff changeset
266 (setq key (url-unhex-string (substring cur 0 (match-beginning 0))
915d671fef52 *** empty log message ***
Chong Yidong <cyd@stupidchicken.com>
parents: 64748
diff changeset
267 allow-newlines))
915d671fef52 *** empty log message ***
Chong Yidong <cyd@stupidchicken.com>
parents: 64748
diff changeset
268 (setq val (url-unhex-string (substring cur (match-end 0) nil)
915d671fef52 *** empty log message ***
Chong Yidong <cyd@stupidchicken.com>
parents: 64748
diff changeset
269 allow-newlines))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
270 (if downcase
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
271 (setq key (downcase key)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
272 (setq cur (assoc key retval))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
273 (if cur
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
274 (setcdr cur (cons val (cdr cur)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
275 (setq retval (cons (list key val) retval)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
276 retval))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
277
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
278 (defun url-unhex (x)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
279 (if (> x ?9)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
280 (if (>= x ?a)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
281 (+ 10 (- x ?a))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
282 (+ 10 (- x ?A)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
283 (- x ?0)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
284
54803
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
285 ;; Fixme: Is this definition better, and does it ever matter?
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
286
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
287 ;; (defun url-unhex-string (str &optional allow-newlines)
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
288 ;; "Remove %XX, embedded spaces, etc in a url.
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
289 ;; If optional second argument ALLOW-NEWLINES is non-nil, then allow the
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
290 ;; decoding of carriage returns and line feeds in the string, which is normally
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
291 ;; forbidden in URL encoding."
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
292 ;; (setq str (or str ""))
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
293 ;; (setq str (replace-regexp-in-string "%[[:xdigit:]]\\{2\\}"
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
294 ;; (lambda (match)
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
295 ;; (string (string-to-number
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
296 ;; (substring match 1) 16)))
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
297 ;; str t t))
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
298 ;; (if allow-newlines
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
299 ;; (replace-regexp-in-string "[\n\r]" (lambda (match)
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
300 ;; (format "%%%.2X" (aref match 0)))
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
301 ;; str t t)
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
302 ;; str))
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
303
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
304 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
305 (defun url-unhex-string (str &optional allow-newlines)
54803
a78c94aa182d (url-hexify-string): Don't give multibyte error for char <16.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54770
diff changeset
306 "Remove %XX embedded spaces, etc in a url.
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
307 If optional second argument ALLOW-NEWLINES is non-nil, then allow the
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
308 decoding of carriage returns and line feeds in the string, which is normally
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
309 forbidden in URL encoding."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
310 (setq str (or str ""))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
311 (let ((tmp "")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
312 (case-fold-search t))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
313 (while (string-match "%[0-9a-f][0-9a-f]" str)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
314 (let* ((start (match-beginning 0))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
315 (ch1 (url-unhex (elt str (+ start 1))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
316 (code (+ (* 16 ch1)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
317 (url-unhex (elt str (+ start 2))))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
318 (setq tmp (concat
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
319 tmp (substring str 0 start)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
320 (cond
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
321 (allow-newlines
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
322 (char-to-string code))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
323 ((or (= code ?\n) (= code ?\r))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
324 " ")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
325 (t (char-to-string code))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
326 str (substring str (match-end 0)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
327 (setq tmp (concat tmp str))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
328 tmp))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
329
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
330 (defconst url-unreserved-chars
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
331 '(
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
332 ?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y ?z
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
333 ?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y ?Z
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
334 ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
335 ?- ?_ ?. ?! ?~ ?* ?' ?\( ?\))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
336 "A list of characters that are _NOT_ reserved in the URL spec.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
337 This is taken from RFC 2396.")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
338
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
339 ;;;###autoload
72196
5b336ff592bb (url-hexify-string): Rewrite.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68640
diff changeset
340 (defun url-hexify-string (string)
5b336ff592bb (url-hexify-string): Rewrite.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68640
diff changeset
341 "Return a new string that is STRING URI-encoded.
5b336ff592bb (url-hexify-string): Rewrite.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68640
diff changeset
342 First, STRING is converted to utf-8, if necessary. Then, for each
5b336ff592bb (url-hexify-string): Rewrite.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68640
diff changeset
343 character in the utf-8 string, those found in `url-unreserved-chars'
5b336ff592bb (url-hexify-string): Rewrite.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68640
diff changeset
344 are left as-is, all others are represented as a three-character
5b336ff592bb (url-hexify-string): Rewrite.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68640
diff changeset
345 string: \"%\" followed by two lowercase hex digits."
72218
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
346 ;; To go faster and avoid a lot of consing, we could do:
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
347 ;;
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
348 ;; (defconst url-hexify-table
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
349 ;; (let ((map (make-vector 256 nil)))
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
350 ;; (dotimes (byte 256) (aset map byte
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
351 ;; (if (memq byte url-unreserved-chars)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
352 ;; (char-to-string byte)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
353 ;; (format "%%%02x" byte))))
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
354 ;; map))
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
355 ;;
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
356 ;; (mapconcat (curry 'aref url-hexify-table) ...)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
357 (mapconcat (lambda (byte)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
358 (if (memq byte url-unreserved-chars)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
359 (char-to-string byte)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
360 (format "%%%02x" byte)))
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
361 (if (multibyte-string-p string)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
362 (encode-coding-string string 'utf-8)
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
363 string)
72196
5b336ff592bb (url-hexify-string): Rewrite.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68640
diff changeset
364 ""))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
365
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
366 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
367 (defun url-file-extension (fname &optional x)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
368 "Return the filename extension of FNAME.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
369 If optional variable X is t,
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
370 then return the basename of the file with the extension stripped off."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
371 (if (and fname
79064
5299839279f5 (url-basepath): Function deleted.
Richard M. Stallman <rms@gnu.org>
parents: 78850
diff changeset
372 (setq fname (url-file-nondirectory fname))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
373 (string-match "\\.[^./]+$" fname))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
374 (if x (substring fname 0 (match-beginning 0))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
375 (substring fname (match-beginning 0) nil))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
376 ;;
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
377 ;; If fname has no extension, and x then return fname itself instead of
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
378 ;; nothing. When caching it allows the correct .hdr file to be produced
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
379 ;; for filenames without extension.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
380 ;;
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
381 (if x
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
382 fname
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
383 "")))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
384
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
385 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
386 (defun url-truncate-url-for-viewing (url &optional width)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
387 "Return a shortened version of URL that is WIDTH characters or less wide.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
388 WIDTH defaults to the current frame width."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
389 (let* ((fr-width (or width (frame-width)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
390 (str-width (length url))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
391 (fname nil)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
392 (modified 0)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
393 (urlobj nil))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
394 ;; The first thing that can go are the search strings
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
395 (if (and (>= str-width fr-width)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
396 (string-match "?" url))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
397 (setq url (concat (substring url 0 (match-beginning 0)) "?...")
72218
23d71f51857b (url-hexify-string): Only utf-8 encode if it's a multibyte string.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72196
diff changeset
398 str-width (length url)))
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
399 (if (< str-width fr-width)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
400 nil ; Hey, we are done!
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
401 (setq urlobj (url-generic-parse-url url)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
402 fname (url-filename urlobj)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
403 fr-width (- fr-width 4))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
404 (while (and (>= str-width fr-width)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
405 (string-match "/" fname))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
406 (setq fname (substring fname (match-end 0) nil)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
407 modified (1+ modified))
83823
dd2bcc6758a0 * url-parse.el (url): Use defstruct rather than macros. Update all callers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78222
diff changeset
408 (setf (url-filename urlobj) fname)
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
409 (setq url (url-recreate-url urlobj)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
410 str-width (length url)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
411 (if (> modified 1)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
412 (setq fname (concat "/.../" fname))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
413 (setq fname (concat "/" fname)))
83823
dd2bcc6758a0 * url-parse.el (url): Use defstruct rather than macros. Update all callers.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78222
diff changeset
414 (setf (url-filename urlobj) fname)
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
415 (setq url (url-recreate-url urlobj)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
416 url))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
417
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
418 ;;;###autoload
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
419 (defun url-view-url (&optional no-show)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
420 "View the current document's URL.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
421 Optional argument NO-SHOW means just return the URL, don't show it in
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
422 the minibuffer.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
423
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
424 This uses `url-current-object', set locally to the buffer."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
425 (interactive)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
426 (if (not url-current-object)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
427 nil
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
428 (if no-show
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
429 (url-recreate-url url-current-object)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
430 (message "%s" (url-recreate-url url-current-object)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
431
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
432 (eval-and-compile
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
433 (defvar url-get-url-filename-chars "-%.?@a-zA-Z0-9()_/:~=&"
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
434 "Valid characters in a URL")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
435 )
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
436
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
437 (defun url-get-url-at-point (&optional pt)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
438 "Get the URL closest to point, but don't change position.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
439 Has a preference for looking backward when not directly on a symbol."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
440 ;; Not at all perfect - point must be right in the name.
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
441 (save-excursion
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
442 (if pt (goto-char pt))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
443 (let (start url)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
444 (save-excursion
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
445 ;; first see if you're just past a filename
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
446 (if (not (eobp))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
447 (if (looking-at "[] \t\n[{}()]") ; whitespace or some parens
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
448 (progn
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
449 (skip-chars-backward " \n\t\r({[]})")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
450 (if (not (bobp))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
451 (backward-char 1)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
452 (if (and (char-after (point))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
453 (string-match (eval-when-compile
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
454 (concat "[" url-get-url-filename-chars "]"))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
455 (char-to-string (char-after (point)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
456 (progn
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
457 (skip-chars-backward url-get-url-filename-chars)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
458 (setq start (point))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
459 (skip-chars-forward url-get-url-filename-chars))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
460 (setq start (point)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
461 (setq url (buffer-substring-no-properties start (point))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
462 (if (and url (string-match "^(.*)\\.?$" url))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
463 (setq url (match-string 1 url)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
464 (if (and url (string-match "^URL:" url))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
465 (setq url (substring url 4 nil)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
466 (if (and url (string-match "\\.$" url))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
467 (setq url (substring url 0 -1)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
468 (if (and url (string-match "^www\\." url))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
469 (setq url (concat "http://" url)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
470 (if (and url (not (string-match url-nonrelative-link url)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
471 (setq url nil))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
472 url)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
473
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
474 (defun url-generate-unique-filename (&optional fmt)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
475 "Generate a unique filename in `url-temporary-directory'."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
476 (if (not fmt)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
477 (let ((base (format "url-tmp.%d" (user-real-uid)))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
478 (fname "")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
479 (x 0))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
480 (setq fname (format "%s%d" base x))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
481 (while (file-exists-p
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
482 (expand-file-name fname url-temporary-directory))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
483 (setq x (1+ x)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
484 fname (concat base (int-to-string x))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
485 (expand-file-name fname url-temporary-directory))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
486 (let ((base (concat "url" (int-to-string (user-real-uid))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
487 (fname "")
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
488 (x 0))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
489 (setq fname (format fmt (concat base (int-to-string x))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
490 (while (file-exists-p
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
491 (expand-file-name fname url-temporary-directory))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
492 (setq x (1+ x)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
493 fname (format fmt (concat base (int-to-string x)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
494 (expand-file-name fname url-temporary-directory))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
495
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
496 (defun url-extract-mime-headers ()
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
497 "Set `url-current-mime-headers' in current buffer."
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
498 (save-excursion
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
499 (goto-char (point-min))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
500 (unless url-current-mime-headers
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
501 (set (make-local-variable 'url-current-mime-headers)
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
502 (mail-header-extract)))))
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
503
79558
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
504 (defun url-make-private-file (file)
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
505 "Make FILE only readable and writable by the current user.
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
506 Creates FILE and its parent directories if they do not exist."
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
507 (let ((dir (file-name-directory file)))
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
508 (when dir
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
509 ;; For historical reasons.
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
510 (make-directory dir t)))
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
511 ;; Based on doc-view-make-safe-dir.
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
512 (condition-case nil
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
513 (let ((umask (default-file-modes)))
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
514 (unwind-protect
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
515 (progn
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
516 (set-default-file-modes #o0600)
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
517 (with-temp-buffer
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
518 (write-region (point-min) (point-max)
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
519 file nil 'silent nil 'excl)))
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
520 (set-default-file-modes umask)))
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
521 (file-already-exists
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
522 (if (file-symlink-p file)
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
523 (error "Danger: `%s' is a symbolic link" file))
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
524 (set-file-modes file #o0600))))
ba4da6f08090 (url-make-private-file): New function.
Glenn Morris <rgm@gnu.org>
parents: 79064
diff changeset
525
54695
3fb37923e567 Initial revision
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
526 (provide 'url-util)
54699
7784ae10206d Resolve CVS conflicts
Miles Bader <miles@gnu.org>
parents: 54695
diff changeset
527
54935
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
528 ;; arch-tag: 24352abc-5a5a-412e-90cd-313b26bed5c9
efddc239393d (url-debug): Use with-current-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54803
diff changeset
529 ;;; url-util.el ends here