1 ;;; rng-util.el --- utility functions for RELAX NG library
3 ;; Copyright (C) 2003, 2007, 2008 Free Software Foundation, Inc.
6 ;; Keywords: XML, RelaxNG
8 ;; This file is part of GNU Emacs.
10 ;; GNU Emacs is free software: you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation, either version 3 of the License, or
13 ;; (at your option) any later version.
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
27 (defun rng-make-datatypes-uri (uri)
28 (if (string-equal uri
"")
29 ;; The spec doesn't say to do this, but it's perfectly conformant
30 ;; and better than using nil, I think.
31 'http
://relaxng.org
/ns
/structure
/1.0
34 (defconst rng-xsd-datatypes-uri
35 (rng-make-datatypes-uri "http://www.w3.org/2001/XMLSchema-datatypes"))
37 (defconst rng-builtin-datatypes-uri
(rng-make-datatypes-uri ""))
39 (defun rng-uniquify-eq (list)
40 "Destructively remove any element from LIST that is eq to
45 (if (eq (car head
) (cadr head
))
46 (setcdr head
(cddr head
)))
47 (setq head
(cdr head
)))
50 (defun rng-uniquify-equal (list)
51 "Destructively remove any element from LIST that is equal to
56 (if (equal (car head
) (cadr head
))
57 (setcdr head
(cddr head
)))
58 (setq head
(cdr head
)))
61 (defun rng-blank-p (str) (string-match "\\`[ \t\n\r]*\\'" str
))
63 (defun rng-substq (new old list
)
64 "Replace first member of LIST (if any) that is eq to OLD by NEW.
65 LIST is not modified."
66 (cond ((null list
) nil
)
68 (cons new
(cdr list
)))
70 (let ((tail (cons (car list
)
75 (let ((item (car rest
)))
76 (setq rest
(cdr rest
))
84 (cons item nil
))))))))
87 (defun rng-complete-before-point (start table prompt
&optional predicate hist
)
88 "Complete text between START and point.
89 Replaces the text between START and point with a string chosen using a
90 completion table and, when needed, input read from the user with the
92 Returns the new string if either a complete and unique completion was
93 determined automatically or input was read from the user. Otherwise,
95 TABLE is an alist, a symbol bound to a function or an obarray as with
96 the function `completing-read'.
97 PROMPT is the string to prompt with if user input is needed.
98 PREDICATE is nil or a function as with `completing-read'.
99 HIST, if non-nil, specifies a history list as with `completing-read'."
100 (let* ((orig (buffer-substring-no-properties start
(point)))
101 (completion (try-completion orig table predicate
)))
102 (cond ((not completion
)
103 (if (string= orig
"")
104 (message "No completions available")
105 (message "No completion for %s" (rng-quote-string orig
)))
108 ((eq completion t
) orig
)
109 ((not (string= completion orig
))
110 (delete-region start
(point))
112 (cond ((not (rng-completion-exact-p completion table predicate
))
113 (message "Incomplete")
115 ((eq (try-completion completion table predicate
) t
)
118 (message "Complete but not unique")
122 (let ((saved-minibuffer-setup-hook
123 (default-value 'minibuffer-setup-hook
)))
124 (add-hook 'minibuffer-setup-hook
125 'minibuffer-completion-help
128 (completing-read prompt
134 (setq-default minibuffer-setup-hook
135 saved-minibuffer-setup-hook
))))
136 (delete-region start
(point))
140 (defun rng-completion-exact-p (string table predicate
)
141 (cond ((symbolp table
)
142 (funcall table string predicate
'lambda
))
144 (intern-soft string table
))
145 (t (assoc string table
))))
147 (defun rng-quote-string (s)
148 (concat "\"" s
"\""))
150 (defun rng-escape-string (s)
151 (replace-regexp-in-string "[&\"<>]"
161 (defun rng-collapse-space (string)
163 (replace-regexp-in-string "[ \t\r\n]+" " " string t t
))
164 (when (string-match "\\` " string
)
165 (setq string
(substring string
1)))
166 (when (string-match " \\'" string
)
167 (setq string
(substring string
0 -
1)))
172 ;; arch-tag: 2dc233e0-5e7a-488f-bfc4-5909512dbaf0
173 ;;; rng-util.el ends here