annotate lisp/format.el @ 24419:30e478cd167e

(shell-command-default-error-buffer): Renamed from shell-command-on-region-default-error-buffer. (shell-command-on-region): Mention in echo area when there is some error output. Mention success or failure, too. Accumulate multiple error outputs going forward, with formfeed in between. Display the error buffer when we have put something in it. (shell-command): Add the ERROR-BUFFER argument feature.
author Karl Heuer <kwzh@gnu.org>
date Mon, 01 Mar 1999 03:19:32 +0000
parents eb03024d18fc
children 583275537b14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13352
8dba183df579 Correct initial line typo.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
1 ;;; format.el --- read and save files in multiple formats
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
2
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
3 ;; Copyright (c) 1994, 1995, 1997, 1999 Free Software Foundation
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
4
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
5 ;; Author: Boris Goldowsky <boris@gnu.org>
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
6
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
7 ;; This file is part of GNU Emacs.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
8
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
10 ;; it under the terms of the GNU General Public License as published by
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
11 ;; the Free Software Foundation; either version 2, or (at your option)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
12 ;; any later version.
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
13
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
14 ;; GNU Emacs is distributed in the hope that it will be useful,
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
17 ;; GNU General Public License for more details.
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
18
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
19 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
22 ;; Boston, MA 02111-1307, USA.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
23
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
25
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
26 ;; This file defines a unified mechanism for saving & loading files stored
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
27 ;; in different formats. `format-alist' contains information that directs
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
28 ;; Emacs to call an encoding or decoding function when reading or writing
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
29 ;; files that match certain conditions.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
30 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
31 ;; When a file is visited, its format is determined by matching the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
32 ;; beginning of the file against regular expressions stored in
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
33 ;; `format-alist'. If this fails, you can manually translate the buffer
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
34 ;; using `format-decode-buffer'. In either case, the formats used are
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
35 ;; listed in the variable `buffer-file-format', and become the default
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
36 ;; format for saving the buffer. To save a buffer in a different format,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
37 ;; change this variable, or use `format-write-file'.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
38 ;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
39 ;; Auto-save files are normally created in the same format as the visited
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
40 ;; file, but the variable `auto-save-file-format' can be set to a
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
41 ;; particularly fast or otherwise preferred format to be used for
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
42 ;; auto-saving (or nil to do no encoding on auto-save files, but then you
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
43 ;; risk losing any text-properties in the buffer).
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
44 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
45 ;; You can manually translate a buffer into or out of a particular format
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
46 ;; with the functions `format-encode-buffer' and `format-decode-buffer'.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
47 ;; To translate just the region use the functions `format-encode-region'
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
48 ;; and `format-decode-region'.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
49 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
50 ;; You can define a new format by writing the encoding and decoding
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
51 ;; functions, and adding an entry to `format-alist'. See enriched.el for
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
52 ;; an example of how to implement a file format. There are various
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
53 ;; functions defined in this file that may be useful for writing the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
54 ;; encoding and decoding functions:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
55 ;; * `format-annotate-region' and `format-deannotate-region' allow a
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
56 ;; single alist of information to be used for encoding and decoding.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
57 ;; The alist defines a correspondence between strings in the file
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
58 ;; ("annotations") and text-properties in the buffer.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
59 ;; * `format-replace-strings' is similarly useful for doing simple
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
60 ;; string->string translations in a reversible manner.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
61
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
62 ;;; Code:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13983
diff changeset
63
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
64 (put 'buffer-file-format 'permanent-local t)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
65
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
66 (defvar format-alist
18690
df8ab82c73f3 (format-alist): Don't handle compression here.
Richard M. Stallman <rms@gnu.org>
parents: 18140
diff changeset
67 '((text/enriched "Extended MIME text/enriched format."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
68 "Content-[Tt]ype:[ \t]*text/enriched"
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
69 enriched-decode enriched-encode t enriched-mode)
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
70 (plain "ISO 8859-1 standard format, no text properties."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
71 ;; Plain only exists so that there is an obvious neutral choice in
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
72 ;; the completion list.
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
73 nil nil nil nil nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
74 (ibm "IBM Code Page 850 (DOS)"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
75 nil ; The original "1\\(^\\)" is obscure.
22051
3e5822a3448d (format-alist): Use -f when running recode.
Richard M. Stallman <rms@gnu.org>
parents: 20087
diff changeset
76 "recode -f ibm-pc:latin1" "recode -f latin1:ibm-pc" t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
77 (mac "Apple Macintosh"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
78 nil
22051
3e5822a3448d (format-alist): Use -f when running recode.
Richard M. Stallman <rms@gnu.org>
parents: 20087
diff changeset
79 "recode -f mac:latin1" "recode -f latin1:mac" t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
80 (hp "HP Roman8"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
81 nil
22051
3e5822a3448d (format-alist): Use -f when running recode.
Richard M. Stallman <rms@gnu.org>
parents: 20087
diff changeset
82 "recode -f roman8:latin1" "recode -f latin1:roman8" t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
83 (TeX "TeX (encoding)"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
84 nil
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
85 iso-tex2iso iso-iso2tex t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
86 (gtex "German TeX (encoding)"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
87 nil
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
88 iso-gtex2iso iso-iso2gtex t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
89 (html "HTML (encoding)"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
90 nil
22051
3e5822a3448d (format-alist): Use -f when running recode.
Richard M. Stallman <rms@gnu.org>
parents: 20087
diff changeset
91 "recode -f html:latin1" "recode -f latin1:html" t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
92 (rot13 "rot13"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
93 nil
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
94 "tr a-mn-z n-za-m" "tr a-mn-z n-za-m" t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
95 (duden "Duden Ersatzdarstellung"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
96 nil
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
97 "diac" iso-iso2duden t nil)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
98 (de646 "German ASCII (ISO 646)"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
99 nil
22051
3e5822a3448d (format-alist): Use -f when running recode.
Richard M. Stallman <rms@gnu.org>
parents: 20087
diff changeset
100 "recode -f iso646-ge:latin1" "recode -f latin1:iso646-ge" t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
101 (denet "net German"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
102 nil
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
103 iso-german iso-cvt-read-only t nil)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
104 (esnet "net Spanish"
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
105 nil
18690
df8ab82c73f3 (format-alist): Don't handle compression here.
Richard M. Stallman <rms@gnu.org>
parents: 18140
diff changeset
106 iso-spanish iso-cvt-read-only t nil))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
107 "List of information about understood file formats.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
108 Elements are of the form \(NAME DOC-STR REGEXP FROM-FN TO-FN MODIFY MODE-FN).
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
109
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
110 NAME is a symbol, which is stored in `buffer-file-format'.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
111
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
112 DOC-STR should be a single line providing more information about the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
113 format. It is currently unused, but in the future will be shown to
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
114 the user if they ask for more information.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
115
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
116 REGEXP is a regular expression to match against the beginning of the file;
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
117 it should match only files in that format. Use nil to avoid
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
118 matching at all for formats for which this isn't appropriate to
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
119 require explicit encoding/decoding.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
120
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
121 FROM-FN is called to decode files in that format; it gets two args, BEGIN
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
122 and END, and can make any modifications it likes, returning the new
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
123 end. It must make sure that the beginning of the file no longer
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
124 matches REGEXP, or else it will get called again.
19245
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
125 Alternatively, FROM-FN can be a string, which specifies a shell command
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
126 (including options) to be used as a filter to perform the conversion.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
127
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
128 TO-FN is called to encode a region into that format; it is passed three
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
129 arguments: BEGIN, END, and BUFFER. BUFFER is the original buffer that
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
130 the data being written came from, which the function could use, for
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
131 example, to find the values of local variables. TO-FN should either
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
132 return a list of annotations like `write-region-annotate-functions',
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
133 or modify the region and return the new end.
19245
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
134 Alternatively, TO-FN can be a string, which specifies a shell command
33adb5cee0b0 (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19244
diff changeset
135 (including options) to be used as a filter to perform the conversion.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
136
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
137 MODIFY, if non-nil, means the TO-FN wants to modify the region. If nil,
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
138 TO-FN will not make any changes but will instead return a list of
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
139 annotations.
19244
dc92be3441cd (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 19235
diff changeset
140
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
141 MODE-FN, if specified, is called when visiting a file with that format.")
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
142
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
143 ;;; Basic Functions (called from Lisp)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
144
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
145 (defun format-encode-run-method (method from to &optional buffer)
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
146 "Translate using function or shell script METHOD the text from FROM to TO.
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
147 If METHOD is a string, it is a shell command;
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
148 otherwise, it should be a Lisp function.
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
149 BUFFER should be the buffer that the output originally came from."
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
150 (if (stringp method)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
151 (let ((error-buff (get-buffer-create "*Format Errors*"))
24347
eb03024d18fc (format-encode-run-method, format-decode-run-method): Fix previous change.
Dave Love <fx@gnu.org>
parents: 24315
diff changeset
152 (coding-system-for-read 'no-conversion)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
153 format-alist)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
154 (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
155 (widen)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
156 (erase-buffer))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
157 (if (and (zerop (shell-command-on-region from to method t t
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
158 error-buff))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
159 ;; gzip gives zero exit status with bad args, for instance.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
160 (zerop (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
161 (buffer-size))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
162 (bury-buffer error-buff)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
163 (switch-to-buffer-other-window error-buff)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
164 (error "Format decoding failed")))
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
165 (funcall method from to buffer)))
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
166
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
167 (defun format-decode-run-method (method from to &optional buffer)
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
168 "Decode using function or shell script METHOD the text from FROM to TO.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
169 If METHOD is a string, it is a shell command; otherwise, it should be
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
170 a Lisp function. Decoding is done for the given BUFFER."
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
171 (if (stringp method)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
172 (let ((error-buff (get-buffer-create "*Format Errors*"))
24347
eb03024d18fc (format-encode-run-method, format-decode-run-method): Fix previous change.
Dave Love <fx@gnu.org>
parents: 24315
diff changeset
173 (coding-system-for-write 'no-conversion)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
174 format-alist)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
175 (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
176 (widen)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
177 (erase-buffer))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
178 ;; We should perhaps go via a temporary buffer and copy it
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
179 ;; back, in case of errors.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
180 (if (and (zerop (save-window-excursion
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
181 (shell-command-on-region (point-min) (point-max)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
182 method t t
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
183 error-buff)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
184 ;; gzip gives zero exit status with bad args, for instance.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
185 (zerop (with-current-buffer error-buff
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
186 (buffer-size))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
187 (bury-buffer error-buff)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
188 (switch-to-buffer-other-window error-buff)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
189 (error "Format decoding failed"))
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
190 (point))
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
191 (funcall method from to)))
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
192
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
193 (defun format-annotate-function (format from to orig-buf)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
194 "Return annotations for writing region as FORMAT.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
195 FORMAT is a symbol naming one of the formats defined in `format-alist',
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
196 it must be a single symbol, not a list like `buffer-file-format'.
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
197 FROM and TO delimit the region to be operated on in the current buffer.
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
198 ORIG-BUF is the original buffer that the data came from.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
199 This function works like a function on `write-region-annotate-functions':
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
200 it either returns a list of annotations, or returns with a different buffer
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
201 current, which contains the modified text to write.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
202
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
203 For most purposes, consider using `format-encode-region' instead."
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
204 ;; This function is called by write-region (actually build-annotations)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
205 ;; for each element of buffer-file-format.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
206 (let* ((info (assq format format-alist))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
207 (to-fn (nth 4 info))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
208 (modify (nth 5 info)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
209 (if to-fn
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
210 (if modify
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
211 ;; To-function wants to modify region. Copy to safe place.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
212 (let ((copy-buf (get-buffer-create " *Format Temp*")))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
213 (copy-to-buffer copy-buf from to)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
214 (set-buffer copy-buf)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
215 (format-insert-annotations write-region-annotations-so-far from)
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
216 (format-encode-run-method to-fn (point-min) (point-max) orig-buf)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
217 nil)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
218 ;; Otherwise just call function, it will return annotations.
16020
0f704de0600f (format-alist): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 14452
diff changeset
219 (funcall to-fn from to orig-buf)))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
220
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
221 (defun format-decode (format length &optional visit-flag)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
222 ;; This function is called by insert-file-contents whenever a file is read.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
223 "Decode text from any known FORMAT.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
224 FORMAT is a symbol appearing in `format-alist' or a list of such symbols,
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
225 or nil, in which case this function tries to guess the format of the data by
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
226 matching against the regular expressions in `format-alist'. After a match is
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
227 found and the region decoded, the alist is searched again from the beginning
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
228 for another match.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
229
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
230 Second arg LENGTH is the number of characters following point to operate on.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
231 If optional third arg VISIT-FLAG is true, set `buffer-file-format'
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
232 to the list of formats used, and call any mode functions defined for those
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
233 formats.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
234
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
235 Returns the new length of the decoded region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
236
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
237 For most purposes, consider using `format-decode-region' instead."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
238 (let ((mod (buffer-modified-p))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
239 (begin (point))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
240 (end (+ (point) length)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
241 (if (null format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
242 ;; Figure out which format it is in, remember list in `format'.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
243 (let ((try format-alist))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
244 (while try
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
245 (let* ((f (car try))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
246 (regexp (nth 2 f))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
247 (p (point)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
248 (if (and regexp (looking-at regexp)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
249 (< (match-end 0) (+ begin length)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
250 (progn
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
251 (setq format (cons (car f) format))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
252 ;; Decode it
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
253 (if (nth 3 f)
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
254 (setq end (format-decode-run-method (nth 3 f) begin end)))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
255 ;; Call visit function if required
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
256 (if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
257 ;; Safeguard against either of the functions changing pt.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
258 (goto-char p)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
259 ;; Rewind list to look for another format
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
260 (setq try format-alist))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
261 (setq try (cdr try))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
262 ;; Deal with given format(s)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
263 (or (listp format) (setq format (list format)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
264 (let ((do format) f)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
265 (while do
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
266 (or (setq f (assq (car do) format-alist))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
267 (error "Unknown format" (car do)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
268 ;; Decode:
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
269 (if (nth 3 f)
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
270 (setq end (format-decode-run-method (nth 3 f) begin end)))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
271 ;; Call visit function if required
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
272 (if (and visit-flag (nth 6 f)) (funcall (nth 6 f) 1))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
273 (setq do (cdr do)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
274 (if visit-flag
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
275 (setq buffer-file-format format))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
276 (set-buffer-modified-p mod)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
277 ;; Return new length of region
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
278 (- end begin)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
279
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
280 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
281 ;;; Interactive functions & entry points
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
282 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
283
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
284 (defun format-decode-buffer (&optional format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
285 "Translate the buffer from some FORMAT.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
286 If the format is not specified, this function attempts to guess.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
287 `buffer-file-format' is set to the format used, and any mode-functions
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
288 for the format are called."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
289 (interactive
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
290 (list (format-read "Translate buffer from format (default: guess): ")))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
291 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
292 (goto-char (point-min))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
293 (format-decode format (buffer-size) t)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
294
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
295 (defun format-decode-region (from to &optional format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
296 "Decode the region from some format.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
297 Arg FORMAT is optional; if omitted the format will be determined by looking
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
298 for identifying regular expressions at the beginning of the region."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
299 (interactive
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
300 (list (region-beginning) (region-end)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
301 (format-read "Translate region from format (default: guess): ")))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
302 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
303 (goto-char from)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
304 (format-decode format (- to from) nil)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
305
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
306 (defun format-encode-buffer (&optional format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
307 "Translate the buffer into FORMAT.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
308 FORMAT defaults to `buffer-file-format'. It is a symbol naming one of the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
309 formats defined in `format-alist', or a list of such symbols."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
310 (interactive
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
311 (list (format-read (format "Translate buffer to format (default %s): "
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
312 buffer-file-format))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
313 (format-encode-region (point-min) (point-max) format))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
314
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
315 (defun format-encode-region (beg end &optional format)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
316 "Translate the region into some FORMAT.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
317 FORMAT defaults to `buffer-file-format', it is a symbol naming
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
318 one of the formats defined in `format-alist', or a list of such symbols."
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
319 (interactive
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
320 (list (region-beginning) (region-end)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
321 (format-read (format "Translate region to format (default %s): "
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
322 buffer-file-format))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
323 (if (null format) (setq format buffer-file-format))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
324 (if (symbolp format) (setq format (list format)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
325 (save-excursion
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
326 (goto-char end)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
327 (let ((cur-buf (current-buffer))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
328 (end (point-marker)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
329 (while format
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
330 (let* ((info (assq (car format) format-alist))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
331 (to-fn (nth 4 info))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
332 (modify (nth 5 info))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
333 result)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
334 (if to-fn
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
335 (if modify
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
336 (setq end (format-encode-run-method to-fn beg end
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
337 (current-buffer)))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
338 (format-insert-annotations
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
339 (funcall to-fn beg end (current-buffer)))))
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
340 (setq format (cdr format)))))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
341
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
342 (defun format-write-file (filename format)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
343 "Write current buffer into file FILENAME using some FORMAT.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
344 Makes buffer visit that file and sets the format as the default for future
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
345 saves. If the buffer is already visiting a file, you can specify a directory
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
346 name as FILENAME, to write a file of the same old name in that directory."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
347 (interactive
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
348 ;; Same interactive spec as write-file, plus format question.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
349 (let* ((file (if buffer-file-name
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
350 (read-file-name "Write file: "
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
351 nil nil nil nil)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
352 (read-file-name "Write file: "
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
353 (cdr (assq 'default-directory
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
354 (buffer-local-variables)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
355 nil nil (buffer-name))))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
356 (fmt (format-read (format "Write file `%s' in format: "
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
357 (file-name-nondirectory file)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
358 (list file fmt)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
359 (setq buffer-file-format format)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
360 (write-file filename))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
361
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
362 (defun format-find-file (filename format)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
363 "Find the file FILENAME using data format FORMAT.
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
364 If FORMAT is nil then do not do any format conversion."
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
365 (interactive
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
366 ;; Same interactive spec as write-file, plus format question.
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
367 (let* ((file (read-file-name "Find file: "))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
368 (fmt (format-read (format "Read file `%s' in format: "
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
369 (file-name-nondirectory file)))))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
370 (list file fmt)))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
371 (let ((format-alist nil))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
372 (find-file filename))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
373 (if format
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
374 (format-decode-buffer format)))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
375
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
376 (defun format-insert-file (filename format &optional beg end)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
377 "Insert the contents of file FILENAME using data format FORMAT.
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
378 If FORMAT is nil then do not do any format conversion.
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
379 The optional third and fourth arguments BEG and END specify
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
380 the part of the file to read.
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
381
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
382 The return value is like the value of `insert-file-contents':
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
383 a list (ABSOLUTE-FILE-NAME . SIZE)."
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
384 (interactive
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
385 ;; Same interactive spec as write-file, plus format question.
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
386 (let* ((file (read-file-name "Find file: "))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
387 (fmt (format-read (format "Read file `%s' in format: "
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
388 (file-name-nondirectory file)))))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
389 (list file fmt)))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
390 (let (value size)
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
391 (let ((format-alist nil))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
392 (setq value (insert-file-contents filename nil beg end))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
393 (setq size (nth 1 value)))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
394 (if format
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
395 (setq size (format-decode format size)
12154
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
396 value (cons (car value) size)))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
397 value))
38a933f88c87 (format-find-file, format-insert-file): New functions.
Karl Heuer <kwzh@gnu.org>
parents: 12082
diff changeset
398
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
399 (defun format-read (&optional prompt)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
400 "Read and return the name of a format.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
401 Return value is a list, like `buffer-file-format'; it may be nil.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
402 Formats are defined in `format-alist'. Optional arg is the PROMPT to use."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
403 (let* ((table (mapcar (lambda (x) (list (symbol-name (car x))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
404 format-alist))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
405 (ans (completing-read (or prompt "Format: ") table nil t)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
406 (if (not (equal "" ans)) (list (intern ans)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
407
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
408
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
409 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
410 ;;; Below are some functions that may be useful in writing encoding and
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
411 ;;; decoding functions for use in format-alist.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
412 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
413
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
414 (defun format-replace-strings (alist &optional reverse beg end)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
415 "Do multiple replacements on the buffer.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
416 ALIST is a list of (from . to) pairs, which should be proper arguments to
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
417 `search-forward' and `replace-match' respectively.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
418 Optional 2nd arg REVERSE, if non-nil, means the pairs are (to . from), so that
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
419 you can use the same list in both directions if it contains only literal
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
420 strings.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
421 Optional args BEG and END specify a region of the buffer on which to operate."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
422 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
423 (save-restriction
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
424 (or beg (setq beg (point-min)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
425 (if end (narrow-to-region (point-min) end))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
426 (while alist
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
427 (let ((from (if reverse (cdr (car alist)) (car (car alist))))
24315
382a7de604b6 (format-replace-strings): Fix value of TO in REVERSE case.
Richard M. Stallman <rms@gnu.org>
parents: 24156
diff changeset
428 (to (if reverse (car (car alist)) (cdr (car alist)))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
429 (goto-char beg)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
430 (while (search-forward from nil t)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
431 (goto-char (match-beginning 0))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
432 (insert to)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
433 (set-text-properties (- (point) (length to)) (point)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
434 (text-properties-at (point)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
435 (delete-region (point) (+ (point) (- (match-end 0)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
436 (match-beginning 0)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
437 (setq alist (cdr alist)))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
438
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
439 ;;; Some list-manipulation functions that we need.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
440
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
441 (defun format-delq-cons (cons list)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
442 "Remove the given CONS from LIST by side effect and return the new LIST.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
443 Since CONS could be the first element of LIST, write
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
444 `\(setq foo \(format-delq-cons element foo))' to be sure of changing
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
445 the value of `foo'."
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
446 (if (eq cons list)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
447 (cdr list)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
448 (let ((p list))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
449 (while (not (eq (cdr p) cons))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
450 (if (null p) (error "format-delq-cons: not an element."))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
451 (setq p (cdr p)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
452 ;; Now (cdr p) is the cons to delete
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
453 (setcdr p (cdr cons))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
454 list)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
455
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
456 (defun format-make-relatively-unique (a b)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
457 "Delete common elements of lists A and B, return as pair.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
458 Compares using `equal'."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
459 (let* ((acopy (copy-sequence a))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
460 (bcopy (copy-sequence b))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
461 (tail acopy))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
462 (while tail
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
463 (let ((dup (member (car tail) bcopy))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
464 (next (cdr tail)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
465 (if dup (setq acopy (format-delq-cons tail acopy)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
466 bcopy (format-delq-cons dup bcopy)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
467 (setq tail next)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
468 (cons acopy bcopy)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
469
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
470 (defun format-common-tail (a b)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
471 "Given two lists that have a common tail, return it.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
472 Compares with `equal', and returns the part of A that is equal to the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
473 equivalent part of B. If even the last items of the two are not equal,
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
474 returns nil."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
475 (let ((la (length a))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
476 (lb (length b)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
477 ;; Make sure they are the same length
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
478 (if (> la lb)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
479 (setq a (nthcdr (- la lb) a))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
480 (setq b (nthcdr (- lb la) b))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
481 (while (not (equal a b))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
482 (setq a (cdr a)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
483 b (cdr b)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
484 a)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
485
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
486 (defun format-reorder (items order)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
487 "Arrange ITEMS to following partial ORDER.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
488 Elements of ITEMS equal to elements of ORDER will be rearranged to follow the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
489 ORDER. Unmatched items will go last."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
490 (if order
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
491 (let ((item (member (car order) items)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
492 (if item
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
493 (cons (car item)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
494 (format-reorder (format-delq-cons item items)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
495 (cdr order)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
496 (format-reorder items (cdr order))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
497 items))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
498
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
499 (put 'face 'format-list-valued t) ; These text-properties take values
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
500 (put 'unknown 'format-list-valued t) ; that are lists, the elements of which
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
501 ; should be considered separately.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
502 ; See format-deannotate-region and
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
503 ; format-annotate-region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
504
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
505 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
506 ;;; Decoding
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
507 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
508
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
509 (defun format-deannotate-region (from to translations next-fn)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
510 "Translate annotations in the region into text properties.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
511 This sets text properties between FROM to TO as directed by the
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
512 TRANSLATIONS and NEXT-FN arguments.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
513
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
514 NEXT-FN is a function that searches forward from point for an annotation.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
515 It should return a list of 4 elements: \(BEGIN END NAME POSITIVE). BEGIN and
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
516 END are buffer positions bounding the annotation, NAME is the name searched
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
517 for in TRANSLATIONS, and POSITIVE should be non-nil if this annotation marks
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
518 the beginning of a region with some property, or nil if it ends the region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
519 NEXT-FN should return nil if there are no annotations after point.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
520
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
521 The basic format of the TRANSLATIONS argument is described in the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
522 documentation for the `format-annotate-region' function. There are some
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
523 additional things to keep in mind for decoding, though:
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
524
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
525 When an annotation is found, the TRANSLATIONS list is searched for a
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
526 text-property name and value that corresponds to that annotation. If the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
527 text-property has several annotations associated with it, it will be used only
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
528 if the other annotations are also in effect at that point. The first match
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
529 found whose annotations are all present is used.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
530
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
531 The text property thus determined is set to the value over the region between
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
532 the opening and closing annotations. However, if the text-property name has a
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
533 non-nil `format-list-valued' property, then the value will be consed onto the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
534 surrounding value of the property, rather than replacing that value.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
535
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
536 There are some special symbols that can be used in the \"property\" slot of
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
537 the TRANSLATIONS list: PARAMETER and FUNCTION \(spelled in uppercase).
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
538 Annotations listed under the pseudo-property PARAMETER are considered to be
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
539 arguments of the immediately surrounding annotation; the text between the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
540 opening and closing parameter annotations is deleted from the buffer but saved
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
541 as a string. The surrounding annotation should be listed under the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
542 pseudo-property FUNCTION. Instead of inserting a text-property for this
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
543 annotation, the function listed in the VALUE slot is called to make whatever
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
544 changes are appropriate. The function's first two arguments are the START and
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
545 END locations, and the rest of the arguments are any PARAMETERs found in that
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
546 region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
547
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
548 Any annotations that are found by NEXT-FN but not defined by TRANSLATIONS
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
549 are saved as values of the `unknown' text-property \(which is list-valued).
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
550 The TRANSLATIONS list should usually contain an entry of the form
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
551 \(unknown \(nil format-annotate-value))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
552 to write these unknown annotations back into the file."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
553 (save-excursion
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
554 (save-restriction
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
555 (narrow-to-region (point-min) to)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
556 (goto-char from)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
557 (let (next open-ans todo loc unknown-ans)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
558 (while (setq next (funcall next-fn))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
559 (let* ((loc (nth 0 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
560 (end (nth 1 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
561 (name (nth 2 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
562 (positive (nth 3 next))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
563 (found nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
564
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
565 ;; Delete the annotation
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
566 (delete-region loc end)
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
567 (cond
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
568 ;; Positive annotations are stacked, remembering location
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
569 (positive (setq open-ans (cons `(,name ((,loc . nil))) open-ans)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
570 ;; It is a negative annotation:
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
571 ;; Close the top annotation & add its text property.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
572 ;; If the file's nesting is messed up, the close might not match
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
573 ;; the top thing on the open-annotations stack.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
574 ;; If no matching annotation is open, just ignore the close.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
575 ((not (assoc name open-ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
576 (message "Extra closing annotation (%s) in file" name))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
577 ;; If one is open, but not on the top of the stack, close
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
578 ;; the things in between as well. Set `found' when the real
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
579 ;; one is closed.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
580 (t
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
581 (while (not found)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
582 (let* ((top (car open-ans)) ; first on stack: should match.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
583 (top-name (car top)) ; text property name
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
584 (top-extents (nth 1 top)) ; property regions
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
585 (params (cdr (cdr top))) ; parameters
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
586 (aalist translations)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
587 (matched nil))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
588 (if (equal name top-name)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
589 (setq found t)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
590 (message "Improper nesting in file."))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
591 ;; Look through property names in TRANSLATIONS
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
592 (while aalist
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
593 (let ((prop (car (car aalist)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
594 (alist (cdr (car aalist))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
595 ;; And look through values for each property
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
596 (while alist
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
597 (let ((value (car (car alist)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
598 (ans (cdr (car alist))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
599 (if (member top-name ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
600 ;; This annotation is listed, but still have to
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
601 ;; check if multiple annotations are satisfied
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
602 (if (member nil (mapcar (lambda (r)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
603 (assoc r open-ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
604 ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
605 nil ; multiple ans not satisfied
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
606 ;; If there are multiple annotations going
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
607 ;; into one text property, split up the other
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
608 ;; annotations so they apply individually to
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
609 ;; the other regions.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
610 (setcdr (car top-extents) loc)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
611 (let ((to-split ans) this-one extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
612 (while to-split
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
613 (setq this-one
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
614 (assoc (car to-split) open-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
615 extents (nth 1 this-one))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
616 (if (not (eq this-one top))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
617 (setcar (cdr this-one)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
618 (format-subtract-regions
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
619 extents top-extents)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
620 (setq to-split (cdr to-split))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
621 ;; Set loop variables to nil so loop
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
622 ;; will exit.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
623 (setq alist nil aalist nil matched t
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
624 ;; pop annotation off stack.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
625 open-ans (cdr open-ans))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
626 (let ((extents top-extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
627 (start (car (car top-extents)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
628 (loc (cdr (car top-extents))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
629 (while extents
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
630 (cond
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
631 ;; Check for pseudo-properties
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
632 ((eq prop 'PARAMETER)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
633 ;; A parameter of the top open ann:
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
634 ;; delete text and use as arg.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
635 (if open-ans
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
636 ;; (If nothing open, discard).
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
637 (setq open-ans
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
638 (cons
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
639 (append (car open-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
640 (list
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
641 (buffer-substring
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
642 start loc)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
643 (cdr open-ans))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
644 (delete-region start loc))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
645 ((eq prop 'FUNCTION)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
646 ;; Not a property, but a function.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
647 (let ((rtn
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
648 (apply value start loc params)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
649 (if rtn (setq todo (cons rtn todo)))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
650 (t
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
651 ;; Normal property/value pair
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
652 (setq todo
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
653 (cons (list start loc prop value)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
654 todo))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
655 (setq extents (cdr extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
656 start (car (car extents))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
657 loc (cdr (car extents))))))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
658 (setq alist (cdr alist))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
659 (setq aalist (cdr aalist)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
660 (if (not matched)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
661 ;; Didn't find any match for the annotation:
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
662 ;; Store as value of text-property `unknown'.
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
663 (let ((extents top-extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
664 (start (car (car top-extents)))
20087
3a72c0f0ad69 (format-deannotate-region): In case of unmatched tags,
Karl Heuer <kwzh@gnu.org>
parents: 19631
diff changeset
665 (loc (or (cdr (car top-extents)) loc)))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
666 (while extents
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
667 (setq open-ans (cdr open-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
668 todo (cons (list start loc 'unknown top-name)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
669 todo)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
670 unknown-ans (cons name unknown-ans)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
671 extents (cdr extents)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
672 start (car (car extents))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
673 loc (cdr (car extents))))))))))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
674
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
675 ;; Once entire file has been scanned, add the properties.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
676 (while todo
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
677 (let* ((item (car todo))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
678 (from (nth 0 item))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
679 (to (nth 1 item))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
680 (prop (nth 2 item))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
681 (val (nth 3 item)))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
682
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
683 (if (numberp val) ; add to ambient value if numeric
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
684 (format-property-increment-region from to prop val 0)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
685 (put-text-property
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
686 from to prop
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
687 (cond ((get prop 'format-list-valued) ; value gets consed onto
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
688 ; list-valued properties
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
689 (let ((prev (get-text-property from prop)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
690 (cons val (if (listp prev) prev (list prev)))))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
691 (t val))))) ; normally, just set to val.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
692 (setq todo (cdr todo)))
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
693
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
694 (if unknown-ans
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
695 (message "Unknown annotations: %s" unknown-ans))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
696
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
697 (defun format-subtract-regions (minu subtra)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
698 "Remove from the regions in MINUend the regions in SUBTRAhend.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
699 A region is a dotted pair (from . to). Both parameters are lists of
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
700 regions. Each list must contain nonoverlapping, noncontiguous
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
701 regions, in descending order. The result is also nonoverlapping,
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
702 noncontiguous, and in descending order. The first element of MINUEND
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
703 can have a cdr of nil, indicating that the end of that region is not
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
704 yet known."
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
705 (let* ((minuend (copy-alist minu))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
706 (subtrahend (copy-alist subtra))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
707 (m (car minuend))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
708 (s (car subtrahend))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
709 results)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
710 (while (and minuend subtrahend)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
711 (cond
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
712 ;; The minuend starts after the subtrahend ends; keep it.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
713 ((> (car m) (cdr s))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
714 (setq results (cons m results)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
715 minuend (cdr minuend)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
716 m (car minuend)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
717 ;; The minuend extends beyond the end of the subtrahend. Chop it off.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
718 ((or (null (cdr m)) (> (cdr m) (cdr s)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
719 (setq results (cons (cons (1+ (cdr s)) (cdr m)) results))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
720 (setcdr m (cdr s)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
721 ;; The subtrahend starts after the minuend ends; throw it away.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
722 ((< (cdr m) (car s))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
723 (setq subtrahend (cdr subtrahend) s (car subtrahend)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
724 ;; The subtrahend extends beyond the end of the minuend. Chop it off.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
725 (t ;(<= (cdr m) (cdr s)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
726 (if (>= (car m) (car s))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
727 (setq minuend (cdr minuend) m (car minuend))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
728 (setcdr m (1- (car s)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
729 (setq subtrahend (cdr subtrahend) s (car subtrahend))))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
730 (nconc (nreverse results) minuend)))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
731
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
732 ;; This should probably go somewhere other than format.el. Then again,
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
733 ;; indent.el has alter-text-property. NOTE: We can also use
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
734 ;; next-single-property-change instead of text-property-not-all, but then
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
735 ;; we have to see if we passed TO.
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
736 (defun format-property-increment-region (from to prop delta default)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
737 "Over the region between FROM and TO increment property PROP by amount DELTA.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
738 DELTA may be negative. If property PROP is nil anywhere
19631
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
739 in the region, it is treated as though it were DEFAULT."
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
740 (let ((cur from) val newval next)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
741 (while cur
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
742 (setq val (get-text-property cur prop)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
743 newval (+ (or val default) delta)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
744 next (text-property-not-all cur to prop val))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
745 (put-text-property cur (or next to) prop newval)
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
746 (setq cur next))))
51b56762f98b (format-subtract-regions): New function.
Richard M. Stallman <rms@gnu.org>
parents: 19363
diff changeset
747
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
748 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
749 ;;; Encoding
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
750 ;;;
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
751
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
752 (defun format-insert-annotations (list &optional offset)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
753 "Apply list of annotations to buffer as `write-region' would.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
754 Inserts each element of the given LIST of buffer annotations at its
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
755 appropriate place. Use second arg OFFSET if the annotations' locations are
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
756 not relative to the beginning of the buffer: annotations will be inserted
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
757 at their location-OFFSET+1 \(ie, the offset is treated as the character number
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
758 of the first character in the buffer)."
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
759 (if (not offset)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
760 (setq offset 0)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
761 (setq offset (1- offset)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
762 (let ((l (reverse list)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
763 (while l
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
764 (goto-char (- (car (car l)) offset))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
765 (insert (cdr (car l)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
766 (setq l (cdr l)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
767
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
768 (defun format-annotate-value (old new)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
769 "Return OLD and NEW as a \(close . open) annotation pair.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
770 Useful as a default function for TRANSLATIONS alist when the value of the text
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
771 property is the name of the annotation that you want to use, as it is for the
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
772 `unknown' text property."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
773 (cons (if old (list old))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
774 (if new (list new))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
775
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
776 (defun format-annotate-region (from to translations format-fn ignore)
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
777 "Generate annotations for text properties in the region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
778 Searches for changes between FROM and TO, and describes them with a list of
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
779 annotations as defined by alist TRANSLATIONS and FORMAT-FN. IGNORE lists text
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
780 properties not to consider; any text properties that are neither ignored nor
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
781 listed in TRANSLATIONS are warned about.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
782 If you actually want to modify the region, give the return value of this
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
783 function to `format-insert-annotations'.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
784
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
785 Format of the TRANSLATIONS argument:
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
786
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
787 Each element is a list whose car is a PROPERTY, and the following
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
788 elements are VALUES of that property followed by the names of zero or more
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
789 ANNOTATIONS. Whenever the property takes on that value, the annotations
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
790 \(as formatted by FORMAT-FN) are inserted into the file.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
791 When the property stops having that value, the matching negated annotation
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
792 will be inserted \(it may actually be closed earlier and reopened, if
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
793 necessary, to keep proper nesting).
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
794
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
795 If the property's value is a list, then each element of the list is dealt with
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
796 separately.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
797
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
798 If a VALUE is numeric, then it is assumed that there is a single annotation
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
799 and each occurrence of it increments the value of the property by that number.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
800 Thus, given the entry \(left-margin \(4 \"indent\")), if the left margin
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
801 changes from 4 to 12, two <indent> annotations will be generated.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
802
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
803 If the VALUE is nil, then instead of annotations, a function should be
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
804 specified. This function is used as a default: it is called for all
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
805 transitions not explicitly listed in the table. The function is called with
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
806 two arguments, the OLD and NEW values of the property. It should return
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
807 lists of annotations like `format-annotate-location' does.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
808
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
809 The same structure can be used in reverse for reading files."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
810 (let ((all-ans nil) ; All annotations - becomes return value
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
811 (open-ans nil) ; Annotations not yet closed
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
812 (loc nil) ; Current location
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
813 (not-found nil)) ; Properties that couldn't be saved
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
814 (while (or (null loc)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
815 (and (setq loc (next-property-change loc nil to))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
816 (< loc to)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
817 (or loc (setq loc from))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
818 (let* ((ans (format-annotate-location loc (= loc from) ignore translations))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
819 (neg-ans (format-reorder (aref ans 0) open-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
820 (pos-ans (aref ans 1))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
821 (ignored (aref ans 2)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
822 (setq not-found (append ignored not-found)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
823 ignore (append ignored ignore))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
824 ;; First do the negative (closing) annotations
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
825 (while neg-ans
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
826 ;; Check if it's missing. This can happen (eg, a numeric property
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
827 ;; going negative can generate closing annotations before there are
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
828 ;; any open). Warn user & ignore.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
829 (if (not (member (car neg-ans) open-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
830 (message "Can't close %s: not open." (car neg-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
831 (while (not (equal (car neg-ans) (car open-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
832 ;; To close anno. N, need to first close ans 1 to N-1,
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
833 ;; remembering to re-open them later.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
834 (setq pos-ans (cons (car open-ans) pos-ans))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
835 (setq all-ans
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
836 (cons (cons loc (funcall format-fn (car open-ans) nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
837 all-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
838 (setq open-ans (cdr open-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
839 ;; Now remove the one we're really interested in from open list.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
840 (setq open-ans (cdr open-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
841 ;; And put the closing annotation here.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
842 (setq all-ans
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
843 (cons (cons loc (funcall format-fn (car neg-ans) nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
844 all-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
845 (setq neg-ans (cdr neg-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
846 ;; Now deal with positive (opening) annotations
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
847 (let ((p pos-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
848 (while pos-ans
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
849 (setq open-ans (cons (car pos-ans) open-ans))
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
850 (setq all-ans
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
851 (cons (cons loc (funcall format-fn (car pos-ans) t))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
852 all-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
853 (setq pos-ans (cdr pos-ans))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
854
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
855 ;; Close any annotations still open
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
856 (while open-ans
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
857 (setq all-ans
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
858 (cons (cons to (funcall format-fn (car open-ans) nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
859 all-ans))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
860 (setq open-ans (cdr open-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
861 (if not-found
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
862 (message "These text properties could not be saved:\n %s"
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
863 not-found))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
864 (nreverse all-ans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
865
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
866 ;;; Internal functions for format-annotate-region.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
867
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
868 (defun format-annotate-location (loc all ignore translations)
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
869 "Return annotation(s) needed at location LOC.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
870 This includes any properties that change between LOC-1 and LOC.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
871 If ALL is true, don't look at previous location, but generate annotations for
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
872 all non-nil properties.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
873 Third argument IGNORE is a list of text-properties not to consider.
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
874 Use the TRANSLATIONS alist.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
875
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
876 Return value is a vector of 3 elements:
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
877 1. List of names of the annotations to close
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
878 2. List of the names of annotations to open.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
879 3. List of properties that were ignored or couldn't be annotated."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
880 (let* ((prev-loc (1- loc))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
881 (before-plist (if all nil (text-properties-at prev-loc)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
882 (after-plist (text-properties-at loc))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
883 p negatives positives prop props not-found)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
884 ;; make list of all property names involved
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
885 (setq p before-plist)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
886 (while p
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
887 (if (not (memq (car p) props))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
888 (setq props (cons (car p) props)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
889 (setq p (cdr (cdr p))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
890 (setq p after-plist)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
891 (while p
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
892 (if (not (memq (car p) props))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
893 (setq props (cons (car p) props)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
894 (setq p (cdr (cdr p))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
895
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
896 (while props
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
897 (setq prop (car props)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
898 props (cdr props))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
899 (if (memq prop ignore)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
900 nil ; If it's been ignored before, ignore it now.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
901 (let ((before (if all nil (car (cdr (memq prop before-plist)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
902 (after (car (cdr (memq prop after-plist)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
903 (if (equal before after)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
904 nil ; no change; ignore
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
905 (let ((result (format-annotate-single-property-change
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
906 prop before after translations)))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
907 (if (not result)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
908 (setq not-found (cons prop not-found))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
909 (setq negatives (nconc negatives (car result))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
910 positives (nconc positives (cdr result)))))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
911 (vector negatives positives not-found)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
912
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
913 (defun format-annotate-single-property-change (prop old new trans)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
914 "Return annotations for property PROP changing from OLD to NEW.
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
915 These are searched for in the translations alist TRANS.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
916 If NEW does not appear in the list, but there is a default function, then that
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
917 function is called.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
918 Annotations to open and to close are returned as a dotted pair."
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
919 (let ((prop-alist (cdr (assoc prop trans)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
920 default)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
921 (if (not prop-alist)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
922 nil
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
923 ;; If either old or new is a list, have to treat both that way.
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
924 (if (or (consp old) (consp new))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
925 (let* ((old (if (listp old) old (list old)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
926 (new (if (listp new) new (list new)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
927 (tail (format-common-tail old new))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
928 close open)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
929 (while old
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
930 (setq close
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
931 (append (car (format-annotate-atomic-property-change
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
932 prop-alist (car old) nil))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
933 close)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
934 old (cdr old)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
935 (while new
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
936 (setq open
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
937 (append (cdr (format-annotate-atomic-property-change
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
938 prop-alist nil (car new)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
939 open)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
940 new (cdr new)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
941 (format-make-relatively-unique close open))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
942 (format-annotate-atomic-property-change prop-alist old new)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
943
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
944 (defun format-annotate-atomic-property-change (prop-alist old new)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
945 "Internal function annotate a single property change.
13983
292411768ad9 (format-annotate-atomic-property-change): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 13352
diff changeset
946 PROP-ALIST is the relevant segment of a TRANSLATIONS list.
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
947 OLD and NEW are the values."
19155
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
948 (let (num-ann)
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
949 ;; If old and new values are numbers,
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
950 ;; look for a number in PROP-ALIST.
19235
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
951 (if (and (or (null old) (numberp old))
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
952 (or (null new) (numberp new)))
19155
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
953 (progn
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
954 (setq num-ann prop-alist)
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
955 (while (and num-ann (not (numberp (car (car num-ann)))))
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
956 (setq num-ann (cdr num-ann)))))
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
957 (if num-ann
19235
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
958 ;; Numerical annotation - use difference
19359
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
959 (progn
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
960 ;; If property is numeric, nil means 0
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
961 (cond ((and (numberp old) (null new))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
962 (setq new 0))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
963 ((and (numberp new) (null old))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
964 (setq old 0)))
19235
759e45894579 (format-annotate-single-property-change,
Richard M. Stallman <rms@gnu.org>
parents: 19155
diff changeset
965
19359
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
966 (let* ((entry (car num-ann))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
967 (increment (car entry))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
968 (n (ceiling (/ (float (- new old)) (float increment))))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
969 (anno (car (cdr entry))))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
970 (if (> n 0)
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
971 (cons nil (make-list n anno))
8f531dfe20bc (format-annotate-atomic-property-change): Fix prev change.
Richard M. Stallman <rms@gnu.org>
parents: 19245
diff changeset
972 (cons (make-list (- n) anno) nil))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
973
19155
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
974 ;; Standard annotation
20fda18753c2 (format-annotate-atomic-property-change):
Richard M. Stallman <rms@gnu.org>
parents: 18690
diff changeset
975 (let ((close (and old (cdr (assoc old prop-alist))))
11054
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
976 (open (and new (cdr (assoc new prop-alist)))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
977 (if (or close open)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
978 (format-make-relatively-unique close open)
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
979 ;; Call "Default" function, if any
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
980 (let ((default (assq nil prop-alist)))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
981 (if default
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
982 (funcall (car (cdr default)) old new))))))))
cf9842a72fe5 Initial revision
Boris Goldowsky <boris@gnu.org>
parents:
diff changeset
983
18140
f16cf00a2f42 (format-insert-file): Fix arg order to format-decode.
Richard M. Stallman <rms@gnu.org>
parents: 16954
diff changeset
984 (provide 'format)
24156
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
985
e93962ff30b0 Doc fixes.
Dave Love <fx@gnu.org>
parents: 22051
diff changeset
986 ;;; format.el ends here