1 ;;; mew-syntax.el --- Internal syntax for Mew
3 ;; Author: Kazu Yamamoto <Kazu@Mew.org>
4 ;; Created: Oct 2, 1996
5 ;; Revised: Aug 30, 1999
9 (defconst mew-syntax-version "mew-syntax.el version 0.18")
13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17 ;; <esgl> = [ 'single file (dcr) (<epri>) (CT:) CTE: CD: nil (CDP:) ]
18 ;; <emul> = [ 'multi dir/ (dcr) (<epri>) ("mul") CTE: CD: nil (CDP:) 1*<eprt> ]
19 ;; <eprt> = <esgl> | <emul>
20 ;; <epri> = list of (mew-ct-mls mew-ct-pgs)
24 ;; <dmsg> = [ 'message hbeg hend (<dpri>) ("msg") CTE: CD: CID: (CDP:) <dbdy> ]
25 ;; <dsgl> = [ 'single beg end (<dpri>) (CT:) CTE: CD: CID: (CDP:) ]
26 ;; <dmul> = [ 'multi beg end (<dpri>) ("mul") CTE: CD: CID: (CDP:) 1*<dprt> ]
27 ;; <dbdy> = <dmul> | Text/Plain <dsgl>
28 ;; <dprt> = <dmsg> | <dsgl> | <dmul>
29 ;; <dpri> = list of (mew-ct-mls mew-ct-pgs RESULT) in reverse order ;; for cons
35 (defmacro mew-syntax-singlepart-p (syntax)
36 (` (eq (aref (, syntax) 0) 'single)))
38 (defmacro mew-syntax-multipart-p (syntax)
39 (` (eq (aref (, syntax) 0) 'multi)))
41 (defmacro mew-syntax-message-p (syntax)
42 (` (eq (aref (, syntax) 0) 'message)))
48 (defmacro mew-syntax-get-key (syntax)
49 (` (aref (, syntax) 0)))
51 (defmacro mew-syntax-set-key (syntax key)
52 (` (aset (, syntax) 0 (, key))))
54 (defmacro mew-syntax-get-begin (syntax)
55 (` (aref (, syntax) 1)))
57 (defmacro mew-syntax-set-begin (syntax begin)
58 (` (aset (, syntax) 1 (, begin))))
60 (defmacro mew-syntax-get-end (syntax)
61 (` (aref (, syntax) 2)))
63 (defmacro mew-syntax-set-end (syntax end)
64 (` (aset (, syntax) 2 (, end))))
66 (defmacro mew-syntax-get-privacy (syntax)
67 (` (aref (, syntax) 3)))
69 (defmacro mew-syntax-set-privacy (syntax privacy)
70 (` (aset (, syntax) 3 (, privacy))))
72 (defmacro mew-syntax-get-ct (syntax)
73 (` (aref (, syntax) 4)))
75 (defmacro mew-syntax-set-ct (syntax ct)
76 (` (aset (, syntax) 4 (, ct))))
78 (defmacro mew-syntax-get-cte (syntax)
79 (` (aref (, syntax) 5)))
81 (defmacro mew-syntax-set-cte (syntax cte)
82 (` (aset (, syntax) 5 (, cte))))
84 (defmacro mew-syntax-get-cd (syntax)
85 (` (aref (, syntax) 6)))
87 (defmacro mew-syntax-set-cd (syntax cd)
88 (` (aset (, syntax) 6 (, cd))))
90 (defmacro mew-syntax-get-cid (syntax)
91 (` (aref (, syntax) 7)))
93 (defmacro mew-syntax-set-cid (syntax cid)
94 (` (aset (, syntax) 7 (, cid))))
96 (defmacro mew-syntax-get-cdp (syntax)
97 (` (aref (, syntax) 8)))
99 (defmacro mew-syntax-set-cdp (syntax cdp)
100 (` (aset (, syntax) 8 (, cdp))))
102 (defmacro mew-syntax-get-part (syntax)
103 (` (aref (, syntax) 9)))
105 (defmacro mew-syntax-set-part (syntax part)
106 (` (aset (, syntax) 9 (, part))))
108 ;; alias for draft syntax
110 (defmacro mew-syntax-get-file (syntax)
111 (` (aref (, syntax) 1)))
113 (defmacro mew-syntax-set-file (syntax file)
114 (` (aset (, syntax) 1 (, file))))
116 (defmacro mew-syntax-get-decrypters (syntax)
117 (` (aref (, syntax) 2)))
119 (defmacro mew-syntax-set-decrypters (syntax decrypters)
120 (` (aset (, syntax) 2 (, decrypters))))
122 ;; for content parameters
124 (defun mew-syntax-get-value (ctl &optional capitalize)
126 (capitalize (car ctl))
129 (defmacro mew-syntax-get-params (ctl)
132 ;; ctl = (value (pname pvalue) (pname pvalue) ...)
133 ;; ctl = ((pname pvalue) (pname pvalue) ...)
134 (defmacro mew-syntax-get-param (ctl member)
135 (` (mew-header-sanity-check-string (nth 1 (assoc (, member) (, ctl))))))
138 (defmacro mew-syntax-cat (syntax part)
139 (` (vconcat (, syntax) (vector (, part)))))
141 (defun mew-syntax-cdp-format (file)
142 (if file (list "attachment" (list "filename" file))))
146 (defun mew-syntax-encrypted-p (syntax)
147 (let ((plist (mew-syntax-get-privacy (mew-syntax-get-part syntax))))
150 (if (mew-case-equal (nth 0 (car plist)) mew-ct-mle)
152 (setq plist (cdr plist))))))
154 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
159 (defun mew-syntax-get-entry (syntax nums)
161 ((null nums) syntax) ;; single & message match
162 ((mew-syntax-message-p syntax)
163 (let ((body (mew-syntax-get-part syntax)))
164 (if (mew-syntax-multipart-p body)
165 (mew-syntax-get-entry (mew-syntax-get-part syntax) nums)
168 ((mew-syntax-multipart-p syntax)
169 (if (null nums) syntax
170 (mew-syntax-get-entry
171 (aref syntax (+ mew-syntax-magic (1- (car nums)))) (cdr nums))))))
173 (defun mew-syntax-insert-entry (syntax nums entry)
181 (ns (reverse (nthcdr 2 rev))))
185 (mew-syntax-add-entry parent n0 child))
189 (setq grand (mew-syntax-get-entry root ns)))
190 (setq parent (mew-syntax-get-entry grand (list n1)))
191 (setq parent (mew-syntax-add-entry parent n0 child))
192 (aset grand (+ mew-syntax-magic (1- n1)) parent)
195 (defun mew-syntax-add-entry (syntax n entry)
196 "Must not use in functions other than mew-syntax-insert-entry"
197 (let* ((len (1+ (length syntax)))
198 (vec (make-vector len nil))
199 (cnt 0) (thr (+ mew-syntax-magic (1- n))))
201 (aset vec cnt (aref syntax cnt))
206 (aset vec cnt (aref syntax (1- cnt)))
211 (defun mew-syntax-remove-entry (syntax nums)
218 (ns (reverse (nthcdr 2 rev))))
222 (mew-syntax-cut-entry parent n0))
226 (setq grand (mew-syntax-get-entry root ns)))
227 (setq parent (mew-syntax-get-entry grand (list n1)))
228 (setq parent (mew-syntax-cut-entry parent n0))
229 (aset grand (+ mew-syntax-magic (1- n1)) parent)
232 (defun mew-syntax-cut-entry (syntax n)
233 "Must not use in functions other than mew-syntax-remove-entry"
234 (let* ((len (1- (length syntax)))
235 (vec (make-vector len nil))
236 (cnt 0) (thr (+ mew-syntax-magic (1- n))))
238 (aset vec cnt (aref syntax cnt))
241 (aset vec cnt (aref syntax (1+ cnt)))
246 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
251 (defvar mew-syntax-number-text-regex "^.....\\([.0-9]+\\) +")
252 (defvar mew-syntax-number-icon-regex "<\\([0-9.]+\\)>")
254 (defun mew-summary-goto-part (msg part)
255 (goto-char (point-min))
257 ((equal major-mode 'mew-virtual-mode)
258 (if (re-search-forward (format "\r.*%s" msg) nil t)
259 (re-search-forward (format "^.....%s" part) nil t)))
260 ((equal major-mode 'mew-summary-mode)
261 (if (re-search-forward (format "^ *%s" msg) nil t)
262 (re-search-forward (format "^.....%s" part) nil t))))
265 (defun mew-summary-goto-message ()
266 (if (mew-in-decode-syntax-p)
268 (goto-char (mew-decode-syntax-begin))
271 (defun mew-syntax-number ()
272 (let ((event last-command-event)
275 (mouse-event-p event)
276 (event-over-toolbar-p event)
277 (or (button-press-event-p event)
278 (button-release-event-p event)))
280 (setq str (toolbar-button-help-string (event-toolbar-button event)))
281 ;; last-pressed-toolbar-button can't be used.
282 (if (string-match mew-syntax-number-icon-regex str)
283 (setq ret (mew-match 1 str)))))
285 (if (or (mew-in-attach-p)
286 (mew-in-decode-syntax-p))
289 (if (looking-at mew-syntax-number-text-regex)
292 (defmacro mew-syntax-number-to-nums (strnum)
294 (mapcar (function string-to-int) (mew-split (, strnum) ?.))
297 (defmacro mew-syntax-nums ()
298 '(mew-syntax-number-to-nums (mew-syntax-number)))
300 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
305 (defun mew-summary-message-number ()
306 (let ((event last-command-event)
309 ;; exclude press button 2 in summary buffer.
310 ;; exclude pulldown menu in Summary mode.
311 ;; exclude popup menu of multipart icon because
312 ;; the cursor has already moved.
313 (mouse-event-p event)
314 (event-over-toolbar-p event)
315 (or (button-press-event-p event) ;; right button
316 (button-release-event-p event))) ;; left button
317 (if last-pressed-toolbar-button
319 (setq str (toolbar-button-help-string
320 last-pressed-toolbar-button))
321 (if (string-match "^\\([0-9]+\\) " str)
322 (setq ret (mew-match 1 str))))))
325 (if (not (mew-in-decode-syntax-p))
329 ((equal major-mode 'mew-summary-mode)
330 (if (looking-at mew-summary-message-regex)
333 ((equal major-mode 'mew-virtual-mode)
334 (if (looking-at ".*\r \\([-+%=].*\\) \\(.*\\)$")
339 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
344 (defun mew-encode-syntax-single (file &optional ctl cte cd cid cdp
346 ;; cid is just for beauty
347 ;; if cdp is *non-nil*, set cdp from file.
348 (let* ((attr (mew-attr-by-file file))
349 (ct (mew-attr-get-ct attr)))
350 (or cte (setq cte (mew-attr-get-cte attr)))
351 (if (null ctl) (setq ctl (list ct)))
353 (not (mew-member-match ct mew-mime-content-type-ignore-cdp t)))
356 (setq cdp (mew-syntax-cdp-format cdp))
357 (vconcat [single] (list file decrypters privacy ctl cte cd cid cdp))))
359 (defun mew-encode-syntax-multi (dir ct)
360 (if (not (string-match (concat mew-path-separator "$") dir))
361 (setq dir (file-name-as-directory dir)))
362 (vconcat [multi] (list dir) [nil nil] (list ct) [nil nil nil nil]))
364 (defun mew-encode-syntax-initial (dir)
366 (mew-encode-syntax-multi dir mew-type-mlm)
367 ;; ensure to guess charset ....
368 (list (mew-encode-syntax-single mew-draft-coverpage (list mew-ct-txt)))))
370 (defun mew-encode-syntax-initial-multi (dir n)
373 (setq ret (vconcat ret (list (mew-encode-syntax-single
374 (int-to-string i)))))
376 (vconcat (mew-encode-syntax-multi dir mew-type-mlm)
377 (list (mew-encode-syntax-single mew-draft-coverpage
381 (defconst mew-encode-syntax-dot
382 [nil "." nil nil ("") nil nil nil nil])
384 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
389 (defun mew-decode-syntax-rfc822 (&optional msg-head)
390 ;; msg-head may include CD:
391 (if (null msg-head) (setq msg-head (mew-decode-syntax-rfc822-head t)))
392 (vconcat msg-head (vector (mew-decode-syntax-text))))
394 (defun mew-decode-syntax-rfc822-head (&optional reg-hend)
395 (vector 'message (point-min)
397 (save-excursion (forward-line -1) (beginning-of-line) (point)))
398 nil mew-type-msg nil nil nil nil))
400 (defun mew-decode-syntax-text ()
401 (vector 'single (point) (point-max) nil mew-type-txt nil nil nil nil))
403 (defconst mew-encode-syntax-multi-head
404 (vector 'multi nil nil nil mew-type-mlm nil nil nil nil))
406 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
411 (defun mew-encode-syntax-print (syntax)
415 (nums (mew-syntax-nums)))
418 (goto-char (point-max))
419 (re-search-backward (concat "^" mew-draft-attach-boundary-end "$") nil t)
421 (re-search-backward (concat "^" mew-draft-attach-boundary-begin "$") nil t)
423 (delete-region (point) end)
424 (setq mew-syntax-multi-form nil)
425 (setq mew-syntax-icon-spec nil)
426 (mew-syntax-multipart syntax nil nil 'mew-draft-button)
427 (mapcar (function insert-and-inherit)
428 (nreverse mew-syntax-multi-form))
431 (goto-char (mew-attach-begin))
433 (put-text-property (mew-attach-begin) (point-max) 'read-only t)
434 (mew-front-nonsticky (mew-attach-begin) (1+ (mew-attach-begin)))
435 (mew-rear-sticky (1- (point-max)) (point-max))
438 (goto-char (1- (mew-attach-begin)))
441 (mew-syntax-print-icon-spec (nreverse mew-syntax-icon-spec)
443 (mew-attach-goto-number 'here nums))))))
449 (defun mew-decode-syntax-print (sumbuf syntax form spec)
451 (let ((part (mew-syntax-get-part syntax))
452 (cbuf (current-buffer)))
453 (if (not (mew-syntax-multipart-p part))
459 (mew-decode-syntax-begin-set)
460 (mapcar (function insert-and-inherit) form)
461 (if (equal pos (point))
462 ;; Nothing was printed.
463 (mew-decode-syntax-remove)
464 (mew-decode-syntax-end-set)
465 (put-text-property (mew-decode-syntax-begin) (mew-decode-syntax-end)
468 (mew-syntax-print-icon-spec spec mew-summary-toolbar))
469 (mew-summary-goto-message)
470 (set-buffer-modified-p nil))
477 (defun mew-decode-syntax-clear ()
478 (setq mew-syntax-multi-form nil)
479 (mew-syntax-clear-icon-spec)
480 (mew-decode-syntax-clear-privacy))
482 (defun mew-decode-syntax-set ()
485 (part (mew-syntax-get-part mew-decode-syntax)))
486 (if (mew-syntax-multipart-p part)
488 (mew-syntax-multipart part 'decoding nil 'mew-summary-button 'body)
489 (setq mew-syntax-multi-form (nreverse mew-syntax-multi-form))
490 (setq mew-syntax-icon-spec (nreverse mew-syntax-icon-spec)))
491 (mew-decode-syntax-set-privacy part "body"))))
493 (defun mew-syntax-multipart (syntax dec part func &optional body)
494 (let* ((ct (mew-syntax-get-value (mew-syntax-get-ct syntax) 'cap))
495 (cd (or (mew-syntax-get-cd syntax) ""))
496 (cnt mew-syntax-magic)
498 (len (length syntax))
500 ;; multipart itself is displayed only when encoding.
502 (mew-decode-syntax-set-privacy
504 (concat (if part (concat part " "))
507 (mew-syntax-format syntax part dec)
508 (mew-syntax-set-icon-spec part
510 (mew-attr-get-icon (mew-attr-by-ct ct)) func))
513 (setq strpart (concat part "." (int-to-string num)))
514 (setq strpart (int-to-string num)))
515 (setq subsyntax (aref syntax cnt))
517 ((mew-syntax-multipart-p subsyntax)
518 (mew-syntax-multipart subsyntax dec strpart func nil))
519 ((mew-syntax-message-p subsyntax)
520 (mew-syntax-message subsyntax dec strpart func))
521 ((mew-syntax-singlepart-p subsyntax)
522 (mew-syntax-singlepart subsyntax dec strpart func
523 (and body (equal cnt mew-syntax-magic)))))
529 (setq part (concat part "." (int-to-string num)))
530 (setq part (int-to-string num)))
531 (mew-syntax-format mew-encode-syntax-dot part dec)
532 (mew-syntax-set-icon-spec part "Attach Here" cd mew-icon-blank func))))
534 (defun mew-syntax-singlepart (syntax dec part func first)
535 ;; part is valid only when called by mew-syntax-multipart.
536 (let ((ct (mew-syntax-get-value (mew-syntax-get-ct syntax) 'cap))
537 (cd (or (mew-syntax-get-cd syntax) "")))
538 ;; see also mew-mime-message/rfc822.
540 ;; the first singlepart in multipart under message if t
541 ;; the first singlepart under message if 'body
543 ;; CT: is text/plain but not attached file.
544 (mew-case-equal ct mew-ct-txt))
545 () ;; skip displaying.
546 ;; reach here only when called by mew-syntax-multipart.
547 (mew-syntax-format syntax part dec)
548 (mew-syntax-set-icon-spec part ct cd
549 (mew-attr-get-icon (mew-attr-by-ct ct)) func))
550 (if dec (mew-decode-syntax-set-privacy
552 (if (equal first 'body)
553 (if part (concat part " body") "body")
556 (defun mew-syntax-message (syntax dec part func)
557 (let ((ct (mew-syntax-get-value (mew-syntax-get-ct syntax) 'cap))
558 (cd (or (mew-syntax-get-cd syntax) ""))
559 (subsyntax (mew-syntax-get-part syntax)))
560 (mew-syntax-format syntax part dec)
561 (if dec (mew-decode-syntax-set-privacy
563 (format "%s message" part)))
564 (mew-syntax-set-icon-spec part ct cd
565 (mew-attr-get-icon (mew-attr-by-ct ct)) func)
567 ((mew-syntax-multipart-p subsyntax)
568 (mew-syntax-multipart subsyntax dec part func 'body))
569 ((mew-syntax-message-p subsyntax)
571 ((mew-syntax-singlepart-p subsyntax)
573 (mew-syntax-singlepart subsyntax dec part func 'body)))))
575 ;012345678901234567890123456789012345678901234567890123456789012345678901234567
576 ;<4>snss<27-2 >ss<24+2 >ss<16 >
578 (defun mew-syntax-format (syntax number dec)
579 (let* ((file (if (not dec) (mew-syntax-get-file syntax)))
580 (ctl (mew-syntax-get-ct syntax))
581 (ct (mew-syntax-get-value ctl 'cap))
582 (char (mew-syntax-get-param ctl "charset"))
583 (cte (mew-syntax-get-cte syntax)) ;; cte may be nil
584 (cd (mew-syntax-get-cd syntax))
585 (cdpl (mew-syntax-get-cdp syntax))
586 (filename (mew-syntax-get-param cdpl "filename"))
587 (decrypters-list (mew-syntax-get-decrypters syntax))
588 (decrypters (and (not dec) decrypters-list
589 (mew-join "," decrypters-list)))
591 (privacy (mew-syntax-get-privacy syntax))
593 (cnt "..") (lcnt (length cnt))
594 (LT (- (window-width) 2))
597 (lt 27) (ltc (- lt lcnt))
598 (ld (* (/ (- LT lm lt) 5) 3)) (ldc (- ld lcnt))
599 (lf (- LT lm ln lt ld 8)) (lfc (- lf lcnt))
600 (AR "*") (lfc* (1- lfc)) (asterisk nil)
602 (marks (make-string lm SP))
603 (i 0) (N (length privacy))
606 (run-hooks 'mew-syntax-format-hook)
607 (if (string-match "Text/" ct)
609 (setq ct (concat ct "(" char ")"))
611 (setq ct (concat ct "(" mew-us-ascii ")"))
612 (setq ct (concat ct "(guess)")))))
616 (setq cte (downcase cte))
618 ((or (equal cte mew-7bit)
623 ((equal cte mew-b64) (aset marks 0 ?B))
624 ((equal cte mew-qp) (aset marks 0 ?Q))
625 ((equal cte mew-xg) (aset marks 0 ?G))
626 (t (aset marks 0 ?X))))
628 (if dec (setq privacy (reverse privacy)))
630 (setq ctm (nth 0 (nth i privacy)))
631 (setq ctp (nth 1 (nth i privacy)))
633 ((string-match "pgp" ctp) (aset marks (* i 2) ?P))
634 ((string-match "moss" ctp) (aset marks (* i 2) ?M)))
636 ((string-match mew-ct-mle ctm) (aset marks (1+ (* i 2)) ?E))
637 ((string-match mew-ct-mls ctm) (aset marks (1+ (* i 2)) ?S)))
640 (if (< lm (length marks))
641 (setq marks (substring marks 0 lm))
642 (setq marks (concat marks (make-string (- lm (length marks)) SP))))
644 (if (< lt (length ct))
645 (setq ct (concat (substring ct 0 ltc) cnt))
646 (setq ct (concat ct (make-string (- lt (length ct)) SP))))
648 (if (and (not dec) decrypters) (setq cd-or-dec decrypters))
650 (setq cd-or-dec (make-string ld SP))
651 (if (< ld (mew-string-width cd-or-dec))
652 (setq cd-or-dec (concat (mew-substring cd-or-dec ldc) cnt))
655 (make-string (- ld (mew-string-width cd-or-dec)) SP)))))
658 (setq file filename))
659 ((and file (not (equal file ".")) (not (string-match "/$" file)))
661 (setq file (concat file AR))))
663 (if (< lf (mew-string-width file))
665 (setq file (concat (mew-substring file lfc*) AR cnt))
666 (setq file (concat (mew-substring file lfc) cnt)))))
667 (setq mew-syntax-multi-form
670 (if number (concat space number))
678 mew-syntax-multi-form))))
680 (defun mew-decode-syntax-delete ()
681 (if (mew-decode-syntax-p)
682 (let ((cbuf (current-buffer))
684 (set-buffer (mew-decode-syntax-buffer))
685 (mew-syntax-clear-icon-spec)
686 (mew-summary-toolbar-update)
687 (set-marker pos (point))
689 (delete-region (mew-decode-syntax-begin) (mew-decode-syntax-end)))
690 (mew-decode-syntax-remove)
691 (goto-char (marker-position pos))
692 (mew-highlight-cursor-line)
693 (set-buffer-modified-p nil)
696 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
701 (defvar mew-syntax-icon-spec nil)
703 (defun mew-syntax-set-icon-spec (part ct cd icon func)
705 (setq mew-syntax-icon-spec
709 (format "%s <%s> (%s) %s"
710 mew-cache-message-number
711 (or part "top") ct cd))
712 mew-syntax-icon-spec))))
714 (defun mew-syntax-clear-icon-spec ()
715 (setq mew-syntax-icon-spec nil))
717 (defun mew-syntax-print-icon-spec (spec bar)
720 ((eq mew-multipart-icon-position 'left)
721 (setq toolbar (append spec mew-icon-separate-spec bar)))
722 ((eq mew-multipart-icon-position 'right)
723 (setq toolbar (append bar mew-icon-separate-spec spec)))
724 (t (setq toolbar bar)))
725 (set-specifier default-toolbar (cons (current-buffer) toolbar))))
727 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
732 (defun mew-decode-syntax-set-privacy (syntax label)
733 (let ((privacy (mew-syntax-get-privacy syntax))
736 (setq results (concat results (nth 2 (car privacy))))
737 (setq privacy (cdr privacy)))
739 (setq mew-syntax-privacy-result
740 (concat mew-syntax-privacy-result
742 (format " <%s> " label)
746 (defun mew-decode-syntax-clear-privacy ()
747 (setq mew-syntax-privacy-result nil))
749 (defun mew-decode-syntax-insert-privacy ()
750 (if mew-syntax-privacy-result
752 (insert mew-syntax-privacy-result)
753 (mew-decode-header-property-region beg (point))
755 (narrow-to-region beg (point))
756 (goto-char (point-min))
757 (while (re-search-forward "BAD.*sign" nil t)
762 (intern-soft "mew-highlight-header-face-xmew-bad")))))))
764 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
769 (defvar mew-marker-decode-syntax-begin (make-marker))
770 (defvar mew-marker-decode-syntax-end (make-marker))
772 (defvar mew-overlay-header-keymap nil)
773 (defvar mew-overlay-attach-keymap nil)
775 (mapcar (function make-variable-buffer-local)
776 '(mew-overlay-header-keymap
777 mew-overlay-attach-keymap))
781 (defmacro mew-in-decode-syntax-p ()
782 '(and (marker-position mew-marker-decode-syntax-begin)
783 (marker-position mew-marker-decode-syntax-end)
784 (>= (point) (marker-position mew-marker-decode-syntax-begin))
785 (< (point) (marker-position mew-marker-decode-syntax-end))))
787 (defmacro mew-in-header-p ()
788 '(let ((end (mew-header-end)))
789 (and end (<= (point) end))))
791 (defmacro mew-in-attach-p ()
792 '(let ((beg (mew-attach-begin)))
793 (and beg (> (point) beg)))) ;; excluding the preceding \n
797 (defmacro mew-decode-syntax-p ()
798 '(and (marker-position mew-marker-decode-syntax-begin)
799 (marker-position mew-marker-decode-syntax-end)))
801 (defmacro mew-header-p ()
802 '(next-single-property-change (point-min) 'read-only))
804 (defmacro mew-attach-p ()
805 '(if (/= (point-max) 1)
806 (get-text-property (1- (point-max)) 'mew-attach-end)))
808 (defmacro mew-attach-valid-p ()
809 '(> (length mew-encode-syntax) (1+ mew-syntax-magic)))
813 (defmacro mew-decode-syntax-begin ()
814 '(marker-position mew-marker-decode-syntax-begin))
816 (defmacro mew-decode-syntax-end ()
817 '(marker-position mew-marker-decode-syntax-end))
819 (defmacro mew-header-end ()
822 (defmacro mew-attach-begin ()
824 (let ((beg (previous-single-property-change
825 (point-max) 'mew-attach-begin)))
826 (if beg (1- beg) nil))))
830 (defmacro mew-decode-syntax-begin-set ()
831 '(set-marker mew-marker-decode-syntax-begin (point)))
833 (defmacro mew-decode-syntax-end-set ()
834 '(set-marker mew-marker-decode-syntax-end (point)))
836 (defmacro mew-decode-syntax-remove ()
838 (set-marker mew-marker-decode-syntax-begin nil)
839 (set-marker mew-marker-decode-syntax-end nil)))
841 (defmacro mew-decode-syntax-buffer ()
842 '(set-buffer (marker-buffer mew-marker-decode-syntax-begin)))
844 (defun mew-summary-end-of-message-p ()
847 (set-buffer (mew-decode-syntax-buffer))
849 (setq end (mew-decode-syntax-end))
854 (and (<= beg pos) (< pos end)))))
858 (defmacro mew-header-set (sep)
864 (put-text-property end (point) 'read-only t)
865 (mew-front-nonsticky end (1+ end))
866 (mew-rear-nonsticky (1- (point)) (point))
869 (defmacro mew-header-clear ()
870 ;; the cursor moves to the end of the header (with some exceptions)
872 (mew-header-goto-end) ;; do not use mew-header-end
875 ;; (put-text-property pos (point) 'read-only nil)
876 ;; If the body contains the read-only property, mew-header-p
877 ;; makes a mistake. So, remove the read-only property from
878 ;; the entire buffer.
879 (put-text-property (point) (point-max) 'read-only nil)
880 (delete-region pos (point)))))
884 (defmacro mew-attach-set ()
887 (goto-char (point-max))
888 (if (null (bolp)) (insert "\n"))
891 (insert mew-draft-attach-boundary-begin)
893 (insert mew-draft-attach-boundary-end)
895 (put-text-property beg (1+ beg) 'mew-attach-begin t)
896 (put-text-property (1- (point)) (point) 'mew-attach-end t)
898 (mew-draft-attach-keymap))))
900 (defmacro mew-attach-clear ()
904 (delete-region (mew-attach-begin) (point-max)))
905 (if mew-use-overlay-keymap
906 (mew-overlay-delete mew-overlay-attach-keymap)))))
908 (defmacro mew-header-prepared ()
910 (mew-header-set (concat mew-header-separator "\n"))
911 (if mew-config-insert-when-prepared
912 (mew-draft-insert-config 'nohighlight))
913 (mew-highlight-header)
914 (mew-draft-header-keymap)))
916 (defmacro mew-draft-header-keymap ()
918 (if mew-use-overlay-keymap
919 (if (mew-overlay-p mew-overlay-header-keymap)
920 (mew-overlay-move mew-overlay-header-keymap
921 (point-min) (1+ (mew-header-end)))
922 (setq mew-overlay-header-keymap
923 (mew-overlay-make (point-min) (1+ (mew-header-end))))
924 (mew-overlay-put mew-overlay-header-keymap
925 (if mew-xemacs-p 'keymap 'local-map)
926 mew-draft-header-map)
927 (mew-rear-sticky mew-overlay-header-keymap)))))
929 (defmacro mew-draft-attach-keymap ()
931 (if mew-use-overlay-keymap
932 (if (mew-overlay-p mew-overlay-attach-keymap)
933 (mew-overlay-move mew-overlay-attach-keymap
934 (1+ (mew-attach-begin)) (point-max))
935 (setq mew-overlay-attach-keymap
936 (mew-overlay-make (1+ (mew-attach-begin)) (point-max)))
937 (mew-overlay-put mew-overlay-attach-keymap
938 (if mew-xemacs-p 'keymap 'local-map)
939 mew-draft-attach-map)))))
941 (provide 'mew-syntax)
943 ;;; Copyright Notice:
945 ;; Copyright (C) 1996, 1997, 1998, 1999 Mew developing team.
946 ;; All rights reserved.
948 ;; Redistribution and use in source and binary forms, with or without
949 ;; modification, are permitted provided that the following conditions
952 ;; 1. Redistributions of source code must retain the above copyright
953 ;; notice, this list of conditions and the following disclaimer.
954 ;; 2. Redistributions in binary form must reproduce the above copyright
955 ;; notice, this list of conditions and the following disclaimer in the
956 ;; documentation and/or other materials provided with the distribution.
957 ;; 3. Neither the name of the team nor the names of its contributors
958 ;; may be used to endorse or promote products derived from this software
959 ;; without specific prior written permission.
961 ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND
962 ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
963 ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
964 ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE
965 ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
966 ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
967 ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
968 ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
969 ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
970 ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
971 ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
973 ;;; mew-syntax.el ends here